Le système d'exploitation GNU-Linux/Le processus d'initialisation

Le chargement du noyau Linux modifier

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

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

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.

À faire... 

parler du initrd

Messages du noyau Linux modifier

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

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

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

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

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


À faire... 

parler du modèle de script d'initialisation /etc/init.d/skeleton

Commandes pour manipuler les runlevel modifier

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

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

  1. (en) Dr. Sam Liles, ICCWS2014- 9th International Conference on Cyber Warfare & Security: ICCWS 2014, Academic Conferences Limited, (lire en ligne)
  2. https://linuxonfire.wordpress.com/2012/10/19/what-are-init-0-init-1-init-2-init-3-init-4-init-5-init-6-2/