Blog ENI : Toute la veille numérique !
🐠 -25€ dès 75€ 
+ 7 jours d'accès à la Bibliothèque Numérique ENI. Cliquez ici
Accès illimité 24h/24 à tous nos livres & vidéos ! 
Découvrez la Bibliothèque Numérique ENI. Cliquez ici
  1. Livres et vidéos
  2. Linux
  3. Architecture du système GNU/Linux
Extrait - Linux Administration avancée - Maintenance et exploitation de vos serveurs (3e édition)
Extraits du livre
Linux Administration avancée - Maintenance et exploitation de vos serveurs (3e édition) Revenir à la page d'achat du livre

Architecture du système GNU/Linux

Vue d’ensemble

Il est important de bien connaître l’architecture et le fonctionnement du système d’exploitation pour en assurer l’installation, la configuration, l’exploitation et la maintenance.

Ce chapitre vous permettra d’étudier les différentes couches qui constituent le système GNU/Linux, de donner une définition aux termes et également de décrire leurs rôles respectifs.

1. Projet GNU

En 1984, Richard Stallman a initié le projet GNU financé par la FSF (Free Software Foundation) pour créer un système libre de type Unix qu’il a nommé GNU (GNU’s Not Unix). Il comprenait le compilateur GCC (GNU Compiler Collection), GNU Emacs, le shell Bash (Bourne Again Shell), des bibliothèques, etc.

Le noyau officiel Hurd a rencontré quelques difficultés dans son développement pour élaborer un système complet GNU/Hurd. Au début des années 90, le noyau Linux apparaît. Le système GNU intègre ce dernier et ainsi le système GNU/Linux est né sur la plate-forme x86. Plus simplement, nous l’appelons aujourd’hui Linux.

2. Distributions Linux

MCC Interim Linux, créée par Owen Le Blanc du Manchester Computing Centre (université de Manchester, Angleterre), est la première distribution capable de s’installer de façon...

Identifier la distribution

Nous allons parler des deux principales distributions du marché : Debian et Red Hat.

1. Debian

Debian est une distribution de logiciels libres à but non commercial, créée par Ian Murdock en 1993. Son organisation est basée sur une communauté démocratique.

Elle est composée de trois branches de développement :

  • unstable

  • testing

  • stable

Unstable

Debian SID (Still In Development) correspond toujours à la version non stable (unstable). Elle est constamment en évolution (rolling release).

Il n’est pas recommandé de l’utiliser en production. C’est une pré-version.

Testing

Debian Testing est la future version stable incluant des paquets suffisamment stables. Debian 10 Buster est l’actuelle version testing et Debian 11 Bullseye sera la future version.

Stable

La version stable de Debian porte un numéro de version et un nom de personnage du film d’animation Toy Story de Pixar : Debian 9 Stretch.

La version stable est mise à jour uniquement par correctifs de bogues ou de sécurité. C’est la version qu’il faut utiliser en production.

Cependant, les dépôts Backports officiellement supportés par Debian fournissent des versions de programmes plus récentes, mais avec le risque que ces derniers soient moins stables.

Si chaque programme qui constitue le système d’exploitation a respectivement...

Plates-formes matérielles

1. Sur quelles plates-formes ?

Le noyau Linux est porté sur une liste exhaustive de plates-formes matérielles 32 bits et 64 bits : X86, x86_64, IA-64, PowerPC, ARM et ARM64, etc.

Vous trouvez Linux sur des super-ordinateurs, des smartphones, des tablettes, des serveurs, des systèmes embarqués (télévision, modem, GPS...), et même si c’est plus rare, des stations de travail.

2. Identifier l’architecture matérielle

La commande uname propose trois options :

Option

Description

courte

longue

-m

--machine

Affiche l’architecture de la machine.

-p

--processor

Affiche le type de processeur.

-i

--hardware-platform

Affiche la plate-forme matérielle.

