le SysVinit-Sam HOWTO : mon royaume pour un prompt ! v0.03 ; Octobre 2001 Copyright (c) 2001 Samuel Thibault. Librement distribuable et modifiable selon les termes du LDP 11.. PPrréésseennttaattiioonn 11..11.. IInnttrroodduuccttiioonn J'en avais marre d'attendre 3 plombes que Samba démarre avant de pouvoir me logguer (j'ai un 486dx2-80). J'ai donc bricolé le SysVinit pour que ce genre de démons démarrent en arrière-plan. 11..22.. AAtttteennttiioonn !! WARNING !! WARNING !! WARNING !! WARNING !! WARNING !! WARNING !! WARNING !! Les modifications proposées ici marchent pour mon linux (une mandrake 6.0 au début), je ne saurais être responsable si ces modifs rendent votre machine inutilisable, non bootable, crashable, explosable, bombe nucléairable... 22.. QQuu''eesstt--ccee qquuii ssee ppaassssee ?? 22..11.. NNoonn DDeebbiiaann 22..11..11.. IInniitt Au démarrage du système, init regarde inittab : - il y voit une ligne du genre : si::sysinit:/etc/rc.d/rc.sysinit Il lance donc rc.sysinit, qui checke les partitions, les montent, regarde les modules, fait le ménage, la vaisselle, le repassage, etc... - viennent des lignes du genre : l0:0:wait:/etc/rc.d/rc 0 l1:1:wait:/etc/rc.d/rc 1 l2:2:wait:/etc/rc.d/rc 2 l3:3:wait:/etc/rc.d/rc 3 l4:4:wait:/etc/rc.d/rc 4 l5:5:wait:/etc/rc.d/rc 5 l6:6:wait:/etc/rc.d/rc 6 Selon le runlevel, il va lancer "rc le_runlevel", et comme "wait" est indiqué, il *attend* que ce script soit fini avant de continuer. C'est là le problème. - enfin, des lignes du genre 1:2345:respawn:/sbin/mingetty tty1 2:2345:respawn:/sbin/mingetty tty2 3:2345:respawn:/sbin/mingetty tty3 4:2345:respawn:/sbin/mingetty tty4 5:2345:respawn:/sbin/mingetty tty5 6:2345:respawn:/sbin/mingetty tty6 Là, c'est les logins, et "respawn" veut dire que INIT les relancera au cas où il y en ait une qui clamse. (j'omet volontairement d'autres lignes qui n'ont rien à voir avec mes propos) 22..11..22.. RRcc Lorsque "rc" est appelé avec le numéro du runlevel, il va voir dans /etc/rc.d/rc(le_runlevel).d où il y a des liens symboliques vers des scripts de /etc/rc.d/init.d (ces répertoire pouvant être respectivement /etc/rc(le_runlevel).d et /etc/init.d, selon les distributions). Rc les exécute dans l'ordre alphabétique, d'abord ceux qui commencent par "K", en leur passant le paramètre stop (pour arrêter le service associé), puis ceux qui commencent par "S", en leur passant le paramètre start (...) 22..22.. DDeebbiiaann (ou assimilés) (Là, c'est plus joliment fait) 22..22..11.. IInniitt Au démarrage du système, init regarde inittab : - il y voit une ligne du genre : si::sysinit:/etc/rc.d/rcS rcS est un script du style rc, qui va voir les scripts dans /etc/rcS.d, et les exécute dans l'ordre alphabétique. - viennent des lignes du genre : l0:0:wait:/etc/init.d/rc 0 l1:1:wait:/etc/init.d/rc 1 l2:2:wait:/etc/init.d/rc 2 l3:3:wait:/etc/init.d/rc 3 l4:4:wait:/etc/init.d/rc 4 l5:5:wait:/etc/init.d/rc 5 l6:6:wait:/etc/init.d/rc 6 Selon le runlevel, il va lancer "rc le_runlevel", et comme "wait" est indiqué, il *attend* que ce script soit fini avant de continuer. C'est là le problème. - enfin, des lignes du genre 1:2345:respawn:/sbin/mingetty tty1 2:2345:respawn:/sbin/mingetty tty2 3:2345:respawn:/sbin/mingetty tty3 4:2345:respawn:/sbin/mingetty tty4 5:2345:respawn:/sbin/mingetty tty5 6:2345:respawn:/sbin/mingetty tty6 Là, c'est les logins, et "respawn" veut dire que INIT les relancera au cas où il y en ait une qui clamse. (j'omet volontairement d'autres lignes qui n'ont rien à voir avec mes propos) 22..11..22.. RRcc Fonctionne de la même manière que pour les Non-debian, au nom du répertoire près 33.. QQuuee ffaaiirree,, aalloorrss ?? 33..11.. NNoonn DDeebbiiaann Couper rc en deux ! D'une part, des scripts "Systèmes", style le clavier, monter le /home en NFS, etc..., d'autre part, les scripts "Démons", style sendmail, samba, etc... On fait une deuxième copie de rc : rcS, puis on modifie les deux : Pour rc, - for i in /etc/rc.d/rc$runlevel.d/K*; do + for i in /etc/rc.d/rc$runlevel.d/K*[^S]; do et un peu plus loin, - for i in /etc/rc.d/rc$runlevel.d/S*; do + for i in /etc/rc.d/rc$runlevel.d/S*[^S]; do Pour rcS, - for i in /etc/rc.d/rc$runlevel.d/K*; do + for i in /etc/rc.d/rc$runlevel.d/K*S; do et un peu plus loin, - for i in /etc/rc.d/rc$runlevel.d/S*; do + for i in /etc/rc.d/rc$runlevel.d/S*S; do ce qui distingue alors les scripts "Systèmes" des scripts "Démons", c'est que les scripts "Systèmes" finissent par un S (en général, les noms des scripts sont en minuscules, donc ça pose pas de problème) rc ne s'occupera alors que des scripts "Démons", et rcS, des scripts "SystèmeS" Maintenant, on va préciser à Init que rcS doit être lancé avant rc au démarrage, mais que rc doit être lancé avant rcS à l'extinction : -l0:0:wait:/etc/rc.d/rc 0 -l1:1:wait:/etc/rc.d/rc 1 -l2:2:wait:/etc/rc.d/rc 2 -l3:3:wait:/etc/rc.d/rc 3 -l4:4:wait:/etc/rc.d/rc 4 -l5:5:wait:/etc/rc.d/rc 5 -l6:6:wait:/etc/rc.d/rc 6 +# scripts to run *before* logins +S2:2:wait:/etc/rc.d/rcS 2 +S3:3:wait:/etc/rc.d/rcS 3 +S4:4:wait:/etc/rc.d/rcS 4 +S5:5:wait:/etc/rc.d/rcS 5 + +# scripts to run whenever possible, displaying it on another virtual console +l2:2:once:/etc/rc.d/rc 2 /dev/tty9 +l3:3:once:/etc/rc.d/rc 3 /dev/tty9 +l4:4:once:/etc/rc.d/rc 4 /dev/tty9 +l5:5:once:/etc/rc.d/rc 5 /dev/tty9 + +# scripts to run *before* System scripts +l0:0:wait:/etc/rc.d/rc 0 +l1:1:wait:/etc/rc.d/rc 1 +l6:6:wait:/etc/rc.d/rc 6 + +# System scripts +S0:0:wait:/etc/rc.d/rcS 0 +S1:1:wait:/etc/rc.d/rcS 1 +S6:6:wait:/etc/rc.d/rcS 6 "once" indique de surcroît que c'est pas la peine d'attendre la fin de rc pour examiner la suite de inittab : les logins. C'est exactement ce que l'on veut. 33..22.. DDeebbiiaann (ou assimilés) La séparation est déjà faite ! En effet, les scripts Systèmes sont déjà dans rcS.d, qui sont lancés par rcS, déjà défini ! La seule modification à faire est donc dans /etc/inittab : -l2:2:wait:/etc/init.d/rc 2 -l3:3:wait:/etc/init.d/rc 3 -l4:4:wait:/etc/init.d/rc 4 -l5:5:wait:/etc/init.d/rc 5 +# scripts to run whenever possible, displaying it on another virtual console +l2:2:once:/etc/init.d/rc 2 /dev/tty9 +l3:3:once:/etc/init.d/rc 3 /dev/tty9 +l4:4:once:/etc/init.d/rc 4 /dev/tty9 +l5:5:once:/etc/init.d/rc 5 /dev/tty9 Cependant, il faut également autoriser les logins dès le boot : il faut que dans /etc/default/rcS, on ait DELAYLOGIN=no 44.. SSyysstteemm oorr DDaaeemmoonn,, tthhaatt iiss tthhee QQuueessttiioonn...... (Ne concerne que les Non-debian) Effectivement, il est *primordial* de bien choisir ce qui est système de ce qui ne l'est pas. Il faut bien penser que certains scripts dans /etc/rc.d/init.d ne servent qu'à l'extinction, mais *doivent* être système. Voici ceux que j'ai élu système sur ma machine : au démarrage, - keytable c'est plus pratique, les logins avec un clavier AZERTY à l'extinction, - halt sert pour l'extinction, et *doit* être le dernier script lancé - single *doit* être le dernier script lancé quand on passe en runlevel 1 éventuellement, si /home est sur le réseau, par exemple, - network attendre le réseau - netfs et monter /home il faut donc renommer ces scripts dans /etc/rc.d/init.d/ en rajoutant un S à la fin. Il faut de plus refabriquer les liens de /etc/rc.d/rc(runlevel).d/ en rajoutant un S final à la fois au nom du liens, et à la référence vers le script correspondant dans /etc/rc.d/init.d, ceci *pour chaque runlevel* ! par exemple, voici un extrait de /etc/rc.d/rc0.d/ sur ma machine : (/home n'est *pas* monté en réseau) total 0 lrwxrwxrwx 1 root root 13 Sep 18 22:29 K35smb -> ../init.d/smb lrwxrwxrwx 1 root root 16 Apr 23 11:51 K70syslog -> ../init.d/syslog lrwxrwxrwx 1 root root 17 Oct 7 15:20 K90killall -> ../init.d/killall lrwxrwxrwx 1 root root 17 Oct 7 14:09 K90network -> ../init.d/network lrwxrwxrwx 1 root root 15 Oct 7 13:50 S00haltS -> ../init.d/haltS un autre de /etc/rc.d/rc6.d/ : total 0 lrwxrwxrwx 1 root root 13 Sep 18 22:29 K35smb -> ../init.d/smb lrwxrwxrwx 1 root root 16 Apr 23 11:51 K70syslog -> ../init.d/syslog lrwxrwxrwx 1 root root 17 Oct 7 15:20 K90killall -> ../init.d/killall lrwxrwxrwx 1 root root 17 Oct 7 14:09 K90network -> ../init.d/network lrwxrwxrwx 1 root root 15 Oct 7 13:50 S00rebootS -> ../init.d/haltS et un dernier de /etc/rc.d/rc5.d/ : total 0 lrwxrwxrwx 1 root root 17 Oct 7 14:10 S10network -> ../init.d/network lrwxrwxrwx 1 root root 18 Oct 7 14:10 S11ipchains -> ../init.d/ipchains lrwxrwxrwx 1 root root 16 Oct 7 13:49 S30syslog -> ../init.d/syslog lrwxrwxrwx 1 root root 19 Oct 7 13:49 S75keytableS -> ../init.d/keytableS lrwxrwxrwx 1 root root 13 Oct 7 13:49 S91smb -> ../init.d/smb lrwxrwxrwx 1 root root 11 Apr 23 11:51 S99local -> ../rc.local Enfin, il *faut* modifier rcS, haltS, rebootS et singleS car ceux-ci regardent souvent si la commande est halt, reboot ou single. Cette modif dépend énormément de la distributions, je ne la détaillerai pas. 55.. EEtt SSyyssVV ddaannss ttoouutt ççaa ?? Malgré tout ce bidouillage, ça reste à peu près SysV, et les outils des distribs pour les logiciels continuent à fonctionner : chkconfig, sysvinit, et les scripts d'installation de rpm ou dpkg marchent, puisque seuls les scripts système sont changés. Seuls les packages sysvinit ou initscripts vont froncer les sourcils. C'est donc une modif qui marche pour un système installé une fois pour toute, mais pas du tout pour un système amené à être upgradé !