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

Un livre de Wikilivres.
Aller à : navigation, rechercher


  1. Qu'est-ce qu'un système d'exploitation ?
  2. Unix et Linux
  3. Partitionnement du disque
  4. Installation
    1. Installer Debian via le réseau
  5. Utilisateur Unix, l'interface console
    1. Le login
    2. Commandes de base
    3. L'aide en ligne man
    4. L'éditeur de texte vi
    5. Les shells
    6. La complétion
    7. Les jokers
    8. Les répertoires importants
    9. Redirection des entrées/sorties
    10. Invoquer un programme en tâche de fond
    11. Propriétaires et droits d'accès
    12. Processus
    13. Locale
  6. Administration du système
    1. Configuration du réseau
    2. Les utilisateurs et groupes
    3. Le processus d'initialisation
    4. Les systèmes de fichiers
    5. Le système virtuel /proc
    6. Les périphériques /dev
    7. L'ordonnanceur de travaux cron
    8. Le backup : tar et gzip
    9. ghost avec partimage
    10. sauvegarde de fichiers avec rsync
    11. Les fichiers journaux syslog
    12. Installation de nouveaux logiciels
    13. Le noyau Linux et les modules
    14. Autres commandes utiles
    15. Installation RAID1 logiciel + LVM + XFS
    16. Scripts de surveillance
    17. Réseaux sans fil
  7. Administration des services réseaux
    1. Le serveur de noms BIND
    2. Le serveur de configuration réseau DHCP
    3. Le serveur de shell distant SSH
    4. Le partage de fichiers Samba
    5. Le partage de fichiers NFS
    6. Le serveur d'impression CUPS
    7. Le serveur de fichiers FTP
    8. Le serveur Web Apache
    9. La base de données MySQL
    10. Le serveur de mails Postfix
    11. Les annuaires LDAP
    12. L'outil d'administration Webmin
    13. La supervision
  8. Sécurisation d'un serveur Linux
    1. Installation d'un service en mode chroot
    2. Protection avec iptables
  9. Médiagraphie
  10. Auteurs


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

A la différence de Lilo, il n'est pas nécessaire d'exécuter une commande particulière lorsque l'on modifie ce fichier.

link={{{link}}}À faire...

parler du initrd

les 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)
 ...

A 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 (cad 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 appeller les scripts d'initialisation.
  • Si le lien commence par un S, le script va etre appellé avec l'option start
  • Si le lien commence par un K, le script va etre appellé 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

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'appeller 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

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


link={{{link}}}À faire...

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

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 systeme :

  • 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