Pour connaître votre architecture matérielle, saisissez dans un terminal uname suivi du commutateur -i :

[root@system2 ~]# uname -i 
x86_64 

Les commutateurs -p et -m sont aussi des solutions.

Fedora, Red Hat et CentOS retournent des valeurs avec ces trois commutateurs. Quant à Debian, elle affiche « unknown » pour les commutateurs -i et -p. Vous pouvez dans ce cas utiliser le commutateur -m. Si la machine est x86_64, le processeur l’est également.

Anneaux de protection

Les systèmes d’exploitation utilisent généralement aujourd’hui des anneaux de protection (protection rings) qui offrent plusieurs niveaux de privilèges : du plus faible au plus élevé. Ces derniers sont créés par le processeur et non par le système d’exploitation.

Quand un programme s’exécute, le système d’exploitation lui attribue une zone de mémoire vive qui est affectée à un anneau de protection. L’intérêt est de faire une séparation entre les programmes sensibles, comme le noyau du système, et les programmes du ou des utilisateurs.

1. Commutation de contexte

Un programme contenu dans une zone mémoire qui est affectée à l’anneau 3 ne pourra pas accéder à une zone mémoire affectée à l’anneau 0.

Lorsqu’un processus utilisateur demande l’exécution d’une routine du système par le biais d’un appel système, ce processus quitte son mode courant d’exécution (mode utilisateur) pour passer en mode d’exécution système (mode superviseur). Ce passage constitue une « commutation de contexte ».

La commutation de contexte nécessite une opération de sauvegarde du contexte utilisateur puis un contexte noyau est ensuite chargé....

Chargeurs d’amorçage

1. Définition

Un chargeur d’amorçage (boot loader) est un programme qui permet de charger un système d’exploitation à la fois. Il peut proposer un menu pour offrir un choix de systèmes à démarrer. Dans ce cas, nous parlons de multi-boot.

Le micrologiciel BIOS va charger le MBR (Master Boot Record), c’est-à-dire les 512 premiers octets du disque. Ensuite, il va lire le VBR (Volume Boot Record) de la partition et trouver l’emplacement du chargeur d’amorçage.

Sur certains PC, ce n’est pas le micrologiciel BIOS mais le micrologiciel EFI qui localise le chargeur d’amorçage.

Par le passé, Linux avait le chargeur d’amorçage LILO (LInux Loader) développé par John Coffman sous licence BSD. Sa configuration était inscrite dans le fichier texte /etc/lilo.conf. GRUB (GRand Unified Bootloader) l’a maintenant remplacé.

Grub legacy

La version 1 de GRUB, développée sous licence GNU GPL version 3, est appelée GRUB legacy ou bien GRUB 0.9x. Elle gère d’autres systèmes que GNU/Linux ou Microsoft Windows tels que Hurd, OpenBSD, FreeBSD, NetBSD... et prend en charge le multi-boot. Elle peut charger une image de système d’exploitation sur un réseau en utilisant le protocole TFTP.

De façon transparente, GRUB supporte plusieurs systèmes de fichiers tels que FFS (BSD), FAT16, FAT32, Minix fs, ext2, ReiserFS, JFS, XFS... Il sait aussi décompresser automatiquement des fichiers avec gzip.

GRUB fournit une interface avec un menu qui liste les commandes de démarrage prédéfinies. Un délai d’attente réglable permet d’intervenir, sinon c’est la configuration par défaut qui est lancée. Il possède également une interface en ligne de commande pour changer les paramètres de démarrage.

Depuis Debian 5 (Lenny), le Grub version 1 est remplacé par la version 2. Quant à Red Hat, le remplacement est arrivé avec la RHEL7.

GRUB-PC

La version 2, appelée GRUB-PC, propose des évolutions notables. Elle intègre de nouveaux systèmes de fichiers comme ext4 ou btrfs. Elle offre la possibilité d’écrire des scripts avec des structures de contrôle (boucles, conditions...).

