F.2.4. Le programme /sbin/init
Le programme
/sbin/init
(aussi appelé init
) coordonne le reste du processus de démarrage et configure l'environnement de l'utilisateur.
Lorsque la commande
init
est lancée, elle devient le parent ou grand-parent de tous les processus qui sont lancés automatiquement sur le système. Tout d'abord, elle exécute le script /etc/rc.d/rc.sysinit
qui définit le chemin d'accès de l'environnement, démarre swap, contrôle les systèmes de fichiers et exécute toutes les autres étapes nécessaires à l'initialisation du système. Par exemple, la plupart des systèmes utilisant une horloge, rc.sysinit
lit le fichier de configuration /etc/sysconfig/clock
pour initialiser l'horloge matérielle. Autre exemple : s'il existe des processus de port série spéciaux qui doivent être initialisés, rc.sysinit
exécute le fichier /etc/rc.serial
.
La commande
init
exécute ensuite les tâches dans le répertoire /etc/event.d
, qui décrit la manière selon laquelle le système devrait être configuré à chaque niveau d'exécution, SysV init runlevel. Les niveaux d'exécution sont des états, ou modes, définis par les services énumérés dans le répertoire /etc/rc.d/rc<x>.d/
de SysV, où <x> correspond au numéro du niveau d'exécution. Pour obtenir de plus amples informations sur les niveaux d'exécution SysV init, reportez-vous à la Section F.4, « Niveaux d'exécution de SysV Init ».
Ensuite, la commande
init
configure la bibliothèque de fonctions sources, /etc/rc.d/init.d/functions
, pour le système. Celle-ci indique comment démarrer ou arrêter un programme et comment déterminer le PID d'un programme.
Le programme
init
démarre l'ensemble des processus d'arrière-plan en consultant le répertoire rc
approprié au niveau d'exécution spécifié comme valeur par défaut dans /etc/inittab
. Les répertoires rc
sont numérotés de façon à correspondre au niveau d'exécution qu'ils représentent. Par exemple, /etc/rc.d/rc5.d/
est le répertoire correspondant au niveau d'exécution 5.
En démarrant au niveau d'exécution 5, le programme
init
examine le répertoire /etc/rc.d/rc5.d/
afin de déterminer les processus à arrêter et à démarrer.
Ci-dessous figure un exemple de listing pour un répertoire
/etc/rc.d/rc5.d/
:
K05innd -> ../init.d/innd K05saslauthd -> ../init.d/saslauthd K10dc_server -> ../init.d/dc_server K10psacct -> ../init.d/psacct K10radiusd -> ../init.d/radiusd K12dc_client -> ../init.d/dc_client K12FreeWnn -> ../init.d/FreeWnn K12mailman -> ../init.d/mailman K12mysqld -> ../init.d/mysqld K15httpd -> ../init.d/httpd K20netdump-server -> ../init.d/netdump-server K20rstatd -> ../init.d/rstatd K20rusersd -> ../init.d/rusersd K20rwhod -> ../init.d/rwhod K24irda -> ../init.d/irda K25squid -> ../init.d/squid K28amd -> ../init.d/amd K30spamassassin -> ../init.d/spamassassin K34dhcrelay -> ../init.d/dhcrelay K34yppasswdd -> ../init.d/yppasswdd K35dhcpd -> ../init.d/dhcpd K35smb -> ../init.d/smb K35vncserver -> ../init.d/vncserver K36lisa -> ../init.d/lisa K45arpwatch -> ../init.d/arpwatch K45named -> ../init.d/named K46radvd -> ../init.d/radvd K50netdump -> ../init.d/netdump K50snmpd -> ../init.d/snmpd K50snmptrapd -> ../init.d/snmptrapd K50tux -> ../init.d/tux K50vsftpd -> ../init.d/vsftpd K54dovecot -> ../init.d/dovecot K61ldap -> ../init.d/ldap K65kadmin -> ../init.d/kadmin K65kprop -> ../init.d/kprop K65krb524 -> ../init.d/krb524 K65krb5kdc -> ../init.d/krb5kdc K70aep1000 -> ../init.d/aep1000 K70bcm5820 -> ../init.d/bcm5820 K74ypserv -> ../init.d/ypserv K74ypxfrd -> ../init.d/ypxfrd K85mdmpd -> ../init.d/mdmpd K89netplugd -> ../init.d/netplugd K99microcode_ctl -> ../init.d/microcode_ctl S04readahead_early -> ../init.d/readahead_early S05kudzu -> ../init.d/kudzu S06cpuspeed -> ../init.d/cpuspeed S08ip6tables -> ../init.d/ip6tables S08iptables -> ../init.d/iptables S09isdn -> ../init.d/isdn S10network -> ../init.d/network S12syslog -> ../init.d/syslog S13irqbalance -> ../init.d/irqbalance S13portmap -> ../init.d/portmap S15mdmonitor -> ../init.d/mdmonitor S15zebra -> ../init.d/zebra S16bgpd -> ../init.d/bgpd S16ospf6d -> ../init.d/ospf6d S16ospfd -> ../init.d/ospfd S16ripd -> ../init.d/ripd S16ripngd -> ../init.d/ripngd S20random -> ../init.d/random S24pcmcia -> ../init.d/pcmcia S25netfs -> ../init.d/netfs S26apmd -> ../init.d/apmd S27ypbind -> ../init.d/ypbind S28autofs -> ../init.d/autofs S40smartd -> ../init.d/smartd S44acpid -> ../init.d/acpid S54hpoj -> ../init.d/hpoj S55cups -> ../init.d/cups S55sshd -> ../init.d/sshd S56rawdevices -> ../init.d/rawdevices S56xinetd -> ../init.d/xinetd S58ntpd -> ../init.d/ntpd S75postgresql -> ../init.d/postgresql S80sendmail -> ../init.d/sendmail S85gpm -> ../init.d/gpm S87iiim -> ../init.d/iiim S90canna -> ../init.d/canna S90crond -> ../init.d/crond S90xfs -> ../init.d/xfs S95atd -> ../init.d/atd S96readahead -> ../init.d/readahead S97messagebus -> ../init.d/messagebus S97rhnsd -> ../init.d/rhnsd S99local -> ../rc.local
Comme le montre ce listing, aucun des scripts qui lancent et arrêtent vraiment les services n'est réellement situé dans le répertoire
/etc/rc.d/rc5.d/
. Tous les fichiers dans /etc/rc.d/rc5.d/
sont en fait des liens symboliques qui pointent vers les scripts situés dans le répertoire /etc/rc.d/init.d/
. Des liens symboliques sont utilisés dans chacun des répertoires rc
afin que les niveaux d'exécution puissent être reconfigurés en créant, modifiant et supprimant les liens symboliques, et ce, sans affecter les scripts auxquels ils font référence.
Le nom de chaque lien symbolique commence soit par
K
, soit par S
. Les liens K
correspondent à des processus arrêtés à ce niveau d'exécution, tandis que les liens S
correspondent à des processus démarrés à ce niveau d'exécution.
La commande
init
arrête tout d'abord tous les liens symboliques K
du répertoire en émettant la commande /etc/rc.d/init.d/<command> stop
, <command> correspondant au processus à arrêter. Elle démarre ensuite tous les liens symboliques S
en émettant la commande /etc/rc.d/init.d/<command> start
.
Note
Une fois que le système a terminé son démarrage, il est possible d'établir une connexion en tant que super-utilisateur et d'exécuter ces mêmes scripts pour démarrer et arrêter des services. Par exemple, la commande
/etc/rc.d/init.d/httpd stop
arrêtera le serveur HTTP Apache.
Chacun des liens symboliques est numéroté de façon à établir l'ordre de démarrage. L'ordre dans lequel les services sont démarrés ou arrêtés peut être modifié en changeant ce numéro. Plus le numéro est bas, plus le démarrage se produira tôt. Les liens symboliques disposant du même numéro sont démarrés par ordre alphabétique.
Note
Une des dernières choses que le programme
init
exécute est le fichier /etc/rc.d/rc.local
. Ce dernier est utilisé pour la personnalisation du système. Reportez-vous à la Section F.3, « Exécution de programmes supplémentaires au démarrage » pour de plus amples informations sur l'utilisation du fichier rc.local
.
Une fois que la commande
init
a progressé dans le répertoire rc
approprié pour le niveau d'exécution, Upstart crée un processus /sbin/mingetty
pour chaque console virtuelle (invites de connexion) assignée au niveau d'exécution par la définition de la tâche dans le répertoire /etc/event.d
. Les niveaux d'exécution de 2 à 5 ont tous six consoles virtuelles, tandis que le niveau d'exécution 1 (mode mono-utilisateur) n'a lui qu'une seule console virtuelle et que les niveaux d'exécution 0 et 6 n'en ont aucune. Le processus /sbin/mingetty
ouvre des chemins de communication vers des périphériques tty. [16], définit leurs modes, affiche l'invite de connexion, accepte le nom d'utilisateur et le mot de passe de l'utilisateur, et initie le processus de connexion.
Dans le niveau d'exécution 5, Upstart exécute un script nommé
/etc/X11/prefdm
. Le script prefdm
exécute le gestionnaire d'affichage X préféré[17] — gdm
, kdm
, ou xdm
, en fonction du contenu du fichier /etc/sysconfig/desktop
.
Une fois l'ensemble du processus terminé, le système fonctionne à un niveau d'exécution 5 et affiche un écran de connexion.