Linux utilise un service de démarrage spécial nommé SysVinit qui est basé sur un concept de niveaux d'exécution. Il peut être très différent d'un système à un autre, du coup, il ne peut pas être supposé que parce que cela fonctionne sur une distribution Linux particulière, cela fonctionnera de la même façon dans LFS. LFS a sa propre façon de le faire mais il respecte généralement les standards établis.
SysVinit (qui sera nommé par la suite « init ») fonctionne en utilisant un schéma de
niveaux d'exécution. Ils sont au nombre de sept (numérotés de 0 à 6).
En fait, il en existe plus mais ils sont réservés à des cas spéciaux
et ne sont généralement pas utilisés. Voir init(8)
pour plus de détails. Chacun d'entre eux
correspond à des actions que l'ordinateur est supposé effectuer
lorsqu'il démarre. Le niveau d'exécution par défaut est 3. Voici les
descriptions sur l'implémentation des différents niveaux
d'exécution :
0: arrête l'ordinateur
1: mode mono-utilisateur
2: mode multi-utilisateur sans réseau
3: mode multi-utilisateur avec réseau
4: réservé pour la personnalisation, sinon identique à 3
5: identique à 4, il est habituellement utilisé pour la connexion GUI (comme xdm de X ou kdm de KDE)
6: redémarre l'ordinateur
Lors de l'initialisation du noyau, le premier programme qui se
lance est soit spécifié sur la ligne de commande, soit, par défaut,
init. Ce programme
lit le fichier d'initialisation /etc/inittab
. Créez ce fichier avec :
cat > /etc/inittab << "EOF"
# Début de /etc/inittab
id:3:initdefault:
si::sysinit:/etc/rc.d/init.d/rc S
l0:0:wait:/etc/rc.d/init.d/rc 0
l1:S1:wait:/etc/rc.d/init.d/rc 1
l2:2:wait:/etc/rc.d/init.d/rc 2
l3:3:wait:/etc/rc.d/init.d/rc 3
l4:4:wait:/etc/rc.d/init.d/rc 4
l5:5:wait:/etc/rc.d/init.d/rc 5
l6:6:wait:/etc/rc.d/init.d/rc 6
ca:12345:ctrlaltdel:/sbin/shutdown -t1 -a -r now
su:S016:once:/sbin/sulogin
1:2345:respawn:/sbin/agetty --noclear tty1 9600
2:2345:respawn:/sbin/agetty tty2 9600
3:2345:respawn:/sbin/agetty tty3 9600
4:2345:respawn:/sbin/agetty tty4 9600
5:2345:respawn:/sbin/agetty tty5 9600
6:2345:respawn:/sbin/agetty tty6 9600
# Fin de /etc/inittab
EOF
Vous trouverez une explication de ce fichier d'initialisation dans
la page de manuel de inittab. Pour LFS, la commande clé qui
se lance est rc. Le
fichier d'initialisation ci-dessus demandera à rc de lancer tous les scripts
commençant par un S qui sont dans le répertoire /etc/rc.d/rcsysinit.d
, puis tous les scripts
commençant par un S du répertoire /etc/rc.d/rc?.d
où le point d'interrogation est
spécifié par la valeur initdefault.
Par commodité, le script rc lit une bibliothèque de
fonctions dans /lib/lsb/init-functions
. Cette bibliothèque lit
aussi un fichier de configuration facultatif, /etc/sysconfig/rc.site
. Tous les paramètres du
fichier de configuration du système décrits dans les sections
suivantes peuvent être mis dans ce fichier, ce qui permet de
rassembler tous les paramètres systèmes dans un seul fichier.
Pour faciliter le débogage, le script functions enregistre aussi
toute la sortie dans /run/var/bootlog
. Le répertoire /run
étant un tmpfs, ce fichier n'est pas
persistant entre les redémarrages, il est cependant envoyé dans le
fichier plus permanent /var/log/boot.log
à la fin du processus de
démarrage.
La commande utilisée pour modifier le niveau d'exécution est
init <[niveau_exécution]>
,
où <[niveau_exécution]>
est le
niveau d'exécution cible. Par exemple, pour redémarrer
l'ordinateur, un utilisateur pourrait lancer la commande
init 6 qui est un
alias de la commande reboot. De même, init 0 est un alias pour la
commande halt.
Il existe un certain nombre de répertoires sous /etc/rc.d
qui ressemble à rc?.d
(où ? est le numéro du niveau d'exécution)
et rcsysinit.d
, tous contenant un
certain nombre de liens symboliques. Certains commencent avec un
K, les autres avec un
S, et tous ont deux nombres
après la lettre initiale. Le K signifie l'arrêt (kill) d'un service
et le S son lancement (start). Les nombres déterminent l'ordre dans
lequel les scripts sont exécutés, de 00 à 99 — plus ce
nombre est petit, plus tôt le script correspondant sera exécuté.
Quand init bascule
sur un autre niveau d'exécution, les services appropriés sont soit
lancés soit tués, suivant le niveau d'exécution choisi.
Les vrais scripts sont dans /etc/rc.d/init.d
. Ils font le vrai boulot et les
liens symboliques pointent tous vers eux. Les liens K et les liens
S pointent vers le même script dans /etc/rc.d/init.d
. Ceci est dû au fait que les
scripts peuvent être appelés avec différents paramètres comme
start
, stop
, restart
, reload
et status
. Quand un lien K est
rencontré, le script approprié est lancé avec l'argument stop
. Quand un lien S est rencontré,
le script approprié est lancé avec l'argument start
.
Il existe une exception à cette explication. Les liens commençant
avec un S dans les
répertoires rc0.d
et rc6.d
ne lanceront aucun service. Ils seront
appelés avec l'argument stop
pour arrêter quelque chose. La
logique derrière ceci est que, quand un utilisateur va redémarrer
ou arrêter le système, rien ne doit être lancé. Le système a
seulement besoin d'être arrêté.
Voici les descriptions de ce que font les arguments des scripts :
start
Le service est lancé.
stop
Le service est stoppé.
restart
Le service est stoppé puis relancé.
reload
La configuration du service est mise à jour. Ceci est utilisé après modification du fichier de configuration d'un service, quand le service n'a pas besoin d'être redémarré.
status
Indique si le service est en cours d'exécution ainsi que les PID associés.
Vous êtes libre de modifier la façon dont le processus de démarrage fonctionne (après tout, c'est votre système LFS). Les fichiers donnés ici sont un exemple d'une façon de faire.