Le système d'exploitation GNU-Linux/Le processus d'initialisation
Le chargement du noyau Linux
[modifier | modifier le wikicode]Lorsque l'on allume son ordinateur, la carte mère effectue un test automatique qui se charge de tester le bon fonctionnement des composants de la carte mère (processeur, mémoire, etc.). Ce test s'appelle le POST (Power-On Self Test). Si tout est OK, ce test se termine par un (et un seul) bip.
Ceci fait, le BIOS charge ensuite le programme stocké dans le boot secteur du disque dur.
Sur architecture PC, il existe deux programmes permettant de charger le noyau Linux, ou un autre système d'exploitation.
LILO
[modifier | modifier le wikicode]LILO (LInux LOader) a été le premier logiciel permettant d'effectuer cette opération.
Exemple de fichier de configuration de Lilo (/etc/lilo.conf) :
boot=/dev/hda map=/boot/map install=/boot/boot.b default=linux prompt timeout=50 message=/boot/message # Premiere section : boot Windows other=/dev/hda1 label=windows table=/dev/hda # Deuxieme section: boot Linux image=/boot/vmlinuz label=linux root=/dev/hda4 append="acpi=off" read-only # Troisieme section: boot Linux - mode mono-utilisateur image=/boot/vmlinuz label=linux_single_user root=/dev/hda4 append="single acpi=off" read-only
Ce fichier se compose de paramêtres communs (disque dur de boot, timeout ...) et de sections pour chaque système d'exploitation à booter.
Chaque fois que l'on modifie ce fichier, il faut exécuter la commande lilo afin de re-écrire dans le boot secteur l'emplacement exact du noyau sur le disque dur.
# lilo Added windows Added linux Added linux_single_user
GRUB
[modifier | modifier le wikicode]Aujourd'hui, on utilise le programme GRUB (GRand Unified Bootloader) car il offre des possibilités supplémentaires.
Contrairement à Lilo, Grub sait lire une partition Linux (ext2/3, XFS, reiserFS ...) afin de charger son fichier de configuration (/boot/grub/menu.lst) et le(s) noyau(x) Linux.
Exemple de fichier de configuration de Grub (/boot/grub/menu.lst)
default 0 timeout 30 color cyan/blue white/blue # Premiere section : Linux title Debian GNU/Linux, kernel 2.6.18-5-686 root (hd1,0) kernel /vmlinuz-2.6.18-5-686 root=/dev/sdb2 ro acpi=off initrd /initrd.img-2.6.18-5-686 savedefault # Deuxieme section : Linux mode mono-utilisateur title Debian GNU/Linux, kernel 2.6.18-5-686 (single-user mode) root (hd1,0) kernel /vmlinuz-2.6.18-5-686 root=/dev/sdb2 ro acpi=off single initrd /initrd.img-2.6.18-5-686 savedefault # Troisieme section : Windows title Windows NT/2000/XP (loader) root (hd0,0) savedefault makeactive chainloader +1
À la différence de Lilo, il n'est pas nécessaire d'exécuter une commande particulière lorsque l'on modifie ce fichier.
Messages du noyau Linux
[modifier | modifier le wikicode]Une fois chargé en mémoire, le noyau va se charger de détecter et d'initialiser les composants de la carte mère et les périphériques présents.
Ces messages sont affichés sur l'écran lors du démarrage.
La commande dmesg permet de consulter ces messages ultérieurement. Exemples :
# dmesg Linux version 2.6.18-5-686 (Debian 2.6.18.dfsg.1-13) (dannf@debian.org) (gcc version 4.1.2 20061115 (prerelease) (Debian 4.1.1-21)) #1 SMP Fri Jun 1 00: 47:00 UTC 2007 BIOS-provided physical RAM map: BIOS-e820: 0000000000000000 - 000000000008f000 (usable) ...
À noter que la commande dmesg affiche tous les messages détectés durant le boot, ainsi que les messages du noyau affichés par la suite (c.a.d. durant le fonctionnement du système).
Dans certains cas, l'affichage de la commande dmesg peut être tronqué (notamment les messages affichés durant le boot). Dans ce cas, on peut consulter le fichier /var/log/dmesg qui ne contient que les messages du boot.
Le processus init
[modifier | modifier le wikicode]Une fois que le noyau a détecté l'ensemble des composants de l'ordinateur, il lance le processus du système : init.
Le processus init a comme particularité d'avoir le PID (Process IDentifiant) no 1 (c'est le premier processus), et de fait, il est le père de tous les autres.
Le processus init est lancé par le noyau pour démarrer les autres processus internes à ce dernier (noté entre crochet lorsque l'on fait ps aux), comme par exemple les processus kjournald qui gère les journaux des systèmes de fichiers journalisés. }}[1]
Le processus dispose d'un fichier de configuration, c'est le fichier /etc/inittab, contenant entre autres les runlevel, paramètres de init.
La syntaxe de ce fichier est la suivante :
code:niveau:action:commande
Exemple de fichier /etc/inittab[2] :
# Indique le runlevel par défaut (ici le 2)
id:2:initdefault:
# Script d'initiation du boot du système
si::sysinit:/etc/init.d/rcS
# mode mono-utilisateur
~~:S:wait:/sbin/sulogin
# runlevel 0 : arret du système
l0:0:wait:/etc/init.d/rc 0
# runlevel 1 : mono-utilisateur
l1:1:wait:/etc/init.d/rc 1
# runlevel 2 : multitâche sans réseau (runlevel par défaut sur Debian)
l2:2:wait:/etc/init.d/rc 2
# runlevel 3 : multitâche en réseau sans interface graphique
l3:3:wait:/etc/init.d/rc 3
# runlevel 4 : idem 3 mais pour la recherche
l4:4:wait:/etc/init.d/rc 4
# runlevel 5 : multitâche en réseau avec interface graphique et son
l5:5:wait:/etc/init.d/rc 5
# runlevel 6 : redémarrage du système
l6:6:wait:/etc/init.d/rc 6
# mode emergency
z6:6:respawn:/sbin/sulogin
# lance le reboot quand on appuie sur CTRL-ALT-DEL
ca:12345:ctrlaltdel:/sbin/shutdown -t1 -a -r now
# Pour les onduleurs
pf::powerwait:/etc/init.d/powerfail start
pn::powerfailnow:/etc/init.d/powerfail now
po::powerokwait:/etc/init.d/powerfail stop
# Démarre les ttys en mode console
1:2345:respawn:/sbin/getty 38400 tty1
2:23:respawn:/sbin/getty 38400 tty2
3:23:respawn:/sbin/getty 38400 tty3
4:23:respawn:/sbin/getty 38400 tty4
5:23:respawn:/sbin/getty 38400 tty5
6:23:respawn:/sbin/getty 38400 tty6
Les runlevels et les scripts de démarrage
[modifier | modifier le wikicode]Une fois que le système a effectué le runlevel S (initialisation minimale, comme par exemple vérifier l'intégrité des systèmes de fichiers), il va dans le runlevel 2 (Debian).
Les niveaux de Runlevel
- S : Initialisation commune à tous les runlevels
- 0 : Arrêt de la machine
- 1 : Single-User
- 2,3,4,5 : Fonctionnement normal
- 6 : Reboot de la machine
Les principe de fonctionnement est le suivant :
- tous les scripts de démarrage et d'arrêt sont stockés dans le répertoire /etc/init.d/.
- les répertoires rc0.d, rc1.d ... rc6.d contiennent des liens qui vont appeler les scripts d'initialisation.
- Si le lien commence par un S, le script va être appelé avec l'option start
- Si le lien commence par un K, le script va être appelé avec l'option stop
- le numéro qui suit le S ou le K indique l'ordre de démarrage ou d'arrêt.
Exemple, le serveur d'impression cupsys :
Le script de démarrage et d'arrêt est situé dans /etc/init.d :
$ ls -l /etc/init.d/cupsys -rwxr-xr-x 1 root root 1977 2007-02-02 14:18 /etc/init.d/cupsys
Le lien suivant indique qu'il faut appeller ce script avec l'option start dans le runlevel 2 (runlevel par défaut sous Debian) :
$ ls -l /etc/rc2.d/S20cupsys lrwxrwxrwx 1 root root 16 2007-10-24 15:40 /etc/rc2.d/S20cupsys -> ../init.d/cupsys
Le lien suivant indique qu'il faut appeller ce script avec l'option stop dans le runlevel 0 (arrêt de la machine) :
$ ls -l /etc/rc0.d/K20cupsys lrwxrwxrwx 1 root root 16 2007-10-24 15:40 /etc/rc0.d/K20cupsys -> ../init.d/cupsys
Pour lister les daemons (actifs et inactifs) :
service --status-all
La commande update-rc.d
[modifier | modifier le wikicode]Sous Debian, la commande update-rc.d permet de gérer les liens des runlevels.
Par exemple, pour enlever le démarrage automatique du serveur web apache :
# update-rc.d -f apache remove
Removing any system startup links for /etc/init.d/apache ...
/etc/rc0.d/K91apache
/etc/rc1.d/K91apache
/etc/rc2.d/S91apache
/etc/rc3.d/S91apache
/etc/rc4.d/S91apache
/etc/rc5.d/S91apache
/etc/rc6.d/K91apache
Pour re-activer le démarrage automatique du serveur web apache :
# update-rc.d apache defaults 91
Adding system startup for /etc/init.d/apache ...
/etc/rc0.d/K91apache -> ../init.d/apache
/etc/rc1.d/K91apache -> ../init.d/apache
/etc/rc6.d/K91apache -> ../init.d/apache
/etc/rc2.d/S91apache -> ../init.d/apache
/etc/rc3.d/S91apache -> ../init.d/apache
/etc/rc4.d/S91apache -> ../init.d/apache
/etc/rc5.d/S91apache -> ../init.d/apache
Pour connaitre la liste des options de la commande update-rc.d, il suffit de l’appeler sans argument :
# update-rc.d
usage: update-rc.d [-n] [-f] <basename> remove
update-rc.d [-n] <basename> defaults [NN | sNN kNN]
update-rc.d [-n] <basename> start|stop NN runlvl [runlvl] [...] .
-n: not really
-f: force
Pour activer Nginx :
sudo update-rc.d nginx enable
La commande chkconfig
[modifier | modifier le wikicode]attention : spécifique à REDHAT
Pour savoir en quel(s) runlevel est lancé un service (ie. postgresql)
# chkconfig --list postgresql
Pour positionner le lancement d'un service à un runlevel donné (ie. 3, 4 et 5)
# chkconfig --level 345 postgresql
Commandes pour manipuler les runlevel
[modifier | modifier le wikicode]La commande runlevel permet de connaître le runlevel dans lequel on est :
# runlevel N 2
Dans cet exemple, on est dans le runlevel n°2 (fonctionnement sous Debian). Le N nous indique le runlevel précédent (N (No) : pas de runlevel précédent)
La commande init ou la commande telinit permet de changer de runlevel. Exemple :
# init 6
Arrêter ou redémarrer le système
[modifier | modifier le wikicode]Pour arrêter le système :
- Commun à tous les UNIX : shutdown
- Spécifique Linux et systèmes récents : halt et reboot
# shutdown -h now "changement de noyau" &
NB : on rajoute un & pour garder la main
Il existe différentes options telles que :
- -h (h pour halt) : arrêt immédiat
- -r now (r pour reboot) : redémarrage immédiat
- -h +10 : arrêt différé dans 10 minutes
- -h 10:30 : arrêt à 10h30
- -c : annule l'arrêt
Références
[modifier | modifier le wikicode]- ↑ (en) Dr. Sam Liles, ICCWS2014- 9th International Conference on Cyber Warfare & Security: ICCWS 2014, Academic Conferences Limited, (lire en ligne)
- ↑ https://linuxonfire.wordpress.com/2012/10/19/what-are-init-0-init-1-init-2-init-3-init-4-init-5-init-6-2/