Noyau Linux

Un noyau (kernel) est un composant majeur au sein du système d’exploitation qui gère les ressources de l’ordinateur et sert d’interface entre le matériel et les programmes.

1. Composants du noyau

Le noyau Linux s’exécute dans l’anneau de protection 0 :

images/02EI06.png

Le noyau Linux est composé de six principaux sous-systèmes :

  • Le Process Management (PM) qui est chargé de répartir de façon équitable les accès au processeur entre toutes les applications actives.

  • Le Memory Management (MM) qui est chargé d’affecter à chaque programme une zone mémoire qui ne doit pas être lue ou modifiée par un autre processus.

  • Le Virtual File System (VFS) qui garantit une gestion correcte des fichiers et un contrôle des droits d’accès (ACL - Access Control List). Pour limiter la complexité liée aux nombreux systèmes de fichiers existants, il utilise des appels système identiques quel que soit le système de fichiers choisi. Le noyau Linux détourne les appels standards vers les appels spécifiques au système de fichiers.

  • L’Inter-Process Communication (IPC) permet à des applications de communiquer entre elles du fait qu’un processus ne peut accéder qu’à la zone mémoire qui lui a été allouée.

  • Le Device Driver (DD) gère les ressources matérielles avec des pilotes de périphériques (device drivers) et fournit aux programmes une interface uniforme pour l’accès à ces ressources.

  • Le Network Stack (NET) permet de se connecter à d’autres systèmes à travers un réseau informatique. De nombreux périphériques matériels sont supportés. Plusieurs protocoles réseau peuvent être utilisés comme IPX/SPX, TCP/IP version 4 ou 6...

2. Code source

Le noyau Linux, créé en 1991 par Linus Torvalds, est distribué sous les termes de la GNU General Public License (GNU GPL) version 2. Il existe deux branches de développement mainline et vanilla. Cette dernière est généralement utilisée par les distributions. Le téléchargement du code source s’effectue depuis le site web http://www.kernel.org.

Le code source est écrit...

Pilotes de périphériques

Un pilote de périphérique (device driver ou plus simplement driver) est un programme qui permet aux autres programmes du système de communiquer avec un périphérique.

GNU/Linux dispose de trois classes de pilotes :

  • En mode caractère (char drivers). Ils communiquent avec le périphérique par un flux d’octets tel que les ports séries et parallèles ou bien un terminal.

  • En mode bloc (block drivers). Ils communiquent par blocs de données avec le périphérique tel qu’un disque dur.

  • Réseau (net). Ils sont destinés à contrôler des ressources réseau.

1. Fichiers spéciaux

Les pilotes en mode caractère ou en mode bloc sont accessibles à travers des fichiers spéciaux appelés nœuds (nodes) qui sont situés dans le dossier /dev. Quant aux pilotes réseau, ils ne figurent pas dans ce dossier.

Pour visualiser le type de fichier, utilisez la commande ls :

Syntaxe

ls <option> <fichiers> 

L’option utilisée :

Option courte

Description

-l

Utilise un format d’affichage long.

Voici un exemple avec RHEL 7

[root@system2 ~]# ls -l /dev 
total 0 
crw-------. 1 root root     10, 235 24 oct.   21:46 autofs 
drwxr-xr-x. 2 root root         260 24 oct.   21:46 block 
drwxr-xr-x. 2 root root         120 24 oct.   21:46 bsg 
crw-------. 1 root root     10, 234 24 oct.   21:46 btrfs-control 
drwxr-xr-x. 3 root root          60 24 oct.   21:47 bus 
lrwxrwxrwx. 1 root root           3 24 oct.   21:46 cdrom -> sr0 
drwxr-xr-x. 2 root root        2800 24 oct.   21:47 char 
crw-------. 1 root root      5,   1 24 oct.   21:46 console 
lrwxrwxrwx. 1 root root          11 24 oct.   21:46 core -> /proc/kcore 
drwxr-xr-x. 3 root root          80 24 oct.   21:47 cpu 
crw-------. 1 root root     10,  61 24 oct.   21:46 cpu_dma_latency 
crw-------. 1...

