Product SiteDocumentation Site

Chapitre 9. Services Unix

9.1. Démarrage du système
9.2. Connexion à distance
9.2.1. Connexion à distance sécurisée : SSH
9.2.2. Accéder à distance à des bureaux graphiques
9.3. Gestion des droits
9.4. Interfaces d'administration
9.4.1. Administrer sur interface web : webmin
9.4.2. Configuration des paquets : debconf
9.5. Les événements système de syslog
9.5.1. Principe et fonctionnement
9.5.2. Le fichier de configuration
9.6. Le super-serveur inetd
9.7. Planification de tâches : cron et atd
9.7.1. Format d'un fichier crontab
9.7.2. Emploi de la commande at
9.8. Planification asynchrone : anacron
9.9. Les quotas
9.10. Sauvegarde
9.10.1. Sauvegarde avec rsync
9.10.2. Restauration des machines non sauvegardées
9.11. Branchements « à chaud » : hotplug
9.11.1. Introduction
9.11.2. La problématique du nommage
9.11.3. Fonctionnement de udev
9.11.4. Cas pratique
9.12. Gestion de l'énergie : Advanced Configuration and Power Interface (ACPI)
Ce chapitre parcourt un ensemble de services fondamentaux, souvent communs à beaucoup d'Unix. Tout administrateur se doit de les connaître.

9.1. Démarrage du système

