Nous allons maintenant présenter les étapes de démarrage de Linux à partir de LILO jusqu'au login:
Le travail initial du kernel, c'est de préparer l'accès au système de fichier et de donner la main à /sbin/init. Cet utilitaire est présent sur tout les systèmes Unix.
À partir du fichier /etc/inittab, /sbin/init va démarrer les différents processus nécéssaire à l'opération d'un système multi-usagers.
Le fichier /etc/inittab a un format relativement simple. Outre des commentaires (ligne débutant par le caractère #), il contient une commande par ligne. Chaque ligne a le format suivant:
C'est généralement une séquence de deux lettres identifiant uniquement cette ligne. /sbin/init utilise cet identificateur lorsqu'il rapporte des erreurs.
Chaque commande est associé à un ou plusieurs groupes appelé "run levels". Les "run levels" sont identifiés par un numéro de 0 à 6. La définition exacte de chaque niveau peut varier d'une distribution à l'autre. Voici la définition pour un système RedHat:
La définition importe peu à /sbin/init. Il s'assure que les commandes associés à un certain groupe exécute.
Voici les attributs possibles
Ceci est simplement la commande et ces arguments.
/sbin/init localise la ligne "id:X:initdefault:" où X représente le runlevel par défaut.
Lors du démarrage, LILO nous offre une ligne de commande permettant de sélectionner la configuration ou le système d'exploitation à démarrer. Dans le cas de Linux, on peut passer au kernel différents options. Un des options est le runlevel. On passe simplement un numéro et /sbin/init démarrera ce runlevel. Notez que outre les runlevels de 1 à 6, il y a un pseudo mode appelé "maintenance", identifié par la lettre S.
On peut donc faire:
Ceci démarre le runlevel 5 et donc linux démarre immédiatement en mode graphique (xdm).
Linux démarre en mode "maintenance". Ce mode démarre simplement /bin/sh et c'est tout. On utilise ce mode lorsque la machine est véritable mal en point.
Ceci démontre une capacité intèressante. Vous pouvez même préciser le nom du premier programme à exécuter. Dans ce cas, /sbin/init est mis hors circuit complèment.
Le lecteur attentif notera que ceci permet d'accèder à un système Linux sans le moindre mot de passe. Effectivement, le noyau démarre et fait démarrer /bin/sh, l'interpréteur de commande ... et ... voilà, vous êtes entré. Pour cet raison, plusieurs souhaiteront enregistrer un mot de passe dans LILO, empêchant le premier venu de prendre contrôle de la machine. Évidemment si vous laisser l'accès physique à un serveur critique, oublier donc la sécurité: Rien n'empèche de voler le disque dure...
Notez que Linuxconf vous offre un menu au moment du démarrage vous permettant de sélectionner le mode d'opération de façon plus conviviale.
Le fichier /etc/inittab n'est pas toujours pratique. À chaque fois qu'on ajoute un nouveau service (package), on se doit d'aller modifier ce fichier. Les concept des scripts "system V" (popularisé par le Unix SysV de AT&T) introduisent un sous-répertoire par runlevel. Ce sous-répertoire s'appelle généralement /etc/rc.d/rcN.d, où N est le numéro du runlevel.
Ces sous-répertoires contiennent des scripts de démarrage. Comme un service peut être disponible dans plusieurs runlevels, on place généralement les scripts de tous les services dans un répertoire commun, généralement appelé /etc/rc.d/init.d/ et on établie des liens symboliques entre ces fichiers et les différents sous-répertoire rcN.d.
Lors du démarrage, /sbin/init sélectionne le runlevel et exécutera tous les scripts dans le répertoire /etc/rc.d/rcN.d correspondant. Comme l'ordre d'initialisation de ces services peut être important, on insert un préfixe de 3 caractères au nom de chaque service. Ce préfixe est la lettre S suivit de deux chiffre. Ce préfixe assure un ordre de tri significatif. /sbin/init exécutera ces scripts en respectant l'ordre de tri. La lettre S signifie "Start".
Le répertoire /etc/rc.d/rc3.d/ sur un système RedHat 5.2 ressemble à ceci:
K20rusersd -> ../init.d/rusersd
K20rwhod -> ../init.d/rwhod
K45named -> ../init.d/named
K55routed -> ../init.d/routed
K87ypbind -> ../init.d/ypbind
S01kerneld -> ../init.d/kerneld
S10network -> ../init.d/network
S11portmap -> ../init.d/portmap
S15nfsfs -> ../init.d/nfsfs
S20random -> ../init.d/random
S30syslog -> ../init.d/syslog
S40atd -> ../init.d/atd
S40crond -> ../init.d/crond
S45pcmcia -> ../init.d/pcmcia
S50inet -> ../init.d/inet
S55sshd -> ../init.d/sshd
S60lpd -> ../init.d/lpd
S60nfs -> ../init.d/nfs
S72autofs -> ../init.d/autofs
S75keytable -> ../init.d/keytable
S80sendmail -> ../init.d/sendmail
S85gpm -> ../init.d/gpm
S85httpd -> ../init.d/httpd
S85mysql -> ../init.d/mysql
S85sound -> ../init.d/sound
S91smb -> ../init.d/smb
S99linuxconf -> ../init.d/linuxconf
S99local -> ../rc.local
Lorsqu'on passe à un nouveau runlevel, via la commande "/sbin/telinit N" où N est le numéro du runlevel, les distributions ont un comportement légèrement différents. Voici les variations.
Lorsqu'on passe à un nouveau runlevel