Bibliothèques

Les programmes du système Linux sont principalement écrits en langage C. Ils sont composés de plusieurs fichiers de code source. La compilation produit un programme exécutable au format binaire. En vérité, nous avons quatre étapes :

1. La précompilation (pre-processing). Cette étape réalise plusieurs opérations de substitution sur le code source telles que la suppression des commentaires, l’inclusion des fichiers d’en-têtes *.h  dans chaque fichier source .c et le traitement des directives de compilation (#define, #ifdef, #pragma…).

2. La compilation (compiling). Le code source est transformé en assembleur, un langage machine qui reste lisible par un humain. Les fichiers ont une extension .s.

3. L’assemblage (assembling). Le code assembleur est ensuite transformé en code machine binaire qui ne peut pas être lu par un humain. Il faut prendre des outils pour désassembler. Les fichiers dits « objets » ont une extension .o.

4. L’édition des liens (linking). Le fichier objet produit par l’étape 3 demeure incomplet, il ne contient pas le code des fonctions telles que printf()... Ce code est présent dans une bibliothèque (library). L’édition des liens va réunir le fichier objet et les fonctions contenues dans les bibliothèques pour produire le programme complet, soit l’exécutable.

Les développeurs peuvent concevoir des routines (fonctions du langage C ou des méthodes et des classes du langage C++ par exemple) qu’ils vont invoquer plusieurs fois dans un ou plusieurs programmes. Ils vont donc compiler ces dernières dans des fichiers objets et les intégrer dans une bibliothèque logicielle. Les bibliothèques sont exécutées dans l’anneau de protection 3.

Nous avons deux types de bibliothèques :

  • les bibliothèques statiques (static libraries),

  • les bibliothèques partagées (dynamically linked shared object libraries).

1. Bibliothèques statiques

Une bibliothèque statique est un fichier avec l’extension .a qui se trouve généralement dans le répertoire /usr/lib. Elle est copiée dans les programmes qui l’utilisent pendant la construction de ces derniers. Vous obtenez...

Appels système

Les applications communiquent avec le noyau par le biais des appels système (system calls ou syscalls).

images/02EI07.png

Une application appelle des fonctions provenant d’une bibliothèque telle que la glibc qui, à leur tour via l’interface des appels système (SCI, System Calls Interface), demandent au noyau d’effectuer des tâches pour le compte de l’application. 

Le système Linux offre un peu plus de 350 appels système qui sont regroupés par catégories :

  • Gestion des processus

  • Gestion des signaux

  • Gestion du système de fichiers

  • Mécanisme de protection

  • Fonctions de minuterie et statistiques

Lorsqu’une application utilise, par exemple, la fonction printf() pour afficher une chaîne de caractères formatée dans une console, elle invoque la fonction write().

La section 2 des pages de manuel fournit la description des appels système :

[root@system2: ~]# man 2 intro 

Voici le résultat à l’écran :

images/02EI08N.png

Concernant Debian, les pages de manuel pour le développement ne sont pas forcément installées. Il faut installer le paquet manpages-dev ou pour la version française manpages-fr-dev :

root@system1:~# apt-get install manpages-dev 
Lecture des listes de paquets... Fait 
Construction de l'arbre des dépendances 
Lecture des informations d'état......

Gestion des services

Un service (dæmon ou démon) est un programme qui démarre lors du chargement du système d’exploitation et qui s’exécute en arrière-plan. Ces programmes peuvent être des serveurs web, de messagerie, de base de données, un pare-feu, entre autres...

Historiquement, les services étaient démarrés par le programme /sbin/init (System V initialization ou sysVinit) qui avait un fichier de configuration /etc/inittab. Nous disposions de plusieurs niveaux d’exécution.

Scott James Remnant de Canonical Ltd a, par la suite, développé upstart pour remplacer le dæmon sysVinit. Il est nativement intégré depuis la distribution Ubuntu 9.10 (Karmic Koala). Nous disposons également de plusieurs niveaux d’exécution.

Lennart Poettering a initié en 2010 le projet systemd ou « system dæmon » (le dæmon du système). Ce projet a suscité de vives controverses chez les développeurs Linux. L’objectif est de mieux appréhender la gestion d’un système multitâche, de gérer les dépendances entre les différents services lancés au démarrage avec comme intention d’optimiser les performances système. Il devient peu à peu le gestionnaire des services dans la plupart des distributions Linux.

À partir de Debian 8 (Jessie), systemd est le gestionnaire de service par défaut. L’adoption de ce dernier a provoqué une prise de position d’une partie des développeurs et utilisateurs de la communauté Debian. Ils partent du principe que systemd ne respecte pas le principe KISS (Keep It Simple and Stupid)... Donc, une distribution dérivée (fork) est née en novembre 2014 : Devuan. Elle propose par défaut sysVinit.

Red Hat proposait sysVinit par défaut dans ces distributions jusqu’à la version 5. La version 6 utilisait upstart pour la partie système. Cependant, les services ajoutés depuis les dépôts étaient gérés par sysVinit. Red Hat 7 contient de base systemd.

En conclusion, Debian 9 et Red Hat 7 utilisent tous deux systemd avec une prise en charge de sysVinit pour assurer une compatibilité.

1. System V init

Le noyau lance le premier processus...

Journaux système

Les journaux système de Debian 9 et de Red Hat Enterprise Linux 7 sont gérés par le service systemd-journald qui retransmet les événements au service rsyslogd pour assurer une compatibilité antérieure. Nous pouvons donc nous attendre à la disparition de rsyslogd dans de prochaines versions de Debian ou Red Hat.

1. Service rsyslogd

Les distributions Linux disposaient historiquement du service syslog pour gérer les journaux système. Il a été remplacé par rsyslog qui apporte quelques améliorations, notamment les événements qui peuvent être écrits dans une base de données comme MariaDB ou PostgreSQL, l’utilisation de son propre protocole RELP (Reliable Event Logging Protocol) au lieu de UDP (User Datagram Protocol), etc. rsyslogd reprend cependant les règles de syslog.

Le programme qui s’exécute en tant que dæmon dans le système est /usr/sbin/rsyslogd et le répertoire des journaux est /var/log.

Debian et Red Hat n’ont pas exactement les mêmes journaux système.

Les journaux spécifiques à Debian 9 :

Journal

Format

Description

alternatives.log

texte

Information des update-alternatives.

L’update-alternatives gère des liens symboliques déterminant les commandes par défaut.

apt

dossier

Informations sur la commande apt.

auth.log

texte

Informations d’autorisation du système, c’est-à-dire les connexions des utilisateurs et des services. 

btmp

binaire

Informations sur les tentatives de connexion infructueuses. Commande :

last -f /var/log/btmp | less

cups

dossier

Informations sur le dæmon Common unix Printing System.

daemon.log

texte

Informations sur les dæmons du système.

debug

texte

Informations sur le débogage de toutes les installations. 

dpkg.log

texte

Informations sur l’installation des paquets .deb.

faillog

binaire

Informations sur les échecs de connexion.

Commande :

faillog -a

fontconfig.log

texte

Informations sur la bibliothèque logicielle pour X Window System qui permet de configurer les polices de caractères.

hp

dossier

Informations concernant HP.

installer

dossier

Informations sur l’installation du système.

kern.log

texte

Informations du noyau Linux.

lastlog

binaire

Affiche les informations...

Shell

Un shell est un programme qui sert d’interface entre l’utilisateur et le système d’exploitation. Il existe deux formes distinctes :

  • l’interpréteur de lignes de commandes (CLI ou Command Line Interface),

  • le shell graphique (GUI ou Graphical User Interface).

1. Différents shells

Plusieurs shells CLI existent pour GNU/Linux. Choisir un shell plutôt qu’un autre dépend généralement des besoins, à savoir des fonctionnalités qu’il offre, de son occupation disque ou en mémoire vive.

a. Bourne Shell

Le Bourne Shell, conçu par Stephen Bourne, était le shell par défaut d’Unix version 7 en 1977. Il remplaçait le Thompson Shell de Kenneth Lane Thompson, le créateur d’Unix. Le fichier exécutable porte le même nom : sh.

Du fait que Bourne Shell n’est pas open source, le fichier /bin/sh est un lien symbolique vers le Dash (Debian Almquist Shell) dans les distributions Debian et Ubuntu.

Pour vérifier à quoi correspond sh, tapez ceci :

#ls -l $(which sh) 
lrwxrwxrwx 1 root root 4 janv. 24 2017 /bin/sh -> dash 

Quant à Red Hat, le lien symbolique pointe vers le Bash (Bourne Again shell) :

#ls -l $(which sh)  
lrwxrwxrwx 1 root root 4 25 oct. 13:57 /bin/sh -> bash 

b. Almquist Shell et Debian Almquist Shell

Almquist Shell (A Shell ou Ash) est un shell dérivé...

Applications

Les programmes compilés sont écrits dans un langage de programmation C, C++, Java, FreePascal, etc. Les programmes interprétés sont écrits en TCL/TK, Perl, Python, Ruby...

Le développement d’une application graphique est basé sur une bibliothèque comme GTK+ (The Gimp ToolKit) qui a permis de développer les bureaux gnome, xfce... ou Qt (prononcez « cute » et non la lettre Q puis la lettre T) qui a permis de développer le bureau KDE. Sur les serveurs, il est rare de voir une interface graphique. Ceci est plutôt réservé aux stations de travail.

Des applications console peuvent, quant à elles, utiliser la bibliothèque ncurses (New Curses) qui propose principalement la gestion de fenêtres, huit couleurs différentes, la gestion de la souris et la gestion des touches de fonction du clavier. On peut penser aux programmes htop, Midnight commander...

Bien sûr, il existe d’autres bibliothèques comme Newt (Not Erik’s Windowing Toolkit), développée par Erik Troan, qui sont utilisées pour écrire le programme whiptail, ou les outils TUI (Text-based User Interface) comme nmtui.

Les programmes binaires sont sur 32 bits ou 64 bits. La commande file permet d’identifier son modèle de compilation.

Syntaxe

file <chemin/nom_du_fichier> 

Exemple

Savoir si le programme ls est 32 ou 64 bits.

[root@system2 ~]# file /bin/ls 
/bin/ls: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), 
dynamically linked (uses shared libs), for GNU/Linux 2.6.32,  
BuildID[sha1]=c5ad78cfc1de12b9bb6829207cececb990b3e987, stripped 

Vous lisez « ELF 64-bit LSB executable, x86-64 » dans le résultat.

1. Pages de manuel

Les pages de manuel, connues sous le nom de « man pages », constituent la documentation de référence pour l’utilisateur, l’administrateur et le programmeur.

Si le paquet n’est pas installé, il se nomme manpages pour Debian et man-pages pour Red Hat. Vous pouvez aussi l’installer en français....

Exercice

L’objectif est d’identifier les différents composants du système.

1. Avant de commencer, ouvrez une console sur la machine virtuelle system1. Puis, identifiez-vous en tant que root.

2. Identifiez, à l’aide de plusieurs commandes, les informations suivantes :

  • l’architecture matérielle,

  • la version du noyau,

  • la liste des modules de noyau qui sont chargés,

  • le nom et la version du shell,

  • la version de GRUB,

  • la version de la distribution Linux,

  • la liste des services démarrés,

  • l’unité cible activée par défaut.