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

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

## Le chargement du noyau Linux

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

LILO (LInux LOader) a été le premier logiciel permettant d'effectuer cette opération.
Exemple de fichier de configuration de Lilo (/etc/lilo.conf) :
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.

### GRUB

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)
À la différence de Lilo, il n'est pas nécessaire d'exécuter une commande particulière lorsque l'on modifie ce fichier.
parler du initrd

### Messages du noyau Linux

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

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) n$^o$ 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. }}
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 :

## Les runlevels et les scripts de démarrage

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 :
Le lien suivant indique qu'il faut appeller ce script avec l'option start dans le runlevel 2 (runlevel par défaut sous Debian) :
Le lien suivant indique qu'il faut appeller ce script avec l'option stop dans le runlevel 0 (arrêt de la machine) :
Pour lister les daemons (actifs et inactifs) :

### La commande update-rc.d

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 :
Pour re-activer le démarrage automatique du serveur web apache :
Pour connaitre la liste des options de la commande update-rc.d, il suffit de l’appeler sans argument :
Pour activer Nginx :

### La commande chkconfig

attention : spécifique à REDHAT
Pour savoir en quel(s) runlevel est lancé un service (ie. postgresql)
Pour positionner le lancement d'un service à un runlevel donné (ie. 3, 4 et 5)
parler du modèle de script d'initialisation /etc/init.d/skeleton

## Commandes pour manipuler les runlevel

La commande runlevel permet de connaître le runlevel dans lequel on est :
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 :

## Arrêter ou redémarrer le système

Pour arrêter le système :
* Commun à tous les UNIX : shutdown
* Spécifique Linux et systèmes récents : halt et reboot
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

* ↑ (en) Dr. Sam Liles, ICCWS2014- 9th International Conference on Cyber Warfare & Security: ICCWS 2014, Academic Conferences Limited, 24 mars 2014 (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/