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.


[16] Référez-vous au Guide de déploiement Red Hat Enterprise Linux pour obtenir plus d'informations sur les périphériques tty.
[17] Référez-vous au Guide de déploiement Red Hat Enterprise Linux pour obtenir plus d'informations sur les gestionnaires d'affichage.