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
.
Ensuite la commande
init
exécute le script
/etc/inittab
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
mode définis par les services énumérés dans le répertoires
/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 (ou SysV init runlevels), 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.
After the init
command has progressed through the appropriate rc
directory for the runlevel, the /etc/inittab
script forks an /sbin/mingetty
process for each virtual console (login prompt) allocated to the runlevel. Runlevels 2 through 5 have all six virtual consoles, while runlevel 1 (single user mode) has one, and runlevels 0 and 6 have none. The /sbin/mingetty
process opens communication pathways to tty devices[], sets their modes, prints the login prompt, accepts the user's username and password, and initiates the login process.
In runlevel 5, the /etc/inittab
runs a script called /etc/X11/prefdm
. The prefdm
script executes the preferred X display manager[] — gdm
, kdm
, or xdm
, depending on the contents of the /etc/sysconfig/desktop
file.
Une fois l'ensemble du processus terminé, le système fonctionne à un niveau d'exécution 5 et affiche un écran de connexion.