Lorsque l'ordinateur démarre, les messages défilant sur la console révèlent de nombreuses initialisations et configurations automatiques. Parfois, il est souhaitable de modifier légèrement le déroulement de cette étape, ce qui implique de bien la comprendre. C'est l'objet de cette section.
En tout premier lieu, le BIOS prend le contrôle de l'ordinateur, détecte les disques, charge le Master Boot Record (enregistrement d'amorçage maître) et l'exécute. Le chargeur d'amorçage prend alors le relais, trouve le noyau sur le disque, le charge et l'exécute. Le noyau s'initialise alors et se met en devoir de trouver et monter la partition contenant la racine de l'arborescence pour enfin démarrer le premier programme : init. Il est fréquent que cette « partition racine » et cet init soient en réalité sur un système de fichiers virtuel qui n'existe qu'en mémoire vive (d'où son nom initramfs, anciennement appelé initrd pour initialization RAM disk). Ce système de fichiers est chargé en mémoire par le chargeur d'amorçage, souvent à partir d'un fichier sur un disque dur ou sur le réseau. Il contient le strict minimum qui peut être requis par le noyau pour charger le « vrai » système de fichiers racine : il peut s'agir de modules de pilotes pour les disques durs ou d'autres périphériques sans lesquels le système ne peut pas démarrer, ou, plus fréquemment, des modules et des scripts d'initialisation permettant d'assembler des grappes RAID, d'ouvrir des partitions chiffrées, d'activer des volumes LVM… Une fois que la partition racine est montée, l'initramfs passe la main au vrai init et on revient sur le processus de démarrage standard.
Le « vrai init » est actuellement fourni par sysv-rc (« System V »), sur lequel cette section se focalise.
Celui-ci exécute tout un ensemble de processus en suivant les indications du fichier /etc/inittab. Le premier programme exécuté (correspondant à l'étape sysinit) est /etc/init.d/rcS, script qui exécute tous les programmes du répertoire /etc/rcS.d/.
Parmi ceux-ci, on trouve successivement :
  • la configuration du clavier de la console ;
  • le chargement des pilotes : la plupart des modules noyau sont chargés par le noyau lui-même en fonction du matériel détecté ; certains pilotes peuvent ensuite être systématiquement chargés, les modules correspondants doivent être listés dans /etc/modules ;
  • la vérification de l'intégrité des systèmes de fichiers ;
  • le montage des partitions locales ;
  • la configuration du réseau ;
  • le montage des systèmes de fichiers distants (NFS).
Après cette phase, init reprend la main et démarre les programmes associés au niveau d'exécution (runlevel) normal, soit par défaut le niveau 2. Il exécute /etc/init.d/rc 2, script qui démarre tous les services donnés du répertoire /etc/rc2.d/ débutant par la lettre « S ». Le nombre (à deux chiffres) qui suit servait historiquement à classer les services pour les démarrer dans le bon ordre, mais de nos jours le système de démarrage par défaut utilise insserv, un système de démarrage où l'ordonnancement se fait en fonction des dépendances entre scripts. Chaque script de démarrage déclare ainsi les contraintes qui s'appliquent à lui (par exemple, s'il doit démarrer avant ou après tel autre service) ; init les lance alors dans un ordre qui satisfait les contraintes. La numérotation statique des scripts n'est donc plus prise en compte (mais ils doivent toujours s'appeler d'un nom composé d'un « S » suivi de deux caractères, suivis à leur tour du véritable nom du script utilisé pour les dépendances). D'une manière générale, les services de base (comme le service de collecte des journaux, rsyslog, ou celui d'attribution des ports, portmap) sont démarrés en premier, suivis par les services standards et l'interface graphique (gdm).
Ce système de démarrage par dépendances permet d'automatiser des renumérotations qui pourraient s'avérer fastidieuses si elles devaient être faites manuellement et il prévient les erreurs humaines, puisque l'ordonnancement se fait en fonction des contraintes exprimées. Il présente également l'avantage supplémentaire de permettre le démarrage de plusieurs services en parallèle, si plusieurs scripts sont indépendants entre eux, ce qui peut accélérer la séquence de démarrage.
init distingue plusieurs niveaux d'exécution car il peut basculer de l'un à l'autre par la commande telinit nouveau-niveau. Dès son invocation, init exécute à nouveau /etc/init.d/rc avec le nouveau niveau d'exécution désiré, script qui démarre à son tour les services manquants et arrête ceux qui ne sont plus souhaités. Pour cela, il se réfère au contenu du répertoire /etc/rcX.d (où X représente le nouveau niveau d'exécution). Les scripts débutant par « S » (comme Start) sont des services à démarrer, ceux débutant par « K » (comme Kill) sont des services à stopper. Le script évite de redémarrer tout service déjà actif dans le niveau d'exécution précédent.
Debian utilise par défaut quatre runlevels différents :
  • Le niveau 0 n'est utilisé que de manière transitoire, lors de la phase d'extinction de l'ordinateur. Il contient donc de nombreux scripts « K ».
  • Le niveau 1, aussi connu sous le nom de single-user, correspond au système en mode dégradé ; il ne contient que les services de base et est prévu pour les opérations de maintenance en dehors de l'interaction des utilisateurs.
  • Le niveau 2 est le niveau de fonctionnement normal, qui inclut les services réseau, l'interface graphique, les connexions des utilisateurs, etc.
  • Le niveau 6 est similaire au niveau 0, à ceci près qu'il est utilisé lors de la phase d'extinction qui précède un redémarrage.
D'autres niveaux existent, notamment de 3 à 5. Ils sont par défaut configurés pour fonctionner de la même manière que le niveau 2, mais l'administrateur peut les modifier (en ajoutant ou supprimant des scripts dans les répertoires /etc/rcX.d/ correspondants) pour les adapter à un besoin particulier.
Étapes du démarrage d'un ordinateur sous Linux

Figure 9.1. Étapes du démarrage d'un ordinateur sous Linux

Tous les scripts contenus dans les différents répertoires /etc/rcX.d ne sont que des liens symboliques, créés à l'installation du paquet concerné par le programme update-rc.d, et menant vers les scripts réels, stockés sous /etc/init.d/. Pour adapter à sa guise les services à démarrer ou à stopper à chaque niveau d'exécution, l'administrateur exécutera à nouveau le programme update-rc.d en lui fournissant les paramètres adéquats. La page de manuel update-rc.d(1) en détaille la syntaxe précise. Signalons au passage que supprimer tous les liens symboliques (avec le paramètre remove) n'est pas la bonne méthode pour désactiver un service. Il faut simplement le configurer pour ne pas démarrer dans les niveaux d'exécution souhaités (tout en conservant les appels correspondants pour l'arrêter au cas où le service tournait dans le niveau d'exécution précédent). L'utilisation d'update-rc.d étant quelque peu alambiquée, on pourra utiliser rcconf (du paquet rcconf) pour se voir présenter une interface plus simple à manipuler.
Enfin, init démarre les programmes de contrôle des différentes consoles virtuelles (getty). Ils affichent une invite, attendent un nom d'utilisateur, puis exécutent login utilisateur pour démarrer une session.