Install Linux
Install Linux
de Linux
Christian Casteyde
Guide d’installation et de configuration de Linux
par Christian Casteyde
Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.1 or any
later version published by the Free Software Foundation; with no Invariant Sections, with no Front-Cover Texts, and with no Back-Cover Texts.
A copy of the license is included in the section entitled "GNU Free Documentation License".
Permission vous est donnée de copier, distribuer et modifier ce document selon les termes de la licence GNU pour les documentations libres,
version 1.1 ou toute autre version ultérieure publiée par la Free Software Foundation.
Une copie de cette licence est incluse dans l’annexe intitulée "Licence de Documentation Libre GNU".
iv
Utilisation des ACLs.....................................................................................................71
vi, l’éditeur de fichiers de base.........................................................................................................73
Utilisation du shell bash ...................................................................................................................75
Contrôle des processus ...........................................................................................................76
Lancement d’un programme en arrière-plan.................................................................76
Listing des processus ....................................................................................................77
Notion de signal ............................................................................................................77
Arrêt d’un processus .....................................................................................................78
Gel d’un processus........................................................................................................79
Relancement d’un processus.........................................................................................79
Redirections............................................................................................................................79
Principe de base ............................................................................................................80
Redirections de données en entrée................................................................................80
Redirection de données en sortie ..................................................................................81
Insertion de documents .................................................................................................83
Les tubes.................................................................................................................................83
Syntaxe des tubes..........................................................................................................83
Les tubes nommés.........................................................................................................85
La commande tee ..........................................................................................................86
La commande xargs ......................................................................................................87
Manipulation des variables d’environnement.........................................................................87
Caractère d’échappement et chaînes de caractères.................................................................92
Les substitutions .....................................................................................................................94
Génération de chaînes de caractères selon un motif .....................................................94
Substitution du nom d’utilisateur..................................................................................94
Remplacements de variables.........................................................................................95
Substitution du résultat d’une commande.....................................................................97
Évaluation d’expressions arithmétiques........................................................................98
Substitution de commandes ..........................................................................................98
Découpage en mots .......................................................................................................99
Remplacement des caractères génériques...................................................................100
Les expressions rationnelles .................................................................................................100
Structures de contrôle ...........................................................................................................101
Les instructions composées.........................................................................................101
Les tests.......................................................................................................................103
Le branchement conditionnel......................................................................................106
Les boucles..................................................................................................................107
Les itérations...............................................................................................................108
Les ruptures de séquence ............................................................................................108
Les fonctions...............................................................................................................109
Les entrées / sorties de données ..................................................................................110
Les alias ................................................................................................................................111
Les scripts shell ....................................................................................................................112
v
6. Administration du système de base..................................................................................................114
Sauvegarde de la configuration d’installation ................................................................................114
Mise à l’heure du système..............................................................................................................115
Gestion des utilisateurs et de la sécurité ........................................................................................118
Mécanismes d’authentification des utilisateurs ....................................................................119
Création et suppression des utilisateurs................................................................................121
Description de la bibliothèque PAM ....................................................................................124
Gestion des paquetages ..................................................................................................................127
Le gestionnaire de paquetages rpm ......................................................................................127
Le gestionnaire de paquetages apt........................................................................................128
Le gestionnaire de paquetages pkgtool.................................................................................130
Notion de niveau d’exécution et amorçage du système .................................................................131
Maintenance des systèmes de fichiers............................................................................................133
Création des systèmes de fichiers .........................................................................................133
Montage des systèmes de fichiers.........................................................................................134
Démontage des systèmes de fichiers ....................................................................................136
Vérification des systèmes de fichiers....................................................................................137
Configuration du montage des systèmes de fichiers.............................................................140
Montage des systèmes de fichiers à la demande ..................................................................143
Gestion des volumes ......................................................................................................................146
Gestion des fichiers images ..................................................................................................146
Agrégation de volumes.........................................................................................................147
Chiffrement des systèmes de fichiers ...................................................................................149
Configuration des terminaux virtuels .............................................................................................150
Configuration de la console............................................................................................................153
Pages de codes et Unicode....................................................................................................153
Principe de fonctionnement du clavier .................................................................................154
Principe de fonctionnement de l’écran de la console ...........................................................157
Configuration du clavier .......................................................................................................159
Définition de scancodes ..............................................................................................159
Définition d’un plan de clavier ...................................................................................162
Modification des paramètres du clavier ......................................................................166
Choix de la police de caractères ...........................................................................................167
Configuration des paramètres du terminal............................................................................168
Description des terminaux....................................................................................................169
Paramétrage des applications................................................................................................173
Configuration du clavier pour la bibliothèque readline ..............................................173
Configuration du clavier pour vi .................................................................................174
Configuration du clavier pour less ..............................................................................177
Configuration de la souris.....................................................................................................179
Configuration de l’imprimante.......................................................................................................180
Concepts de base de l’impression sous Unix .......................................................................181
Le système d’impression LPRng..........................................................................................181
Le mécanisme des filtres APSFILTER .......................................................................182
Installation des filtres et configuration des files d’impression ....................................183
Commandes d’impression...........................................................................................184
Description du fichier /etc/printcap.............................................................................185
Le système d’impression CUPS ...........................................................................................186
vi
Le mécanisme des filtres de CUPS .............................................................................186
Configuration d’une imprimante CUPS......................................................................187
Les fichiers de configuration de CUPS .......................................................................188
Configuration du lancement automatique des tâches .....................................................................190
Gestion de l’énergie .......................................................................................................................192
Généralités sur la gestion de l’énergie..................................................................................192
Configuration de la gestion de l’énergie...............................................................................193
Le démon ACPI ....................................................................................................................194
7. Notions de compilation et configuration du noyau .........................................................................197
Notions de base ..............................................................................................................................197
Définition des termes............................................................................................................197
Processus de génération........................................................................................................201
Compilation de GCC......................................................................................................................203
Prérequis ...............................................................................................................................204
Installation des sources.........................................................................................................205
Configuration........................................................................................................................205
Compilation ..........................................................................................................................206
Installation de GCC ..............................................................................................................206
Compilation du noyau Linux .........................................................................................................207
Installation des sources de Linux .........................................................................................207
Choix des options de configuration du noyau ......................................................................209
Compilation et installation du noyau....................................................................................210
Compilation et installation des modules...............................................................................212
8. Configuration du matériel et des périphériques .............................................................................213
Généralités sur le support matériel sous Linux ..............................................................................213
Notion de fichiers spéciaux de périphériques.......................................................................213
Modules du noyau ................................................................................................................214
Chargement et déchargement des modules.................................................................214
Options des modules ...................................................................................................215
Chargement automatique des modules .......................................................................216
Configuration des périphériques intégrés au noyau..............................................................219
Périphériques connectables à chaud .....................................................................................220
Agents hotplug ............................................................................................................220
Chargements des modules par hotplug .......................................................................221
Chargement des firmwares..........................................................................................222
Création automatique des fichiers spéciaux de périphériques..............................................223
Avantages d’udev ........................................................................................................223
Principe de fonctionnements de udev .........................................................................224
Persistance des fichiers spéciaux de périphériques.....................................................225
Initialisation du système .............................................................................................227
Configuration des périphériques de masse.....................................................................................228
Configuration des périphériques SCSI .................................................................................228
Configuration des disques durs IDE .....................................................................................229
Installation d’un graveur de CD/DVD..................................................................................231
Notions de base sur le gravage sous Linux .................................................................232
Configuration du noyau...............................................................................................232
Configuration des modules du noyau..........................................................................233
vii
Installation des logiciels de gravage ...........................................................................234
Utilisation des logiciels de gravage ............................................................................234
Configuration des cartes filles ........................................................................................................238
Généralités sur les cartes ISA, Plug And Play et PCI ..........................................................238
Configuration des cartes son.................................................................................................242
Fonctionnalités du matériel.........................................................................................242
Configuration du noyau...............................................................................................242
Configuration des modules du noyau..........................................................................244
Ajustage des paramètres audio avec ALSA................................................................245
Fichiers MIDI et synthétiseurs logiciels .....................................................................247
Installation d’une carte graphique 3D ..................................................................................249
Installation d’une carte d’acquisition vidéo .........................................................................251
Configuration des cartes réseau ............................................................................................254
Configuration des adaptateurs Wifi ......................................................................................254
Configuration des ports de communication ...................................................................................258
Prise en charge des périphériques ISA standards .................................................................258
Configuration du port parallèle ...................................................................................258
Configuration des ports série ......................................................................................259
Installation des périphériques USB ......................................................................................261
Installation des périphériques IEEE1394 .............................................................................263
Configuration du noyau...............................................................................................263
Installation des bibliothèques complémentaires .........................................................264
9. Configuration du réseau....................................................................................................................266
Notions de réseau TCP/IP ..............................................................................................................266
Généralités sur les réseaux ...................................................................................................266
Le protocole IP .....................................................................................................................267
Le protocole TCP .................................................................................................................274
Les protocoles de haut niveau ..............................................................................................276
Configuration du réseau sous Linux...............................................................................................277
Configuration statique des interfaces réseau ........................................................................277
Définition des règles de routage ...........................................................................................279
Définition du nom de la machine..........................................................................................281
Résolution des noms de domaine .........................................................................................281
Utilisation des protocoles DHCP et BOOTP........................................................................283
Autoconfiguration des clients DHCP et BOOTP........................................................284
Configuration d’un client DHCP au niveau utilisateur ...............................................284
Définition des protocoles de haut niveau..............................................................................286
Les super-démons inetd et xinetd .........................................................................................287
Le super-démon inetd .................................................................................................288
Le super-démon xinetd ...............................................................................................289
Configuration de la connexion à Internet .......................................................................................294
Le protocole PPP ..................................................................................................................294
Création d’une connexion à Internet ....................................................................................295
Connexion à l’ADSL ............................................................................................................300
Les autres outils de connexion..............................................................................................303
Configuration d’un cache de DNS........................................................................................303
Installation d’un proxy HTTP ..............................................................................................306
viii
Pare-feu et partages de connexion à Internet .................................................................................310
Mécanismes de filtrage du noyau .........................................................................................310
Translations d’adresses et masquerading .............................................................................312
Trajet des paquets dans le code de Netfilter .........................................................................314
Configuration du noyau et installation des outils .................................................................315
Utilisation d’iptables ............................................................................................................317
Manipulation des chaînes............................................................................................317
Manipulation des règles ..............................................................................................317
Exemple de règles.................................................................................................................319
Exemple de règles de filtrage ......................................................................................319
Exemple de partage de connexion à Internet ..............................................................322
Configuration des clients ......................................................................................................324
Configuration de la sécurité du réseau ...........................................................................................325
Limitation des services et des accès .....................................................................................326
Réduction du nombre des services..............................................................................326
Définition de règles de contrôle d’accès .....................................................................327
Restrictions d’accès avec tcpd...........................................................................327
Restrictions d’accès avec xinetd........................................................................328
Contrôle des utilisateurs au niveau des services .........................................................329
Chiffrement des communications.........................................................................................330
Principes de base de cryptographie.............................................................................331
Utilisation de SSH ......................................................................................................334
Principes de base de l’authentification SSH......................................................335
Compilation et installation d’OpentSSH...........................................................336
Configuration d’OpenSSH côté serveur ............................................................337
Utilisation d’OpenSSH côté client ....................................................................339
Création d’un tunnel SSH .................................................................................341
Utilisation d’IPSec ......................................................................................................342
Fonctionnement d’IPSec ...................................................................................342
Configuration manuelle d’IPSec en mode transport .........................................344
Configuration manuelle d’IPSec en mode tunnel..............................................346
Autoconfiguration avec ISAKMP .....................................................................348
Configuration des fonctions serveur...............................................................................................352
Paramétrage des connexions extérieures ..............................................................................352
Configuration des liaisons PPP.............................................................................................354
Liaison de deux ordinateurs par un câble série ....................................................................358
Configuration d’un serveur DHCP .......................................................................................359
Systèmes de fichiers en réseau .......................................................................................................360
Installation d’un serveur de fichiers NFS .............................................................................361
Configuration d’un client NFS .............................................................................................365
Installation d’un serveur de fichiers SMB ............................................................................366
Configuration d’un client SMB ............................................................................................374
10. Installation de XWindow.................................................................................................................378
Généralités sur XWindow ..............................................................................................................379
Configuration de [Link]...................................................................................................................382
Génération automatique du fichier [Link] .......................................................................383
Utilisation de xorgconfig ......................................................................................................383
ix
Utilisation de xorgcfg ...........................................................................................................386
Configuration en mode graphique...............................................................................386
Configuration en mode texte.......................................................................................389
Description du fichier [Link]...........................................................................................391
Structure générale du fichier [Link].......................................................................391
Section « Files »..........................................................................................................393
Section « ServerFlags » ..............................................................................................394
Section « Module » .....................................................................................................394
Section « InputDevice »..............................................................................................395
Sections « Device ».....................................................................................................397
Sections « Monitor »...................................................................................................398
Sections « Modes » .....................................................................................................407
Sections « Screen » .....................................................................................................408
Sections « ServerLayout » ..........................................................................................409
Informations utilisées lors du démarrage de [Link]...............................................................411
Utilisation de xvidtune .........................................................................................................411
Utilisation du pilote frame buffer du noyau ...................................................................................412
Configuration du noyau et installation du pilote ..................................................................413
Configuration du serveur X ..................................................................................................414
Configuration des terminaux X ......................................................................................................415
Principe de fonctionnement de xdm .....................................................................................416
Configuration de xdm ...........................................................................................................416
Serveurs X locaux .......................................................................................................417
Serveurs X utilisant XDMCP......................................................................................418
Paramétrage du serveur X pour utiliser le protocole XDMCP ...................................421
Fichiers d’initialisation de sessions ............................................................................421
Paramétrage des terminaux X...............................................................................................422
La commande xset ......................................................................................................423
Configuration de la disposition du clavier ..................................................................424
Paramétrage des applications et ressources X................................................................................426
Gestion de la sécurité sous XWindow............................................................................................429
La commande xhost..............................................................................................................430
La commande xauth .............................................................................................................430
Gestion des polices de caractères...................................................................................................431
Gestion des polices de caractères sous XWindow................................................................432
Installation des polices Truetype ..........................................................................................434
Configuration du serveur X.........................................................................................435
Configuration des polices Truetype pour l’impression ...............................................436
Conversion des polices Truetype en polices Adobe de Type 42 .......................437
Installation des polices Truetype pour GhostScript ..........................................438
Configuration d’un serveur de polices..................................................................................438
Problèmes classiques rencontrés ....................................................................................................441
11. Conclusion ........................................................................................................................................443
A. Options de configuration du noyau .................................................................................................444
Menu « Code maturity level options » ...........................................................................................444
Menu « General setup » .................................................................................................................444
Sous-menu « Configure standard kernel features (for small systems) » ..............................446
x
Menu « Loadable module support » ..............................................................................................447
Menu « Processor type and features » ...........................................................................................447
Sous-menu « Firmware Drivers ».........................................................................................450
Menu « Power management options (ACPI, APM) »....................................................................450
Menu « Bus options (PCI, PCMCIA, EISA, MCA, ISA) »...........................................................452
Sous-menu « PCMCIA/CardBus support »..........................................................................453
Sous-menu « PCI Hotplug Support » ...................................................................................453
Menu « Executable file formats » ..................................................................................................453
Menu « Networking » ....................................................................................................................454
Menu « Networking options » ..............................................................................................454
Sous-menu « IP: Virtual Server Configuration » ........................................................459
Sous-menu « Network packet filtering (replace ipchains) » .......................................459
Sous-menu « IP: Netfilter Configuration »........................................................459
Sous-menu « IPv6: Netfilter Configuration »....................................................464
Sous-menu « DECnet: Netfilter Configuration » ..............................................465
Sous-menu « Bridge: Netfilter Configuration » ................................................465
Sous-menu « SCTP Configuration (EXPERIMENTAL) ».........................................465
Sous-menu « QoS and/or fair queueing » ...................................................................466
Sous-menu « Network testing »..................................................................................466
Menu « Amateur Radio support » ........................................................................................466
Sous-menu « AX.25 network device drivers » ...........................................................466
Menu « IrDA subsystem support ».......................................................................................466
Sous-menu « Infrared-port device drivers »................................................................467
Menu « Bluetooth support » .................................................................................................467
Sous-menu « Bluetooth device drivers » ....................................................................467
Device Drivers................................................................................................................................468
Menu « Generic Driver Options » ........................................................................................468
Menu « Memory Technology Devices (MTD) »..................................................................469
Menu « Parallel port support » .............................................................................................469
Menu « Plug and Play support »...........................................................................................470
Menu « Block devices » .......................................................................................................470
Menu « IO Schedulers » .............................................................................................473
Menu « ATA/ATAPI/MFM/RLL support » ..........................................................................473
Menu « SCSI device support » .............................................................................................476
Sous-menu « SCSI Transport Attributes »..................................................................477
Sous-menu « SCSI low-level drivers » .......................................................................477
Sous-menu « PCMCIA SCSI adapter support » .........................................................477
Menu « Old CD-ROM drivers (not SCSI, not IDE) » ..........................................................477
Menu « Multi-device support (RAID and LVM)..................................................................478
Menu « Fusion MPT device support » .................................................................................479
Menu « IEEE 1394 (FireWire) support (EXPERIMENTAL) » ...........................................479
Menu « I2O device support » ...............................................................................................480
Configuration des interfaces réseau......................................................................................481
Sous-menu « ARCnet devices » .................................................................................483
Sous-menu « Ethernet (10 or 100Mbit) » ...................................................................483
Sous-menu « Ethernet (1000 Mbit) »..........................................................................483
Sous-menu « Ethernet (10000 Mbit) »........................................................................484
Sous-menu « Token Ring devices (depends on LLC=y) » .........................................484
xi
Sous-menu « Wireless LAN (non-hamradio) » ..........................................................484
Sous-menu « PCMCIA network device support »......................................................484
Sous-menu « Wan interfaces »....................................................................................484
Sous-menu « ATM drivers » .......................................................................................485
Menu « ISDN subsystem »...................................................................................................485
Ancienne interface ISDN4Linux ................................................................................486
Gestionnaires de périphériques ISDN4Linux ...................................................486
Interface CAPI ............................................................................................................486
Menu « Telephony Support » ...............................................................................................487
Menu « Input device support » .............................................................................................487
Sous-menu « Hardware I/O ports » ............................................................................488
Menu « Character devices » .................................................................................................489
Sous-menu « Serial drivers » ......................................................................................492
Sous-menu « IPMI » ...................................................................................................493
Sous-menu « Watchdog cards » ..................................................................................493
Sous-menu « Ftape, the floppy tape device driver » ...................................................493
Sous-menu « PCMCIA character device support » ....................................................494
Sous-menu « TPM Hardware support »......................................................................494
Sous-menu « I2C support » ..................................................................................................494
Sous-menu « Dallas’s 1-wire bus » ......................................................................................495
Sous-menu « Hardware Monitoring support » .....................................................................495
Sous-menu « Misc devices » ................................................................................................495
Menu « Multimedia devices » ..............................................................................................495
Sous-menu « Video For Linux » .................................................................................496
Sous-menu « Radio Adapters »...................................................................................496
Sous-menu « Digital Video Broadcasting Devices » ..................................................496
Menu « Graphics support » ..................................................................................................496
Menu « Sound »....................................................................................................................497
Menu « USB support » .........................................................................................................498
Menu « MMC/SD Card support ...........................................................................................501
Menu « InfiniBand support...................................................................................................501
Menu « SN Devices..............................................................................................................501
Menu « File systems » ...................................................................................................................501
Sous-menu « CDROM/DVD Filesystems » .........................................................................502
Sous-menu « DOS/FAT/NT Filesystems »...........................................................................503
Sous-menu « Pseudo filesystems ».......................................................................................503
Sous-menu « Miscelaneous filesystems » ............................................................................504
Sous-menu « Network File Systems »..................................................................................504
Sous-menu « Partition Types » .............................................................................................505
Sous-menu « Native Language Support » ............................................................................505
Menu « Profiling support » ............................................................................................................506
Menu « Kernel hacking » ...............................................................................................................506
Menu « Security options » .............................................................................................................508
Menu « Cryptographic options » ...................................................................................................509
Menu « Library routines » .............................................................................................................509
xii
B. Compilation et mise à jour des principaux composants du système ............................................510
Compilation de make 3.80.0 ..........................................................................................................510
Compilation des binutils 2.16.1 .....................................................................................................510
Compilation de la bibliothèque C 2.3.5 .........................................................................................511
Compilation de OpenSSL ..............................................................................................................515
Compilation de [Link] 6.8.2............................................................................................................515
Compilation de Lesstif 0.93.94 ......................................................................................................518
Compilation de MESA 6.2.1..........................................................................................................518
Compilation de KDE 3.4.2.............................................................................................................519
Compilation de Gnome 2.10.0 .......................................................................................................523
Compilation de Samba 3.0.11 ........................................................................................................528
C. Formulaire pour la création des lignes de mode de [Link] ............................................................530
D. GNU Free Documentation License..................................................................................................534
E. Licence de documentation libre GNU .............................................................................................539
xiii
Liste des tableaux
3-1. Caractéristiques des liens physiques et symboliques .........................................................................17
3-2. Hiérarchie standard du système de fichiers ........................................................................................20
5-1. Groupes de pages de man...................................................................................................................59
5-2. Principaux signaux Unix ....................................................................................................................78
5-3. Variables d’environnements courantes ...............................................................................................90
5-4. Tests sur les fichiers..........................................................................................................................105
9-1. Plages d’adresses IP réservées pour un usage personnel .................................................................270
10-1. Fréquence maximale des moniteurs ...............................................................................................403
10-2. Numéros des modes graphiques VESA..........................................................................................414
xiv
Remarques de l’auteur
Il se peut que certaines informations fournies dans ce document soient spécifiques à ma configuration . À
titre indicatif, j’utilise une Slackware 9.1. Il est connu que la Slackware n’utilise pas, par défaut, la
notion de niveaux d’exécution. En revanche, elle n’utilise que les versions officielles des logiciels, et sa
configuration reste simple et compréhensible. De plus, certaines informations pourront être spécifiques à
la configuration matérielle des machines que j’utilise. Je me suis cependant efforcé de rendre ce
document générique et indépendant de la Slackware et de mon matériel. J’espère donc que la plupart des
informations fournies ici s’appliqueront à toutes les distributions de Linux et à la plupart des
configurations matérielles, bien que je ne puisse pas le garantir. Les informations données dans ce livre
permettront donc sans doute aux personnes qui n’ont jamais vu Linux de débroussailler un peu le terrain,
et à celles qui utilisent déjà Linux de comprendre en profondeur comment leur système fonctionne.
Je remercie d’avance les gens qui pourront m’envoyer des remarques concernant les imprécisions, voire
les horreurs et les âneries que j’aurais pu écrire. Plus je recevrai de critiques constructives et de
propositions, plus ce document a de chances de s’améliorer. Cependant, si vous prenez le temps de
m’envoyer les remarques et les erreurs que vous avez pu détecter, je vous serais gré de vérifier au
préalable qu’elles sont toujours d’actualité dans la dernière version de ce document, que vous pourrez
trouver dans différents formats de fichiers sur mon site Web ([Link]
Vous pouvez contribuer au maintien et au support de mes documents libres sur la page de support de mon
site Web, à l’adresse [Link] Si vous estimez que ce travail
mérite salaire, n’hésitez pas, c’est facile et sécurisé.
i
Chapitre 1. Introduction
Linux est le noyau d’un système d’exploitation libre de type Unix, écrit initialement par Linus Torvalds
en 1991 et auquel un grand nombre de programmeurs ont contribué par Internet depuis. Les origines de
tous les systèmes Unix remontent à la première version d’un système d’exploitation expérimental
développé par Dennis Ritchie et Ken Thompson dans les laboratoires AT&T’s Bell Laboratories en 1969.
Ce système a avant tout été développé par des programmeurs, pour des programmeurs, et reprenait un
certain nombre de concepts qui avaient été développés auparavant pour le système d’exploitation Multics
(abréviation de « Multiplexed Information and Computing Service »), dont le rôle était de fournir des
services informatiques centralisés à un grand nombre de personnes (un peu comme le Minitel a tenté de
le faire par la suite). Multics n’a jamais réellement vu le jour, en revanche, le système Unix initial a
engendré un grand nombre d’autres systèmes plus ou moins compatibles. Récemment, les différents
fournisseurs de systèmes Unix se sont accordés pour définir l’ensemble des fonctionnalités que tous les
systèmes Unix doivent supporter, afin de résoudre les problèmes engendrés par les incompatibilités
existantes entre ces différents systèmes. Le terme Unix est donc un terme générique pour représenter
l’ensemble de tous ces systèmes, dont Linux fait partie. Pour l’anecdote, la dénomination Unix provient
de la contraction de « Unics » (abréviation de « Uniplexed Information and Computing Service »), terme
forgé ironiquement pour bien signaler qu’Unix était une version allégée de ce que Multics devait être.
Bien que compatible avec les dernières spécifications Unix, Linux ne contient pas une ligne du code
source du système Unix original, ce qui en fait ce que l’on appelle un « clone ». Cela dit, il s’agit
réellement d’un système Unix à part entière. En tant que tel, il dispose des fonctionnalités fournies par
les systèmes Unix : il est multitâche, multi-utilisateur et relativement orienté réseau. Vous aurez donc,
avec Linux, un système fiable, fonctionnel et performant.
Linux vous permettra de réaliser les opérations les plus classiques, comme effectuer un travail
bureautique, naviguer sur Internet, réaliser l’acquisition, la capture et le retraitement d’images, réaliser
des animations 3D ou encore programmer. En revanche, autant vous prévenir tout de suite : nombre de
jeux ne sont tout simplement pas disponibles sous Linux, bien que les principaux titres soient
régulièrement portés. De même, il n’existe pas de logiciel complet permettant de réaliser l’acquisition de
séquences vidéo et d’en réaliser le montage de manière aisée. Vous ne pourrez pas non plus réaliser ce
que vous faisiez avec les applications MS Windows dont il n’existe pas encore d’équivalent sous Linux,
comme les applications de gestion et de paie utilisées par nombre de professionnels indépendants ou par
des PME.
Que les choses soient claires : l’installation de Linux est une opération relativement compliquée, et
l’usage d’un système Unix en général n’est pas à la portée de tout le monde. Même si la qualité des
distributions actuellement disponibles s’est grandement accrue ces derniers temps, au point que
n’importe qui peut installer un système Linux viable sans trop de problèmes, la configuration du système
pour obtenir un fonctionnement correct exige un travail assez important. En particulier, les distributions
actuelles éprouvent encore quelques difficultés pour optimiser les périphériques exotiques, et souvent
seules les fonctionnalités de base sont correctement configurées après une installation classique. Par
ailleurs, la plupart des applications sont développées par des groupes de programmeurs indépendants, et
bien que ce soit justement le rôle des distributions de réaliser l’intégration de tous ces composants dans
un environnement homogène, celle-ci n’est pas forcément parfaite. Les outils de configuration des
distributions vous permettront sans doute de configurer votre système de base simplement, mais pour
aller au-delà, il faudra sans doute intervenir manuellement.
Néanmoins, il faut reconnaître que celui qui installe Linux à partir d’une distribution sur un ordinateur
assez vieux (c’est-à-dire un ordinateur qui ne dispose pas des derniers périphériques et cartes graphiques
1
Chapitre 1. Introduction
à la mode), ou dont les constituants sont de marque courante, obtient rapidement un système fonctionnel
et capable de réaliser la plupart des opérations qu’il désire. En particulier, celui qui utilise son ordinateur
pour travailler (j’entends par là écrire des lettres, les imprimer, naviguer sur Internet pour récupérer des
informations, ou programmer) peut parfaitement se contenter de l’installation par défaut. Ce type de
situation ne convient pas à tout le monde : la plupart des gens disposent de cartes graphiques récentes
(surtout depuis l’avènement des jeux 3D) ou de périphériques spécifiques. Tout le monde ne se place pas
uniquement dans le cadre d’une utilisation professionnelle, et il est absurde de disposer d’une carte son
et de ne pas pouvoir l’utiliser. Et c’est là que le bât blesse ! Si l’on désire que Linux reconnaisse ces
matériels exotiques, il va falloir mettre les mains dans le cambouis et avoir une bonne dose de patience.
Ce problème de configuration apparaît malheureusement principalement pour les particuliers, qui
souvent disposent de machines hétéroclites et absolument non standards. Dans le cadre d’une entreprise,
il existe des personnes qualifiées pour résoudre ce type de problème, mais ce sont des informaticiens et,
de plus, les machines sont souvent homogènes, ce qui permet d’apporter des solutions génériques.
En conclusion, il faut être informaticien ou amateur très éclairé pour installer Linux sur une machine de
particulier et pour le configurer de manière optimale. La situation est d’autant plus grave que la plupart
des gens ne connaissent pas Linux, et qu’il est toujours difficile d’apprendre et de prendre de nouvelles
habitudes. Je veux dire par là que même une tâche très simple à réaliser peut prendre un certain temps,
car tout simplement on ne l’a jamais faite. Celui qui a installé trois fois MS Windows sait parfaitement le
faire à présent, et il pense que c’est relativement facile. Et pourtant, il réalise souvent des tâches d’une
complexité qui dépasse, là aussi, le commun des mortels.
Heureusement, et c’est là la force de Linux, ces opérations ne doivent être effectuées qu’une seule fois.
On n’a absolument pas besoin de changer la configuration à chaque instant, comme c’est le cas sous MS
Windows, parce que le système est globalement beaucoup plus stable. Il ne plante quasiment jamais, les
applications ne peuvent pas le corrompre, et sa qualité supprime le besoin permanent de mettre à jour
une partie du système. En clair, quand on en a un qui fonctionne, on le garde, non pas parce que c’est un
enfer à installer et à configurer, mais tout simplement parce que ce n’est pas nécessaire de le changer.
En résumé, on peut affirmer que :
L’objet de ce document est de donner les connaissances de base nécessaires à l’installation de Linux sur
un ordinateur de particulier ou un petit serveur. Il est supposé que l’utilisateur a déjà utilisé un autre
système d’exploitation, par exemple MS Windows. Cependant, aucune notion avancée d’informatique
n’est nécessaire. Tout sera expliqué au fur et à mesure des besoins et, si nécessité est, des compléments
d’information seront donnés pour permettre la compréhension des opérations à effectuer. Néanmoins, les
notions qui seront abordées ici ne seront pas simples, et il est possible que la plupart des personnes qui
n’ont pas une grande habitude de l’informatique aient quelques difficultés à les assimiler. Cela dit, à
vaincre sans peine, on triomphe sans gloire, et l’installation de Linux vous procurera le plaisir
d’apprendre.
2
Chapitre 1. Introduction
Ce document est structuré en neuf parties distinctes, qui correspondent essentiellement aux grandes
étapes que vous suivrez pour installer et utiliser Linux. La première partie a pour but de clarifier un peu
les notions ayant trait aux logiciels libres. Elle tente d’expliquer pourquoi ces logiciels existent, et
pourquoi ils font partie des meilleurs logiciels actuels. La deuxième partie décrit les concepts de base de
la plupart des systèmes d’exploitation Unix. Elle ne traite pas de l’installation à proprement parler, mais
sa lecture est recommandée pour tous ceux qui n’ont jamais vu un tel système. La troisième partie décrit
l’installation du système de base de Linux. À l’issue de cette partie, vous devez disposer d’un système
fonctionnel, utilisable mais non optimisé et ne permettant pas forcément d’utiliser tous vos
périphériques. La quatrième partie constitue un petit cours d’Unix pour les nouveaux utilisateurs de ce
type de système, et la cinquième partie traite des opérations d’administration et de maintenance de base
des systèmes Unix. Bien que, comme les deux premières parties, ces deux parties ne traitent pas de
l’installation à proprement parler, leur lecture est vivement recommandée. La sixième partie donne les
notions de base sur les mécanismes de compilation et décrit la manière de faire pour compiler la dernière
version de GCC, le compilateur C/C++ du projet GNU. Elle décrit également la technique à utiliser pour
compiler et installer un nouveau noyau dans le système, opération indispensable pour obtenir un noyau
optimisé qui « colle » à la machine. La configuration des différents types de matériel et leur prise en
charge au niveau du noyau sera décrite ensuite dans la septième partie. La huitième partie traite de la
configuration du réseau sous Linux. Le réseau est réellement l’un des aspects les plus importants de
Linux, et nécessite donc une attention toute particulière. Enfin, la neuvième et dernière partie vous décrit
la procédure d’installation de XWindow, l’environnement graphique de Linux. L’installation des polices
TrueType y est aussi présentée.
3
Chapitre 2. GNU, Linux et les logiciels libres
Vous entendrez souvent parler de la licence « GPL », du projet « GNU » et de la « Free Software
Foundation » dans le monde de Linux. Pour bien comprendre ce qu’est la Free Software Foundation et ce
que signifie la licence GPL, il est nécessaire d’en faire une brève présentation.
La Free Software Foundation est une organisation dont le but est de développer des logiciels libres. Le
terme de « libre » signifie clairement que chacun peut faire ce qu’il veut du logiciel, y compris le
modifier. La vente n’est absolument pas interdite, et il faut donc faire la distinction entre libre et gratuit.
Cela étant dit, les logiciels libres sont souvent de facto gratuits, car ils sont librement redistribuables par
quiconque en possède une copie.
La liberté de modifier les logiciels libres implique naturellement que leur code source, c’est à dire le
texte de leur programme tel qu’il a été saisi par ses auteurs, soit librement accessible et modifiable. Les
logiciels libres sont donc qualifiés de logiciels « Open Source », ce qui signifie en anglais que les sources
du programme sont disponibles. Attention cependant, tous les logiciels Open Source ne sont pas
forcément libres, car il n’est pas toujours possible de modifier ce code source et de le redistribuer
librement (éventuellement gratuitement). Ainsi, nombre d’éditeurs de logiciels propriétaires publient leur
code source sans pour autant donner de droits supplémentaires à ceux qui les lisent. Certains d’entre eux
jouent d’ailleurs explicitement sur cette confusion. De plus, la plupart des journalistes anglo-saxons font
cette confusion et, de ce fait, occultent tous les avantages des logiciels libres. Vous trouverez de plus
amples informations sur la notion de code source dans le Chapitre 7.
Il faut bien comprendre que le fait de diffuser un logiciel sous une licence libre ne prive absolument pas
son auteur de ses droits. Il en reste l’auteur et, en tant que tel, conserve les droits d’auteurs sur son
travail. Il ne fait que concéder la liberté d’exploiter ce travail aux autres. C’est en cela que les logiciels
libres se démarquent du domaine publique, dont les logiciels ne sont plus soumis à aucun droit.
Afin de protéger les logiciels libres et leurs auteurs, la Free Software Foundation a rédigé la licence GPL
(abréviation de l’anglais « General Public License »). Cette licence stipule que le logiciel libre peut être
redistribué, utilisé, modifié librement, pourvu que celui qui en bénéficie accorde les mêmes droits à ceux
à qui il fournit les copies du logiciel, qu’il l’ait modifié ou non. En d’autre termes, elle garantit que la
liberté des uns s’arrête là où commence celle des autres. Cette licence empêche donc l’aliénation du
logiciel et sa transformation en logiciel propriétaire, de quelque manière que ce soit. Cela implique que
tout logiciel libre sous licence GPL modifié par une autre personne que son auteur reste libre, et le
restera à jamais. Ainsi, il est impossible qu’une société commerciale puisse un jour s’approprier un
logiciel libre, même si elle l’améliore. Si vous désirez lire la licence GPL, vous pouvez en trouver une
copie dans le fichier /usr/src/linux/COPYING une fois que vous aurez installé Linux. La FSF a
également rédigé d’autres licences plus adaptées aux bibliothèques de programmes et aux
documentations libres. Ainsi, la licence LGPL (« Lesser General Public License ») permet d’utiliser les
bibliothèques de programmes dans des programmes propriétaires, et la licence FDL (« Free
Documentation License ») permet de diffuser des documentations libres. À titre d’exemple, ce guide est
distribué sous licence FDL, dont vous trouverez une tradution française en annexe.
La licence GPL a été écrite initialement pour le projet GNU de la Free Software Foundation, dont le but
est de réaliser un système Unix libre et indépendant des Unix commerciaux. Précisons ici que le terme
« Unix » caractérise un ensemble de systèmes d’exploitation, qui disposent tous à peu près des mêmes
fonctionnalités et proposent d’y accéder de la même manière. Le projet GNU est toujours en cours,
puisque la Free Software Foundation a déjà écrit la plupart des utilitaires Unix, mais que le cœur du
système (ce que l’on appelle le noyau) est toujours en cours de réalisation. Pour information, ce noyau se
4
Chapitre 2. GNU, Linux et les logiciels libres
nomme « Hurd ».
Cependant, d’autres noyaux sont disponibles, avec lesquels les commandes GNU peuvent être utilisées.
Parmi ces noyaux, il existe bien entendu Linux, qui a été écrit par le Finlandais Linus Torvalds lorsqu’il
était étudiant, et amélioré par des programmeurs du monde entier sur Internet. Linux est un noyau parmi
tant d’autres, à ceci près qu’il est, lui aussi, distribué sous la licence GPL, bien que n’ayant rien avoir
avec la Free Software Foundation.
Cela signifie qu’il serait en fait plus exact de parler du système « GNU/Linux » que de « Linux » tout
court. Sous cette dénomination, il est clair que ce système est constitué des outils GNU fonctionnant sur
le noyau Linux. C’est donc un ensemble de logiciels libres provenant de plusieurs sources distinctes.
Cependant, il est très courant d’entendre parler de « Linux » tout court, par abus de langage et par souci
de simplicité. Bien entendu, cette dénomination est proscrite sur les sites Internet de la Free Software
Foundation, qui devient très susceptible à ce sujet.
Précisons que la licence GPL n’est pas la seule licence permettant de distribuer des logiciels libres. Il
existe d’autres licences, dont les termes sont à peu près similaires. Par exemple, la licence BSD (un autre
système Unix libre) exige également la distribution des sources, mais permet l’appropriation des sources
par des sociétés commerciales. De même, la licence X, sous laquelle est diffusée l’environnement
graphique X11 qu’utilise Linux, est une licence libre. Quelques outils fournis avec Linux sont distribués
avec d’autres licences plus rares.
Les logiciels libres disposent d’avantages indéniables par rapport aux logiciels « propriétaires » ou
« fermés ». Je vais tenter de donner ici une liste non exhaustive de ces avantages :
• les programmes distribués sous licence libre ont souvent été écrits par des passionnés du domaine
applicatif auquel ils appartiennent. Les logiciels libres disposent donc souvent des dernières
fonctionnalités à la mode et sont donc généralement extrêmement compétitifs sur ce plan ;
• du fait du grand nombre possible d’intervenants sur les sources des logiciels libres, un grand nombre
de possibilités techniques peuvent être explorées, et c’est souvent la meilleure qui est sélectionnée.
C’est une forme de sélection naturelle de la meilleure solution. Ainsi, sur le long terme, les logiciels
libres sont les plus efficaces en terme de performances ;
• toujours du fait du grand nombre d’intervenants, et surtout de par la possibilité de consulter et de
modifier librement le code source, le cycle de détection/identification/correction des bogues est très
court. Les logiciels libres sont donc parmi les plus fiables qui se font. On peut considérer qu’un
logiciel libre utilisé par un grand nombre de personnes est virtuellement « sans bogue » connu,
puisque si tel était le cas il serait immédiatement corrigé ;
• la possibilité de repartir d’une base de source existante permet de réaliser des développements
beaucoup plus rapidement que dans un modèle fermé. Les logiciels libres sont donc également ceux
qui se développent le plus rapidement à coût fixe, et sont certainement les plus rentables en terme de
coût global pour la collectivité ;
• afin de garantir l’interopérabilité entre les différents intervenants du monde du logiciel libre, chacun
s’évertue à respecter les standards. Les logiciels libres sont donc les plus ouverts, non seulement en
terme de code source, mais également au niveau des formats de fichiers et des protocoles de
communication. Cela garantie une interopérabilité optimale et l’absence de mauvaise surprise ;
• professionnellement parlant, la disponibilité du code source fournit une garantie de fonctionnement
que l’on ne peut pas retrouver ailleurs. En cas de problème, il est toujours possible de s’en sortir,
éventuellement en recourant à des compétences externes pour adapter le logiciel à ses propres besoins ;
5
Chapitre 2. GNU, Linux et les logiciels libres
• enfin, la disponibilité du code source garantit une pérennité absolue du logiciel, ce qu’aucune société
commerciale vendant des logiciels propriétaires ne peut ou ne veut faire.
Mais l’aspect le plus important des logiciels libres est sans doute le fait qu’ils garantissent la liberté des
utilisateurs par rapport aux éditeurs de logiciels. Le respect des standards, l’ouverture des formats de
documents et des protocoles de communication garantissent une interopérabilité absolue, qui permet
ainsi à chacun de rester libre de ses choix pour sa solution informatique. Il n’est que trop courant de voir
les éditeurs de logiciels enfermer leurs clients dans une dépendance vis à vis d’eux, simplement en leur
faisant utiliser des produits fermés et inutilisables sans leur concours. Le pire est sans doute que cette
dépendance est transitive (le fait pour un auteur d’utiliser un produit implique que ses lecteurs le
possèdent également) et durable (on ne peut faire de mise à jour que chez le même éditeur de logiciel).
Bien que cela ne se situe pas au même niveau philosophique, la question du financement se pose
également de manière récurrente. Il n’est en effet pas évident, en première analyse, de déterminer les
raisons qui poussent un auteur ou une entreprise à rendre ainsi public son savoir faire, au risque de se le
faire tout simplement voler. Les particuliers font souvent cela par amusement ou pour faire valoir leur
savoir-faire. Les entreprises quant à elles peuvent financer le développement de certains logiciels libres
soit parce qu’elles l’utilisent en interne, soit parce qu’elles en vivent de manière dérivée (par vente de
produits dérivés ou de services complémentaires par exemple). Certaines sociétés préfèrent également
repartir d’un logiciel libre qui satisfait à 80% de leurs besoins, et de développer les 20% restants. Le coût
total de développement d’une solution complètement propriétaire serait en effet beaucoup plus élevé.
Dans ce cas, les développeurs de logiciels libres sont avant tout leurs propres utilisateurs... Cela dit, il
faut être clair à ce sujet : le logiciel libre rapporte moins que le logiciel propriétaire, tout simplement
parce qu’on ne peut pas pressurer le client de la même manière.
Enfin, pour information, le terme « GNU » est l’abréviation de l’anglais « GNU’s Not Unix ». Cette
curieuse phrase rappelle que le projet GNU est de réaliser un système Unix différent des autres. Vous
remarquerez que cette définition est récursive, c’est-à-dire qu’elle utilise le mot « GNU » elle-même.
Cela doit être attribué au goût des développeurs de la Free Software Foundation pour ce genre de
définition infiniment récursive. Vous ne saurez sans doute jamais les raisons qui les ont poussés à choisir
la lettre ’G’ dans leur définition. Cela étant, « GNU » se prononce « gnou » en anglais, et vous trouverez
donc souvent la représentation d’un gnou sur les sites Internet de GNU.
6
Chapitre 3. Concepts de base
Ce chapitre décrit les principes de base qu’il faut connaître pour bien comprendre Linux. Les
informations qui sont données ici ne sont pas réellement spécifiques à Linux. Elles s’appliquent souvent
aux systèmes Unix en général. Il est donc recommandé de lire ce chapitre, surtout si l’on n’a jamais vu ni
utilisé un système Unix. En particulier, les utilisateurs chevronnés de Windows risquent d’être
légèrement déroutés. L’architecture du système sera présentée, ainsi que la sécurité et la notion
d’utilisateur. Viendront ensuite les descriptions des principales fonctionnalités du système de fichiers et
de sa structure.
Architecture du système
Comme tout logiciel d’une certaine taille, Linux est d’une grande complexité. Tous les systèmes
d’exploitation récents sont constitués d’un grand ensemble de composants qui interagissent et dont la
mise en place peut être soit indispensable au bon fonctionnement du système, soit facultative, soit tout
simplement inutile étant donnés la configuration matérielle et les besoins de l’utilisateur. Cette
complexité implique un grand nombre d’erreurs, d’anomalies et de dysfonctionnements possibles. En
effet, pour qu’un système informatique fonctionne correctement, il faut tout prévoir pour donner une
action appropriée à tous les événements possibles. Cela n’est pas humainement réalisable quand le
système devient trop complexe.
Pour résoudre ce problème, il est courant de subdiviser le système en composants indépendants, dont le
mauvais fonctionnement potentiel ne peut perturber que partiellement les autres parties du système. Des
points de synchronisation à partir desquels le système peut reprendre un fonctionnement normal après
une erreur sont prévus. Ces points de synchronisation permettent simplement d’assurer la viabilité du
système, même en cas d’erreur inopinée. Pour quelques systèmes, le seul point de synchronisation est le
point de départ, à savoir le démarrage de l’ordinateur. De tels systèmes doivent donc souvent être
redémarrés, parfois pour une cause mineure (erreur d’un logiciel, modification de la configuration du
système, ajout d’un composant au système). Ce n’est pas le cas de Linux, qui dans le pire des cas détruit
le composant qui a généré l’erreur sans toucher aux autres parties du système. Le point de
synchronisation de Linux est donc le redémarrage d’une partie du système uniquement, ce qui assure
ainsi une grande stabilité du système complet.
Il va de soi que, lorsqu’un composant se plante, ceux qui l’utilisent risquent fort de se retrouver dans un
état d’erreur assez difficile à gérer. Cela peut souvent provoquer leur propre perte. Par conséquent, plus
un composant est utilisé, plus il doit être fiable. Or il est un composant à la base de tout dans Linux : le
noyau (« kernel » en anglais). C’est le cœur du système, et en fait c’est précisément le système Linux.
Heureusement, ce composant est d’une très, très grande fiabilité, et il n’est pas rare de voir un système
Linux fonctionner plusieurs mois ou années sur des serveurs. Cette fiabilité provient du modèle de
développement de Linux, qui est ouvert à tout le monde (chacun peut récupérer, lire, modifier, compléter
ou corriger le noyau à condition de savoir bien programmer). À partir d’une taille critique en terme de
nombre d’utilisateurs, taille que Linux a atteinte, il existe suffisamment de développeurs pour détecter et
corriger les erreurs. Ainsi, dès qu’une erreur est détectée, elle est souvent corrigée dans les jours qui
suivent, ce qui assure une grande qualité.
Le noyau gère quasiment tout (mémoire, disques, systèmes de fichiers, réseau, clavier, droits des
utilisateurs, etc.), mais il n’est pas exploitable tel quel. Il n’est par exemple pas capable d’offrir une
interface utilisateur permettant de lui donner les commandes qu’il doit exécuter. Ces opérations sont du
7
Chapitre 3. Concepts de base
ressort d’autres modules développés par la Free Software Foundation. Parmi ces modules, on trouve le
« shell » (ce qui signifie grosso modo « environnement utilisateur »). Le shell est capable de lire des
commandes saisies au clavier, de les exécuter et d’afficher leurs résultats à l’écran. En général, les
programmes capables de réaliser ces opérations sont appelés des interpréteurs de commandes. Mais le
shell est bien plus que cela, car il peut être programmé, et il peut gérer les processus (en arrêter un, en
lancer un autre, etc.).
En fait, les commandes que le shell peut exécuter sont en nombre très réduit. La plupart des commandes
sont tout simplement d’autres programmes. Les programmes que l’on peut utiliser dans le shell sont des
programmes dits « en ligne de commande », parce qu’ils sont propres à être utilisés dans les lignes de
commandes que l’on saisit au clavier dans le shell. Ces programmes sont, encore une fois, développés
soit par la Free Software Foundation, soit par des bénévoles, toujours sous la licence GNU. Toutes ces
commandes sont des commandes compatibles Unix. Ces commandes sont absolument essentielles pour
pouvoir utiliser le système, mais elles sont assez rébarbatives et peu d’utilisateurs acceptent de s’en
contenter.
C’est pour cela qu’une couche graphique a été développée, pour introduire une interface graphique plus
conviviale (mais cependant légèrement moins puissante en termes de fonctionnalités) : XWindow.
Encore une fois, cette couche logicielle est constituée de plusieurs composants, dont la base est le
serveur X. Le serveur X est un programme capable de fournir les services graphiques (d’où le nom de
serveur) aux autres applications. Plusieurs implémentations concurrentes existent. L’une d’elles est
particulièrement utilisée sous Linux, puisqu’elle est libre (comme tout le reste) : [Link]. À vrai dire, un
serveur X ne fait pas grand chose d’autre que de réaliser des affichages sous les ordres d’autres
programmes. D’autres composants permettent donc d’obtenir des fonctionnalités de plus haut niveau.
Le gestionnaire de fenêtres (« Window Manager » en anglais) est le composant qui se place juste
au-dessus du serveur X. Il est en charge, comme son nom l’indique, de gérer les fenêtres des applications
graphiques sous X. C’est le gestionnaire de fenêtres qui prend en charge la gestion des décorations des
fenêtres de premier niveau (c’est-à-dire des fenêtres principales des programmes). Par exemple, il
s’occupe d’afficher les bords, la barre de titre, les boutons de réduction et de restauration, etc. des
fenêtres. C’est également lui qui s’occupe du positionnement des fenêtres, et qui donc permet à
l’utilisateur de déplacer et de réduire les fenêtres des applications graphiques. L’utilisateur est libre
d’utiliser le gestionnaire de fenêtres qu’il désire, selon ses propres goûts et ses désirs, la différence est
souvent une pure question de style.
Il existe des environnements graphiques complets qui, en plus d’un gestionnaire de fenêtres souvent
extrêmement puissant, fournissent la plupart des outils classiques que l’on est en droit d’attendre d’un
système graphique moderne. Ainsi, ces environnements comprennent des éditeurs, des outils de
configuration, des navigateurs Internet, des logiciels multimédia... En plus de ces applications, ils
fournissent un cadre standard pour les applications graphiques qui savent communiquer avec eux. Ce
cadre permet d’améliorer l’intégration des diverses applications entre elles, et c’est la raison pour
laquelle on appelle souvent ces environnements des gestionnaires de bureau. KDE et Gnome sont des
exemples de tels environnements de travail.
Enfin, au-dessus de toutes ces couches logicielles, on trouve les applications X, qui sont aussi diverses
que variées (traitement de texte, tableurs, logiciels de dessin...). Quelques-unes de ces applications sont
simplement des « front-end » d’applications en ligne de commande, c’est-à-dire des interfaces
graphiques à des programmes non graphiques existants. Ce concept permet d’avoir un composant
unique, et plusieurs interfaces différentes pour ce composant, et en plus de rendre indépendante la
fonctionnalité de l’interface utilisateur. Encore une fois, la stabilité en est d’autant plus accrue.
8
Chapitre 3. Concepts de base
Bon nombre d’applications pour XWindow sont libres, ou utilisables librement à des fins non
commerciales. Cela signifie qu’un particulier a le droit de les utiliser tant qu’il ne s’en sert pas pour un
travail qu’il revendra. Comme c’est le cas de la plupart des particuliers, on peut considérer qu’il est
actuellement possible, avec Linux, d’avoir un environnement logiciel complet, fiable et performant...
pour un prix de revient minime.
En résumé, un système GNU/Linux est structuré de la manière suivante :
• le noyau Linux ;
• les programmes en ligne de commande et le shell ;
• le serveur XWindow ;
• le gestionnaire de fenêtres et le gestionnaire de bureau ;
• les applications XWindow.
Il n’est pas évident d’établir un parallèle avec MS Windows, puisque ce système est réellement
monolithique. Cependant, on peut considérer que le noyau Linux correspond aux modules KERNEL ou
[Link] de Windows, que le shell correspond aux interpréteurs de commandes [Link] ou
[Link], que les programmes en ligne de commande correspondent aux programmes DOS ou console
classiques (xcopy, fdisk, format...), que le serveur X correspond au couple (pilote de carte graphique,
GDI), que le gestionnaire de fenêtres correspond au module USER, et le gestionnaire de bureau à
l’explorateur, les fonctionnalités d’OLE et aux programmes fournis avec Windows. La différence
essentielle vient du fait que le shell est à peine programmable sous Windows, que les commandes DOS
ont tendance à accéder aux ressources de la machine directement sans passer par le noyau, que le pilote
de carte graphique, la GDI et le module USER sont tous intégrés dans le système au lieu d’en être
séparés (ce qui multiplie les chances de crash du système complet), et que la plupart des applications
Windows ne peuvent fonctionner que dans l’environnement graphique. Elles sont donc entraînées par le
système lorsque les modules graphiques de Windows plantent (je n’ai d’ailleurs jamais vu un processus
DOS survivre à un crash de l’interface graphique de Windows).
En conclusion :
9
Chapitre 3. Concepts de base
• les systèmes Unix, donc Linux, sont très structurés, plus simples à utiliser, à configurer, à maintenir et
à développer ;
• ils sont très stables, car les composants de haut niveau n’interfèrent pas sur les composants de bas
niveau ;
• ils sont faciles à personnaliser, puisque l’utilisateur a le choix des outils à chaque niveau ;
• Linux a de plus la particularité d’être parfaitement modifiable, puisque si l’on sait programmer, on
peut personnaliser les composants du système ou en rajouter ;
• et il n’est pas propriétaire, c’est-à-dire que l’on n’est pas dépendant d’une société éditrice de logiciel
pour résoudre un problème donné.
En bref, c’est la voie de la vérité.
Sécurité et utilisateurs
Linux est un système multi-utilisateur. Cela signifie que plusieurs personnes peuvent utiliser l’ordinateur
simultanément (et pas uniquement les unes à la suite des autres), et que le système se charge de faire
respecter la loi entre elles. Les ressources de la machine sont ainsi partagées équitablement, tant au
niveau de la puissance de calcul qu’au niveau de la mémoire, du disque, des imprimantes...
Évidemment, une question se pose : comment plusieurs utilisateurs peuvent-ils se partager le clavier et
l’écran ? La réponse est simple : ils ne le peuvent pas. Par conséquent, il n’y a que trois solutions
possibles : soit on connecte à l’ordinateur d’autres claviers et d’autres écrans (on appelle un couple
clavier/écran un « terminal »), soit on accède au système par l’intermédiaire d’un autre ordinateur via le
réseau, soit les utilisateurs lancent tour à tour leurs programmes. La dernière solution nécessite que les
programmes ne soient pas interactifs : ils doivent être capable de fonctionner sans intervention de celui
qui les a lancés.
La première hypothèse n’est pas sérieuse pour un particulier, il est d’ailleurs assez difficile de connecter
un terminal supplémentaire sur un PC (c’est réalisable, soit en connectant un terminal dédié à l’un des
ports série, soit en ajoutant une carte graphique PCI et en connectant un deuxième clavier et une
deuxième souris, par exemple sur le port USB, et en utilisant une version modifiée de [Link]. Ce n’est
donc pas une opération à la portée du commun des mortels.). La deuxième solution, en revanche, est
nettement plus envisageable. Il est parfaitement possible qu’un particulier dispose de deux PC connectés
en réseau, et que deux membres de la même famille cherchent à utiliser des ressources de la même
machine (par exemple, une imprimante ou tout autre périphérique, un programme installé sur un seul
ordinateur, des fichiers personnels, etc.). Quant à la troisième solution, elle est du domaine du quotidien,
même pour un ordinateur sans réseau et avec un seul utilisateur. En effet, certains programmes sont
lancés par le système pour effectuer des tâches de maintenance, et fonctionnent au nom de
l’administrateur de la machine.
Il va de soi que pour être multi-utilisateur, le système doit satisfaire certains critères :
• il doit être multitâche, c’est-à-dire qu’il doit être capable de faire fonctionner plusieurs programmes
simultanément sur la même machine, en partageant les ressources de celle-ci ;
• il doit être fiable, car un arrêt du système peut déranger un nombre arbitraire de personnes, y compris
celles qui ne sont pas à proximité de l’ordinateur ;
10
Chapitre 3. Concepts de base
• il doit être sûr, car il ne faut pas que les erreurs ou les malveillances d’un utilisateur ne puissent
déranger les autres.
Le multitâche est assuré au niveau du noyau. Chaque programme en cours d’exécution (on les appelle
« processus ») fonctionne dans sa propre zone de mémoire, qui est complètement contrôlée par le noyau.
Les ressources du processeur sont partagées entre les processus, et il est impossible à l’un d’entre eux de
monopoliser la mémoire, le disque ou quoi que ce soit. Les processus doivent toujours passer par le
noyau pour effectuer une opération, ce qui permet un contrôle absolu.
La fiabilité est également assurée au niveau du noyau. Les zones de mémoire utilisées par chaque
processus (encore appelées « espaces d’adressage ») sont bien distinctes et bien identifiées par le noyau.
Cela implique qu’il est impossible à un processus de perturber le fonctionnement d’un autre processus.
Ainsi, si un processus fait une faute, il est purement et simplement terminé par le noyau. Cela est sans
appel : le noyau est le seul maître à bord.
Enfin, la sécurité est assurée par le noyau et par le système de fichiers. Au niveau du noyau, chaque
utilisateur est identifié de manière unique par un numéro dans le système. Ce numéro est utilisé pour
vérifier les droits de l’utilisateur, ou, autrement dit, ce qu’il peut faire. Les droits des utilisateurs
comprennent la possibilité de lire ou écrire un fichier, d’accéder ou non à une ressource ou d’exécuter un
programme. Il est également possible de créer un ou plusieurs « groupes » d’utilisateurs, et de donner
des droits particuliers à ces groupes. Tous les utilisateurs qui font partie de ce groupe recevront les droits
du groupe. Ainsi, des classes d’utilisateurs peuvent être facilement définies, et ces classes peuvent se voir
attribuer un peu plus de privilèges que les utilisateurs normaux selon les nécessités. Il existe toutefois un
utilisateur spécial, qui a tous les droits : l’administrateur du système (« root » en anglais). Aucune
restriction ne s’applique à cet utilisateur, car il doit être capable de gérer le système, l’installer, l’arrêter,
le mettre à jour si nécessaire, et de définir les utilisateurs et leurs droits.
Au niveau du système de fichiers, la sécurité est assurée par le stockage d’informations additionnelles
pour chaque fichier ou répertoire. Ces informations permettent de connaître :
Il n’est sans doute pas inutile de préciser un peu le fonctionnement des droits dans le système de fichiers.
Le droit de lecture correspond à la possibilité d’ouvrir et de consulter un fichier, ou de lister le contenu
d’un répertoire. Le droit d’écriture correspond à la possibilité de modifier un fichier, ou de créer ou
supprimer un fichier d’un répertoire. Enfin, le droit d’exécution correspond à la possibilité d’exécuter un
11
Chapitre 3. Concepts de base
fichier contenant un programme, ou d’entrer dans un répertoire. On notera par exemple qu’il est possible
d’obtenir la liste des fichiers d’un répertoire sans pouvoir s’y déplacer, ou encore de modifier un fichier
sans pouvoir le lire. On prendra garde également que le fait d’avoir le droit d’écriture sur un fichier ne
donne pas le droit de le supprimer (cependant, on peut le vider !). Pour cela, il faut avoir le droit
d’écriture sur le répertoire contenant ce fichier. Comme on le voit, les droits d’accès aux fichiers et aux
répertoires sont très souples.
Ces droits sont attribués séparément pour le propriétaire, le groupe et les autres utilisateurs (c’est-à-dire
les utilisateurs qui ne font pas partie du groupe auquel appartient le fichier). Il est donc possible de
donner par exemple tous les droits au propriétaire d’un fichier, et seulement le droit de lecture aux autres
utilisateurs. Cette configuration est celle qui est choisie par défaut lors de la création d’un fichier, elle
assure que seul le propriétaire peut modifier ou exécuter ce fichier, tout en laissant la possibilité aux
autres de le lire. Ce choix privilégie la sécurité des données de chacun en laissant le maximum de liberté
aux autres.
Si plusieurs personnes doivent travailler sur les mêmes fichiers, il existe deux techniques
complémentaires. La première, qui est la solution classique sous Unix, est de regrouper ces personnes
dans un groupe, d’affecter les fichiers sur lesquels ils doivent travailler à ce groupe, et de donner les
droits d’écriture aux membres de ce groupe sur ces fichiers. Cette solution elle toutefois relativement
contraignante, car elle nécessite la création d’un groupe par l’administrateur d’une part, et n’est pas très
souple quand des droits différents sur un même fichier doivent être attribués à plusieurs groupes
d’utilisateurs d’autre part. Il existe donc une deuxième possibilité, basée sur la notion d’ACL
(abréviation de l’anglais « Access Control List », liste d’informations décrivant les droits d’accès aux
fichiers). Grâce aux ACLs, il est possible de définir des droits de manière plus fine, fichier par fichier,
pour des utilisateurs et des groupes variés. De plus, les ACLs peuvent être manipulées par le propriétaire
du fichier, sans avoir recours aux droits administrateur. En contrepartie de cette facilité, il n’est pas
toujours évident de contrôler la sécurité de manière globale avec les ACLs, puisqu’on ne peut plus retirer
les droits d’un utilisateur sur tout un jeu de fichiers appartenant à un même groupe simplement en le
supprimant de la liste des utilisateurs de ce groupe.
La sécurité du système est transitive, cela signifie que tout programme lancé par un utilisateur s’exécute
en son nom et reçoit donc les droits de cet utilisateur. Le processus correspondant se voit donc attribuer
les mêmes restrictions que l’utilisateur qui l’a lancé. Il dispose également des droits du groupe auquel le
fichier du programme appartient. Il existe toutefois quelques exceptions à cette règle, pour les
programmes dont le comportement est bien connu et qu’il est impossible de détourner de leur fonction
initiale. C’est notamment le cas de quelques commandes systèmes (comme passwd, qui permet de
changer de mot de passe), qui peuvent être lancées par les utilisateurs et qui s’exécutent toutefois au nom
du système (dans le compte root). Il est donc impossible à un utilisateur de violer les règles de sécurité
du système. Pour parvenir à ce comportement, il faut utiliser des attributs spéciaux sur les fichiers de ces
programmes. Les attributs spéciaux sont décrits ci-dessous.
Le premier attribut spécial est le bit « setuid » (qui est l’abréviation de l’anglais « SET User IDentifier »).
Il ne peut être placé qu’au niveau des droits du propriétaire sur le fichier. Il permet d’indiquer que le
fichier est exécutable, et que lorsque le programme qu’il contient est lancé par un utilisateur, le processus
correspondant s’exécute avec les droits du propriétaire du fichier et non pas avec ceux de l’utilisateur qui
l’a lancé. Cependant, le système conserve tout de même le numéro de l’utilisateur réel qui a lancé le
processus, ce qui fait que le programme peut savoir par qui il a été lancé et au nom de qui il s’exécute.
Un processus dispose donc toujours de deux numéros d’utilisateur :
• le numéro de l’utilisateur réel (« real user id » en anglais), qui est le numéro de l’utilisateur qui a lancé
12
Chapitre 3. Concepts de base
le programme ;
• le numéro de l’utilisateur effectif (« effective user id » en anglais), qui est le numéro de l’utilisateur
avec les droits duquel le processus fonctionne.
Le bit setuid permet donc simplement d’affecter le numéro du propriétaire du fichier au numéro
d’utilisateur effectif du processus lorsqu’il est lancé. Le fait de conserver le numéro de l’utilisateur réel
permet au programme de réaliser des vérifications de sécurité additionnelles. Par exemple, la commande
passwd, qui permet de changer le mot de passe d’un utilisateur, a besoin des droits de l’utilisateur root
pour enregistrer le nouveau mot de passe. Il dispose donc du bit setuid pour que tous les utilisateurs
puissent l’utiliser. Cependant, même s’il s’exécute au nom de l’utilisateur root, il ne doit pas permettre à
n’importe qui de changer le mot de passe des autres utilisateurs : seul l’utilisateur root a le droit de faire
cette opération. Il utilise donc le numéro de l’utilisateur réel qui a lancé la commande pour savoir si c’est
bien l’utilisateur root qui l’a lancé.
Le bit setuid est l’attribut le plus couramment utilisé, essentiellement pour certaines commandes
systèmes. Il est représenté par la lettre ’s’ (comme « Setuid »), et il remplace le droit d’exécution (’x’)
des fichiers pour le propriétaire des fichiers (rappelons que le bit setuid implique que le fichier est
exécutable). Il n’a aucune signification pour les répertoires.
Le deuxième attribut spécial est le bit « setgid » (qui est l’abréviation de l’anglais « SET Group
IDentifier »). Ce bit fonctionne un peu de la même manière que le bit setuid, à ceci près qu’il fixe le
numéro de groupe effectif du processus lancé à celui de son fichier exécutable. Cet attribut est également
représenté par la lettre ’s’, et remplace le droit d’exécution (’x’) pour les utilisateurs du groupe auquel
appartient le fichier exécutable. De plus, et contrairement au bit setuid, ce bit a une signification pour les
répertoires. Un répertoire disposant du bit setgid permet de faire en sorte que tous les fichiers qui sont
créés dans ce répertoire se voient automatiquement attribués le même groupe que le répertoire. Ce bit est
relativement peu utilisé.
Enfin, le troisième et dernier attribut spécial est le bit « sticky ». Cet attribut remplace l’attribut
exécutable pour les autres utilisateurs que le propriétaire du fichier ou du répertoire et les membres du
groupe auquel il appartient. Contrairement aux bits setuid et setgid, il est représenté par la lettre ’t’ (pour
« sTickky »). Sa signification est assez spéciale : elle permet de faire en sorte que les programmes restent
chargés en mémoire après leur terminaison, ce qui permet de les relancer plus rapidement. Afin de ne pas
consommer la mémoire de manière permanente, le code du programme est placé automatiquement dans
le swap s’il n’est toujours pas relancé après un certain temps, mais même dans ce cas, tous les calculs de
chargement sont déjà effectués. Le lancement des programmes marqués de ce bit sera donc toujours
accéléré. Sachez cependant ne pas abuser du bit sticky car la mémoire (même virtuelle) est encore une
ressource rare. Pour les répertoires, sa signification est totalement différente : elle permet de restreindre
les droits des utilisateurs sur les répertoires ayant ce bit positionné. Ce bit fait en sorte que même si un
utilisateur dispose des droits d’écriture sur le répertoire, il ne peut pas supprimer tous les fichiers de ce
répertoire. Les seuls fichiers qu’il est autorisé à supprimer sont ses propres fichiers. Bien entendu, il est
toujours possible d’ajouter des fichiers dans le répertoire en question.
En pratique, les utilisateurs n’ont pas à se soucier des attributs des fichiers, et en fait même
l’administrateur laisse souvent les attributs par défaut, car ils correspondent à la majorité des besoins de
sécurité. L’administrateur a cependant le contrôle total sur les droits d’accès aux fichiers, sur le
propriétaire et le groupe de chaque fichier. Il est également le seul utilisateur capable de créer un autre
utilisateur ou un groupe, ainsi que de les détruire.
13
Chapitre 3. Concepts de base
Les questions qui se posent évidemment sont les suivantes. Est-ce qu’un particulier a besoin de tout
cela ? Ces fonctionnalités ne sont-elles pas réservées aux serveurs ? Est-ce qu’on ne risque pas de perdre
beaucoup de temps pour définir les droits pour chaque utilisateur et pour chaque ressource du système ?
La gestion de la sécurité ne consomme-t-elle pas trop de ressources ? Ces questions sont légitimes, mais
en fait, il est très intéressant même pour un particulier de disposer de ces fonctionnalités. En effet, la
sécurité permet tout simplement de protéger le système contre ses propres erreurs. Qui n’a pas effacé un
jour un fichier important ou déplacé le répertoire Windows en bougeant légèrement la souris lors d’un
double clic effectué trop lentement ? Avec Linux, on peut faire n’importe quoi, on est certain que le
système restera intact. D’ailleurs la règle essentielle, même pour un ordinateur utilisé par une seule
personne, est de toujours créer un compte utilisateur normal et de ne jamais travailler sous le compte
root. Cette sécurité est telle que Linux est le système d’exploitation idéal pour apprendre l’informatique à
quelqu’un : savoir que le système protège tout ce qui est important permet aux débutants de prendre des
initiatives sans crainte. Quant aux éventuels revers de médaille, ils sont absents : la gestion de la sécurité
ne consomme quasiment aucune ressource, et sa configuration est élémentaire. Toutes les distributions
s’installent de telle sorte que le système se protège des utilisateurs, et que ceux-ci soient indépendants les
uns des autres.
En résumé :
• le multitâche est un confort indéniable. Il est appréciable de pouvoir utiliser son ordinateur même
lorsqu’il est en train de faire une tâche longue en arrière-plan ;
• la fiabilité est évidemment indispensable. Il est rassurant de se dire que même si un processus très
gourmand en ressources fonctionne en arrière-plan, il ne perturbera pas les autres processus ;
• la sécurité permet de se protéger de ses propres erreurs, pour un coût minimal. Il suffit de conserver les
paramètres par défaut du système et de ne plus s’en soucier !
14
Chapitre 3. Concepts de base
• Linux est capable de gérer plusieurs systèmes de fichiers réels. La seule condition est qu’ils doivent
tous fournir les services de base exigés par le système de fichiers virtuel ;
• les applications peuvent utiliser plusieurs de ces systèmes de fichiers réels de manière uniforme,
puisqu’elles n’utilisent que le système de fichiers virtuel. Cela simplifie leur programmation, et permet
d’éviter autant de bogues potentiels ;
• chaque système de fichiers réel étant indépendant des autres, il ne perturbe pas leur fonctionnement.
En particulier, un système de fichiers corrompu ne corrompt pas les autres.
Avec cette architecture, un grand nombre de systèmes de fichiers ont été développés pour Linux. Parmi
ces systèmes de fichiers, on retrouve les plus connus, à savoir :
• le système de fichiers EXT2, qui est le système de fichiers natif de Linux ;
• le système de fichiers EXT3, qui est une évolution du système de fichiers EXT2 capable de prendre en
charge également les mécanismes de journalisation (voir la note ci-dessous pour savoir ce qu’est la
journalisation d’un système de fichiers) ainsi que les blocs déffectueux sur le support physique ;
• le système de fichiers ReiserFS, qui supprime la notion de bloc disque et qui est également journalisé ;
• les systèmes de fichiers FAT, FAT32 et FAT32X (utilisés par les systèmes DOS et Windows) ;
• le système de fichiers NTFS (utilisé par Windows NT, Windows 2000 et XP), en lecture seule et en
écriture par écrasement des données de fichiers existants uniquement pour l’instant ;
• le système de fichiers ISO9660, qui est utilisé par tous les CD-ROM. Les extensions permettant de
gérer les noms longs sont également gérées. Ces extensions comprennent en particulier le système de
fichiers Joliet (extensions de Microsoft pour Windows 95) et Rock Ridge (extensions utilisées par tous
les systèmes Unix) ;
• le système de fichiers NFS (utilisé pour distribuer sur un réseau un système de fichiers).
15
Chapitre 3. Concepts de base
Note : La journalisation consiste à écrire sur le disque toutes les opérations en cours à chaque
instant. Ainsi, lorsqu’un redémarrage intempestif se produit, le système peut ramener rapidement la
structure de données du système de fichiers dans un état cohérent. La journalisation accroît donc
encore à la fiabilité du système de fichiers.
Linux gère également d’autres systèmes de fichiers natifs ou utilisés par d’autres systèmes d’exploitation
(Unix ou non). Il permet même d’intégrer un pseudo système de fichiers généré par le noyau. Ce système
de fichiers est complètement fictif : sa structure et ses fichiers sont générés dynamiquement par le noyau
lorsqu’une application y accède. Il est principalement utilisé par les applications pour lire des
informations que le noyau met à leur disposition, ainsi que pour changer dynamiquement certains
paramètres du noyau en les écrivant simplement dans les fichiers.
Les systèmes de fichiers natifs de Linux sont de loin les systèmes de fichiers les plus fonctionnels, les
plus fiables et les plus courants. Le choix du système de fichiers dépend donc généralement de l’usage
que l’on en fera, certains systèmes de fichiers étant plus appropriés pour certains types d’utilisation. Si
l’on recherche essentiellement la stabilité, je recommande le système de fichiers EXT3, car c’est pour
l’instant le seul système de fichiers capable de prendre en compte les blocs défectueux sur le support
physique.
Quoi qu’il en soit, on ne pourra installer Linux que sur un système de fichiers de type Unix. Ces
systèmes de fichiers sont tous plus fonctionnels et plus performants que les systèmes de fichiers FAT.
Leurs principales fonctionnalités sont les suivantes :
• les accès aux fichiers sont rapides, même plus rapides que les systèmes de fichiers basés sur la FAT
sous Windows, qui pourtant ne gèrent pas les droits des utilisateurs ni les autres fonctionnalités
avancées des systèmes de fichiers Unix ;
• la fragmentation des fichiers est quasiment inexistante. En fait, la fragmentation des fichiers est si
faible que l’on peut l’ignorer en pratique. Cela provient des algorithmes utilisés par ces systèmes de
fichiers pour allouer les blocs du disque dur lors de l’écriture dans un fichier : ils cherchent tout
simplement à donner systématiquement les blocs les plus proches. Pour donner un ordre de grandeur,
après installation, suppression, manipulation d’un grand nombre d’applications et de petits fichiers sur
une partition EXT2 de 800 Mo, le tout réalisé par plusieurs processus fonctionnant en même temps, la
fragmentation reste inférieure à 1% sur 57571 fichiers (sur un total de 249856 fichiers que le système
de fichiers pourrait contenir) ;
• quant à la fiabilité, elle est gérée grâce à un stockage redondant des principales structures de données
internes. Ainsi, si une erreur apparaît dans le système de fichiers, les parties défectueuses peuvent être
reconstituées à partir des informations sauvegardées. Cette réparation est réalisée automatiquement à
chaque redémarrage de la machine si nécessaire.
Nous allons maintenant voir les quelques fonctionnalités additionnelles que les systèmes de fichiers de
Linux supportent.
La première fonctionnalité intéressante est le support des droits d’accès aux fichiers pour les utilisateurs
et pour les groupes. La gestion de ces droits est un impératif sous Unix. Comme on l’a déjà vu, ces droits
comprennent les droits d’accès en lecture, en écriture et en exécution, plus les attributs spéciaux des
fichiers. Ces droits sont fixés indépendamment pour l’utilisateur propriétaire du fichier, le groupe
d’utilisateur propriétaire du fichier, et tous les autres utilisateurs.
16
Chapitre 3. Concepts de base
Une autre fonctionnalité intéressante est la possibilité de réaliser des liens sur des fichiers ou des
répertoires. Un lien est une référence à un fichier ou un répertoire existant, qui peut être manipulé
exactement comme sa cible. Il existe deux sortes de liens : les liens physiques, qui sont réellement une
référence sur les données du fichier au niveau de la structure même du système de fichiers, et les liens
symboliques, qui ne sont rien d’autre qu’un fichier additionnel contenant les informations nécessaires
pour retrouver la cible.
Les liens physiques présentent les inconvénients de ne pas pouvoir référencer des répertoires, et de ne
pouvoir référencer que des objets du même système de fichiers que celui dans lequel ils sont créés. La
limitation sur les répertoires permet d’éviter de construire des cycles dans la structure du système de
fichiers. Quant à la limitation à la frontière des systèmes de fichiers, elle est obligatoire puisque les liens
physiques sont gérés directement au niveau de la structure du système de fichiers. En revanche, ils
présentent des avantages certains :
• le déplacement des cibles ne les perturbe pas si celles-ci restent dans le même système de fichiers,
parce que dans ce cas les données ne sont pas déplacées sur le disque ;
• la suppression de la cible ne détruit pas le lien physique. Tous les liens physiques sur un fichier
partagent la même structure de données du système de fichiers, et celle-ci n’est réellement détruite
qu’à la destruction du dernier lien physique.
En fait, toute entrée de répertoire est un lien physique sur le contenu du fichier. Le fait d’avoir plusieurs
liens physiques sur les mêmes données correspond à disposer de plusieurs entrées de répertoire donnant
accès aux mêmes données dans le système de fichiers. Il serait possible de créer des liens physiques dans
un système de fichiers FAT, mais ils seraient interprétés comme des références croisées par les outils de
vérification de disque. Le système de fichiers FAT de Linux interdit donc la création des liens physiques,
tout comme le font DOS et Windows.
Les liens symboliques, quant à eux, permettent de référencer des fichiers ou des répertoires se trouvant
dans d’autres systèmes de fichiers que le leur. C’est pour cette raison qu’ils sont très couramment utilisés
(en fait, les liens physiques ne sont quasiment pas utilisés, parce qu’il est très courant de faire un lien sur
un répertoire, ce que seuls les liens symboliques savent faire). En revanche, ils sont extrêmement
dépendants de leur cible : si elle est supprimée ou déplacée, tous les liens symboliques qui s’y réfèrent
deviennent invalides.
La référence sur le fichier ou le répertoire cible contenue dans les liens symboliques peut être soit
relative à l’emplacement de leur cible, soit absolue dans le système de fichiers. Chacune de ces méthodes
a ses avantages et ses inconvénients : les liens symboliques qui contiennent des références relatives ne
sont pas brisés lors d’un déplacement de la cible, pourvu qu’ils soient déplacés également et restent à la
même position relative par rapport à celle-ci dans la hiérarchie du système de fichiers. En revanche, ils
sont brisés s’ils sont déplacés et que la cible ne l’est pas. Les liens symboliques utilisant des références
absolues sont systématiquement brisés lorsque la cible est déplacée, mais ils restent valides lorsqu’ils
sont eux-mêmes déplacés. Comme en général c’est le comportement que l’on recherche, les liens
symboliques sont toujours créés avec des références absolues, mais vous êtes libre de faire autrement si
vous en ressentez le besoin. Sachez cependant que déplacer une source de données n’est jamais une
bonne idée. Le tableau suivant récapitule les avantages et les inconvénients des différents types de liens :
17
Chapitre 3. Concepts de base
Les systèmes de fichiers de Linux donne également la possibilité de gérer des fichiers presque vides
(« sparse files » en anglais) et les quotas. Ces deux fonctionnalités sont relativement peu utilisées par les
particuliers, elles ne sont mentionnées ici qu’afin d’être complet. Les fichiers presque vides sont des
fichiers contenant des données séparées par de grands espaces vides. Il est inutile de stocker ces espaces
vides sur le disque, aussi les systèmes de fichiers signalent-ils simplement que ce fichier contient des
trous, et ils ne stockent que les données réelles et la position des trous avec leurs tailles. Cela constitue
une économie de place non négligeable. Les applications classiques des fichiers presque vides sont les
bases de données, qui utilisent souvent des fichiers structurés contenant relativement peu de données
effectives. Les quotas quant à eux permettent d’attribuer un espace disque fixe à chaque utilisateur. Ce
n’est réellement utile que pour les serveurs.
18
Chapitre 3. Concepts de base
inverse (nommée « backslash » en anglais) ’\’, rendant ainsi tous ses systèmes incompatibles avec les
systèmes Unix, et générant ainsi beaucoup de problèmes supplémentaires là où il n’était pas nécessaire
d’en avoir (sincèrement, le coût de cette ânerie, ainsi que celle des marqueurs de fin de ligne dans les
fichiers textes, doit atteindre des sommes astronomiques dans tous les projets de portage ou de
développement d’applications portables). Comme le répertoire racine n’a pas de nom, il peut être accédé
directement avec un simple slash :
La qualification complète d’un fichier se fait en précisant le nom du répertoire à chaque niveau et en
séparant par des slashes chacun de ces noms. Cette qualification porte le nom de « chemin » d’accès
(« path » en anglais). L’exemple suivant vous montre l’allure d’un chemin d’accès typique sous Unix :
/home/[Link]/lettres/professionnelles/marketing/[Link]
La longueur maximale d’un chemin d’accès est de 4 ko dans le système de fichiers EXT2.
Les utilisateurs du DOS et de Windows constateront ici que les chemins d’accès Unix ne comportent pas
de spécification de lecteur. Les systèmes de fichiers Unix sont dits mono-têtes, ce qui signifie qu’ils n’ont
qu’un seul point de départ : le répertoire racine (alors que les systèmes Microsoft sont multi-têtes,
puisqu’ils ont un point de départ par lecteur et par partition). Le fait de n’avoir qu’un seul point de départ
est beaucoup plus simple et permet, encore une fois, d’écrire les programmes plus simplement et donc
avec moins de bogues potentiels. Je sens tout de suite venir la question de la part des habitués du DOS :
« Mais alors, comment spécifie-t-on le lecteur que l’on veut utiliser ? ». Cette question a deux réponses.
Premièrement, on n’accède pas aux lecteurs, mais aux systèmes de fichiers. Les utilisateurs du DOS
devront donc réapprendre qu’un lecteur représente un périphérique physique, et qu’il est possible qu’il
contienne plusieurs systèmes de fichiers. Ils devront également se rendre compte qu’un système de
fichiers n’est pas nécessairement stocké sur un lecteur : il peut être stocké dans un fichier (c’est le cas par
exemple pour les images disques de CD-ROM), accessible par le réseau (c’est le cas des systèmes de
fichiers réseau, « Network File System » en anglais), ou encore généré par un composant du système
(c’est le cas des systèmes de fichiers virtuels du noyau). La question n’a donc pas beaucoup de sens telle
quelle. Cependant, le problème de l’accès aux systèmes de fichiers se pose malgré tout. La réponse à ce
problème-ci est cette fois la suivante : pour accéder à un système de fichiers, il faut réaliser une opération
que l’on nomme le « montage ». Cette opération associe le répertoire racine de ce système de fichiers à
l’un des répertoires de l’arborescence existante. Ce répertoire est couramment appelé « point de
montage ». Par exemple, il est courant de monter le lecteur de disquette dans le répertoire /floppy/.
Ainsi, si la disquette contient le fichier [Link], ce fichier sera accessible grâce au chemin
suivant :
/floppy/[Link]
Cette solution permet d’accéder à tous les systèmes de fichiers de la même manière, à partir d’un seul
répertoire racine, que ces systèmes de fichiers soient EXT2, FAT, ISO9660, NTFS ou Amiga... En
pratique, c’est nettement plus simple.
L’opération de montage peut réaliser bien plus d’opérations qu’une simple association d’un système de
fichiers à un point de montage. En effet, elle peut générer les opérations suivantes :
19
Chapitre 3. Concepts de base
On prendra en particulier garde à toujours démonter les systèmes de fichiers pour les lecteurs amovibles.
Linux utilise en effet des zones de la mémoire que l’on appelle les tampons (« buffers » en anglais), pour
y stocker les données des systèmes de fichiers montés, et il n’écrit ces données que lorsque c’est
nécessaire. Ce mécanisme permet d’accélérer les lectures et les écritures sur les disques, mais a
l’inconvénient de nécessiter une requête de vidange des tampons (opération que l’on appelle « sync »)
avant de retirer le lecteur ou avant d’éteindre le système. Si on ne le fait pas, des données seront
certainement perdues. Le système effectue le sync lorsqu’il s’arrête (par l’une des commandes halt,
shutdown ou reboot), mais il ne le fait pas si on coupe le courant brutalement. C’est pour cela qu’il faut
toujours arrêter le système proprement. De manière similaire, Linux empêche l’éjection des CD-ROM
tant qu’ils sont montés. En revanche, il ne peut rien faire pour les lecteurs de disquettes, c’est à
l’utilisateur de prendre garde à les démonter avant de retirer la disquette.
Deux derniers points auxquels les utilisateurs de DOS et Windows devront faire attention :
• les fichiers ne sont pas identifiés par leur extension. Un nom de fichier peut contenir un ou plusieurs
points, et une extension peut être arbitrairement longue. En particulier, un nom de fichier peut
commencer par un point. Dans ce cas, ce fichier sera considéré comme caché par les programmes, et
on ne les verra que si on le demande explicitement ;
• les systèmes de fichiers Unix font la distinction entre les majuscules et les minuscules. Il faut donc
prendre garde à la manière dont on écrit les noms de fichiers et de répertoires. Cependant, la plupart
des répertoires et des fichiers ont un nom écrit complètement en minuscules.
Nous allons à présent nous intéresser à l’organisation du système de fichiers de Linux. Ce système de
fichiers contient un certain nombre de répertoires et de fichiers standards, qui ont chacun une fonction
bien définie. Cette structure standard permet de gérer tous les systèmes Linux de manière homogène : les
programmes savent où trouver ce dont ils ont besoin. Ils sont donc portables d’un système à un autre, et
les utilisateurs ne sont pas dépaysés lorsqu’ils changent de machine (en fait, cette structure est à peu près
la même pour tous les systèmes Unix, ce qui donne encore plus de poids à l’argument précédent).
Cette organisation standard du système de fichiers a été conçue de telle manière que les données et les
programmes sont placés chacun à leur place, et qu’ils puissent être facilement intégrés dans un réseau.
L’intégration dans un réseau sous-entend que les fichiers des programmes peuvent être partagés par les
différentes machines de ce réseau, ce qui permet d’économiser beaucoup de place. De plus, il est
possible d’accéder à la plupart des ressources du système grâce à une interface uniforme. En particulier,
il est possible d’accéder à tous les périphériques installés sur l’ordinateur par l’intermédiaire de fichiers
spéciaux, et on peut récupérer des informations sur le système mises à disposition par le noyau
simplement en lisant des fichiers générés par un pseudo système de fichiers. Le tableau suivant décrit les
principaux éléments de l’arborescence du système de fichiers de Linux.
20
Chapitre 3. Concepts de base
Répertoire Signification
/ Répertoire racine. Point de départ de toute la hiérarchie du système de
fichiers. Le système de fichiers contenant ce répertoire est monté
automatiquement par le noyau pendant l’amorçage du système. Ce système
de fichiers est appelé système de fichiers racine (« root » en anglais).
/boot/ Répertoire contenant le noyau de Linux et ses informations de symboles. Ce
répertoire est parfois le point de montage d’un système de fichiers de très
petite taille, dédié au noyau. Dans ce cas, il est recommandé que le système
de fichiers correspondant soit monté en lecture seule. On notera que sur
certains systèmes, le noyau reste placé dans le répertoire racine. Cette
technique n’est pas recommandée, car on ne peut pas monter en lecture seule
la partition racine en utilisation normale du système.
/boot/vmlinuz Noyau compressé de Linux. Les noyaux compressés se décompressent
automatiquement lors de l’amorçage du système. Sur certains systèmes, le
noyau est encore placé dans le répertoire racine du système de fichiers.
/boot/[Link] Fichier système contenant la liste des symboles du noyau. Ce fichier est
utilisé par certains programmes donnant des renseignements sur le système.
En particulier, il est utilisé par le programme « top » (programme qui indique
la liste des principaux processus actifs) afin de donner le nom de la fonction
du noyau dans lequel un processus se trouve bloqué lorsqu’il est en attente de
la fin d’une opération que le noyau doit exécuter pour lui.
/dev/ Répertoire contenant tous les fichiers spéciaux permettant d’accéder aux
périphériques. Sous Linux, la plupart des périphériques sont accessibles au
travers de fichiers spéciaux, grâce auxquels l’envoi et la réception des
données vers les périphériques peuvent être réalisés de manière uniforme. Il
existe un tel fichier pour chaque périphérique, et ils sont tous placés dans ce
répertoire. Les distributions installent souvent dans ce répertoire les fichiers
spéciaux pour la plupart des périphériques, même s’ils ne sont pas
physiquement présents dans la machine. Dans ce cas, les opérations sur les
fichiers spéciaux des périphériques non installés seront tout simplement
refusées par le noyau. Une autre possibilité est d’utiliser un système de
fichiers virtuel, géré directement par le noyau. Le répertoire /dev/ ne
contient dans ce cas que les fichiers spéciaux des périphériques pour lesquels
le noyau dispose d’un gestionnaire intégré ou chargé dynamiquement. Quelle
que soit la technique utilisée, ce répertoire doit être impérativement placé
dans le système de fichiers racine.
/sbin/ Répertoire contenant les commandes systèmes nécessaires à l’amorçage et
réservées à l’administrateur. Ce répertoire doit être impérativement placé
dans le système de fichiers racine. En général, seul l’administrateur utilise
ces commandes.
/bin/ Répertoire contenant les commandes systèmes générales nécessaires à
l’amorçage. Ce répertoire doit être impérativement placé dans le système de
fichiers racine. Tous les utilisateurs peuvent utiliser les commandes de ce
répertoire.
21
Chapitre 3. Concepts de base
Répertoire Signification
/lib/ Répertoire contenant les bibliothèques partagées (« DLL » en anglais, pour
« Dynamic Link Library ») utilisées par les commandes du système des
répertoires /bin/ et /sbin/. Ce répertoire doit être impérativement placé
dans le système de fichiers racine.
/lib/modules/ Ce répertoire contient les modules additionnels du noyau. Les modules sont
des composants logiciels du noyau, mais qui ne sont pas chargés
immédiatement pendant la phase d’amorçage du système. Ils peuvent en
revanche être chargés et déchargés dynamiquement, lorsque le système est en
fonctionnement. Il est fortement recommandé que ce répertoire soit placé
dans le système de fichiers racine.
/etc/ Répertoire contenant tous les fichiers de configuration du système. Ce
répertoire doit être impérativement placé dans le système de fichiers racine.
/etc/X11/ Répertoire contenant les fichiers de configuration de l’environnement
graphique XWindow. Dans certaines distributions, ces fichiers sont placés
directement dans le répertoire /etc/, mais ce n’est pas une technique
recommandable.
/etc/rc.d/ Répertoire contenant les scripts de démarrage du système. Ces scripts sont
exécutés lorsque le système démarre ou s’arrête, ainsi que lorsqu’il change
de mode de mode de fonctionnement. Il est également possible de les
exécuter pour démarrer ou arrêter un service particulier. Dans certaines
distributions, ces fichiers sont placés dans le répertoire /sbin/init.d/.
/etc/opt/ Répertoire contenant les fichiers de configuration des applications.
/tmp/ Répertoire permettant de stocker des données temporaires. En général,
/tmp/ ne contient que des données très éphémères. Il est préférable
d’utiliser le répertoire /var/tmp/. En effet, le répertoire /tmp/ ne dispose
pas nécessairement de beaucoup de place disponible.
/usr/ Répertoire contenant les fichiers du système partageables en réseau et en
lecture seule.
/usr/bin/ Répertoire contenant la plupart des commandes des utilisateurs.
/usr/sbin/ Répertoire contenant les commandes systèmes non nécessaires à l’amorçage.
Ces commandes ne sont normalement utilisées que par l’administrateur
système.
/usr/lib/ Répertoire contenant les bibliothèques partagées de tous les programmes de
/usr/bin/ et /usr/sbin/ et les bibliothèques statiques pour la création de
programmes.
/usr/include/ Répertoire contenant les fichiers d’en-têtes du système pour le compilateur
C/C++. Les fichiers de ce répertoire sont utilisés pour réaliser des
programmes dans les langages de programmation C et C++.
/usr/X11R6/ Répertoire contenant X11R6 et ses applications. Ce répertoire contient des
sous-répertoires bin/, lib/ et include/, où se trouvent les exécutables de
XWindow, les bibliothèques et les fichiers d’en-têtes pour créer des
programmes pour XWindow en C et C++.
22
Chapitre 3. Concepts de base
Répertoire Signification
/usr/src/ Répertoire contenant les fichiers sources du noyau et des applications de la
distribution. Normalement, ce répertoire ne doit contenir que le code source
des applications dépendantes de la distribution que vous utilisez.
/usr/src/linux/ Sources du noyau de Linux. Il est vivement recommandé de conserver les
sources du noyau de Linux sur son disque, afin de pouvoir changer la
configuration du système à tout moment.
/usr/local/ Répertoire contenant les programmes d’extension du système indépendants
de la distribution. Ce n’est toutefois pas le répertoire d’installation des
applications, que l’on installera en général dans le répertoire /opt/.
« local » ne signifie pas ici que les programmes qui se trouvent dans ce
répertoire ne peuvent pas être partagés sur le réseau, mais plutôt que ce sont
des extensions du système qu’on ne trouve donc que localement sur un site
donné. Ce sont donc les extensions qui ne font pas partie de la distribution de
Linux utilisée, et qui doivent être conservées lors des mises à jour ultérieures
de cette distribution. Ce répertoire contient les sous-répertoires bin/, lib/,
include/ et src/, qui ont la même signification que les répertoires du
même nom de /usr/, à ceci près qu’ils ne concernent que les extensions
locales du système, donc indépendantes de la distribution.
/var/ Répertoire contenant toutes les données variables du système. Ce répertoire
contient les données variables qui ne pouvaient pas être placées dans le
répertoire /usr/, puisque celui-ci est normalement accessible en lecture
seule.
/var/tmp/ Répertoire contenant les fichiers temporaires. Il est préférable d’utiliser ce
répertoire plutôt que le répertoire /tmp/.
/var/opt/ Répertoire contenant les données variables des applications.
/var/log/ Répertoire contenant les traces de tous les messages système. C’est dans ce
répertoire que l’on peut consulter les messages d’erreurs du système et des
applications.
/var/spool/ Répertoire contenant les données en attente de traitement. Les travaux
d’impression en cours, les mails et les fax en attente d’émission, les travaux
programmés en attente d’exécution sont tous stockés dans ce répertoire.
/var/locks/ Répertoire contenant les verrous sur les ressources système. Certaines
ressources ne peuvent être utilisées que par une seule application (par
exemple, un modem). Les applications qui utilisent de telles ressources le
signalent en créant un fichier de verrou dans ce répertoire.
/var/cache/ Répertoire contenant les données de résultats intermédiaires des applications.
Les applications qui doivent stocker des résultats intermédiaires doivent les
placer dans ce répertoire.
23
Chapitre 3. Concepts de base
Répertoire Signification
/opt/ Répertoire contenant les applications. C’est dans ce répertoire que les
applications qui ne font pas réellement partie du système doivent être
installées. Les applications graphiques devraient être installées dans ce
répertoire. C’est en particulier le cas des gestionnaires de bureau. Les seules
applications graphiques considérées comme faisant partie du système sont
les applications de X11, qui sont donc stockées dans /usr/X11R6/. Il est
recommandé que ce répertoire soit placé sur un système de fichiers en lecture
seule, et que les applications utilisent le répertoire /var/opt/ pour
travailler.
/home/ Répertoire contenant les répertoires personnels des utilisateurs. Il est bon de
placer ce répertoire dans un système de fichiers indépendant de ceux utilisés
par le système. Cela permet de faire des sauvegardes plus facilement, et de
faire les mises à jour du système de manière sûre, sans craindre de perdre les
données des utilisateurs.
/root/ Répertoire contenant le répertoire personnel de l’administrateur. Il est donc
recommandé que le répertoire personnel de l’administrateur soit placé en
dehors de /home/ pour éviter qu’un problème sur le système de fichiers des
utilisateurs ne l’empêche de travailler. Toutefois, il est important que
l’administrateur puisse travailler même si les répertoires /root/ et
/home/root/ ne sont pas présents. Dans ce cas, son répertoire personnel
sera le répertoire racine.
/mnt/ Répertoire réservé au montage des systèmes de fichiers non-permanents
(CD-ROM, disquettes, etc.). Ce répertoire peut contenir plusieurs
sous-répertoires pour chaque périphérique amovible, afin de permettre d’en
monter plusieurs simultanément. Notez qu’il est assez courant de disposer de
liens symboliques dans la racine référençant les principaux systèmes de
fichiers, afin d’en simplifier l’accès. Par exemple, il est courant d’avoir un
répertoire /floppy/ référençant le lecteur de disquette et un répertoire
/cdrom/ référençant le lecteur de CD-ROM.
/lost+found/ Répertoire contenant les données récupérées lors de la réparation d’un
système de fichiers endommagé. Ces données sont écrites par les utilitaires
de vérification et de réparation des systèmes de fichiers lorsqu’ils trouvent
des informations qui ne peuvent être rattachées à aucun fichier existant, ainsi,
il est possible de récupérer ces informations si elles ne sont pas dans un état
de détérioration trop avancé.
/proc/ Répertoire contenant le pseudo système de fichiers du noyau. Ce pseudo
système de fichiers contient des fichiers permettant d’accéder aux
informations sur le matériel, la configuration du noyau et sur les processus en
cours d’exécution.
24
Chapitre 3. Concepts de base
Répertoire Signification
/sys/ Répertoire contenant le pseudo système de fichiers des gestionnaires de
périphériques. Ce pseudo système de fichiers contient des fichiers permettant
d’obtenir des informations sur l’ensemble des objets du noyau, en en
particulier sur l’ensemble des périphériques de l’ordinateur. Ce système de
fichiers est appelé à recevoir une bonne partie des informations exposées par
le système de fichiers /proc/, dont le rôle se restreindra sans doute à fournir
des informations plus générales sur le système.
Note : Les informations données ici peuvent ne pas être correctes pour votre distribution. En effet,
certaines distributions utilisent une structure légèrement différente. Les informations données ici sont
conformes à la norme de hiérarchie de systèmes de fichiers version 2.0 (« FHS » en anglais). Vous
pouvez consulter ce document pour une description exhaustive du système de fichiers de Linux.
Vous avez pu constater que les répertoires bin/, lib/, include/ et src/ apparaissent régulièrement
dans la hiérarchie du système de fichiers. Cela est normal : les répertoires sont classés par catégorie
d’applications et par importance. Les répertoires bin/ contiennent en général les programmes, et les
répertoires lib/ les bibliothèques partagées par ces binaires. Cependant, les répertoires lib/ peuvent
aussi contenir des bibliothèques statiques, qui sont utilisées lors de la création de programmes. En
général, tous les systèmes Unix fournissent en standard un compilateur pour réaliser ces programmes.
Dans le cas de Linux, ce compilateur est « gcc » (pour « GNU C Compiler »). La création d’un
programme nécessite que l’on dispose des fichiers sources, qui contiennent le programme écrit dans un
langage de programmation, des fichiers d’en-têtes, qui contiennent les déclarations de toutes les
fonctions utilisables, et des fichiers de bibliothèques statiques, contenant ces fonctions. Ces différents
fichiers sont stockés respectivement dans les répertoires src/, include/ et lib/. Les notions de
sources et de compilation seront décrites en détail dans le Chapitre 7.
25
Chapitre 4. Installation du système de base
Maintenant que vous connaissez tout des grands principes de Linux (et de la plupart des systèmes Unix),
vous devez brûler d’impatience de l’installer et de commencer à exploiter toutes ses possibilités.
Cependant, il faut ne pas tomber dans le travers de ceux qui veulent impérativement utiliser une
fonctionnalité sous prétexte qu’elle est disponible. Il se peut que vous ayez envie de les essayer, parce
que vous en avez été privé depuis longtemps. Ce comportement est tout à fait normal, mais vous allez
devoir refréner vos envies, pour deux raisons. La première est qu’il va falloir installer Linux au préalable,
et la deuxième est qu’il ne faut pas faire un sac de nœuds avec vos données. Vous pourrez expérimenter à
loisir, mais il faudra rester sérieux dès que vous toucherez au système. Comprenez bien que l’installation
et la configuration de Linux doivent se faire pas à pas. Griller les étapes peut se révéler être une erreur,
car cela rendrait les choses plus compliquées qu’elles ne le sont.
La configuration minimale supportée par Linux est un 386 avec au minimum 12 Mo de mémoire vive. Il
va de soi qu’avec un tel foudre de guerre, vous ne pourrez pas aller bien loin, et une configuration
minimale plus raisonnable serait plutôt un 486DX2 66MHz avec au moins 32Mo de mémoire. La
quantité de mémoire est de loin le facteur le plus important, et si vous voulez utiliser l’environnement
graphique X11, il faut au minimum compter sur 64 Mo de mémoire vive. Vous pourrez donc
parfaitement transformer un vieux 486 ou pentium en routeur ou en Firewall avec partage de connexion à
Internet par exemple. Vous n’aurez donc certainement aucun problème avec les ordinateurs puissants qui
se vendent actuellement.
26
Chapitre 4. Installation du système de base
• types de lecteurs ou de graveur de CD-ROM ou de DVD (IDE, ATAPI, SCSI, connecté sur carte son)
et le type de leur branchement s’ils sont externes (port parallèle, SCSI ou USB) ;
• nom, modèle et marque de la carte graphique, type de chipset utilisé par cette carte et taille de sa
mémoire vidéo ;
• nom, modèle et marque de l’écran, avec, surtout, ses fréquences de balayage horizontales et verticales,
sa bande passante et les fréquences recommandées par le constructeur pour les différentes résolutions ;
• type de carte son (ISA, PCI, PnP) ainsi que le nom du chipset utilisé par cette carte ;
• type de carte réseau (ISA, PCI, PnP) ainsi que le nom de son chipset ;
• type de chipset pour les réseaux sans fils Wifi ;
• type de modem (interne, externe) et, si le modem est interne, sa nature (modem complet ou
émulation) ;
• type de chipset pour le contrôleur FireWire (IEEE 1394) si vous en disposez d’un ;
• type de chipset et nom, marque, modèle pour les périphériques annexes (contrôleurs infrarouge,
lecteurs de cartes mémoire intégrés, etc.).
Vous pouvez obtenir ces informations en consultant la documentation fournie avec votre ordinateur, les
sites Web des constructeurs des différents composants, les informations fournies par le programme de
configuration du BIOS ou affichées directement par le BIOS au démarrage de la machine, ou tout
simplement en ouvrant le boîtier de la machine et en regardant ce qu’il y a à l’intérieur. Vous pouvez
également récupérer les informations indiquées dans la configuration de MS Windows si celui-ci est
installé.
Il se peut que vous n’ayez pas besoin de ces informations et que l’installation se passe sans problèmes.
Cependant, si d’aventure Linux exige que vous les connaissiez, mieux vaut pouvoir lui répondre.
Note : Bien que cela soit assez rare, certains composants ou périphériques additionnels peuvent ne
pas être gérés par Linux, faute d’avoir un gestionnaire de périphériques adéquat (cet état de fait est
en général dû à une rétention d’informations de la part des fabricants, qui empêchent ainsi les
développeurs de Linux d’écrire les gestionnaires de périphériques dans de bonnes conditions). C’est
en particulier le cas de nombre de périphériques bas de gamme conçus pour ne fonctionner qu’avec
MS Windows, ou de quelques périphériques exotiques. Les Winmodems ont une triste réputation à
ce sujet (il s’agit de modems incomplets, dont une partie du traitement de signal est reporté dans un
logiciel spécifique à Windows), ainsi que des imprimantes dites « GDI », qui ne comprennent que les
commandes graphiques de Windows. Vous pourrez également avoir des problèmes avec des cartes
de numérisation vidéo analogiques ainsi que certaines cartes de décompression MPEG. Certaines
marques se distinguent par le fait qu’elles refusent obstinément de développer des gestionnaires de
périphériques pour leur matériel ou, pire encore, de fournir les informations nécessaires aux
développeurs de Linux pour écrire ces gestionnaires sous licence libre. Il est donc recommandé,
comme toujours, de bien se renseigner auprès des vendeurs et des groupes de discussion avant
tout achat de matériel... Vous pourrez trouver une liste (non exhaustive) de matériel testé sous Linux
dans la liste de matériel compatible Linux ([Link] La
Liste de compatibilité Linux ([Link] vous permettra également d’effectuer
une recherche sur n’importe quel type de matériel et sur n’importe quel modèle très facilement. Il
existe d’autres sites réalisant périodiquement des tests sur le matériel récent, comme par exemple
LinuxHardware ([Link]
27
Chapitre 4. Installation du système de base
La manière de procéder dépend bien entendu des systèmes d’exploitation éventuellement déjà installés.
Généralement, il s’agit de Microsoft Windows. Si vous disposez d’un lecteur de bande, le problème de la
sauvegarde est très simple : vous n’avez qu’à faire une sauvegarde complète. Dans le cas contraire, vous
allez sans doute devoir trier vos fichiers afin d’identifier ceux auxquels vous tenez réellement, et les
recopier sur un support physique fiable (évitez absolument les disquettes, ils sont lents et n’ont jamais été
fiables). Vous pouvez par exemple faire un CD de sauvegarde si vous disposez d’un graveur de CD.
En fait, l’idéal est tout simplement de disposer d’un autre disque dur, que l’on pourra consacrer
complètement à l’installation de Linux. Ainsi, vous pourrez expérimenter tout à loisir, sans craindre de
perdre vos précieuses données. De plus, l’installation de Linux sur un disque vierge est nettement plus
facile que sur un disque où Windows est déjà installé, parce que vous n’avez pas à dégager de la place
pour son installation. Prenez toutefois garde au fait que Linux restera capable d’accéder aux données de
votre premier disque dur, et que toute erreur de manipulation peut détruire les données qui s’y trouvent.
Par exemple, si vous ne spécifiez pas le bon disque dur lors de la création des systèmes de fichiers, vous
perdrez à nouveau toutes vos données. L’achat d’un tiroir peut être la vraie solution, car vous n’aurez
alors qu’un seul disque à un instant donné dans votre ordinateur. Toutefois, cette technique a
l’inconvénient de ne pas vous permettre d’accéder aux données de votre disque Windows à partir de
Linux.
Amorçage
Pour commencer votre installation, vous devez avant tout démarrer votre ordinateur sous Linux. La
méthode la plus simple est certainement de mettre le CD d’amorçage de votre distribution dans le lecteur
de CD et de redémarrer l’ordinateur. Il faut que votre BIOS soit configuré pour amorcer le système sur le
lecteur de CD pour que cette solution fonctionne. Si votre BIOS ne vous permet pas de le faire, il ne vous
reste plus qu’à utiliser l’une des disquettes fournies avec votre distribution. Pensez également à
supprimer la protectiona contre anti-virus de secteurs de boot de votre BIOS avant de faire l’installation
du système. Dans tous les cas, Linux doit se lancer, et le programme d’installation doit démarrer. Suivez
les indications fournies avec votre distribution pour cette étape.
Le noyau de Linux qui est fourni avec votre distribution est un noyau qui a été spécialement conçu pour
démarrer correctement sur le plus grand nombre de machines possibles. Il contient donc les pilotes
(« drivers » en anglais) pour votre disque dur, ainsi que pour d’autres types de disques. Il se peut même
que plusieurs noyaux vous aient été livrés avec votre distribution. Chacun de ces noyaux permet de
démarrer sur un certain type d’ordinateur. Lorsqu’il se lance, Linux tente de détecter le matériel de votre
ordinateur. Seuls les pilotes correspondant à votre matériel s’activent, les autres sont tout simplement
28
Chapitre 4. Installation du système de base
ignorés. Il se peut cependant que Linux ne détecte pas vos disques durs. Cela peut arriver surtout pour les
disques SCSI. Dans ce cas, soit il faut changer de noyau, soit il faut utiliser des pilotes additionnels, qui
peuvent être chargés à la demande. Ces pilotes sont appelés des « modules » du noyau. Ces modules sont
en général accessibles directement sur le CD-ROM ou la disquette de démarrage, ou sur une disquette
complémentaire. Si Linux ne détecte pas vos disques durs, vous serez obligé d’indiquer les modules à
charger au programme d’installation. Si cela ne fonctionne toujours pas, vous devrez réamorcer votre
système avec un noyau plus adapté à votre matériel. Pour cela, vous aurez sans doute besoin de créer une
disquette d’amorçage pour ce noyau, et de l’utiliser à la place de votre lecteur de CD. En général, les
distributions fournissent un petit utilitaire DOS nommé [Link] qui permet de créer une
disquette d’amorçage à partir d’un noyau très simplement. Il s’utilise avec la ligne de commande
suivante :
où image est l’image d’une des disquettes d’amorçage (que vous trouverez sur le CD d’amorçage de
votre distribution), et lecteur est le lecteur de disquette utilisé (en général, « A: »). Vous pouvez aussi
consulter la documentation de votre distribution pour savoir comment indiquer au noyau les modules
qu’il doit charger, ou comment créer une disquette de démarrage pour un autre noyau.
Dans la majorité des distributions, les outils nécessaires à l’installation sont placés sur un disque virtuel
en mémoire après le démarrage de Linux. C’est en particulier le cas du programme d’installation. Cela
est normal, puisque Linux n’est pas encore installé, d’une part, et que ces outils ne tiennent pas
facilement sur une disquette, d’autre part. Ces outils sont donc souvent compressés. Vous devez malgré
tout avoir déjà accès aux périphériques de votre ordinateur, en particulier aux disques, pour poursuivre
votre installation.
Partitionnement du disque
La deuxième opération après le démarrage du système est le partitionnement du disque dur. Cette étape
est de loin la plus dangereuse, mais elle est absolument nécessaire. Elle ne pose pas de problèmes
lorsqu’on installe Linux sur une machine neuve, mais peut être délicate si un autre système
d’exploitation est déjà installé ou doit être installé en parallèle. Cette section décrit les principes de base
du partitionnement, la manière de récupérer de la place sur un disque dur et l’opération de
partitionnement proprement dite.
29
Chapitre 4. Installation du système de base
mieux si on lui attribue une partition de « swap » (dite aussi « partition d’échange ») pour stocker des
données peu utilisées qui se trouve en mémoire, lorsqu’il a besoin de plus de mémoire qu’il n’en est
physiquement installée sur la machine. De même, il est possible de créer plusieurs partitions pour séparer
les données utilisateurs des programmes, ce qui permet de faciliter les mécanismes de sauvegarde d’une
part, et d’assurer une plus grande sécurité des données lors des opérations de maintenance du système
d’autre part.
Sur les machines de type PC, chaque disque dur peut être découpé en quatre partitions dites
« primaires ». La position, la taille et le type de ces partitions sont enregistrées dans le premier secteur du
disque dur, que l’on appelle souvent le « Master Boot Record » (« MBR » en abrégé). Le MBR ne
contient que quatre entrées pour la définition des partitions, d’où la limite de quatre partitions primaires.
Le type des partitions est un code numérique qui indique le système d’exploitation capable de l’utiliser et
sa nature (partition de swap ou système de fichiers par exemple). À titre d’exemple, Linux utilise
principalement deux types de partition : les partitions de swap (numéro 82) et les partitions pour les
systèmes de fichiers (type 83).
La définition des partitions se fait donc en donnant leur adresse de départ, leur taille et leur type.
L’adresse de départ et la longueur des partitions sont exprimées en secteurs. Un « secteur » est l’unité de
base pour les données des disques durs, qui correspond à un bloc de 512 octets utiles (auxquels
s’ajoutent bien entendu d’éventuels octets de contrôle d’erreur, mais qui ne sont manipulés que par le
disque dur lui-même et par son contrôleur, et que l’on ne peut donc pas utiliser pour y stocker des
données). Cela dit, certains systèmes (ceux de Microsoft) ne permettent pas une telle finesse dans la
définition des partitions et nécessitent de travailler au niveau du cylindre.
Note : Pour comprendre ce qu’est un cylindre, il faut savoir que les données des disques durs sont
stockées sur les faces magnétiques de plateaux en rotation, au dessus (et en dessous) desquelles
les têtes de lecture/écriture du disque se déplacent radialement. Les données sont donc écrites en
cercles concentriques sur les différents plateaux en raison de leur rotation sous les têtes de lecture
(contrairement aux microsillons et aux CD, il s’agit bien ici de cercles et non d’une spirale car les
têtes de lecture/écriture restent à une position fixe pendant la rotation des plateaux). On appelle ces
cercles des « pistes » (« track » en anglais). Chaque tête accède donc à une piste et une seule à un
instant donné, sur laquelle les secteurs sont enregistrés. Comme toutes les têtes sont solidaires
(elles se déplacent ensemble lorsque l’une d’entre elles doit changer de piste), les différentes pistes
des différents plateaux sont accédées simultanément. L’ensemble de ces pistes, situés à un rayon
donné pour tous les plateaux, constitue ce que l’on appelle un « cylindre ». Les paramètres des
disques durs sont donc exprimés en termes de nombre de têtes, de cylindres et de secteurs par
piste.
30
Chapitre 4. Installation du système de base
Vous remarquerez souvent que le nombre de têtes est impair, alors qu’en général, un plateau a deux
faces... Cela est dû au fait que les fabricants de disques durs conservent toujours une face d’un
plateau pour y écrire des données de contrôle permettant aux têtes de lecture/écriture de se
positionner ou pour y placer des pistes complémentaires en cas de zones défectueuses sur la
surface de l’un des autres plateaux.
Bien entendu, la limitation à quatre partitions seulement est extrêmement contraignante, aussi la notion
de partition étendue a-t-elle été introduite. Une « partition étendue » est une partition primaire spéciale,
dans laquelle il est possible de définir jusqu’à 64 sous-partitions. Ces sous-partitions sont appelées des
« partitions logiques ». Les données ne sont jamais stockées dans la partition étendue elle-même, mais
dans ses partitions logiques. On ne peut définir qu’une seule partition étendue sur un disque donné, mais
cela n’empêche pas d’avoir des partitions primaires normales à côté de celle-ci. Il est donc recommandé,
lorsque l’on crée la quatrième partition, de créer une partition étendue et non une partition primaire, afin
de se réserver la possibilité de créer de nouvelles partitions ultérieurement. Il faut toutefois savoir que
certains systèmes ne peuvent pas être installés sur des partitions logiques (notamment DOS et Windows
9x/Millenium), bien qu’ils soient capables d’y accéder une fois qu’ils ont démarré.
Outre la table des partitions primaires, le MBR contient un petit programme appelé le « bootstrap
loader » qui permet de charger le premier secteur d’une des partitions primaires. Ce secteur est
communément appelé le « secteur de boot », parce qu’il contient le programme capable de charger le
système d’exploitation. La partition dont le secteur de boot est chargé par le bootstrap loader est appelée
la « partition active ». Il ne peut y avoir qu’une seule partition active à chaque instant : celle du système
d’exploitation principal.
31
Chapitre 4. Installation du système de base
Généralement, le programme stocké sur le secteur de boot d’une partition a pour but de charger le
système d’exploitation qui y est installé. Cependant, pour certains systèmes d’exploitation, ce
programme est très évolué et permet de lancer d’autres systèmes d’exploitation, éventuellement installés
sur d’autre partitions ou d’autres disques durs. Ces programmes sont alors appelés des « gestionnaires
d’amorçage ». Linux dispose de deux gestionnaires d’amorçage très puissants : le GRUB et LILO.
Windows NT, 2000 ou XP disposent également d’un gestionnaire d’amorçage capable de lancer d’autres
systèmes d’exploitation : NTLDR.
Pour résumer, lors du démarrage d’un PC, le BIOS charge le MBR du premier disque dur en mémoire et
exécute le bootstrap loader. Celui-ci cherche ensuite à charger le secteur de boot de la partition active, et
exécute le gestionnaire d’amorçage qui s’y trouve. Ce gestionnaire peut donner accès aux différents
systèmes d’exploitation, qu’ils soient situés sur d’autres partitions ou même d’autres disques durs. La
manière dont chaque système est lancé dépend bien sûr du système. Il faut donc, en général, lancer
chaque système d’exploitation avec son propre chargeur. Cependant, on peut toujours utiliser un
gestionnaire d’amorçage d’un autre système en rusant quelque peu : il suffit d’indiquer à ce gestionnaire
de charger le secteur de boot de la partition d’installation du système que l’on désire lancer si celui-ci
n’est pas pris en charge directement. Dans ce cas, le gestionnaire d’amorçage ne fait que passer la main
au chargeur de l’autre système. La manière de procéder pour installer LILO, le GRUB ou NTLDR sera
décrite dans la la section intitulée Amorçage du système et configuration multiboot.
Plan de partitionnement
Avant de se lancer dans l’opération de partitionnement proprement dite, il faut établir un plan de
partitionnement. Cela consiste tout simplement à déterminer la taille et la nature de chaque partition dans
le système. Il est normal, sur un système où seul Linux sera utilisé, de disposer d’au moins trois
partitions :
• une partition de swap, que Linux utilisera pour y stocker temporairement des données lorsqu’il aura
besoin de récupérer un peu de place en mémoire. Il est recommandé de placer cette partition au début
du disque (c’est à dire au plus près du cylindre 0, là où le taux de transfert est le plus rapide) ;
• une partition pour le système de fichiers racine (point de montage /), dans laquelle doit se trouver
l’ensemble des fichiers du système. Cette partition doit se trouver dans les 1024 premiers cylindres
pour que le BIOS puisse y accéder et charger le gestionnaire d’amorçage du système ;
• une partition devant contenir les données des utilisateurs (point de montage /home/).
32
Chapitre 4. Installation du système de base
L’avantage d’avoir une partition séparée pour toutes les données des utilisateurs est considérable,
puisque dans ce cas on peut mettre à jour le système ou le réinstaller complètement sans avoir à faire de
sauvegarde de ses données. De plus, les fichiers de configuration importants peuvent être sauvegardés sur
cette partition avant la réinstallation, ce qui est extrêmement pratique. Ce type de partitionnement est à
prendre sérieusement en considération, surtout pour les machines de particuliers, sur lesquelles un grand
nombre de programmes peuvent être installés simplement pour les tester. Il n’est donc pas rare, dans ces
conditions, d’avoir à refaire une installation complète pour « nettoyer » rapidement le système.
Toutefois, si l’on ne dispose pas de beaucoup de place sur le disque, il est possible de regrouper la
partition racine et la partition contenant les données utilisateurs. Un mauvais dimensionnement de ces
partitions aura dans ce cas de moins lourdes conséquences (si une partition est pleine, on ne peut pas
facilement utiliser l’espace restant sur les autres partitions).
Si votre machine est destinée à accueillir plusieurs systèmes d’exploitation, il est vivement recommandé
de créer au moins une partition FAT ou FAT32. Cette partition permettra en effet d’échanger des données
entre Linux et les autres systèmes d’exploitation, car les systèmes de fichiers FAT sont reconnus par tous
les systèmes d’exploitation courants. Notez que si Windows NT4 doit être installé, vous devrez créer une
partition FAT plutôt qu’une partition FAT32, car Windows NT ne reconnaît pas, sans programmes
additionnels, les partitions FAT32. Ce problème ne se pose plus pour Windows 2000 et pour XP. Notez
également que bien que Linux sache parfaitement lire les partitions NTFS (utilisées par Windows NT4,
Windows 2000 et par XP), l’écriture sur ces partitions n’est pas complètement implémentée (il n’est
possible que d’écrire dans un fichier existant). Inversement, aucun système Windows ne sait et ne saura
lire les systèmes de fichiers Linux, quels qu’ils soient. De même, les systèmes Windows ne savent pas
accéder à un système de fichiers stocké dans un autre fichier, sans installer d’outils complémentaires
(pour ceux qui disposent de Windows XP, l’outil filedisk ([Link] sera sans
doute relativement utile). Avoir une partition FAT est donc souvent la solution la plus simple pour
échanger des informations entre les deux systèmes.
Si la machine doit être d’une fiabilité absolue ou si vous êtes soumis à des contraintes d’exploitation
fortes, vous pouvez opter pour des solutions radicales qui consistent à séparer les données d’exploitation
(normalement situées dans le répertoire /var/) des fichiers des programmes, et de les placer dans une
partition dédiée. Vous pourrez alors ne monter que cette partition en lecture/écriture. Ainsi, en cas de
crash système, seule la partition contenant les données d’exploitation devra être réparée, ou à l’extrême
rigueur réinitialisée complètement par les scripts de démarrage.
Rien ne vous empêche de créer d’autres partitions si vous le désirez. Sachez cependant que les systèmes
de fichiers de Linux ne sont pas aussi limités que les systèmes de fichiers FAT et FAT32 en ce qui
concerne les tailles maximales des partitions et que, par conséquent, créer une multitude de partitions
n’est pas nécessaire et n’est certainement pas une bonne idée. La création de partitions supplémentaires
peut malgré tout s’avérer nécessaire, par exemple pour y installer d’autres systèmes d’exploitation. Dans
ce cas, vous aurez certainement à créer une partition étendue et des partitions logiques.
La grande difficulté dans l’établissement du plan de partitionnement est de bien déterminer ses besoins
en place disque, aussi bien pour les programmes que pour les données et le swap. Cependant, d’une
manière générale, on peut considérer que ce qui est le plus important pour un particulier, ce sont ses
données, et que le système ne va pas prendre des dizaines de giga-octets sur le disque ! Si vous décidez
de placer les programmes et les données utilisateurs dans deux partitions séparées, vous pouvez
envisager le plan de partitionnement suivant :
33
Chapitre 4. Installation du système de base
• une partition de swap : deux fois la mémoire vive de l’ordinateur si vous ne disposez pas de beaucoup
d’espace disque, 256 Mo sinon. Il est inutile de consacrer plus de place que cela, car il est très rare
d’avoir besoin de plus de 384 Mo de mémoire virtuelle (la mémoire virtuelle est la somme de la
mémoire libre et de la taille des partitions ou fichiers d’échange). Notez que la règle du double de la
mémoire vive est tout à fait empirique. Elle se base sur le principe que si le système a besoin de plus
de swap, c’est que de toutes façons il n’est pas dimensionné pour ce qu’on lui demande de faire. Cela
dit, vous pouvez mettre autant de swap que vous le désirez si vous en avez réellement besoin (par
exemple pour manipuler de très grandes photos ou des fichiers de très grande taille). Si vous avez un
gros disque, vous pouvez utiliser une très grande partition de swap : elle ne sera quasiment pas
utilisée, mais le jour où vous en aurez besoin, elle sera là. Après tout, abus de bien ne nuit pas...
Sachez toutefois que de toutes façons, si un jour il fallait plus de mémoire virtuelle, vous pourriez
créer un fichier d’échange temporaire ;
• une partition racine, contenant le système, les programmes et les fichiers de configuration : environ 2
Go. Il est possible de travailler avec 1 Go, mais on n’est vraiment pas à l’aise avec XWindow ou si
l’on désire compiler des programmes récupérés sur Internet (ce qui est assez courant). Il est inutile de
dépasser les 3 Go pour cette partition, si l’on a besoin de plus de place, c’est que le répertoire des
données de travail /var/ devient trop gros et dans ce cas on a intérêt à le placer sur une partition qui
lui est dédiée. Notez que l’on a intérêt à placer cette partition au début du disque pour deux raisons :
premièrement, c’est à cet endroit que le disque dur est le plus rapide, et deuxièmement, certains BIOS
ne sont pas capables d’accéder aux cylindres de numéro supérieur à 1024 et ne peuvent donc pas
accéder au gestionnaire d’amorçage du système s’il est installé sur cette partition ;
• une partition pour les répertoires personnels des utilisateurs : le reste de l’espace disponible sur le
disque moins, bien entendu, l’espace nécessaire aux partitions des autres systèmes d’exploitation et
celui d’une éventuelle partition de sauvegarde ou d’échange de données ;
• enfin, si nécessaire, une partition de sauvegarde ou d’échange de données entre les différents systèmes
d’exploitation si l’on désire réaliser une configuration multiboot. Cette partition devra être en FAT16 si
les autres systèmes ne supportent pas les partitions de type FAT32 (par exemple DOS, Windows 95
première édition ou Windows NT4), mais on préférera tout de même la FAT32 si possible (Windows
95OSR2 ou plus, ou Windows 2000 ou XP). Cette partition pourra faire environ 1 Go, soit la taille
nécessaire pour stocker une image disque de CD-ROM plus quelques fichiers complémentaires. Elle
pourra être de taille supérieure si un autre système d’exploitation y est installé.
Note : La partition du système dont on utilise le gestionnaire d’amorçage doit être placée de
préférence avant le cylindre 1024. En effet, certains BIOS ne peuvent pas accéder aux cylindres
suivants, et le bootstrap loader ne peut donc pas charger le gestionnaire d’amorçage du système
dans ce cas. Cela signifie que la deuxième partition doit être la partition du système d’exploitation
principal (cela a en plus l’avantage de donner les accès disque les plus rapides pour les fichiers de
ce système).
Notez que ce plan de partitionnement utilise les quatre entrées de la table des partitions, et ne
permet donc pas d’en ajouter une complémentaire. Si l’on désire installer un autre système
d’exploitation, on pourra le faire sur la partition FAT (auquel cas on pourra lui consacrer plus d’un
giga-octet), soit sur un deuxième disque dur. Si cela ne s’avère pas possible (par exemple parce que
l’on veut installer Windows NT, Windows 2000 ou XP sur une partition NTFS tout en conservant la
partition FAT), on devra créer une partition étendue. Je préconise dans ce cas de placer les deux
dernières partitions (la partition d’échange et la partition des répertoires personnels des utilisateurs)
dans des partitions logiques de cette partition étendue, ce qui laisse libre la troisième partition
34
Chapitre 4. Installation du système de base
primaire pour un autre système d’exploitation. Bien entendu, ce plan de partitionnement est une
suggestion et vous êtes absolument libre d’en choisir un autre. Je ne le fournis que pour aider ceux
qui ne savent pas comment effectuer leur partitionnement précisément. Il devrait convenir pour tous
les disques de plus de 4 Go, qui sont monnaie courante à présent.
Utilisation de parted
L’utilitaire GNU parted est le standard en ce qui concerne les manipulations de partitions sous Linux.
Cet outil s’utilise en ligne de commande, et peut donc être utilisé à partir d’un terminal en mode texte
pendant la phase d’installation, si votre distribution l’inclut avec ses outils d’installation standards. Si ce
n’est pas le cas, vous pourrez récupérer l’image d’une disquette de boot Linux contenant cet outil à
l’adresse [Link] Cette image pourra être copiée sur une
disquette à l’aide de l’utilitaire DOS [Link], de la même manière que les disquettes de boot de
votre distribution peuvent être créées. La manière de procéder a été décrite dans la la section intitulée
Amorçage.
35
Chapitre 4. Installation du système de base
Une fois que vous aurez démarré Linux et obtenu un terminal fonctionnel, vous pourrez lancer parted
avec la simple commande suivante :
parted disque
où disque est l’identifiant du disque dur sur lequel la partition à modifier se trouve. Comme on l’a vu
précédemment, tous les périphériques sont accessibles par l’intermédiaire de fichiers spéciaux placés
dans le répertoire /dev/. Le nom des fichiers spéciaux correspondants à vos disques peut varier selon
leur nature. Ainsi, les disques et les lecteurs de CD IDE sont accessibles par l’intermédiaire des fichiers
spéciaux /dev/hda, /dev/hdb, /dev/hdc, etc. Ces fichiers permettent d’accéder respectivement au
disque maître du premier contrôleur IDE, au disque esclave de ce même contrôleur, puis au disque maître
du deuxième contrôleur IDE puis au disque esclave du deuxième contrôleur IDE, etc. Ainsi, si vous ne
disposez que d’un disque, il doit normalement être connecté sur le premier contrôleur IDE et être maître.
Dans ce cas, vous y accéderez par le fichier spécial /dev/hda. Pour les disques SCSI, les noms sont
légèrement différents : ils sont nommés /dev/sda, /dev/sdb, etc. La modification des partitions du
premier disque dur IDE se fera donc à l’aide de la commande suivante :
parted /dev/hda
Note : À partir de la version 2.4.0 du noyau de Linux, le répertoire /dev/ peut être généré par le
noyau, dans un système de fichiers virtuel. L’organisation de ce répertoire est dans ce cas différente
de l’organisation classique, et les noms de fichiers spéciaux correspondants aux disques peuvent
être différents de ceux indiqués ci-dessus. Par exemple, le chemin du fichier spécial permettant
d’accéder au premier disque IDE sera /dev/ide/host0/bus0/target0/disc. Comme vous pouvez
le constater, la représentation de la machine dans le système de fichiers virtuels est plus structurée,
mais également plus compliquée. Afin de simplifier ces mécanismes, il est d’usage de placer des
liens symboliques dans le répertoire /dev/ permettant d’accéder aux fichiers spéciaux de
périphériques avec leurs anciens noms. Vous n’aurez donc normalement pas à vous soucier de
savoir si votre noyau utilise ou non le système de fichiers virtuels /dev/, et les chemins utilisés dans
la suite de ce document seront les chemins classiques. Vous devrez faire la traduction vers les
chemins du système de fichiers virtuels vous-même si vous ne voulez pas utiliser ces liens
symboliques.
parted dispose de plusieurs commandes permettant de modifier les partitions. À l’heure actuelle, il ne
permet réellement de travailler que sur les partitions FAT et les partitions contenant un système de
fichiers EXT2, EXT3 ou ReiserFS. Seul les fonctionnalités de manipulation des partitions FAT nous
intéressent ici, car nous devons réduire une partition FAT.
La première commande indispensable est la commande print, qui permet d’afficher la table des partitions
du disque courant. Les informations affichées par cette commande se présentent de la manière suivante :
Comme vous pouvez le constater, les partitions sont décrites à raison d’une ligne par partition. Cette
ligne contient le numéro de la partition (les quatre premiers numéros étant affectés aux partitions
36
Chapitre 4. Installation du système de base
primaires), les points de départ et de fin de ces partitions, exprimés en mégaoctets, le type de la partition,
le système de fichiers de cette partition, et des indications complémentaires.
Note : Comme il l’a déjà été expliqué ci-dessus, les partitions sont généralement décrites en terme
de cylindres. parted préfère utiliser le mégaoctet comme unité, ce qui est généralement plus clair. Il
prend complètement en charge la traduction des informations de taille en termes plus physiques, en
tenant compte des éventuels problèmes d’alignement aux limites de cylindre. Son utilisation est donc
relativement directe.
La commande qui nous intéresse le plus ensuite est la commande resize, qui permet de redimensionner
une partition. Cette commande utilise la syntaxe suivante :
où partition est le numéro de la partition tel qu’il est présenté dans la première colonne des
informations de la commande print, début est la nouvelle position où la partition commencera et fin
est la nouvelle limite de cette partition. Comme vous pouvez le constater, il est possible de réduire une
partition aussi bien par son début que par sa fin ! La seule contrainte est, bien entendu, que cette partition
reste suffisamment grande pour contenir l’ensemble de ses données. Par exemple, pour réduire de 8 Go la
première partition du disque dur de l’exemple précédent afin d’y placer la partition de swap et les
systèmes de fichiers, on utiliserait la commande suivante :
Note : L’opération de redimensionnement peut prendre un certain temps. En effet, parted doit
déplacer les données qui se trouveraient en dehors de la partition après son redimensionnement si
aucune mesure spéciale n’était prise, et il doit reconstruire complètement la FAT de cette partition
pour qu’elle soit cohérente avec le nouvel emplacement de ces données.
Il est impératif de désactiver la limite utilisateur concernant la taille maximale des fichiers manipulés
avant d’effectuer la moindre opération sur les partitions. En effet, cette limite pourrait empêcher
parted d’accéder aux données situées au-delà d’une certaine position dans la partition. Pour
désactiver cette limite, il faut taper la commande suivante avant de lancer parted :
ulimit -f unlimited
Si vous désirez déplacer une partition plutôt que de la redimensionner, vous pouvez utiliser la commande
move :
où partition est le numéro de la partition et début est son nouvel emplacement de départ, exprimé en
mégaoctets. De même, si vous désirez copier une partition, la commande cp devra être utilisée. Cette
commande suit la syntaxe suivante :
37
Chapitre 4. Installation du système de base
où disque est le disque dur où se trouve la partition source, source est le numéro de cette partition, et
destination est le numéro de la partition destination. La partition destination est toujours située sur le
disque dur courant (c’est-à-dire celui qui a été indiqué en ligne de commande lors du lancement de
parted ou celui spécifié par la commande select de parted).
Enfin, une fois que toutes les manipulations sur les partitions auront été effectuées, vous pourrez quitter
parted avec la simple commande quit. Vous pourrez obtenir la liste des autres commandes acceptées par
parted en tapant la commande help.
Utilisation de fips
fips (abréviation de l’anglais « First Interactive Partition Splitter ») est un utilitaire similaire à parted, à
ceci près qu’il fonctionne sous DOS et qu’il ne permet que de réduire la limite supérieure d’une partition
FAT. De plus, cet utilitaire est incapable de réorganiser le système de fichiers à l’issue de la réduction de
la taille de la partition. Il est donc nécessaire de défragmenter le système de fichiers avant d’utiliser ce
programme, afin de placer toutes ses données au début de la partition.
Note : Vérifiez bien les options du défragmenteur de système de fichiers que vous utilisez : quelques
outils consolident bien l’espace libre mais placent certains fichiers à la fin de la partition FAT pour
laisser plus de place aux fichiers les plus utilisés au début du disque, afin d’optimiser le débit de
données sur ces fichiers (c’est notamment le cas avec le défragmenteur de Norton). Il faut
impérativement désactiver ce type d’option avant de réduire la partition, faute de quoi vous perdriez
définitivement les fichiers qui se trouvent à la fin de la partition et votre FAT serait dans un état
incohérent.
Une fois la défragmentation réalisée, fips peut être utilisé pour réduire la taille de la partition FAT. La
plupart des distributions de Linux fournissent des utilitaires DOS sur leur CD-ROM d’installation,
généralement dans le répertoire dosutils. C’est là que vous pourrez sans doute trouver fips. Attention,
vous devrez impérativement utiliser la version 2.0 de fips pour manipuler les FAT32 et FAT32X.
La réduction de la taille d’une partition se fait en modifiant la variable qui contient la taille de la partition
dans la table des partitions. Pour cela, vous devrez simplement lancer fips. Celui-ci vous présentera alors
la liste des disques durs installés sur votre système, et vous devrez lui indiquer le disque sur lequel la
partition à réduire se trouve. Il vous demandera ensuite la partition que vous désirez réduire, puis le
cylindre auquel cette partition devra se terminer. Lorsque vous aurez déterminé la nouvelle taille de cette
partition, vous devrez presser la touche ’c’ pour poursuivre. fips vous demandera alors confirmation
avant d’écrire sur disque les nouvelles informations de partition. Si vous êtes sûr de vous, vous pouvez
répondre par l’affirmative en pressant la touche ’y’.
Note : Contrairement à parted, fips ne reconstruit pas la table d’allocation des fichiers (la « FAT »)
après avoir réduit la taille de la partition, ce qui fait que cette dernière est trop grosse pour cette
nouvelle taille après réduction. Cela n’est pas gênant, seuls quelques mégaoctets seront perdus sur
la partition FAT dans la FAT elle-même. Cette technique a en revanche l’avantage d’être
extrêmement rapide.
38
Chapitre 4. Installation du système de base
Utilisation de fdisk
Le partitionnement en soi peut se faire soit directement à l’aide du fdisk de Linux, soit par
l’intermédiaire du programme d’installation de la distribution correspondante. Il est recommandé
d’utiliser ce programme d’installation, qui vous guidera et vous indiquera comment réaliser cette
opération. Si toutefois vous désirez utiliser fdisk, il vaut mieux faire attention à ce que vous faites. Pour
lancer fdisk, il suffit de taper la commande suivante en ligne de commande :
fdisk disque
où disque est le fichier spécial de périphérique représentant le disque que vous désirez partitionner. Si
vous voulez partitionner le disque maître du premier contrôleur IDE, vous devrez donc taper :
fdisk /dev/hda
Si vous ne spécifiez aucun disque en paramètre à fdisk, il prendra par défaut le disque /dev/sda, ou
/dev/hda si aucun disque SCSI n’est installé.
fdisk est un programme très peu interactif. Il attend que vous lui communiquiez les commandes à
exécuter en tapant sur une lettre. Les différentes commandes possibles peuvent être affichées avec la
commande ’m’.
Lorsque vous créez une partition, vous devez utiliser la commande ’n’, puis indiquer son type avec les
commandes ’p’ (pour « primary ») pour une partition primaire ou ’e’ (pour « extended ») pour une
partition étendue. Vous devrez ensuite donner son numéro dans la table des partitions, puis indiquer le
début et la fin de la partition. Par défaut, l’unité utilisée par fdisk est le cylindre. Il est recommandé de
conserver cette unité, surtout si l’on utilise un système qui ne sait manipuler que les cylindres. Toutefois,
on peut changer cette unité grâce à la commande ’u’ et utiliser le secteur comme unité.
Si vous avez créé une partition étendue, celle-ci sera utilisée pour y stocker des partitions logiques. Pour
pouvoir les créer, il faut encore utiliser la commande ’n’, et choisir le type de partition logique avec la
commande ’l’ (pour « logical »). Les partitions logiques sont numérotées avec les nombres 5 et suivants.
La création des partitions logiques se fait exactement de la même manière que les partitions primaires, en
spécifiant leur début et leur fin, soit en cylindres, soit en secteurs selon l’unité courante.
Une fois les partitions créées, vous pouvez spécifier leur type à l’aide de la commande ’t’ (pour
« type »). Cette commande demande successivement le numéro de la partition à modifier et la valeur de
son identificateur en hexadécimal. Rappelons que les identificateurs à utiliser pour Linux sont 83 pour les
partitions de systèmes de fichiers Linux, et 82 pour les partitions de swap. La liste des valeurs
admissibles peut être obtenue à l’aide de la commande ’l’. Par défaut, le fdisk de Linux crée des
partitions Linux natives, de code 83.
Lorsque vous aurez complètement défini vos partitions, il ne vous restera plus qu’à activer la partition
qui contiendra le gestionnaire d’amorçage. La sélection de la partition active se fait avec la commande
’a’ de fdisk. C’est donc sur cette partition que le chargeur du MBR ira chercher le gestionnaire
d’amorçage du système à lancer.
Note : Théoriquement, il est tout à fait possible d’installer le gestionnaire d’amorçage d’un système
directement sur le MBR, mais procéder de cette manière est très déconseillé. En effet, certains
systèmes d’exploitation (notamment tous les systèmes de Microsoft) écrasent systématiquement le
MBR lorsqu’ils s’installent, détruisant ainsi le chargeur d’un autre système qui y serait
39
Chapitre 4. Installation du système de base
éventuellement installé. Cela implique que si l’on désire installer un gestionnaire d’amorçage autre
que celui des systèmes Microsoft sur le MBR, il faut le faire après l’installation de ces systèmes. En
pratique, cela veut dire que dans ce cas, on doit installer Linux après Windows ou le DOS.
Notez qu’il n’est toutefois pas toujours faisable d’installer le gestionnaire d’amorçage sur le secteur
de boot de la partition de son système, en particulier si cette partition ne se trouve pas sur le premier
disque dur de la machine. En effet, la plupart des BIOS sont incapables d’utiliser les MBR des autre
disques durs. Dans ce cas, on peut soit créer une partition de démarrage de petite taille (quelques
méga-octets, un cylindre au maximum) au début du disque et sur laquelle on installera le
gestionnaire d’amorçage et éventuellement quelques outils de réparation en cas de coup dur, soit
installer le gestionnaire d’amorçage directement sur le MBR du premier disque dur. Dans ce cas, on
devra faire particulièrement attention à l’ordre d’installation des systèmes d’exploitation. De manière
générale, il faut toujours installer les systèmes Microsoft en premier (respectivement dans l’ordre
suivant si l’on veut éviter les problèmes : DOS, Windows 9x/Millenium et Windows NT4/2000/XP).
Nous verrons plus loin comment installer le gestionnaire d’amorçage de Linux et faire une
configuration multiboot avec les principaux autres systèmes d’exploitation existants.
40
Chapitre 4. Installation du système de base
Premièrement, le système de fichiers EXT2 travaille, comme la plupart des systèmes de fichiers, avec des
blocs de taille fixe (« clusters » en anglais). Cela signifie que l’allocation de l’espace disque se fait par
multiples de la taille de ces blocs : il est impossible de demander seulement une partie d’un bloc. Cette
technique présente des avantages et des inconvénients. Essentiellement, l’avantage est la rapidité
engendrée par la simplification des mécanismes d’allocation et de libération d’espace disque.
L’inconvénient majeur est évidemment qu’on perd de la place pour tous les fichiers qui ne tiennent pas
dans un nombre entier de blocs, puisqu’il faut allouer un bloc supplémentaire qui sera partiellement
utilisé. En moyenne, on perd la moitié d’un bloc par fichier, ce qui ne peut être réduit qu’en limitant la
taille des blocs à une valeur relativement faible.
Note : EXT2 et EXT3 gèrent l’allocation et la libération des blocs de manière à toujours trouver le
meilleur bloc à allouer pour créer un fichier. Ainsi, il limite la fragmentation des fichiers à son strict
minimum, ce qui rend inutiles les programmes de défragmentation de systèmes de fichiers.
Deuxièmement, EXT2 et EXT3 utilisent des structures de données appelées « inodes » pour définir les
fichiers. Un inode contient la plupart des informations d’un fichier, à savoir :
Ces inodes sont stockés dans une table du système de fichiers, ce qui permet d’accéder très rapidement à
toutes ces informations et de retrouver également très simplement le ou les blocs contenant les données
du fichier. Le problème est ici que cette table a un nombre d’entrées limité, ce qui implique un nombre
limité de fichiers dans le système de fichiers. Plus cette table est grande, plus le nombre de fichiers que
l’on pourra créer sera grand, et inversement. Il faut donc trouver un compromis entre la taille de cette
table et le nombre de fichiers que l’on est susceptible de créer. Il va de soi qu’en général, les grandes
partitions contiennent plus de fichiers, mais que la table d’inodes peut également avoir une taille
supérieure sans que cela soit dérangeant. Par conséquent, il est relativement courant de définir le taux
d’inode par bloc ou, autrement dit, la proportion d’inodes dans la partition par rapport à sa taille.
Toutes ces informations (blocs libres et inodes) sont sauvegardées à plusieurs endroits dans la partition,
ce qui permet de disposer en permanence de copies de la structure du système de fichiers. De cette
manière, il est relativement simple de réparer un système de fichiers endommagé, même si les données
sont détruites en raison d’une erreur matérielle (secteurs défectueux sur le disque dur par exemple).
Chacune de ces copies s’appelle un groupe de blocs. Chaque groupe de blocs contient un bloc particulier,
le « super bloc », qui contient la description de son groupe.
Lors de la création du système de fichiers, il est nécessaire d’indiquer la taille d’un bloc en octets. Cette
taille doit impérativement être un multiple de la taille d’un secteur du support physique de données,
parce que les blocs ne peuvent contenir qu’un nombre entier de secteurs. Pour un disque dur, la taille des
secteurs est fixée à 512 octets, ce qui fait que la taille d’un bloc est au moins de 512 octets. De même, il
41
Chapitre 4. Installation du système de base
faut spécifier le nombre d’inodes de la partition. Il est possible de spécifier ce nombre soit directement,
ou d’indiquer seulement le nombre d’octets de la partition par inode. Le nombre total d’inodes utilisé
sera alors calculé à partir de ce nombre d’octets et de la taille de la partition. Bien entendu, le nombre
maximal d’inodes possibles est le nombre total de blocs, puisque tout fichier non vide requiert au moins
un bloc et que chaque inode caractérise un fichier. Si vous ne savez pas quelles valeurs prendre, vous
pouvez utiliser des blocs de 1024 octets (2 secteurs), et un rapport de 4096 octets par inode (donc de 4
blocs de 1 Ko par inode).
Le système de fichiers EXT3 gère, en plus de tout ce que sait faire le système de fichiers EXT2, un
journal contenant les opérations à réaliser de manière transactionnelle sur le disque dur. Ces opérations
sont exécutées de telle sorte que la structure du système de fichiers reste cohérente en toutes
circonstances. Cela implique que le système de fichiers est toujours valide, même si une panne de
courant se produit pendant une opération disque.
La syntaxe de la commande mke2fs est donnée ci-dessous :
où fichier est le nom du fichier spécial de périphérique représentant la partition sur laquelle le système
de fichiers doit être créé. Ce nom est le nom du disque dur, suffixé du numéro de la partition. Les
numéros de partitions commencent à 0, si bien que la première partition du premier disque dur IDE sera
référencée par le chemin /dev/hda0. L’option -j quant à elle est facultative. Lorsqu’elle est utilisée, le
système de fichiers créé est un système de fichiers EXT3. Il est recommandé d’utiliser cette option pour
tous les systèmes de fichiers dont on voudra garantir la cohérence, par exemple pour les systèmes de
fichiers devant contenir des documents ou des informations importantes. Sachez cependant que la
journalisation peut dégrader sensiblement les performances de votre ordinateur, aussi pouvez-vous vous
en passer sur les partitions pour lesquelles un débit élevé est nécessaire (par exemple pour les partitions
devant servir à manipuler des fichiers vidéo).
Note : Le système de fichiers EXT3 utilise les mêmes structures de données que le système de
fichiers EXT2. Il est donc parfaitement compatible avec ce dernier, et un système de fichiers EXT3
peut être utilisé comme un système de fichiers EXT2. En réalité, les mécanismes de journalisation
peut être activés ou non lors de l’opération de montage du système de fichiers, en fonction du type
de système de fichiers indiqué à la commande de montage. Nous détaillerons la manière de monter
les systèmes de fichiers dans la la section intitulée Montage des systèmes de fichiers dans Chapitre
6 et dans la la section intitulée Configuration du montage des systèmes de fichiers dans Chapitre 6.
Pour les mêmes raisons, il est possible de convertir un système de fichiers EXT2 en système de
fichiers EXT3 a posteriori, à l’aide de l’option -j de la commande tune2fs. Cette commande permet
d’activer et de désactiver des fonctionnalités complémentaires pour ces systèmes de fichiers, dont la
journalisation fait partie.
Invoquée sans autres options, la commande mke2fs prend des valeurs par défaut pour tous les paramètres
du système de fichiers créé, mais vous pouvez également spécifier d’autres valeurs. La taille des blocs
peut être indiquée en octets avec l’option suivante :
où taille représente la taille d’un bloc en octets. De même, le nombre d’octets par inode peut être
précisé avec l’une des options -i :
42
Chapitre 4. Installation du système de base
où octets est le rapport de la taille de la partition en octets par le nombre d’inodes à créer. Il est
possible d’indiquer directement ce nombre avec la commande suivante :
Enfin, sachez que l’option -c permet de demander à mke2fs d’effectuer une vérification des secteurs
défectueux du disque dur avant de créer le système de fichiers. Il est fortement recommandé d’utiliser
cette option lors de la première création d’un système de fichiers.
43
Chapitre 4. Installation du système de base
Une fois créée, la partition de swap peut être préparée pour que le noyau puisse l’utiliser. Cette
préparation revient à peu près à formater un système de fichiers, à ceci près que les structures de données
écrites dans la partition de swap sont beaucoup plus simples car il ne s’agit plus ici de stocker une
arborescence complète de fichiers. La commande mkswap permet de préparer les partitions pour être
utilisées en tant que partition de swap. Elle s’utilise selon la syntaxe suivante :
mkswap -c partition
où partition est la partition à préparer pour le swap. Notez que, en réalité, mkswap peut tout aussi
bien travailler sur un fichier que sur une partition.
Lorsque la partition aura été préparée pour le swap, il est possible de demander à Linux de l’utiliser avec
la commande suivante :
swapon partition
où partition est la partition de swap à utiliser. Cette zone de swap est alors automatiquement prise en
compte par le système. La commande suivante permet d’arrêter le swapping sur une partition :
swapoff partition
Normalement, vous n’aurez jamais à utiliser ces commandes manuellement. Le programme d’installation
de votre distribution configure le swap, et fait en sorte que les partitions de swap sont chargées
automatiquement lors du démarrage de la machine. Notez cependant que cette méthode de configuration
dynamique permet d’ajouter temporairement un fichier d’échange si les besoins s’en font sentir, sans
avoir à redémarrer la machine.
44
Chapitre 4. Installation du système de base
Toutes les distributions organisent les différents composants logiciels qu’elles fournissent en paquetages
(« package » en anglais). Ainsi, l’installation du système se fait par groupes homogènes de fichiers, et le
regroupement dans un paquetage est généralement une dépendance forte (en pratique, ce sont les fichiers
d’une même application). En installant un paquetage, on installe finalement un logiciel particulier.
Cependant, certains paquetages dépendent d’autres paquetages, par exemple, les paquetages contenant le
système de base sont évidemment utilisés par tous les autres paquetages. Les programmes d’installation
gèrent relativement bien les dépendances et les conflits entre paquetages, si bien que l’installation peut
maintenant se faire sans trop de problèmes.
Afin d’organiser un peu tous ces paquetages, les distributions les trient souvent par « séries ». Une série
n’est rien d’autre qu’un ensemble de paquetages regroupés par domaine fonctionnel. Cela signifie que
l’on peut facilement retrouver un paquetage donné, en allant le chercher dans la série contenant tous les
paquetages fonctionnellement proches. Le regroupement des paquetages en séries ne signifie absolument
pas que tous les paquetages de la série doivent être installés pour obtenir une fonctionnalité donnée, mais
que les logiciels qui s’y trouvent ont plus ou moins trait à cette fonctionnalité. En fait, il peut même y
avoir redondance ou conflit entre deux paquetages d’une même série. Dans ce cas, il faut choisir l’un ou
l’autre, selon ses besoins personnels.
Certains paquetages sont indispensables pour le système, d’autres sont purement optionnels. Mais la
plupart des paquetages sont simplement les paquetages des applications, et vous devrez faire le tri et
choisir ceux qui vous intéressent parce qu’il est impensable d’installer tous les paquetages (une
distribution de Linux peut faire 5 ou 6 CD-ROM, en tenant compte du système, des applications et des
sources). Les seuls paquetages qu’il faut impérativement installer sont les paquetages de la série de base.
En général, cette série porte le nom A, ou AAA, ou quelque chose de similaire, afin qu’elle puisse
toujours être en tête de liste dans les programmes d’installation. Cette série comprend au moins les
paquetages des commandes Unix de base, du shell, du programme d’installation et de tous les fichiers
nécessaires au fonctionnement du système (fichiers de configuration, scripts et bibliothèques partagées).
Tant que les programmes de cette série sont intacts et fonctionnels, le système est utilisable. S’il en
manque, les problèmes peuvent survenir à tout moment : de l’absence ou l’indisponibilité de la
documentation à l’impossibilité complète de démarrer le système.
Le choix des paquetages à installer est crucial mais non définitif. En effet, si vous avez installé un
paquetage dont vous n’avez pas ou plus besoin, rien ne vous empêche de le supprimer par la suite. De
même, si vous vous apercevez que vous avez oublié d’installer un paquetage dont vous avez besoin, vous
pouvez l’installer ultérieurement.
Il n’est pas possible de donner ici la liste des paquetages que vous devez installer, car cette liste dépend
beaucoup trop de la distribution que vous possédez. Il est conseillé de lire le manuel de cette distribution
ou de bien lire les écrans d’aides du programme d’installation. Cependant, les paquetages dont vous
aurez certainement besoin pour poursuivre l’installation sont sans doute les suivants :
45
Chapitre 4. Installation du système de base
Gardez à l’esprit que dans le monde du logiciel libre, les programmes sont souvent distribués sous la
forme de fichiers sources et que vous aurez sans doute besoin des outils de développement pour les
compiler et les installer. Veillez donc à inclure d’office tous ces outils, même si vous ne désirez pas
programmer personnellement. Bien entendu, vous pourrez revenir ultérieurement dans le programme
d’installation et réinstaller un paquetage si vous l’avez oublié pendant la phase d’installation.
46
Chapitre 4. Installation du système de base
version de Windows installée ultérieurement. La deuxième partie de LILO est enregistrée directement
dans la partition Linux. Elle contient les informations nécessaires pour pouvoir charger les différents
systèmes d’exploitation gérés. Bien entendu, la première partie est capable de retrouver directement la
deuxième sur le disque dur de manière autonome car, lors de l’amorçage, les systèmes de fichiers de
Linux ne sont pas encore chargés.
LILO utilise le fichier de configuration /etc/[Link] pour y retrouver tous ses paramètres de
configuration. Ce fichier contient la description des différents systèmes d’exploitation que LILO doit
proposer au démarrage. Vous pourrez consulter ce fichier avec un des nombreux éditeurs de fichiers texte
présents sur toute installation de Linux. Toutefois, si vous installez Linux pour la première fois, il est
possible que vous n’en connaissiez aucun et que vous soyez un peu perdu. Cela est normal, et dans ce cas
je vous recommande de vous familiariser un peu avec le système et l’environnement utilisateur avant de
vous lancer dans l’édition de ce fichier. Il existe bon nombre d’éditeurs graphiques ou en mode texte et il
est hors de question de tous les décrire ici. Toutefois, toutes les distributions Linux installent un éditeur
historique, j’ai nommé l’affreux « vi ». Cet éditeur n’est pas du tout convivial pour les nouveaux
utilisateurs, mais il dépannera toujours quand tous les autres seront inutilisables ou inaccessibles. En fait,
on finit même par l’apprécier à l’usage... La manière d’utiliser vi sera décrite ultérieurement, dans le
chapitre donnant les notions de base d’Unix à la la section intitulée vi, l’éditeur de fichiers de base dans
Chapitre 5. Vous devriez donc jeter un coup d’œil à cette section si vous désirez modifier immédiatement
le fichier /etc/[Link], ou revenir ultérieurement à la présente section une fois que vous vous serez
familiarisé avec un autre éditeur.
Quoi qu’il en soit, les options les plus importantes du fichier /etc/[Link] sont les suivantes :
• l’option boot, qui permet d’indiquer sur quel secteur d’amorçage LILO doit s’installer. Cette option
suit la syntaxe suivante :
boot = destination
où destination est le nom d’un fichier spécial de périphérique sur lequel LILO va s’installer. Ce
nom peut identifier un disque dur (comme par exemple /dev/hda), auquel cas LILO va s’installer sur
le MBR de ce disque (c’est-à-dire sur le MBR du premier disque du premier contrôleur de disques
IDE dans notre exemple), ou une partition (comme /dev/hda2). Dans ce cas, LILO s’installe sur le
secteur de boot de cette partition (la deuxième partition du premier disque dur IDE dans notre
exemple). Rappelons qu’il est recommandé d’installer LILO sur le secteur de boot de la partition
racine de Linux ;
• l’option read-only permet de demander au noyau de monter le système de fichiers racine en lecture
seule lors du démarrage. Cette option est nécessaire pour que les scripts de démarrage du système
puissent effectuer les vérifications du système de fichiers de cette partition si nécessaire. La partition
sera remontée en lecture et en écriture une fois ces vérifications réalisées ;
• l’option prompt, qui permet à LILO de demander le système à lancer à chaque démarrage. Cette
option force donc l’apparition du message d’invite de LILO au démarrage : « LILO boot: » auquel
on pourra répondre en tapant le nom de la configuration à lancer ;
• l’option timeout, qui permet de fixer un délai au delà duquel LILO lancera la première configuration
définie dans le fichier [Link]. La syntaxe de cette option est la suivante :
timeout = dixièmes
47
Chapitre 4. Installation du système de base
• l’option keytable, qui donne la possibilité de spécifier un fichier de tradution des codes de caractère
envoyés par le BIOS (qui suppose généralement que le clavier utilise la disposition d’un clavier
américain) en les codes de caractère qui seraient envoyés par un BIOS localisé. Cette option permet
donc de redéfinir la disposition des touches du clavier pour prendre en compte les claviers
non-américains. La syntaxe de cette option est la suivante :
keytable = fichier
où fichier est le chemin sur un fichier de traduction de clavier pour LILO. Un tel fichier peut être
généré par le script [Link] à l’aide des fichiers de définition des claviers de Linux
(généralement installés dans le répertoire /usr/lib/kbd/keymaps/). La ligne de commande à
utiliser pour ce script est la suivante :
[Link] us local > fichier
où us est le nom du fichier de définition de clavier Linux pour la disposition utilisée par le BIOS
(donc, effectivement, la disposition d’un clavier américain en général), local est le nom du fichier de
définition de clavier pour la disposition du clavier réellement utilisée, et fichier est le nom du fichier
de traduction des codes à générer. Par exemple, la création de ce fichier pour le clavier français se
ferait avec la commande suivante :
Remarquez que cette technique de traduction de clavier souffre d’un inconvénient majeur, puisque les
combinaisons de touches qui ne sont pas valides dans la disposition américaine des claviers ne peuvent
pas être converties. Si l’une de ces combinaisons doit être utilisée, il faut abandonner l’idée d’utiliser
l’option keytable.
La suite du fichier [Link] décrit les différentes configurations que LILO peut lancer. Les sections
de configuration permettant de charger Linux ont le format suivant :
image = noyau
root = root_device
label = nom
où noyau est le chemin complet sur le noyau de Linux à charger, root_device est le nom complet du
fichier spécial de périphérique contenant le système de fichier racine et nom est le nom de la
configuration tel qu’il devra être saisi à l’invite de LILO. L’exemple donné ci-dessous permet de charger
le noyau /boot/vmlinuz en utilisant la partition /dev/hda2 comme partition racine :
image = /boot/vmlinuz
root = /dev/hda2
label = linux
Si vous désirez créer une section de configuration permettant de lancer un autre système d’exploitation
que Linux (DOS ou Windows par exemple), vous pouvez utiliser la possibilité de passer le relais au
chargeur de ces systèmes, qu’il s’agisse d’un simple secteur de boot ou d’un gestionnaire d’amorçage
complet. Cela se fait avec la syntaxe suivante :
other = partition
48
Chapitre 4. Installation du système de base
table = disque
loader = relais
label = nom
où partition est la partition sur laquelle le secteur de boot de l’autre système est installé, disque est
le disque dur contenant la table des partitions utilisée par ce système, relais est le nom d’un chargeur
spécial permettant de simplement passer la main au chargeur du système, et nom est le nom de la
configuration. Le chargeur à utiliser pour demander à LILO de passer le relais au chargeur de l’autre
système d’exploitation est le chargeur contenu dans le fichier chain.b de LILO. Ce fichier se trouve
généralement dans le répertoire /boot/, aussi doit-on spécifier /boot/chain.b pour le champ
relais.
Note : Prenez garde au fait que Windows NT/Windows 2000/XP installent NTLDR dans la première
partition à laquelle il savent accéder en général. Donc, si un DOS ou Windows 95, Windows 98 ou
Millenium est installé en premier, ils installeront NTLDR dans la partition de ces systèmes. Dans ce
cas, la configuration permettant de lancer le DOS ou le Windows 95, Windows 98 ou Millenium qui
se trouve sur cette partition risque fort de lancer NTLDR qui proposera, à son tour, de lancer les
différents systèmes d’exploitation Microsoft installés.
Cela peut être relativement gênant et peut être corrigé en déplaçant NTLDR sur la partition de
Windows NT/Windows 2000/XP et en reconstruisant les secteurs de boot des différentes partition
pour que leur chargeurs s’occupent de leurs systèmes respectifs, mais il s’agit là d’une opération
extrêmement technique d’une part, et qui ne concerne absolument pas Linux d’autre part. Cela ne
sera donc pas décrit dans ce document. Il existe toutefois des documents sur Internet qui décrivent
la manière de procéder et je vous invite à vous y référer (avec une prudence extrême cependant).
L’exemple donné ci-dessous permet de donner la possibilité de charger Linux ou Windows NT, en
lançant Linux par défaut au bout de 10 secondes. Windows NT est installé sur la troisième partition, et
Linux utilise la deuxième et la quatrième partition respectivement pour y stocker sa partition racine et la
partition des répertoires personnels des utilisateurs. LILO est ici installé sur la partition racine de Linux :
# Options générales :
boot = /dev/hda2
read-only
prompt
timeout=100
keytable = /boot/[Link]
49
Chapitre 4. Installation du système de base
label = NT
L’installation de LILO est très simple une fois que l’on a écrit le fichier [Link]. En effet, il suffit
tout simplement de taper la commande suivante :
lilo [-L]
L’option -L permet de demander à LILO d’utiliser le mode d’adressage LBA pour accéder au disque dur
pendant la phase d’amorçage. Cette option est nécessaire si vous disposez d’un grand disque dur et que
certaines partitions disposant de systèmes à lancer sont situées au delà du cylindre 1024. Il est
recommandé de l’utiliser systématiquement étant donné les tailles des disques durs actuels.
Note : Comprenez bien que si votre BIOS est incapable d’utiliser le mode LBA ou le si bootstrap
loader est incapable d’utiliser ce mode, cette option ne vous sera d’aucune utilité. En effet, dans ce
cas, le bootstrap loader ne parviendrait même pas à charger le secteur de boot de la partition Linux.
C’est pour cette raison qu’il a été recommandé de placer la partition du système principal en deçà de
cette limite des 1024 cylindres. Cette limitation est donc bien une limitation du BIOS, mais vous ne
devriez plus rencontrer ce genre de problème que sur de vieilles machines sur lesquelles un
nouveau disque dur de grande capacité a été installé.
Si lilo signale une erreur, il vaut mieux ne pas insister et corriger le fichier [Link].
Lorsque la machine démarre, LILO affiche son invite de démarrage : LILO boot:
Il attend ici que vous indiquiez le nom du système que vous désirez démarrer. Vous devez ici taper le
nom du système à charger et valider : LILO boot:linux
Si vous ne tapez rien, et que vous avez donné un délai d’attente dans le fichier de configuration de LILO,
la première configuration sera lancée automatiquement après ce délai.
LILO permet de spécifier des paramètres de démarrage complémentaires pour Linux à la suite du nom de
la configuration qui permet de le lancer. Ces paramètres servent principalement à renseigner le noyau sur
la configuration matérielle (en particulier les ports d’entrée/sortie et les lignes d’interruption des
périphériques non Plug and Play), pour le cas où il ne parviendrait pas à les déterminer automatiquement.
L’un des paramètres les plus intéressants est sans doute mem, qui permet d’indiquer au noyau la taille de
la mémoire vive dont dispose l’ordinateur. Ce paramètre peut être nécessaire si vous disposez de plus de
64 Mo de mémoire, parce que les fonctions du BIOS ne permettent pas d’indiquer les tailles de mémoire
plus grandes (la plupart des BIOS récents n’ont toutefois plus ce problème). Par exemple, si votre
ordinateur dispose de 256 Mo de mémoire, vous devrez taper la ligne de paramètres suivante au
démarrage : LILO boot:linux mem=256M
Bien entendu, il est possible d’enregistrer ces paramètres dans le fichier de configuration de LILO afin de
ne pas avoir à les saisir à chaque démarrage. Pour cela, il suffit d’indiquer le paramètre de démarrage du
noyau dans une ligne append de la section de configuration de Linux :
append="paramètre"
Ainsi, la section de configuration de Linux du fichier [Link] exemple donné ci-dessus pourrait être
remplacée par celle-ci sur une machine disposant de 256 Mo de mémoire :
50
Chapitre 4. Installation du système de base
La liste des paramètres que l’on peut fournir au noyau est relativement grande et ne sera pas décrite ici.
Les plus utiles seront présentés en temps et en heure, notamment dans le chapitre décrivant la
configuration du système.
• l’option default, qui permet de spécifier la configuration par défaut à charger. Cette option doit être
suivi du numéro de cette configuration. Les configurations sont numérotées à partir de 0, dans leur
ordre d’apparition dans le fichier de configuration ;
• l’option timeout, qui permet de spécifier le délai d’attente avant que la configuration par défaut
spécifiée par l’option default ne soit lancée.
51
Chapitre 4. Installation du système de base
title titre
root partition
kernel noyau options
où titre est le titre de la configuration tel qu’il doit apparaître dans le menu de démarrage du GRUB,
partition est la partition dans laquelle se trouve le noyau à charger, et noyau est le chemin sur le
fichier image de ce noyau dans cette partition. Attention, ce chemin est défini dans la partition elle-même
et peut donc être différent du chemin utilisé sous Linux. En effet, il faut définir ce chemin par rapport au
point de montage de la partition, faute de quoi le GRUB ne retrouverait pas le fichier image du noyau à
charger.
Comme le GRUB n’est pas un chargeur spécifique à Linux mais a été écrit au contraire avec comme
principal objectif une généricité absolue, la manière de spécifier la partition dans laquelle le noyau se
trouve utilise une syntaxe différente de celle utilisée sous Linux. Cette syntaxe, propre au GRUB donc,
est la suivante :
(hdn,m)
où n est le numéro du disque dans l’ordre énuméré par le BIOS de la machine et m est le numéro de la
partition. Ce dernier numéro est facultatif (ainsi que la virgule qui le précède), ce qui permet de
référencer un disque complet et non une partition. La numérotation des disques et des partitions
commence toujours à 0 dans le GRUB, ce qui fait que la première partition du premier disque est
référencée par (hd0,0), la deuxième partition du premier disque par (hd0,1), la première partition du
deuxième disque par (hd1,0), etc.
Tout comme avec LILO, il est possible de spécifier des options de démarrage qui devront êtres fournies
au noyau. Ces options devront être spécifiées immédiatement après le nom de l’image du noyau. Comme
vous pouvez le constater, la définition d’une configuration de démarrage pour un système Linux est très
simple, puisqu’il suffit quasiment de donner la ligne de commande pour lancer ce noyau ! Par exemple,
pour charger le noyau /boot/vmlinuz d’un système situé sur la deuxième partition du premier disque,
la configuration suivante doit être définie :
title Linux
root (hd0,1)
kernel /boot/vmlinuz mem=256M
Cet exemple présente également comment spécifier la taille de la mémoire disponible dans la machine
(cela n’est normalement pas nécessaire avec les BIOS récents et avec le GRUB). Il suffit simplement de
fournir des options en ligne de commande au noyau pour cela. Beaucoup d’autres options peuvent être
fournies de cette manière au noyau. En particulier, des options peuvent être fournies aux pilotes de
périphériques si nécessaire (par exemple s’il y a des conflits d’interruptions ou de ressources entre
plusieurs périphériques). Ces options seront présentées au fur et à mesure dans la suite de ce document.
Bien entendu, le GRUB est capable de charger le secteur de boot d’une partition afin de passer le relais
au gestionnaire d’amorçage d’un autre système d’exploitation. Pour cela, il faut utiliser la commande
chainloader, plutôt que la commande kernel, dans la description de la configuration de démarrage de ce
système. La forme générale d’une configuration de ce type est donc la suivante :
title titre
root partition
52
Chapitre 4. Installation du système de base
chainloader +1
Le +1 qui suit la commande chainloader indique au GRUB de charger le premier secteur de la partition
indiquée par la commande root et d’exécuter le gestionnaire d’amorçage normalement stocké dans ce
secteur. Comme pour les configurations Linux, la syntaxe utilisée pour spécifier la partition où ce secteur
est situé est la syntaxe du GRUB et non celle utilisée sous Linux.
Le fichier de configuration d’exemple suivant correspond au fichier de configuration de LILO vu dans la
section précédente. Il permet de démarrer un Linux installé sur la deuxième partition ou un Windows NT
installé sur la troisième partition du premier disque dur de la machine :
# Options générales :
default 0
timeout 10
L’installation du GRUB sur une nouvelle machine ne pose quant à elle pas de problème particulier. Il
suffit de s’assurer que le fichier de configuration [Link] se situe bien dans le répertoire
/boot/grub/, de même que les fichiers binaires du GRUB. Ces fichiers sont respectivement les fichiers
stage1, stage2 et tous les fichiers *_stage1_5. S’ils ne s’y trouvent pas, vous pourrez les copier à
partir du répertoire /usr/share/grub/i386-pc/, dans lequel le programme d’installation du GRUB
les place par défaut.
Lorsque tous les fichiers sont en place, il n’y a plus qu’à lancer le GRUB en mode interactif avec la
commande suivante :
grub
et à définir le secteur où il doit installer son fichier d’amorçage principal stage1 (c’est-à-dire dans le
secteur de boot d’une partition ou directement sur le MBR du premier disque dur). Pour cela, vous
devrez utiliser les deux commandes suivantes :
root source
setup destination
source est ici la partition où est installé le GRUB (il s’agit donc de la partition où se trouvent le
répertoire /boot/grub/), et destination est le disque dur ou la partition dont le premier secteur doit
recevoir le code d’amorçage du GRUB. Ces deux informations doivent suivre la syntaxe utilisée par le
GRUB pour spécifier les disques durs et les partitions. Par exemple, pour installer le GRUB sur le secteur
de boot de la deuxième partition du premier disque dur, on utilisera les deux commandes suivantes :
53
Chapitre 4. Installation du système de base
root (hd0,1)
setup (hd0,1)
Cet exemple suppose que le GRUB est également installé dans cette partition. Si ce n’est pas le cas pour
vous, vous devrez modifier la partition spécifiée dans la commande root. Vous pourrez quitter le grub
avec la commande quit une fois l’installation terminée.
emplacement = "Nom"
Cette commande suppose que LILO ait été installé sur la partition /dev/hda3. Elle permet de lire un
bloc de 512 octets de la troisième partition du premier disque dur et de l’enregistrer dans le fichier
[Link]. Vous pourrez ensuite transférer ce fichier dans le répertoire C:\ de Windows, soit en
passant par une partition FAT, soit tout simplement à l’aide d’une disquette (rappelons que le système de
fichiers NTFS n’est utilisable qu’en lecture seule sous Linux).
54
Chapitre 4. Installation du système de base
Une fois ce fichier obtenu, vous pourrez simplement ajouter la ligne suivante dans votre fichier
[Link] :
C:\[Link]="Linux"
[boot loader]
timeout=10
default=multi(0)disk(0)rdisk(0)partition(2)\WINNT
[operating systems]
multi(0)disk(0)rdisk(0)partition(2)\WINNT="Microsoft Windows 2000 Professionnel" /fastdetect
C:\[Link]="Linux"
Vous devriez alors pouvoir démarrer Linux directement à partir du menu de démarrage de NTLDR.
Note : Prenez soin à utiliser un nom court pour le fichier contenant le secteur de Linux (c’est-à-dire
un nom ne comprenant pas plus de huit caractères et une extension d’au plus trois caractères). En
effet, Windows, même dans ses versions les plus récentes, a toujours du mal à prendre en charge
les noms longs et il se peut que le gestionnaire d’amorçage NTLDR ne puisse pas localiser le fichier
si vous ne respectez pas cette règle.
55
Chapitre 5. Commandes Unix de base
Si vous êtes parvenu à installer les paquetages de la série de base, vous disposez d’un système Linux
fonctionnel. Félicitations ! Maintenant, il va falloir le configurer... Autant vous prévenir tout de suite :
cette opération demande beaucoup de temps et de patience, à moins d’avoir une machine vraiment
standard et une chance phénoménale. Mais pour cela, il va falloir que vous appreniez les commandes
Unix de base et la manière d’utiliser un système Linux en ligne de commande (c’est-à-dire en mode
texte, sans XWindow).
Login et déconnexion
Comme il l’a déjà été dit, Linux est un système multi-utilisateur. Il faut donc que chacun s’identifie pour
que le système puisse fonctionner correctement. Cette opération est réalisée lors de l’opération dite de
login (du verbe anglais « to log in », qui signifie « s’enregistrer » dans le système). Le login consiste
essentiellement à taper son nom d’utilisateur, valider, et répondre éventuellement à la demande de mot de
passe de la part du système.
Le login doit être la première opération à effectuer. Il est impossible d’accéder au système d’une autre
manière, et la vérification du mot de passe fournit l’authenticité de l’utilisateur qui se logue. Ainsi, le
système sait en permanence au nom de quelle personne il effectue les opérations demandées. Cette
opération est à la base des mécanismes de sécurité et de personnalisation du système pour chaque
utilisateur.
Il existe deux types de login. Le plus courant est le login en mode texte, qui peut être fait directement sur
le poste local ou à travers un réseau. Le système vous invite à vous identifier avec la ligne suivante :
login:
D’autres informations peuvent être affichées avant le mot login, qui peuvent vous renseigner sur la
nature du système. Quoi qu’il en soit, vous devez taper votre nom d’utilisateur (que l’on appelle
simplement « login »), ou « root » si vous désirez vous connecter en tant qu’administrateur. Le système
vous demande alors le mot de passe avec la ligne suivante :
password:
Bien entendu, vous ne devrez jamais oublier votre mot de passe administrateur. Si toutefois cela vous
arrive, vous n’aurez plus qu’une seule solution : démarrer l’ordinateur à partir d’une disquette système,
et faire le ménage dans le fichier de mots de passe. Cette opération n’est jamais très agréable à réaliser.
Conclusion : n’oubliez jamais votre mot de passe.
56
Chapitre 5. Commandes Unix de base
Le deuxième type de login est le login graphique, sous X11. Ce type de login a en général lieu sur un
terminal X (c’est-à-dire un terminal graphique). La procédure peut varier selon l’environnement utilisé,
mais le principe reste toujours le même : il faut fournir son nom d’utilisateur et son mot de passe.
Si, comme la plupart des gens, vous ne cherchez pas à utiliser votre ordinateur à distance à travers un
réseau, vous vous connecterez quasiment toujours en local. Linux fournit, pour l’utilisateur local,
plusieurs terminaux virtuels. Cela signifie qu’il est possible de se connecter plusieurs fois dans le
système dans des terminaux différents. Pour passer d’un terminal virtuel à un autre, il suffit de taper les
combinaisons de touches ALT+DROITE ou ALT+GAUCHE, où DROITE et GAUCHE sont respectivement les
flèches du curseur droite et gauche. Il est également possible d’accéder à un terminal donné à l’aide de la
combinaison de touches ALT+Fn, où Fn est l’une des touches de fonction F1, F2, F3, etc. La plupart des
distributions utilisent au moins quatre terminaux virtuels, plus un terminal X. Le terminal X est le
terminal graphique, qui fonctionne sous XWindow. Vous noterez sans doute que lorsqu’on est sous
XWindow, les combinaisons ALT+Fn ont une autre signification. Elles ne peuvent donc pas être utilisées
pour basculer vers les terminaux en mode texte. Pour remédier à ce problème, une autre combinaison de
touches a été définie, spécialement pour XWindow : CTRL+ALT+Fn. Il suffit donc simplement d’utiliser
la touche CTRL en plus de la touche ALT.
L’utilisation des terminaux virtuels est très pratique, même pour un seul utilisateur. En effet, ceux-ci
permettent de lancer plusieurs programmes simplement, à raison d’un par terminal virtuel, et de s’y
retrouver ainsi plus facilement. Pour ceux qui ne connaissent pas les systèmes Unix, il est recommandé
de jouer un peu avec les terminaux virtuels afin de simuler la présence de plusieurs utilisateurs. Ils auront
ainsi un aperçu de la puissance de ces systèmes.
Lorsqu’on a fini de travailler, il faut se déconnecter. Cette opération est très simple pour les terminaux
non graphiques, puisqu’il suffit de taper la commande suivante :
logout
Si d’aventure cette commande ne fonctionnait pas, vous pourrez utiliser la commande exit ou la
combinaison de touches CTRL+d, qui terminent le shell courant (y compris le shell de login).
Pour les terminaux X, le processus de déconnexion dépend de l’environnement utilisé. Il faut tâtonner un
peu, et normalement on trouve une option de menu du style « logout » ou « déconnexion ». Vous pouvez
par exemple cliquer sur le bouton droit de la souris sur le bureau de l’environnement de travail, afin
d’appeler un menu contextuel. Dans bien des cas, ce menu contient une option de déconnexion.
Il est très important de se déconnecter et de ne jamais laisser une session ouverte. En effet, cette
négligence peut vous coûter cher, car une personne mal intentionnée pourrait très bien utiliser ce terminal
à vos dépends. Il aurait tous vos droits, et effectuerait ses opérations en votre nom. La sécurité du
système garantissant que vous seul pouvez vous connecter sous ce nom, grâce au mot de passe, vous
seriez donc responsable des agissements de l’intrus. Bien entendu, ce genre de considération n’a pas
autant d’importance pour un particulier que dans une entreprise ou une collectivité quelconque.
57
Chapitre 5. Commandes Unix de base
la plupart des systèmes d’exploitation utilisent une partie de la mémoire de l’ordinateur pour y stocker
temporairement les données qui ont été lues à partir du disque et celles qui doivent y être écrites. Cette
zone de mémoire constitue ce qu’on appelle un tampon (« buffer » en anglais), et elle sert à accélérer les
accès aux périphériques plus lents, que sont les disques durs et lecteurs de CD-ROM. Il va de soi qu’une
requête de lecture sur des données déjà situées en mémoire est infiniment plus rapide que si elles ne s’y
trouvaient pas. Il est en revanche plus difficile de comprendre pourquoi les requêtes d’écriture doivent
être différées. La raison est la suivante : le système préfère différer l’écriture physique sur le disque parce
qu’une autre requête d’écriture dans la même zone du disque peut très bien avoir lieu ultérieurement. Si
les données qui n’ont pas été écrites sont ainsi modifiées par une requête ultérieure, il n’est plus
nécessaire de les écrire, et ainsi le système peut économiser un temps précieux en ne le faisant pas. Si les
données à écrire sont contiguës à celles d’une requête précédente, le système peut les écrire en bloc, ce
qui est toujours plus rapide que de faire plusieurs écritures partielles (notamment parce que les têtes de
lecture du disque n’ont pas à être déplacées). Enfin, si les données qui doivent être écrites font l’objet
d’une requête de lecture, il va de soi qu’elles sont immédiatement accessibles. On voit que cette stratégie
permet de travailler beaucoup plus vite. De facto, Linux utilise toute la mémoire vive libre pour ses
tampons d’entrées / sorties, ce qui en fait un système extrêmement performant. Le gain en performances
peut facilement atteindre un facteur 3 ou 4.
Le problème majeur est évidemment que si l’on éteint l’ordinateur brutalement, les données dont
l’écriture a été différée sont perdues. Pire, parmi ces données, il est probable qu’il y ait des informations
vitales pour le système de fichiers, ce qui fait qu’il risque fort d’être endommagé. Les systèmes de
fichiers journalisés comme EXT3 et ReiserFS sont à l’abri de ce type d’erreur en raison de l’accès
transactionnel aux structures de données du systèmes de fichiers qu’ils utilisent, et le système parvient
généralement à réparer les autres systèmes de fichiers lors de la vérification qui est lancée au redémarrage
suivant de la machine, mais il est inutile de prendre des risques. Tout cela signifie qu’il est impératif de
prévenir le système avant de l’arrêter, pour qu’il puisse écrire les données situées dans ses tampons.
L’arrêt du système est une opération qui est du ressort de l’administrateur. On ne peut donc le réaliser que
sous le compte root. Plusieurs commandes sont disponibles, les plus simples sont données ci-dessous :
Ces commandes sont en fait des scripts permettant d’effectuer les opérations d’arrêt et de redémarrage du
système rapidement. Si elles ne sont pas disponibles sur votre distribution, vous devrez sans doute
utiliser la commande générique suivante :
58
Chapitre 5. Commandes Unix de base
Pages de manuel
Maintenant que vous savez l’essentiel pour conserver votre système en bon état, nous allons traiter des
autres commandes Unix. Parmi elles, il en est qui sont certainement fondamentales : ce sont les
commandes qui permettent d’obtenir de l’aide !
Chaque commande Unix a une page de manuel qui la décrit. Ces pages sont très souvent écrites en
anglais, mais elles sont très précises et fournissent toutes les informations dont on peut avoir besoin.
Pour afficher la page de manuel d’une commande, il suffit d’utiliser la commande suivante :
man page
où page est la page de manuel de la commande sur laquelle on cherche des informations. En général, le
nom de la page de manuel est le même que celui de la commande. Par exemple, pour afficher l’aide sur la
commande cp, il suffit de taper :
man cp
Lorsqu’une page de man est affichée, il est possible de faire défiler son texte à l’aide des touches du
curseur. Pour quitter l’aide, il suffit d’appuyer sur la touche q.
Les pages de man sont classées en groupes de pages thématiques, chaque groupe étant identifié
généralement par un numéro ou une lettre. Si la page de man affichée ne correspond pas à celle désirée,
c’est qu’une page homonyme d’un autre groupe a été utilisée. Dans ce cas, il faut préciser l’identificateur
du groupe de pages de manuel avant le nom de la page à afficher :
où goupe est l’identificateur du groupe auquel la page de manuel appartient. Les principaux groupes
sont les suivants :
Si vous ne savez pas dans quel groupe se trouve une page de manuel, vous pouvez utiliser l’option -k,
qui permet d’afficher l’ensemble des pages disponibles portant ce nom :
59
Chapitre 5. Commandes Unix de base
man -k commande
L’identificateur du groupe est en général précisé entre parenthèses, à la suite du nom de la page de
manuel.
Il se peut également que vous recherchiez de l’aide sur un sujet donné, mais que vous ne connaissiez pas
le nom exact de la page de manuel qui en parle. Pour ce genre de recherche, vous pourrez utiliser le
programme apropos, qui recherchera toutes les pages de manuel qui contiennent un mot clé particulier.
Ce programme s’utilise avec la syntaxe suivante :
apropos mot
où mot est le mot clé à rechercher dans toutes les pages de manuel.
La commande man est la commande d’aide standard sur tous les systèmes Unix. Cependant, Linux
utilise un grand nombre de commandes écrites sous la licence GNU, et qui utilisent un format d’aide
spécifique à GNU. L’aide pour ces commandes peut être obtenue par la commande suivante :
info commande
Il se peut que les deux méthodes fonctionnent. Dans ce cas, la page de man sera certainement moins
récente que la page d’info, car la commande que vous utilisez est sans aucun doute une commande GNU,
qui a été fournie avec sa page d’information. Il est donc recommandé de lire plutôt la page d’information
GNU.
Le format d’aide GNU est plus riche que celui de man, puisqu’il permet de naviguer dans le système
d’aide à l’aide de liens hypertextes. Ces liens sont organisés hiérarchiquement, avec des chapitres et des
sous-chapitres. Chaque chapitre dispose d’une forme de table des matières constituée de menus, qui
permettent d’accéder aux sous-chapitres. Les menus se distinguent du texte normal par un astérisque
(« * ») en début de ligne dans la table des matières. Les commandes clavier suivantes pourront vous être
utiles pour naviguer dans la hiérarchie du système d’aide de GNU :
60
Chapitre 5. Commandes Unix de base
La première commande est évidemment celle qui permet de lister le contenu d’un répertoire. Elle
dispose d’un grand nombre d’options :
ls [options] [fichier]
où fichier est le nom d’un fichier ou d’un répertoire que l’on désire lister. Si ce paramètre est absent, ls
affichera tous les fichiers du répertoire courant. Les principales options sont -l, qui permet d’afficher des
informations étendues (notamment les propriétaires, les groupes, les droits, la taille et éventuellement les
liens), et -a, qui permet d’afficher tous les fichiers, y compris les fichiers cachés (ceux dont le nom
commence par un point).
La deuxième commande est celle qui permet de changer de répertoire courant. Sa syntaxe est très simple :
cd [chemin]
où chemin est un chemin de répertoire Unix valide. Ce chemin est constitué des noms des répertoires et
sous-répertoires successifs, séparés par des barres obliques « / ». Si aucun chemin n’est spécifié, cette
commande change le répertoire courant pour le répertoire personnel de l’utilisateur. Par exemple, pour
aller dans le répertoire d’installation de XWindow, il faut taper la commande suivante :
cd /usr/X11
La notion de chemin sera détaillée dans le paragraphe suivant. « cd » est l’abréviation de l’anglais
« Change Directory ».
La troisième commande permet de créer un répertoire :
mkdir chemin
où chemin est le chemin spécifiant le répertoire à créer. Si le chemin ne contient que le nom du
répertoire à créer, celui-ci est créé dans le répertoire courant et devient donc un sous-répertoire.
« mkdir » est l’abréviation de l’anglais « MaKe DIRectory »).
La commande pour supprimer un répertoire est la suivante :
rmdir chemin
Pour supprimer un répertoire, il faut qu’il soit vide (c’est-à-dire qu’il ne contienne ni fichier, ni
répertoire). « rmdir » est l’abréviation de l’anglais « ReMove DIRectory ».
Enfin, voici une commande dont vous ne vous servirez normalement que très peu, voire pas du tout. Elle
permet d’afficher le répertoire courant :
pwd
Cette commande n’est a priori pas très utile, car le shell affiche toujours le répertoire courant sur la
plupart des distributions. Cependant, le chemin affiché par le shell étant relatif au répertoire personnel de
l’utilisateur lorsqu’on se trouve dans un sous-répertoire de celui-ci, la commande pwd peut être utile
lorsqu’on désire obtenir un chemin absolu sur le répertoire courant. « pwd » est l’abréviation de l’anglais
61
Chapitre 5. Commandes Unix de base
« Print Working Directory ». Cette commande est également utilisée par les scripts pour déterminer le
répertoire à partir duquel ils sont exécutés.
/usr/X11/bin
ou :
../../X11/bin
Le premier chemin est absolu, parce qu’il part directement du répertoire racine. Le deuxième chemin est
relatif, car il part du répertoire courant.
Note : Il va de soi que les chemins relatifs ne sont valides, sauf coup de chance, que dans le
répertoire dans lequel ils sont écrits, alors que les chemins absolus sont toujours valables. En
revanche, si des répertoires sont déplacés ensemble, les chemins relatifs entre ces répertoires
restent valides, mais les chemins absolus deviennent faux. Toutefois, ces considérations ne
concernent pas un utilisateur de base.
La plupart des shells sont capables d’effectuer ce que l’on appelle la complétion automatique des
commandes. La complétion automatique permet de n’écrire qu’une partie des noms de fichiers ou de
répertoires et de demander au shell de compléter ces noms. Cela peut se faire de deux manières. La
première solution, qui est aussi la plus simple, consiste à taper le début du nom, puis d’utiliser une touche
spéciale qui permet de demander au shell de le compléter. Si vous utilisez le shell bash (bash est le shell
de prédilection sur les systèmes Linux), cette touche est la touche de tabulation. Ainsi, si vous tapez :
cd /ho
et que vous appuyez sur la touche de tabulation, bash complétera cette ligne de la manière suivante :
62
Chapitre 5. Commandes Unix de base
cd /home/
Pour cela, il regarde la liste des fichiers et des répertoires qui commencent par « ho » dans le répertoire
racine. Normalement, il ne s’y trouve que le répertoire /home/, et c’est ce nom que bash utilise. Il va de
soi qu’il ne faut pas qu’il y ait ambiguïté sur un nom partiel. Par exemple, si vous tapez la commande
suivante :
cd /usr/l
et que vous demandiez au shell de compléter le nom, il ne pourra pas choisir quel répertoire utiliser entre
/usr/lib/ et /usr/local/. Dans ce cas, il émettra un petit bip signalant l’erreur. En appuyant une
fois de plus sur la touche de tabulation, bash affiche la liste des choix possibles et vous propose de
terminer la ligne de commande en saisissant des caractères supplémentaires afin de résoudre l’ambiguïté.
La deuxième solution est d’utiliser les caractères génériques du shell. Ces caractères permettent de
désigner n’importe quel caractère, ou n’importe quelle séquence de caractères. Ils sont désignés
respectivement par un point d’interrogation (« ? ») et par un astérisque (« * »). Ainsi, si l’on tape la
commande suivante :
cd /ho*
le shell ira directement dans le répertoire /home/, car le caractère générique « * » peut être remplacé par
la séquence de caractères « me ». Il est également possible d’écrire :
cd /?ome
et dans ce cas le caractère générique « ? » sera remplacé par « h ». Encore une fois, il ne faut pas qu’il y
ait ambiguïté. Dans le cas contraire, le comportement varie selon le shell. En général, il essaie de
résoudre l’ambiguïté au mieux en analysant la suite du chemin, et s’il ne peut pas, il affiche un message
d’erreur.
Note : Ces caractères génériques sont interprétés directement par le shell et non par la commande
qui les reçoit en paramètres. Tout nom de fichier contenant un caractère générique est remplacé par
la liste des fichiers qui correspondent au motif donné. S’il n’existe qu’un seul fichier dans cette liste, il
est possible d’utiliser les commandes comme cd, qui ne prennent qu’un seul paramètre. Mais il est
possible d’utiliser les commandes acceptant plusieurs paramètres, même s’il y a plusieurs fichiers
dans cette liste. Ainsi, la commande suivante :
ls *txt
permet de lister tous les fichiers dont le nom se termine par « txt ». Il ne peut évidement pas y avoir
d’ambiguïté dans ce cas.
Si on doit passer un paramètre comprenant l’un des caractères génériques interprétés par le shell à
une commande particulière, on devra préfixer les caractères génériques d’un caractère
d’échappement pour signaler au shell qu’il ne doit pas l’interpréter. Ce caractère d’échappement est
la barre oblique inverse (« \ »). Il est également possible de passer les paramètres entre guillements
« " », car le shell n’interprète pas les caractères génériques dans les chaînes de caractères. Par
exemple, pour créer un répertoire ?, on utilisera la commande suivante :
63
Chapitre 5. Commandes Unix de base
mkdir \?
Les noms de fichiers commençant par un tiret (caractère ’-’) posent également des problèmes avec
la plupart des commandes, car ce caractère est utilisé pour spécifier des options. Ce n’est pas le
shell qui interprète ce caractère dans ce cas, mais le problème est le même. La plupart des
commandes utilisent l’option - (elle-même introduite par un tiret, ce qui fait donc deux tirets accolés)
pour signaler que ce qui suit dans leur ligne de commande ne contient plus d’options, et ne doit donc
plus être interprété. Il suffit donc de faire précéder le nom du fichier par deux tirets pour arrêter
l’interprétation des options. Par exemple, pour afficher les informations relatives à un fichier nommé
« -l », il faudrait utiliser la commande suivante :
ls -l -- -l
less fichier
Cette commande affiche le contenu du fichier et vous permet de le faire défiler avec les flèches du
curseur. Lorsque vous désirez terminer la visualisation, il suffit de taper la touche q (pour « quitter »
less). Pour information, le nom de la commande less provient d’un trait d’humour sur une commande
Unix plus classique, la commande more. Cette commande effectue à peu près le même travail que less,
mais elle n’affiche le texte que page par page. Pour passer à la page suivante, il faut appuyer sur la barre
d’espace. Quant à l’origine du nom de la commande more, c’est qu’elle affiche le mot « more » au bas
de l’écran pour indiquer qu’il y a encore du texte à visualiser, et qu’il faut appuyer sur la barre d’espace
pour lire la suite.
La commande less permet également d’effectuer une recherche dans le fichier en cours d’édition. Pour
cela, il suffit de taper une commande de recherche de less. Cette commande commence par une barre
oblique, suivie du texte à chercher. Par exemple, pour rechercher la chaîne de caractères « local » dans
un fichier en cours de visualisation avec less, il suffit de taper :
/local
Lorsque vous voudrez rechercher l’occurrence suivante du motif de recherche, vous pourrez appuyer sur
la touche n (pour « Next » en anglais). Pour rechercher l’occurrence précédente, il suffit de taper la
touche N (en majuscule, cette fois).
Il est encore plus probable que vous aurez à éditer un fichier. Cette opération peut se faire relativement
facilement grâce à un éditeur simplifié, vi. Cet éditeur n’est pas franchement ce qui se fait de plus
64
Chapitre 5. Commandes Unix de base
convivial, cependant, il existe sur toutes les plates-formes Unix d’une part, et il est suffisamment léger
pour pouvoir fonctionner sur un système minimal. Il est donc recommandé de savoir se servir de vi, ne
serait-ce que dans le cas où votre système ne serait pas complètement fonctionnel. En clair, quand tout va
mal, on peut compter sur vi ! vi sera décrit plus loin dans la la section intitulée vi, l’éditeur de fichiers de
base, car il dispose d’un grand nombre de commandes et il ne serait pas opportun de les décrire ici.
En général, la création d’un fichier se fait avec vi, bien que d’autres commandes puissent créer des
fichiers. En revanche, pour supprimer un fichier, il n’existe qu’une seule commande :
rm chemin
où chemin est le chemin complet permettant d’accéder au fichier à supprimer. Il est possible de spécifier
plusieurs fichiers à la commande rm. Dans ce cas, ils seront tous supprimés. rm est également capable
de supprimer tous les fichiers d’un répertoire, ainsi que ses sous-répertoires. Dans ce cas, elle détruit
toute une branche de l’arborescence du système de fichiers. Pour cela, il suffit d’utiliser l’option -r (pour
« récursif ») avant le chemin du répertoire à supprimer.
La copie d’un fichier se fait avec la commande cp, dont la syntaxe est donnée ci-dessous :
cp fichiers répertoire
où fichiers est la liste des fichiers à copier, et répertoire est le répertoire destination dans lequel
ces fichiers doivent être copiés.
Enfin, le déplacement des fichiers se fait avec la commande mv, comme indiqué ci-dessous :
mv source destination
où source est le nom du fichier source et destination est le nom du répertoire destination. Notez que
mv est une commande très puissante, puisqu’elle permet également de déplacer des répertoires et de
renommer des fichiers et des répertoires. Pour renommer un fichier ou un répertoire, il suffit d’indiquer le
nouveau nom de ce fichier ou de ce répertoire à la place de destination.
65
Chapitre 5. Commandes Unix de base
où source est le nom du fichier ou du répertoire source auquel le lien doit se référer, et lien est le nom
du lien. L’option -s permet de créer un lien symbolique. Par défaut, ce sont des liens physiques qui sont
créés. Rappelons qu’il est impossible de créer des liens physiques sur des répertoires.
Lorsqu’on liste des fichiers, on peut demander l’affichage d’informations complémentaires sur les liens.
Pour cela, il suffit d’utiliser l’option -l de la commande ls. Ainsi, la commande suivante :
ls -l lien
permet d’afficher les informations sur le lien lien, et en particulier le fichier ou le répertoire cible de ce
lien.
La suppression des liens se fait exactement comme celle d’un fichier. La destination n’est pas affectée en
général, sauf si le lien est un lien physique et constitue la dernière référence au fichier pointé par le lien.
Les liens symboliques n’ont pas de droits d’accès ni de propriétaires, les informations de sécurité de la
cible sont utilisées lorsqu’on accède au lien.
Recherche de fichiers
Il vous sera sans doute nécessaire de rechercher des fichiers selon un critère donné dans toute une
arborescence de répertoires. Pour cela, vous utiliserez la commande find. Cette commande est très
puissante, mais dispose d’une syntaxe assez compliquée :
où répertoire est le répertoire à partir duquel la recherche doit commencer et nom est le nom du
fichier à rechercher. Ce nom peut contenir des caractères génériques du shell, mais dans ce cas doit être
placé entre guillemets afin d’éviter que ce dernier ne les interprète.
find accepte d’autres options de recherche que le nom (partie « -name » de la ligne de commande), et
peut effectuer d’autres actions que l’affichage du chemin des fichiers trouvés (partie « -print »).
Consultez les pages de manuel pour plus d’informations à ce sujet.
66
Chapitre 5. Commandes Unix de base
Le texte peut être placé entre guillemets si nécessaire (en particulier, s’il contient des espaces ou des
caractères interprétés par le shell, comme * et ?). grep accepte un grand nombre d’options, qui ne seront
pas décrites ici. Consulter les pages de manuel pour plus d’information à ce sujet.
ou :
où fichier est le fichier sur lequel sed doit travailler, et résultat est le fichier devant recevoir le flux
de données modifiées. Notez que cette commande utilise une redirection du flux de sortie standard dans
un fichier. Ce type de redirection sera décrit en détail dans la la section intitulée Redirections.
sed peut effectuer un grand nombre de commandes différentes et est réellement un outil très puissant.
Cependant, nous ne verrons ici que la commande qui permet d’effectuer un remplacement de texte. Cette
commande utilise la syntaxe suivante :
s/texte/remplacement/options
où texte est le texte à rechercher, remplacement est le texte de remplacement, et options est un jeu
d’options exprimant la manière dont le remplacement doit être fait. Les options sont spécifiées à l’aide de
simple caractères, les plus utiles étant sans doute g, qui permet d’effectuer un remplacement global (au
lieu de ne remplacer que la première occurrence du texte rencontrée dans chaque ligne), et I, qui permet
d’effectuer une recherche sans tenir compte de la casse des caractères.
Par exemple, la ligne de commande suivante :
permet de remplacer toutes les occurrences de la chaîne de caractères « bonjour » par la chaîne de
caractères « bonsoir » dans le texte du fichier [Link], et d’enregistrer le résultat dans le fichier
[Link].
Note : Il ne faut pas utiliser le même nom de fichier pour le fichier source et le fichier de résultat. En
effet, sed lit le fichier source à la volée, et effectuer une redirection sur ce fichier pendant son
traitement provoquerait la perte irrémédiable de son contenu. Pour résoudre ce problème, on pourra
67
Chapitre 5. Commandes Unix de base
utiliser un nom de fichier temporaire, et écraser le fichier original par ce fichier une fois la commande
sed exécutée.
gzip fichier
où fichier est le fichier à compresser. Après avoir effectué son travail, gzip renomme le fichier
compressé en « [Link] ». La compression d’un fichier avec bzip2 utilise exactement la même
syntaxe, à ceci près qu’il faut remplacer gzip par bzip2. De plus, le nom du fichier compressé porte
l’extension .bz2 au lieu de .gz. Le fichier obtenu est donc nommé « fichier.bz2 ».
La décompression d’un fichier se fait à l’aide de la commande suivante :
gunzip [Link]
ou
bunzip2 fichier.bz2
selon qu’il a été compressé avec gzip ou bzip2. Après décompression, l’extension complémentaire .gz
ou .bz2 est supprimée du nom de fichier.
Archivage de fichiers
L’archivage de fichiers se fait classiquement sous Unix avec le programme tar (abréviation de l’anglais
« Tape ARchiver »). Ce programme permet simplement de regrouper tous les fichiers qu’il doit archiver
dans un seul fichier structuré en blocs. Il a été initialement écrit pour permettre des archivages sur bandes
ou sur tout autre périphérique de stockage de masse, mais il est également utilisé pour créer des fichiers
archives contenant toute une arborescence.
La syntaxe de tar est très simple :
où options sont les options qui indiquent l’opération à effectuer et comment elle doit être réalisée,
archive est le nom de l’archive qui doit être créée ou le nom du fichier de périphérique du périphérique
d’archivage, et fichiers est la liste des fichiers à archiver.
Les options de tar que vous utiliserez le plus souvent sont les suivantes :
68
Chapitre 5. Commandes Unix de base
Par exemple, pour archiver le contenu du répertoire courant dans le fichier [Link], vous utiliserez
la ligne de commande suivante :
De plus, pour extraire le contenu de l’archive [Link], vous utiliserez la commande suivante :
Note : L’option z permet d’effectuer une compression des données archivées ou une décompression
des données restaurées à la volée. tar utilise gzip et gunzip pour la compression et la
décompression. De même, l’option j permet de compresser l’archive à la volée avec bzip2.
Si l’on utilise un signe négatif (’-’) à la place du nom de l’archive, tar enverra le résultat de la
compression vers la sortie standard. Cela peut être utilisé pour des opérations avancées. Un
exemple sera donné dans la la section intitulée Redirections.
su [utilisateur]
où utilisateur est l’utilisateur dont on veut prendre l’identité. Par défaut, si aucun utilisateur n’est
spécifié, le changement d’identité se fait vers l’utilisateur root. Bien entendu, il va de soi que la
commande su demande le mot de passe avant d’obtempérer...
69
Chapitre 5. Commandes Unix de base
où utilisateur est le nom de l’utilisateur qui doit devenir propriétaire du fichier, et fichier est le
fichier devant changer de propriétaire.
Le changement de groupe peut être réalisé par n’importe quel utilisateur, mais on ne peut donner un
fichier qu’à l’un des groupes dont on est membre. Cette opération se fait à l’aide de la commande
suivante :
où groupe est le nom du groupe qui doit être affecté au fichier, et fichier est le fichier devant changer
de groupe. Bien entendu, l’administrateur peut affecter un fichier à n’importe quel groupe d’utilisateur.
où fichier est le fichier ou le répertoire dont on désire changer les droits, et droits est une chaîne de
caractères permettant de spécifier les nouveaux droits. Cette chaîne commence par une lettre indiquant le
groupe d’utilisateurs auquel le droit doit être appliqué, d’un caractère + ou - indiquant si le droit doit être
ajouté ou supprimé, et d’une lettre indiquant le droit que l’on est en train de manipuler. La première lettre
peut prendre les valeurs suivantes :
70
Chapitre 5. Commandes Unix de base
permet de donner le droit d’écriture sur le fichier exemple à tous les membres du groupe auquel ce
fichier appartient.
où ACL est l’ACL à affecter au fichier ou au répertoire fichier. Les ACLs sont constitués d’une liste
d’entrées nommées des ACE (« Access Control Entries »). Les ACEs sont séparées par des virgules et
définissent chacune un droit. Chacun de ces droits doit être spécifié de manière complète, en précisant la
classe d’utilisateur sur lequel il porte avec un mot-clé (user pour l’utilisateur propriétaire, group pour
les utilisateurs du groupe propriétaire, ou other pour les autres utilisateurs), le nom de l’utilisateur ou
du groupe si nécessaire, et les droits affectés à cet utilisateur ou à ce groupe. Tous ces paramètres doivent
être séparés par deux points (caractère ’:’). Par exemple, pour ajouter les droits d’écriture à l’utilisateur
alfred sur le fichier exemple, vous pourrez utiliser la commande suivante :
Si l’on ne spécifie aucun utilisateur avec la classe d’utilisateurs user dans une entrée, cette entrée se
réfère automatiquement à l’utilisateur propriétaire du fichier ou du répertoire. De même, si l’on ne
spécifie aucun groupe avec la classe d’utilisateurs group, l’entrée se réfère au groupe auquel le fichier
appartient. Fixer ces entrées d’ACL sur un fichier avec ces deux syntaxes revient donc exactement à
utiliser chmod avec les droits Unix classiques (à un détail près que l’on verra ci-dessous pour le groupe).
Les droits complets d’un fichier ou d’un répertoire peuvent être consultés avec la commande getfacl.
Cette commande affiche en commentaire les informations sur l’objet auquel elle s’applique, à savoir son
nom, son propriétaire et son groupe, à la suite d’un dièze (caractère ’#’). Suivent toutes les ACEs
affectées à cet objet. Les droits Unix classiques sont lisibles directement avec les entrées user::,
group:: et other:: respectivement pour l’utilisateur, les utilisateurs du groupe et les autres
utilisateurs. Par exemple, si l’on affiche les ACLs associées au fichier exemple après la commande
précédente, on obtient ceci :
# file: exemple
# owner: batman
# group: users
user::rw-
user:alfred:-w-
group::r--
mask::rw-
other::r--
71
Chapitre 5. Commandes Unix de base
Dès qu’une ACL nominative a été attribuée à un fichier, une ACL spéciale est créée automatiquement. Il
s’agit de l’ACL mask, qui, comme son nom l’indique, définit un masque de droits complémentaires pour
tous les utilisateurs et les groupes ajoutés nominativement à l’ACL. Pour ces utilisateurs, les droits
effectivement accordés sont leurs droits respectifs, restreints aux droits présent dans le masque. Le
masque permet donc de restreindre les droits de tous les utilisateurs de la classe group, au sens large.
Par exemple, si le masque contient les droits de lecture et d’écriture, et que l’utilisateur alfred dispose
des droits de lecture et d’exécution sur le fichier, ses droits effectifs seront uniquement la lecture. Les
droits effectifs sont indiqués en commentaire par getfacl pour les utilisateurs et les groupes s’ils ne sont
pas égaux aux droits indiqués dans leurs entrées respectives.
Dès qu’il est défini, le masque remplace l’entrée du groupe du fichier pour les commandes classiques.
Ainsi, dès qu’un masque est défini dans l’ACL d’un fichier, les changements de droits sur le groupe
effectués avec la commande chmod ne modifient plus que le champ de masque. Cela peut surprendre
dans certains situation. Par exemple, si l’entrée de l’ACL décrivant les droits du groupe du fichier ne
donne aucun droit, les utilisateurs de ce groupe n’auront toujours aucun droit même après un chmod
g+rwx sur le fichier. En effet, cette dernière commande ne modifie que le masque. Il est donc nécessaire
d’ajouter les droits sur le groupe du fichier explicitement avec setfacl, de la manière suivante :
La première commande modifie les droits sur le masque, et la deuxième ajoute les droits pour tous les
utilisateurs du groupe.
Notez bien que le masque ne s’applique pas pour la détermination des droits du propriétaire et des
utilisateurs de la classe other. Par ailleurs, lorsque l’on affiche les droits étendus d’un fichier avec
l’option -l de la commande ls, les droits affichés pour le groupe du fichier sont les droits définis dans le
masque lui-même (même si aucune entrée d’ACL ne donne complètement ces droits à un utilisateur ou à
un groupe). Cela permet donc de voir directement les droits les plus forts qui pourraient être attribués sur
ce fichier, ce qui est cohérent avec ce qu’attendent les outils Unix classiques.
Il est possible de supprimer toutes les entrées de l’ACL d’un fichier avec l’option -b de setfacl. Pour
supprimer une entrée spécifique de l’ACL, vous devrez utiliser l’option -x. Cette dernière option ne
permet pas de supprimer les entrées génériques pour le propriétaire et le groupe du fichier, ni celles des
autres utilisateurs. Par exemple, pour retirer toutes les entrées définies précédemment sur le fichier
exemple, on utilisera la commande suivante :
setfacl -b exemple
Vous pourrez toutefois constater que getfacl continue d’afficher les entrées génériques « user:: »,
« group:: » et « other:: ».
Les répertoires disposent, en plus de leur ACL normale, d’une ACL par défaut. L’ACL par défaut d’un
répertoire est celle qui est appliquée à tout nouveau fichier ou répertoire créés dans ce répertoire. De
plus, les sous-répertoires héritent de l’ACL par défaut de leur parent. Les ACLs par défaut sont
modifiables avec l’option -d de setfacl et sont affichées avec le préfixe default: par getfacl.
Note : Notez bien que de nombreux outils Unix classiques ne gèrent pas correctement la notion
d’ACL (en particulier les gestionnaires de fichiers graphiques). La copie ou la modification d’un fichier
72
Chapitre 5. Commandes Unix de base
peut donc provoquer la perte de son ACL, modifiant ainsi les droits des utilisateurs sur ce fichier. Les
ACLs doivent donc être utilisées avec parcimonie et leur manipulation entourée du plus grand soin.
vi fichier
Il est possible de passer plusieurs fichiers dans la ligne de commande, et vi les éditera les uns après les
autres. Cependant, il faut savoir que vi ne permet de travailler que sur deux fichiers à la fois, et qu’il n’est
pas facile de passer de l’un à l’autre. Par conséquent, il est conseillé de n’éditer qu’un seul fichier à la
fois.
vi est un éditeur qui fonctionne dans plusieurs modes différents : le mode d’édition, dans lequel le texte
peut être modifié, le mode de commande, dans lequel des commandes particulières peuvent être données,
et le mode de visualisation, dans lequel le fichier ne peut être que visualisé. Par défaut, vi est en mode de
visualisation, et il faut utiliser une commande d’édition pour passer en mode d’édition. Quand on est en
mode d’édition, on peut revenir au mode de visualisation en appuyant sur la touche Echap (ou Esc,
selon votre clavier). Cette touche a aussi une signification dans le mode de commande : elle annule la
saisie de la commande en cours. Par conséquent, lorsqu’on est perdu et que l’on ne sait plus dans quel
mode on se trouve (ce qui arrive fatalement à un moment donné), il suffit d’appuyer sur cette touche. On
sait alors qu’on se trouve en mode de visualisation.
Le déplacement du curseur en mode de visualisation se fait avec les touches du curseur. Cependant, si
votre clavier n’est pas bien configuré, ces touches peuvent ne pas fonctionner. C’est pour cette raison que
vi fournit un jeu de touches alternatif :
73
Chapitre 5. Commandes Unix de base
Le curseur est bien entendu déplacé automatiquement lors de la saisie du texte en mode d’édition.
Le passage en mode d’édition peut se faire avec l’une des commandes suivantes :
• la touche i permet de passer en mode d’insertion (le texte saisi s’insère avant le caractère sur lequel le
curseur est positionné) ;
• la touche a permet de passer en mode d’ajout de caractères (le texte saisi s’insère après le caractère sur
lequel le curseur est positionné) ;
• la touche A permet de placer le curseur en fin de ligne et de passer en mode d’ajout de caractères ;
• la touche o permet de créer une nouvelle ligne après la ligne où se trouve le curseur et de passer en
mode d’édition sur cette nouvelle ligne ;
• la touche O permet de créer une nouvelle ligne avant la ligne où se trouve le curseur et de passer en
mode d’édition sur cette nouvelle ligne.
La création d’une nouvelle ligne peut donc être faite avec les commandes o et O, mais il est possible de
couper une ligne en deux, ou de passer à la ligne simplement en tapant sur la touche Entrée en mode
d’édition. Inversement, la commande J permet de supprimer un saut de ligne en fin de ligne et de placer
ainsi le texte de la ligne suivante à la suite du texte de la ligne courante.
La suppression d’un caractère se fait avec la touche Suppr (ou Del, selon le clavier) ou la touche de
retour arrière (dite touche Backspace). Cependant, encore une fois, vi fournit un jeu de touches
alternatif permettant de travailler avec un clavier mal configuré :
3dd
Dans ce cas, ces trois lignes sont également placées dans le buffer. La même technique peut être utilisée
pour copier/coller plusieurs lignes en une seule opération.
74
Chapitre 5. Commandes Unix de base
Enfin, vi accepte un certain nombre de commandes générales lorsqu’il est en mode de commande. Ce
mode est activé dès que l’on appuie sur la touche deux points (’:’) dans le mode de visualisation. Les
commandes générales les plus utiles sont décrites ci-dessous :
• la commande :q permet de quitter vi. Si le fichier en cours d’édition a été modifié, vi refusera de se
terminer sans l’enregistrer. Si l’on veut malgré tout sortir sans l’enregistrer, il faudra utiliser la
commande :q! ;
• la commande :w permet d’enregistrer le fichier courant. Pour enregistrer ce fichier et quitter vi, la
commande :wq peut être utilisée ;
• la commande :help sujet permet d’obtenir de l’aide sur le sujet « sujet » ;
• la commande :!commande permet d’exécuter la commande du shell « commande ». Cela peut être
pratique pour effectuer une opération dans le shell sans avoir à quitter vi. Cela dit, il sera sans doute
plus efficace d’utiliser un autre terminal virtuel.
Comme vous l’avez constaté, vi est réellement une horreur à utiliser. Malgré tout, il permet de faire tout
ce dont on a besoin pour éditer un fichier. Il dispose même de puissantes fonctionnalités que même les
traitements de texte évolués ne sont pas capables de faire. Elles ne seront cependant pas décrites ici, car
cela dépasserait le cadre de la simple installation de Linux. Vous pourrez toujours consulter l’aide de vi
pour de plus amples informations.
75
Chapitre 5. Commandes Unix de base
Quoi qu’il en soit, le shell est bien plus qu’un interpréteur de commande. Il s’agit réellement d’un
environnement de programmation, permettant de définir des variables, des fonctions, des instructions
complexes et des programmes complets, que l’on appelle des scripts shell. Les sections suivantes ont
pour objectif de vous montrer les principales caractéristiques du shell, sans pour autant prétendre vous
apprendre la programmation des scripts shell. La lecture de cette section pourra donc être différée dans
un premier temps. Toutefois, elle pourra être bénéfique à ceux qui désirent comprendre les scripts de
configuration utilisés par leur distribution, ou tout simplement à ceux qui sont curieux de nature.
• s’assurer que la commande aura toutes les informations nécessaires pour travailler sans intervention de
l’utilisateur (ou, autrement dit, que la commande n’est pas interactive) ;
• ajouter une esperluette (caractère « & ») à la fin de la ligne de commande.
cp /cdrom/kernel/[Link] . &
copiera l’archive du noyau 2.6.6 du CD-ROM vers le répertoire courant, et s’exécutera en arrière-plan.
Lorsqu’une commande est lancée en arrière-plan, le shell affiche deux nombres qui permettront de
l’identifier par la suite. Le premier nombre, indiqué entre crochets, est le numéro de « job » du shell. Ce
numéro sert à identifier les commandes du shell de manière unique. Un job est donc en réalité une
commande du shell, simple ou complexe. Le deuxième numéro est le numéro de processus (« PID »,
pour « Process IDentifier ») dans le système du processus maître du job. Le PID est un numéro unique
dans le système, qui permet d’identifier de manière unique les processus en cours. Ces deux nombres
permettront de manipuler les processus, avec les commandes que l’on verra plus tard.
Il ne faut pas confondre les numéros de job avec les numéros de processus. Premièrement, un numéro de
job n’est unique que dans un shell donné, et n’a aucune signification au niveau du système complet, alors
que le numéro de processus est attribué par le système à chaque programme en cours d’exécution.
Ensuite, une même commande du shell peut lancer plusieurs processus conjointement. Dans ce cas, il y a
bien évidemment plusieurs numéros de processus, mais un seul et unique job. Ce genre de situation se
76
Chapitre 5. Commandes Unix de base
produit par exemple lors de l’utilisation d’une redirection du flux de sortie standard d’un processus vers
le flux d’entrée standard d’un autre processus.
Le numéro de processus affiché par le shell lors du lancement d’une ligne de commande complexe
représente le PID du processus maître de la commande, c’est-à-dire, en pratique, le dernier processus
d’une série de redirections ou le processus du shell exécutant les commandes complexes. Cela signifie
que dans tous les cas de configuration, ce PID est celui du processus qui contrôle l’ensemble des
opérations effectuées par la ligne de commande. C’est donc par ce processus que l’on peut manipuler la
commande complète, par exemple pour l’interrompre.
Il est possible de retrouver le PID du processus maître d’une commande à partir du numéro de job
correspondant du shell. Cela se fait simplement, en utilisant l’expressions suivante :
%job
où job est le numéro du job dont on cherche le PID. Ainsi, dans toutes les commandes décrites
ci-dessous, le PID peut être utilisé directement, ou être remplacé par le numéro du job préfixé du
caractère de pourcentage.
jobs
qui affiche, dans l’ordre, le numéro de job, l’état du processus correspondant, et la ligne de commande.
Une autre commande, plus bas niveau, permet d’obtenir des informations plus complètes directement à
partir du système. Il s’agit de la commande ps, dont la syntaxe est donnée ci-dessous :
ps [options]
Les options les plus utiles sont sans doute x, qui permet de demander l’affichage de toutes les
commandes en cours d’exécution et non pas seulement les processus en cours d’exécution dans le shell
où la commande ps est exécutée, et a, qui permet d’obtenir l’affichage de toutes les commandes, pour
tous les utilisateurs connectés. Ces deux options peuvent être cumulées, et la commande suivante :
ps ax
77
Chapitre 5. Commandes Unix de base
Notion de signal
Dans un système Unix, tous les processus peuvent recevoir des messages, envoyés soit par l’utilisateur,
soit par un autre processus, soit par le système. Ces messages sont appelés signaux. La plupart des
signaux sont envoyés par le système pour indiquer au processus qu’il a fait une faute et qu’il va être
terminé. Cependant, ce n’est pas toujours le cas : certains signaux sont envoyés uniquement dans le cadre
de la communication entre les processus, et certains autres ne peuvent même pas être captés par le
processus et sont traités directement par le système. Nous n’entrerons pas en détail dans la gestion des
signaux ici, car cela nous emmènerait trop loin. Cependant, la manière d’envoyer un signal à un
processus à partir du shell sera décrite.
L’envoi d’un signal se fait avec la commande kill, avec la syntaxe suivante :
où signal est une option qui permet de préciser le signal qui doit être envoyé, et PID est le numéro du
processus qui doit le recevoir. Les numéros de signaux les plus importants sont décrits dans le tableau
ci-dessous :
Numéro de Signification
signal
15 Signal de terminaison de processus.
9 Signal de destruction inconditionnelle de processus.
19 Signal de suspension de processus.
18 Signal de reprise d’exécution d’un processus suspendu.
Lorsqu’aucun signal n’est spécifié, le signal 15 de terminaison est utilisé par défaut. Ce signal demande
au processus en cours d’exécution de se terminer immédiatement. Il peut être capté par le processus,
pour lui donner une chance d’enregistrer les données sur lesquelles il travaillait et de libérer les
ressources qu’il utilisait. Pour certains processus, cela ne fonctionne pas, et il faut utiliser le signal de
destruction du processus à l’aide de la commande suivante :
kill -9 PID
Attention cependant à cette commande : le processus est immédiatement détruit, sans autre forme de
procès. Il peut donc s’ensuivre une perte de données, n’en abusez donc pas trop.
78
Chapitre 5. Commandes Unix de base
commande kill vue précédemment. Dans le cas d’une ligne de commande, le signal de terminaison est
transmis au processus maître de la ligne de commande, et est ensuite propagé à l’ensemble des processus
fils de ce processus. Cela signifie que tous les processus invoqués dans le cadre de cette commande sont
également arrêtés.
La première méthode est recommandée pour les processus lancés par une ligne de commande complexe,
car le signal STOP est envoyé au processus maître de la commande, et est propagé à l’ensemble des
processus fils de ce processus. Cela signifie que tous les processus invoqués dans le cadre de cette
commande sont également gelés. La deuxième méthode est plus bas niveau, et permet de geler n’importe
quel processus que l’on a lancé.
fg [PID]
où PID est le PID du processus à relancer en avant-plan. Si ce paramètre n’est pas spécifié, le dernier
processus stoppé sera relancé en arrière-plan. fg est l’abréviation de l’anglais « foreground », ce qui
signifie « avant-plan ». Il faut attendre que ce processus se termine pour entrer de nouvelles commandes.
Par conséquent, on ne peut lancer en avant-plan qu’un seul processus.
De même, pour lancer un processus en arrière-plan, il faut utiliser la commande bg, qui est l’abréviation
de l’anglais « background ». Cette commande s’utilise de la même manière que la commande fg :
bg [PID]
Le relancement d’un processus suspendu peut également se faire en lui envoyant le signal 18 à l’aide de
la commande kill.
Redirections
Pour pouvoir lancer un programme en arrière-plan, il est nécessaire qu’il n’ait pas besoin de demander
des données à l’utilisateur. En effet, lorsqu’il est en arrière-plan, la saisie de ces données ne peut pas se
79
Chapitre 5. Commandes Unix de base
faire, puisque le shell les interpréterait comme une nouvelle commande. De plus, tout affichage en
provenance d’une commande en arrière-plan apparaît sur la console tel quel, et risque de se mélanger
avec l’affichage des autres programmes ou même avec la commande en cours d’édition. C’est pour
résoudre ces problèmes que le mécanisme des redirections a été introduit.
Principe de base
Le mécanisme des redirections a pour but de transférer les données provenant d’un flux vers les données
d’un autre flux. Il se base sur la notion de descripteur de fichier, utilisée par la plupart des systèmes Unix.
Un descripteur de fichier est un numéro utilisé par les programmes pour identifier les fichiers ouverts.
Les descripteurs 0, 1 et 2 sont respectivement affectés d’office au flux d’entrée standard (nommé
« stdin »), au flux de sortie standard (« stdout ») et au flux d’erreur standard (« stderr »), qui en général
apparaît également sur l’écran.
Les descripteurs de fichiers d’un processus sont généralement hérités par tous ses processus fils. Cela
signifie que, lors de leur lancement, ces processus peuvent utiliser tous les descripteurs de fichiers mis à
leur disposition par leur père. Dans le cas des lignes de commande, les processus fils sont les processus
lancés par le shell, et les descripteurs de fichiers hérités sont donc les descripteurs de fichiers du shell.
C’est de cette manière que le shell peut manipuler les descripteurs de fichiers des processus qu’il lance :
il effectue d’abord les redirections sur ses propres descripteurs de fichiers, puis il lance le processus fils
avec ces redirections actives. Le mécanisme est donc complètement transparent pour les processus fils.
Le mécanisme des redirections permet en fait d’injecter dans un descripteur de fichier des données
provenant d’un autre descripteur ou d’un fichier identifié par son nom, et d’envoyer les données
provenant d’un descripteur de fichier dans un autre descripteur ou dans un fichier identifié par son nom.
Si l’on utilise les descripteurs de fichiers des flux d’entrée / sortie standards, on peut exécuter n’importe
quelle commande interactive en arrière-plan.
n<fichier
où fichier est le nom du fichier dont les données doivent être injectées dans le descripteur n. Dans
cette syntaxe, le descripteur peut ne pas être précisé. Dans ce cas, le shell utilisera le descripteur 0, et les
données du fichier seront donc envoyées dans le flux d’entrée standard du processus. Par exemple,
supposons que l’on désire utiliser une commande nommée « search », et que cette commande demande
un certain nombre d’informations lors de son exécution. Si l’on sait à l’avance les réponses aux questions
qui vont être posées, on peut créer un fichier de réponse (nommé par exemple « [Link] ») et alimenter
la commande « search » avec ce fichier. Pour cela, on utilisera la ligne de commande suivante :
Il est également possible d’injecter des données provenant d’un autre descripteur de fichier dans un
descripteur de fichier. On utilisera pour cela la syntaxe suivante :
80
Chapitre 5. Commandes Unix de base
n<&s
où n est toujours le descripteur de fichier du processus à exécuter dans lequel les données doivent être
injectées, et s est un descripteur de fichier contenant les données sources à injecter. Par défaut, si n n’est
pas précisé, le flux d’entrée standard du processus sera utilisé.
n>fichier
où n est le numéro du descripteur de fichier du processus à enregistrer, et fichier est le nom du fichier
dans lequel les données doivent être stockées. Par défaut, si n n’est pas spécifié, le descripteur du flux de
sortie standard sera utilisé (descripteur 1). Par exemple, si la commande précédente affiche des résultats
et que l’on désire les stocker dans le fichier « [Link] », on utilisera la ligne de commande suivante :
Notez que cette commande détruira systématiquement le contenu du fichier « [Link] » et le remplacera
par les informations provenant du flux de sortie standard du processus « search ». Il est possible de ne
pas vider le fichier « [Link] » et d’ajouter les informations en fin de fichier, en utilisant l’opérateur
’>>’ à la place de l’opérateur ’>’. Ainsi, la commande suivante :
aura pour effet d’ajouter à la fin du fichier « [Link] » les informations affichées par le processus
« search ».
Le flux d’erreur standard, qui correspond normalement à l’écran et qui permet d’afficher les messages
d’erreur, peut être redirigé avec l’opérateur ’2>’, de la même manière que l’opérateur ’>’ est utilisé pour
le flux de sortie standard (puisque c’est le descripteur de fichier utilisé par défaut par l’opérateur ’>’).
Par exemple, si l’on veut envoyer les messages d’erreurs éventuels de la commande précédente vers le
périphérique nul (c’est-à-dire le périphérique qui n’en fait rien) pour ignorer ces messages, on utilisera la
ligne de commande suivante :
Une telle ligne de commande est complètement autonome, et peut être lancée en arrière-plan, sans
aucune intervention de l’utilisateur :
81
Chapitre 5. Commandes Unix de base
Il est également possible d’effectuer une redirection des données provenant d’un descripteur de fichier du
processus vers un autre descripteur de fichier de ce processus. On utilisera pour cela la syntaxe suivante :
n>&d
où n est le descripteur de fichier dont les données doivent être redirigées, et d le descripteur de fichier
destination. Cette syntaxe est souvent utilisée pour rediriger le flux d’erreur standard vers le flux d’entrée
standard, lorsqu’on veut récupérer les erreurs et les messages d’exécution normale dans un même fichier.
Par exemple, si l’on veut rediriger le flux de sortie et le flux d’erreurs de la commande « search » dans un
même fichier, on utilisera la ligne de commande suivante :
Cette ligne de commande utilise deux redirections successives pour les données affichées par la
commande « search » : la première redirige le flux de sortie standard vers un fichier, et la deuxième le
flux d’erreur standard vers le flux de sortie standard. Notez que l’ordre des redirections est important.
Elles sont appliquées de gauche à droite. Ainsi, dans la commande précédente, le flux de sortie standard
est redirigé vers le fichier « [Link] », puis le flux d’erreur standard est injecté dans le flux de sortie
standard ainsi redirigé.
Note : Il est également possible d’utiliser un autre descripteur de fichier que les descripteurs des flux
standards. Cependant, il est nécessaire, dans ce cas, d’ouvrir ce descripteur dans le shell avant de
lancer la commande. Cela peut se faire à l’aide de la syntaxe suivante :
n<>fichier
où n est un numéro de descripteur de fichier non encore utilisé, et fichier est un nom de fichier. Ce
nouveau descripteur de fichier pourra être utilisé dans les commandes précédentes, afin de faire
manipuler le fichier fichier par les processus fils de manière transparente.
Les descripteurs de fichiers ouverts de cette manière le restent d’une commande sur l’autre dans le
shell. Cela implique que toutes les données écrites dans ces descripteurs de fichiers sont ajoutées
automatiquement à la fin des fichiers manipulés par ces descripteurs. Ce comportement est différent
de la redirection vers un fichier effectuée par l’opérateur ’>’, qui ouvre à chaque fois le fichier en
écriture à son début et qui supprime donc toutes les données déjà existantes. Il n’y a donc pas
d’opérateur ’>>&’ pour ajouter des données à un descripteur de fichier, car cela n’a pas de sens.
Les descripteurs de fichiers peuvent également être manipulés directement, par l’intermédiaire de
fichiers virtuels du répertoire /dev/fd/. À chaque descripteur de fichier (y compris les descripteurs
pour les flux d’entrée/sortie standards !) y correspond un fichier dont le nom est le numéro du
descripteur. Par exemple, le fichier /dev/fd/2 correspond au flux d’erreur standard.
En fait, le répertoire /dev/fd/ est un lien symbolique vers le répertoire /proc/self/fd/ du système
de fichiers virtuel /proc/. Ce système de fichiers est géré par le noyau directement, et permet
d’accéder aux informations sur le système et les processus. Il contient en particulier un
sous-répertoire portant le nom du PID de chaque processus existant dans le système, et chacun de
ces répertoires contient lui-même un sous-répertoire fd/ où sont représentés les descripteurs de
fichiers ouvert par le processus correspondant. Le système de fichiers /proc/ contient également
un lien symbolique self/ pointant sur le sous-répertoire du processus qui cherche à l’ouvrir. Ainsi,
/proc/self/fd/ est un chemin permettant à chaque processus d’accéder à ses propres
descripteurs de fichiers.
82
Chapitre 5. Commandes Unix de base
En pratique, la manipulation directe des descripteurs de fichiers n’est réellement intéressante que
pour les flux standards, dont les numéros de descripteurs sont fixes et connus de tous les
programmes. Pour les autres descripteurs, cette technique est souvent inutilisable ou inutile, sauf
lorsqu’on utilise des programmes sachant manipuler des descripteurs de numéros bien déterminés.
Insertion de documents
Il existe un dernier opérateur de redirection, qui n’est utilisé en pratique que dans les scripts shell. Cet
opérateur permet d’insérer directement un texte complet dans le flux d’entrée standard, sans avoir à
placer ce document dans un fichier à part. Cette technique permet donc de stocker des données avec le
code des scripts shell, et de n’avoir ainsi qu’un seul fichier contenant à la fois le script et ses données.
Cet opérateur est l’opérateur ’<<’, il s’utilise selon la syntaxe suivante :
<<EOF
texte
.
.
.
EOF
où texte est le contenu du texte à insérer, et EOF est un marqueur quelconque qui sera utilisé seul sur
une ligne afin de signaler la fin du texte.
Par exemple, il est possible de créer un fichier [Link] de la manière suivante :
Les tubes
Les redirections sont très pratiques lorsqu’il s’agit d’injecter un fichier dans le flux d’entrée standard
d’un processus, ou inversement de rediriger le flux standard d’une commande vers un fichier, mais elles
ont justement le défaut de devoir utiliser des fichiers. Il est des situations où l’on désirerait injecter le
résultat d’une commande dans le flux d’entrée standard d’une autre commande, sans passer par un fichier
intermédiaire. Cela est heureusement réalisable, grâce à ce que l’on appelle les « tubes ».
83
Chapitre 5. Commandes Unix de base
flux d’entrée standard de la commande suivante, d’où le nom de « pipe » en anglais (ce qui signifie
« tuyau » ou « tube »). L’opérateur tube s’utilise de la manière suivante :
• on écrit la première commande, qui doit fournir les données à la deuxième commande ;
• on écrit l’opérateur tube ;
• on écrit la deuxième commande, qui doit lire les données provenant de la première.
La commande se trouvant à la gauche de l’opérateur tube doit être complète, avec ses autres redirections
éventuelles. La redirection dans un tube s’effectue après les autres types de redirections vues
précédemment.
Le système contrôle l’exécution des processus qui se trouvent aux deux bouts d’un tube, de telle sorte
que le transfert de données puisse toujours se faire. Si le processus source a trop de données, il est figé
par le système d’exploitation en attendant que le processus consommateur ait fini de traiter les données
déjà présentes. Inversement, si le processus source est trop lent, c’est le processus consommateur qui
attendra patiemment que les données soient disponibles.
Les tubes sont utilisés très couramment, ne serait-ce que pour afficher page par page le contenu d’un
répertoire. La commande suivante effectue un tel travail :
ls | less
Ici, le résultat de la commande ls est redirigé vers la commande less, qui permet d’afficher page par page
(et de revenir en arrière dans ces pages) la liste des fichiers du répertoire courant.
Prenons un exemple un peu plus complexe. Supposons que l’on veuille archiver et compresser un
répertoire. Il est possible d’archiver ce répertoire avec la commande tar, puis de compresser le fichier
archive résultant :
Cette méthode est correcte, mais souffre d’un défaut : elle utilise un fichier intermédiaire, qui peut
prendre beaucoup de place disque. Une méthode plus économe consiste à lancer tar et gzip en parallèle,
et à rediriger la sortie standard de l’un dans le flux d’entrée de l’autre. Ainsi, il n’y a plus de fichier
temporaire, et la place consommée sur le disque est minimale :
La première commande demande à tar d’archiver tous les fichiers du répertoire et d’envoyer le résultat
dans le flux standard de sortie. Le pipe redirige ce flux standard vers le flux d’entrée standard de gzip.
Celui-ci compresse les données et les émet vers son flux standard de sortie, qui est lui-même redirigé vers
le fichier [Link]. Aucun fichier temporaire n’a été utilisé, et on a ainsi économisé l’espace
disque de l’archive complète non compressée, c’est-à-dire environ la taille complète du répertoire à
archiver. Ce genre de considération peut être très important lorsque le disque dur commence à être plein...
84
Chapitre 5. Commandes Unix de base
Note : En fait, la commande tar de GNU permet de compresser à la volée les données à archiver,
permettant d’éviter de se prendre la tête comme on vient de le faire. Pour cela, il suffit d’utiliser
l’option z dans la ligne de commande de tar. Ainsi, la ligne de commande suivante fournit le même
résultat :
Mais cette solution ne fonctionne pas avec les versions non GNU de tar, qui ne supportent pas cette
option.
Un autre exemple pratique est le déplacement de toute une arborescence de fichiers d’un système de
fichiers à un autre. Vous ne pourrez pas y parvenir à l’aide de la commande mv, car celle-ci ne fait que
modifier la structure du système de fichiers pour déplacer les fichiers et les répertoires, elle ne peut donc
pas fonctionner avec deux systèmes de fichiers. Vous ne pouvez pas non plus utiliser la commande cp,
car celle-ci ne prendra pas en compte les dates des fichiers, leur propriétaire et leur groupe, ainsi que les
liens symboliques et physiques. Il faut donc impérativement utiliser un programme d’archivage. La
méthode à suivre est donc de créer une archive temporaire, puis de se déplacer dans le répertoire
destination, et enfin d’extraire l’arborescence de l’archive :
cd source
tar cvf [Link] *
cd destination
tar xvf source/[Link]
rm source/[Link]
Malheureusement, cette technique nécessite beaucoup de place disque, puisque l’archive temporaire est
stockée directement sur disque. De plus, elle est assez lente, car toutes les données à copier sont
recopiées sur le disque dur, et relues ensuite, pour finalement être détruites... La vraie solution est de
réaliser un tube entre les deux processus tar invoqués. Dans ce cas, le transfert se fait simplement via la
mémoire vive :
cd source
tar cv * | (cd destination ; tar xvf -)
La commande à utiliser est cette fois un peu plus compliquée, car la commande d’extraction des fichiers
nécessite un changement de répertoire. Il faut donc utiliser une commande multiple du shell. Ces
commandes sont constituées de plusieurs autres commandes séparées par des points virgules. La
première commande effectuée ici est le changement de répertoire, et la deuxième est l’extraction par tar
de l’archive qui lui est transférée par le flux d’entrée standard (représenté ici par ’-’). Ces deux
commandes sont mises entre parenthèses, car l’opérateur ’|’ du tube est prioritaire sur l’opérateur ’;’ de
concaténation des commandes du shell. Si vous trouvez que cela est un peu compliqué, je vous l’accorde.
Cependant, la commande qui utilise le tube consomme deux fois moins d’espace disque et est deux fois
plus rapide que la commande qui n’en utilise pas. Je vous invite à mesurer le gain de temps sur un
répertoire contenant un grand nombre de données (utilisez la commande time !).
85
Chapitre 5. Commandes Unix de base
mkfifo nom
où nom est le nom du tube nommé. Notez que cette commande échouera sur les systèmes de fichiers
incapables de gérer les tubes nommés.
Une fois créé, le fichier de tube peut être utilisé comme n’importe quel fichier dans les redirections que
l’on a vues dans la section précédente. Par exemple, la redirection suivante :
ls | less
peut être réécrite pour utiliser un tube nommé temporaire de la manière suivante :
mkfifo /tmp/tempfifo
ls > /tmp/tempfifo
less < /tmp/tempfifo
La destruction d’un tube nommé se fait comme n’importe quel fichier, à l’aide de la commande rm.
La commande tee
La commande tee est un petit programme permettant d’enregistrer les données qu’il reçoit dans son flux
d’entrée standard dans un fichier et de les renvoyer simultanément vers son flux de sortie standard. Elle
est couramment utilisée, en conjonction avec les tubes, pour dupliquer un flux de données. Sa syntaxe est
la suivante :
tee fichier
où fichier est le nom du fichier dans lequel le flux d’entrée standard doit être enregistré.
Supposons par exemple que l’on désire rediriger tous les messages (d’erreur ou non) de la commande ls
/proc/1/* dans un fichier [Link], tout en continuant à les visualiser sur l’écran. Pour cela, on
utilisera la commande suivante :
86
Chapitre 5. Commandes Unix de base
À l’issue de cette commande, le fichier [Link] contiendra une copie des données qui ont été
émises par la commande ls -l /proc/1 2>&1.
La commande xargs
La commande xargs permet d’appeler une autre commande, en passant en paramètre les données qu’elle
reçoit dans le flux d’entrée standard. Sa syntaxe est la suivante :
xargs commande
où commande est la commande que xargs doit exécuter. xargs construira une ligne de commande
complète pour cette commande, en utilisant comme paramètres les données issues du flux d’entrée
standard. Une fois cette ligne de commande construite, xargs l’exécutera. Par exemple, la commande
suivante :
ls -l
xargs ls
Cette commande est plus simple et plus efficace que la commande équivalente :
parce que grep n’est exécuté qu’une seule fois (alors que l’option -exec de la commande find l’exécute
pour chaque fichier trouvé).
87
Chapitre 5. Commandes Unix de base
• son propre environnement, qui contient les variables d’environnement locales à la session du shell en
cours ;
• l’environnement d’exécution, dont les variables d’environnement sont transmises aux programmes que
le shell lance.
Il est très facile de définir une variable du shell. Pour cela, il suffit de lui affecter une valeur, à l’aide de la
syntaxe suivante :
variable=valeur
où variable est le nom de la variable à définir, et valeur est la valeur que l’on désire lui affecter.
Notez qu’il n’est pas nécessaire de fournir une valeur. Dans ce cas, la variable ainsi définie sera vide.
Par exemple, la ligne suivante :
permet de définir la variable BONJOUR. Notez que la valeur est encadrée entre guillemets, car elle
contient des espaces. Notez également que le caractère point d’exclamation (’!’) est précédé d’un
caractère d’échappement antislash (’\’), car il a une signification particulière pour le shell. Ce caractère
d’échappement permet simplement de signaler au shell qu’il ne doit pas interpréter le caractère qui le
suit, et fait donc en sorte que le point d’exclamation fasse partie de la chaînes de caractères à affecter à la
88
Chapitre 5. Commandes Unix de base
variable. Bien entendu, le caractère antislash étant lui-même un caractère spécial pour le shell, il doit
lui-même être préfixé d’un autre antislash si l’on désire l’utiliser dans une chaîne de caractères.
La valeur d’une variable peut être récupérée simplement en préfixant le nom de la variable du symbole
dollar (’$’). Ainsi, la commande suivante permet d’afficher le contenu de la variable BONJOUR :
echo $BONJOUR
Les variables ainsi définies ne font partie que de l’environnement du shell, elles ne sont donc pas
accessibles aux programmes que le shell lance. Donc, si l’on relance un nouveau shell avec la commande
suivante :
bash
et que l’on essaie de lire le contenu de la variable BONJOUR avec la commande echo, on obtient une
chaîne vide. Cela est normal, puisque le deuxième shell (c’est-à-dire celui qui est en cours d’exécution)
n’utilise pas le même environnement que le premier shell. Vous pouvez quitter le nouveau shell avec la
commande suivante :
exit
Dès lors, vous serez à nouveau dans le shell initial, et la variable BONJOUR sera à nouveau accessible.
Pour rendre une variable du shell accessible aux programmes que celui-ci peut lancer, il faut l’exporter
dans l’environnement d’exécution. Cela peut être réalisé avec la commande export :
export variable
permet de lancer un shell et de lui communiquer la variable d’environnement BONSOIR. Cette variable
ne sera définie que pour ce programme, si l’on quitte ce shell avec un exit, la variable BONSOIR ne sera
plus définie.
Une variable peut être détruite à tout instant à l’aide de la commande unset. Cette commande prend en
paramètre le nom de la variable à supprimer. Par exemple, la commande suivante supprime notre
variable :
unset BONJOUR
89
Chapitre 5. Commandes Unix de base
Vous pouvez à tout moment visualiser l’ensemble des variables définies avec la commande set. Le
tableau donné ci-dessous vous présentera les variables d’environnement les plus utilisées, que la plupart
des programmes utilisent pour permettre à l’utilisateur de modifier leur comportement :
Nom Signification
HOME Chemin du répertoire personnel de l’utilisateur.
USER Nom de login de l’utilisateur. Cette information est également
disponible au travers de la variable d’environnement LOGNAME.
TERM Type de terminal utilisé. La valeur de cette variable sert aux
applications pour déterminer les caractérisques du terminal et ses
fonctionnalités afin d’optimiser leur affichage. La valeur de cette
variable est souvent linux sur les consoles Linux, et xterm dans les
émulateurs de terminal graphiques sous X11. Nous verrons l’utilité
de cette variable plus en détail dans la la section intitulée Description
des terminaux dans Chapitre 6.
SHELL Chemin sur le fichier de programme du shell actuellement utilisé.
Sous Linux, il s’agit souvent du shell bash.
PATH Liste des répertoires dans lesquels les programmes à exécuter seront
recherchés. Cette liste ne doit pas contenir le répertoire courant (.)
pour des raisons de sécurité de base (il suffit de placer un cheval de
troie portant le nom d’une commande classique dans un répertoire
pour que l’utilisateur le lance sans s’en rendre compte).
LD_LIBRARY_PATH Liste des répertoires dans lesquels les bibliothèques dynamiques
seront recherchées si elles ne sont pas trouvables dans les répertoires
classiques des bibliothèques de programme du système.
C_INCLUDE_PATH Liste des répertoires dans lesquels le compilateur C recherchera les
fichiers d’en-tête lors de la compilation des fichiers sources C. Cette
liste doit contenir les répertoires additionnels, qui ne sont pas déjà
pris en compte automatiquement par le compilateur C.
CPLUS_INCLUDE_PATH Liste des répertoires dans lesquels le compilateur C++ recherchera
les fichiers d’en-tête lors de la compilation des fichiers sources
C/C++. Cette liste doit contenir les répertoires additionnels, qui ne
sont pas déjà pris en compte automatiquement par le compilateur
C++.
LIBRARY_PATH Liste des répertoires dans lesquels les bibliothèques à utiliser lors de
l’édition de liens des programmes doivent être recherchées. Cette
variable n’est utilisée que par les outils de développement lors de la
compilation de fichiers sources et elle ne doit pas être confondue
avec la variable d’environnement LD_LIBRARY_PATH, qui indique
la liste des répertoires dans lequel l’éditeur de liens dynamiques
recherchera les bibliothèques dynamiques utilisées par les
programmes lors de leur chargement. Les notions de fichiers sources
et de compilation seront détaillées dans le Chapitre 7.
90
Chapitre 5. Commandes Unix de base
Nom Signification
TMPDIR Répertoire des fichiers temporaires. Par défaut, le répertoire des
fichiers temporaires est le répertoire /tmp/, mais il est possible d’en
changer grâce à cette variable d’environnement.
TZ Définition de la zone horaire de l’utilisateur. Le système travaillant
exclusivement en temps universel, chaque utilisateur peut définir sa
propre zone horaire pour obtenir l’affichage des dates et des heures
dans son temps local. Le format de cette variable d’environnement
est assez complexe. Il est constitué de plusieurs champs séparés par
des espaces, représentant successivement le nom du fuseau horaire
(au moins trois caractères), le décalage à ajouter à l’heure universelle
pour obtenir l’heure locale, le nom du fuseau horaire pour l’heure
d’été, le décalage pour l’heure d’été, et les dates de début et de fin de
l’heure d’été. Les décalages horaires doivent être exprimés avec un
’+’ pour les fuseaux horaires placés à l’ouest de Greenwich, ’-’ pour
ceux situés à l’est. Les dates de début et de fin de la période d’heure
d’été peuvent être exprimés de deux manières différentes. La
première méthode est d’indiquer le numéro du jour dans l’année
après la lettre ’J’. Ce numéro ne doit pas tenir compte du 29 février,
même pour les années bissextiles. La deuxième méthode est
d’indiquer le mois de l’année, la semaine du mois et le jour de la
semaine, séparés par des ’.’, et après la lettre ’M’. Les mois sont
comptés de 1 à 12, les semaines de 1 à 5 et les jours de 0 à 6, 0 étant
le dimanche. Seul le premier champ est obligatoire, et il est possible
d’utiliser les noms de fuseaux horaires définis par la bibliothèque C.
En France, on utilise normalement le fuseau CES (temps d’Europe
centrale).
LANG Nom de la locale à utiliser par défaut pour les paramètres
d’internationalisation des applications. Cette valeur sera utilisée pour
les paramètres qui n’en définissent pas une explicitement. Elle doit
être composée de deux codes à deux caractères, le premier indiquant
la langue, et le deuxième le pays (car plusieurs pays peuvent parler la
même langue, et un pays peut avoir plusieurs langues nationales).
Pour la France, on utilise normalement la valeur « fr_FR ». Cette
valeur peut être redéfinie par l’une des variables d’environnement
décrites ci-dessous.
LC_MESSAGES Nom de la locale à utiliser pour déterminer la langue des messages.
La valeur par défaut est spécifiée par la variable d’environnement
LANG.
LC_TYPE Nom de la locale à utiliser pour déterminer les règles de classification
des caractères. La classification des caractères permet de dire si un
caractère est un chiffre ou non, s’il est en majuscule ou en minuscule,
etc. La valeur par défaut est spécifiée par la variable d’environnement
LANG.
91
Chapitre 5. Commandes Unix de base
Nom Signification
LC_COLLATE Nom de la locale à utiliser pour déterminer les règles de comparaison
des caractères. La comparaison des caractères est utilisée pour les tris
lexicographiques (tri par ordre alphabétique par exemple). La valeur
par défaut est spécifiée par la variable d’environnement LANG.
LC_MONETARY Nom de la locale à utiliser pour déterminer l’emplacement et le
caractère représentant le symbole monétaire du pays. La valeur par
défaut est spécifiée par la variable d’environnement LANG.
LC_NUMERIC Nom de la locale à utiliser pour déterminer les conventions locales
d’écriture des nombres (séparateur décimal, format de la virgule,
etc.). La valeur par défaut est spécifiée par la variable
d’environnement LANG.
En résumé, le shell utilise les variables d’environnement du système pour gérer ses propres variables, et
permet de les exporter vers l’environnement d’exécution qu’il communique aux commandes qu’il lance.
Un grand nombre de variables d’environnement classiques sont reconnues par les programmes. Elles
servent à paramétrer leur comportement. Nous reverrons ultérieurement quelques-unes de ces variables
lors de la configuration du système de base.
mkdir \<
Bien entendu, le caractère antislash peut lui-même être précédé d’un autre antislash, lorsqu’on veut
l’utiliser en tant que caractère normal.
Le caractère d’échappement antislash permet également, lorsqu’il est placé en fin de ligne, de supprimer
le saut de ligne qui le suit. Cela signifie qu’il permet de répartir une commande trop longue sur plusieurs
lignes, à des fins de lisibilité. Vous trouverez quelques exemples de cette notation plus loin dans ce
document, pour présenter des commandes trop longues pour tenir sur une page A4.
Il peut être relativement fastidieux de devoir taper des antislashs dans les chaînes de caractères qui
contiennent beaucoup de caractères interprétables par le shell. C’est pour cela que le shell permet de
définir des chaînes de caractères dont il ignore le contenu lors de l’analyse syntaxique. Ces chaînes de
caractères sont simplement données entre guillemets simples (caractère ’). Par exemple, la commande
suivante :
92
Chapitre 5. Commandes Unix de base
Note : Une chaîne de caractères commence par un guillemet et se termine par un guillemet. Les
chaînes de caractères ne peuvent donc pas contenir de guillemet, même précédé d’un caractère
d’échappement.
On veillera à ne surtout pas confondre les guillemets simples (caractère ’) avec les guillemets
inverses (caractère ‘). Ces deux caractères se ressemblent en effet énormément dans certaines
polices de caractères, mais ont néanmoins une signification très différente. Le premier sert à définir
des chaînes de caractères, et le deuxième à exécuter une commande et à en inclure le résultat dans
une autre commande. Nous verrons plus loin comment utiliser ce type de guillemets.
Les guillemets simples sont donc très pratiques pour écrire simplement une chaîne de caractères, mais ne
permettent pas de bénéficier des fonctionnalités de substitutions du shell, comme par exemple le
remplacement d’une variable par sa valeur dans la chaîne de caractères. De plus, elles ne peuvent pas
contenir de guillemets simples, puisque c’est leur caractère de terminaison. C’est pour ces raisons que le
shell donne la possibilité de définir des chaînes de caractères plus souples, à l’aide des guillemets
doubles (caractère "). Dans ces chaînes de caractères, la plupart des caractères normalement interprétés
par le shell ne le sont plus, comme pour les chaînes de caractères utilisant les guillemets simples.
Cependant, les caractères spéciaux $, ‘ et \ conservent leur signification initiale. Il est donc possible, par
exemple, d’utiliser des variables d’environnement dans les chaînes de caractères de ce type :
Le caractère d’échappement antislash peut toujours être utilisé, en particulier pour insérer un caractère de
guillemets doubles dans une chaîne de caractères. En effet, ce caractère marquerait la fin de la chaîne de
caractères s’il n’était pas précédé d’un antislash.
Note : Remarquez que les guillemets et les caractères d’échappement ne sont utilisés que pour
l’analyse de la ligne de commande. Une fois toutes les chaînes de caractères et toutes les
substitutions traitées, les guillemets et les caractères d’échappement inutiles sont supprimés. En
pratique, ce sont tous les caractères d’échappement et les guillemets qui restent après traitement de
la ligne de commande et qui ne font pas partie du résultat d’une des substitutions. Ainsi, la
commande suivante :
a pour but de passer la chaîne de caractères Bonjour tout le monde en tant que premier (et
unique) paramètre de la commande echo, puis de l’exécuter. Les guillemets ne font pas partie de la
chaîne de caractères, ils ont été supprimés par le shell et seul le contenu de la chaîne sera
effectivement affiché.
Notez que la commande précédente est très différente de celle-ci :
même si le résultat est le même. En effet, cette dernière commande passe les chaînes de caractères
Bonjour, tout, le et monde en tant que paramètres (4 au total) à la commande echo, alors que
93
Chapitre 5. Commandes Unix de base
l’utilisation des guillemets permet de passer toute la phrase en un seul paramètre. On peut voir la
différence en utilisant plus d’un espace entre chaque mot : les espaces superflus ne sont conservés
que dans la première commande.
Les substitutions
L’une des fonctionnalités les plus puissantes du shell est sans doute sa capacité à effectuer des
substitutions d’expressions par leur valeur. L’une des substitutions les plus courantes est sans doute le
remplacement d’une variable par sa valeur, mais le shell peut faire beaucoup plus que cela. Les lignes de
commandes peuvent être écrites en utilisant différents types d’expressions spéciales, qui seront
remplacées par leur valeur par le shell avant l’exécution de la commande. Ces expressions permettent de
spécifier des motifs de chaîne de caractères, d’exprimer des chemins partiels sur des fichiers ou des
répertoires, de récupérer la valeur des variables du shell, et de calculer des expressions mathématiques,
voire d’inclure le résultat d’une autre commande dans la ligne de commande en cours.
Les mécanismes des substitutions décrits ci-dessous sont présentés par ordre de priorité décroissante.
Cela signifie que si une expression substituable contient elle-même une autre expression substituable de
priorité inférieure, cette expression sera remplacée après la substitution de l’expression contenante.
ls test{0,1,2,3,4}
Note : Ceux qui se souviennent un peu de leurs mathématiques se diront qu’il s’agit là d’une
factorisation. C’est rigoureusement exact.
94
Chapitre 5. Commandes Unix de base
donnant le nom de login de cet autre utilisateur immédiatement après le caractère tilde. Par exemple, la
commande suivante :
cp *.txt ~jean
permet de copier tous les fichiers d’extension .txt dans le répertoire personnel de l’utilisateur jean.
Remplacements de variables
Comme il l’a déjà été indiqué plus haut, la valeur des variables du shell et des variables d’environnement
peut être récupérée en préfixant le nom de la variable par le caractère dollar (’$’). En fait, cette écriture
est l’une des formes les plus simples que peuvent prendre les substitutions de paramètres. En effet, il est
possible de remplacer l’expression par une partie seulement de la valeur de la variable, ou une par une
autre valeur calculée à partir de celle de la variable.
En pratique, les expressions utilisées par les substitutions de variables peuvent être relativement
compliquées, et il peut être nécessaire de les isoler du reste de la ligne de commande à l’aide
d’accolades. La syntaxe exacte complète de ce type de substitution est donc la suivante :
${expression}
${variable:-valeur}
où valeur est la valeur par défaut à utiliser dans ce cas. Notez que la variable reste indéfinie après la
substitution. Pour fixer la valeur de la variable à cette valeur par défaut en plus d’effectuer la substitution,
on utilisera plutôt la syntaxe suivante :
${variable:=valeur}
Il est parfois préférable d’afficher un message d’erreur plutôt que de donner une valeur par défaut
lorsqu’une variable n’est pas définie. Cela peut se faire avec la syntaxe suivante :
${variable:?message}
où message est le message à afficher dans le cas où la variable variable est non définie ou de valeur
nulle.
Si l’on veut tester si une variable est non définie et renvoyer une valeur spécifique si elle est définie, on
utilisera la syntaxe suivante :
${variable:+valeur}
où valeur est la valeur à renvoyer si la variable est définie. Si la variable n’est pas définie, la
substitution sera faite avec la chaîne de caractères vide (l’expression complète sera donc supprimée).
95
Chapitre 5. Commandes Unix de base
Le shell permet également de faire la substitution avec une sous-chaîne de la valeur de la variable, à
partir d’une position donnée et d’une longueur. La syntaxe à utiliser est donnée ci-dessous :
${variable:position:longueur}
où position est la position à laquelle commence la sous-chaîne à extraire, et longueur est le nombre
de caractères à extraire. Ce dernier champ est facultatif (on ne mettra pas non plus les deux-points
précédents si on décide de ne pas spécifier de longueur). Si on ne le précise pas, la sous-chaîne extraite
sera constituée du reste de la valeur de la variable à partir de la position indiquée. La position quant à elle
doit être positive ou nulle. Une valeur négative indique un point de départ correspondant au nombre de
caractères correspondant à partir de la droite de la valeur de la variable. Si l’on veut obtenir la longueur
d’une chaîne de caractères contenue dans une variable, on utilisera cette syntaxe :
${#variable}
${variable#préfixe}
ou :
${variable##préfixe}
où variable est la variable contenant la chaîne de caractères à traiter, et préfixe est le préfixe à
supprimer.
En fait, le préfixe peut être spécifié à l’aide d’un motif de caractères. Ce motif peut correspondre à une
partie plus ou moins grande de la valeur de la variable. Dans ce cas, il y a plusieurs manières
d’interpréter ce motif, et donc plusieurs choix de préfixes possibles à supprimer. La première syntaxe
devra être utilisée lorsqu’on désire supprimer le plus petit préfixe possible correspondant au motif. La
deuxième syntaxe, quant à elle, permettra de supprimer le préfixe le plus long. Par exemple, si la variable
VAR contient la chaîne de caractères abbbc, la commande suivante :
echo ${VAR#a*b}
affichera la chaîne de caractères bbc, car le plus petit préfixe correspondant au motif a*b est ab.
Inversement, la commande :
echo ${VAR##a*b}
utilisera le préfixe le plus long, à savoir abbb. Le résultat de cette substitution sera donc la chaîne de
caractères c. La syntaxe des motifs de caractères utilisés ici sera précisée dans la la section intitulée Les
expressions rationnelles.
Le shell fournit une syntaxe similaire pour extraire des suffixes de la valeur des variables. Cette syntaxe
utilise simplement le caractère % au lieu du caractère #. Comme pour les préfixes, le fait de doubler ce
caractère implique que le suffixe le plus long correspondant au motif sera utilisé, alors que l’utilisation
d’un seul % permet de choisir le suffixe le plus court. Ainsi, la commande :
96
Chapitre 5. Commandes Unix de base
echo ${VAR%b*c}
echo ${VAR%%b*c}
n’affichera que a.
Pour terminer ce tour d’horizon des remplacements de variables, nous allons voir les possibilités de
recherche et de remplacement du shell dans les chaînes de caractères contenues dans des variables. La
syntaxe suivante :
${variable/motif/remplacement}
permet de rechercher la plus grande sous-chaîne de caractères correspondant au motif motif dans la
chaîne contenue dans la variable variable, et de remplacer cette sous-chaîne par la chaîne de caractères
remplacement. Par exemple, si la variable VAR contient la chaîne de caractères abab, la commande
suivante :
echo ${VAR/b/d}
${variable//motif/remplacement}
Dans les deux syntaxes, la présence du champ remplacement est facultative. Cela permet de supprimer
purement et simplement les sous-chaînes de caractères qui correspondent au motif.
La syntaxe des motifs sera détaillée dans la la section intitulée Les expressions rationnelles. Cependant,
une précision doit être signalée : si le motif commence par le caractère #, il sera obligatoirement
recherché au début de la chaîne de caractères contenue dans la variable. De même, si le motif commence
par le caractère %, il sera obligatoirement recherché à la fin de cette chaîne. Ces deux notations
permettent d’obtenir le même effet que les suppressions de préfixes et de suffixes présentées plus haut.
‘commande‘
où commande est la commande devant être remplacée par son résultat (c’est-à-dire ce qu’elle enverra ce
résultat sur le flux standard de sortie). Pour donner un exemple, la commande suivante :
97
Chapitre 5. Commandes Unix de base
a pour résultat de lancer un signal SIGTERM au processus dont le PID est stocké dans le fichier
/var/pid/[Link]. La commande cat est utilisée pour afficher le contenu de ce fichier, et elle est
substituée par ce contenu. En fin de compte, la commande kill est appliqué au PID affiché par cat.
La deuxième syntaxe utilisable est la suivante :
$(commande)
où commande est toujours la commande à exécuter et à substituer. La différence entre ces deux syntaxes
est que, dans le premier cas, les caractères $, ‘ et \ sont toujours interprétés par le shell et doivent être
précédés d’un antislash s’ils doivent apparaître tels quels dans la commande à substituer, alors que, dans
le deuxième cas, on peut utiliser tous les caractères sans protection particulière (sauf, bien entendu, la
parenthèse fermante, puisqu’elle marque la fin de la commande).
$((expression))
Substitution de commandes
Nous avons déjà vu qu’il était possible de récupérer le résultat d’une commande pour l’insérer dans une
ligne de commande. Cette technique s’apparente à ce qu’il est possible de faire avec la commande xargs
et un pipe. De la même manière, le shell fournit une substitution permettant d’obtenir des fonctionnalités
similaires à celles fournies par les pipes nommés. Cette substitution est la substitution de commande.
La syntaxe utilisée par les substitutions de commandes est similaire à celle des redirections classiques :
<(command)
ou :
>(command)
98
Chapitre 5. Commandes Unix de base
cat <(ls)
mkfifo /tmp/lsfifo
ls > /tmp/lsfifo
cat /tmp/lsfifo
rm /tmp/lsfifo
Les substitutions de commandes sont donc nettement plus pratiques et plus sûres, car elles n’imposent
pas la création d’un fichier de pipe nommé dont le nom peut être choisi arbitrairement.
Découpage en mots
Les résultats provenant des substitutions vues précédemment sont systématiquement décomposés en
série de mots par le shell avant de poursuivre le traitement de la ligne de commande. Cela signifie que les
résultats de substitutions sont analysés pour identifier les mots qu’ils contiennent, en se basant sur la
notion de séparateur. Par défaut, les séparateurs utilisés sont l’espace, le caractère de tabulation et le
retour de ligne, mais il est possible de spécifier des séparateurs différents à l’aide de la variable
d’environnement IFS (abréviation de l’anglais « Internal Field Separator »).
Par exemple, le résultat de la commande ls dans la commande suivante :
echo ‘ls‘
est une chaîne de caractères contenant la liste des fichiers du répertoire courant, chacun étant séparé du
suivant par un caractère de saut de ligne. La substitution du résultat de cette commande est donc soumise
au découpage en mots, et chaque caractère de retour à la ligne est interprété comme un séparateur. Par
conséquent, cette chaîne de caractères est transformée en une liste de mots, chacun de ces mots étant un
des noms de fichiers renvoyés par la commande ls. Au final, la commande echo est appelée, avec comme
paramètres ces noms de fichiers, à raison d’un par paramètre. Les noms de fichiers sont donc affichés sur
une seule ligne.
99
Chapitre 5. Commandes Unix de base
Note : Ce découpage en mot est effectué automatiquement par le shell à la suite des substitutions
vues précédemment. Cela signifie en particulier que s’il n’y a pas de substitution, il n’y a pas de
découpage en mots non plus.
ls [a-c,m-t]*.txt
permet d’afficher tous les fichiers dont le nom commence par les lettres a, b, c et les lettres allant de m à
t, et dont l’extension est .txt. Vous trouverez de plus amples renseignements sur la syntaxe de ces
motifs dans la la section intitulée Les expressions rationnelles.
Sauf paramétrage pour indiquer explicitement de faire le contraire, le shell ignore systématiquement les
répertoires . et .. dans les substitutions. Cela est très important. En effet, une commande utilisant le
caractère générique * ne s’appliquera pas, par défaut, sur le répertoire courant et le répertoire parent.
Paramétrer bash pour qu’il prenne en compte ces répertoires peut être extrêmement dangereux, surtout
avec une commande telle que rm -f *, qui dans ce cas effacerait également les répertoires parents en
plus du contenu du répertoire courant !
100
Chapitre 5. Commandes Unix de base
des sous-chaînes de caractères dans un chaîne de caractères à l’aide des parties variables des expressions
rationnelles, et permet éventuellement de remplacer ces sous-chaînes par des chaînes de substitutions.
Malheureusement, la description des expressions rationnelles pourrait prendre plusieurs pages, aussi ne
verrons-nous ici que expressions utilisables dans les substitutions du shell bash.
Comme vous l’avez sans doute déjà deviné au travers des exemples précédents, le caractère ’*’ permet
d’identifier une quelconque chaîne de caractères, y compris la chaîne vide. Utilisé dans les expressions
rationnelles, il constitue la partie variable principale de ces expressions. De la même manière, le
caractère ’?’ représente un et un seul caractère quelconque. Ce caractère sera donc utilisé quand on
désirera contrôler la taille de la partie variable d’une expression rationnelle, éventuellement en le
répétant un certain nombre de fois.
Les deux caractères de substitutions précédents peuvent contenir n’importe quel caractère, ce qui peut
parfois ne pas être assez restrictif dans la définition d’un motif. Le shell fournit donc une syntaxe plus
évoluée, permettant de définir précisément le jeu de caractère auquel un caractère du motif doit
appartenir. Cette syntaxe consiste simplement à donner la liste des caractères du jeu de caractères entre
crochets :
[...]
Les points de suspension représentent ici l’ensemble des caractères qui peuvent apparaître dans le motif
ainsi défini. Notez que dans le cas d’une suite de caractères, il suffit de spécifier le premier et le dernier
caractère, et de les séparer par un trait d’union (caractère ’-’). Ainsi, le motif suivant :
[a-egt]
représente n’importe lequel des caractères de ’a’ à ’e’, plus les caractères ’g’ et ’t’.
Note : Pour spécifier le caractère - lui-même, il suffit de le placer tout seul au début ou à la fin de la
liste de caractères spécifiée entre les crochets. De même, pour spécifier le caractère ’]’ lui-même
(normalement utilisé pour marquer la fin du jeu de caractères), il faut le placer au début de la liste,
juste après le crochet ouvrant.
Pour finir, sachez que le shell bash est également capable de prendre en charge des expressions
rationnelles plus complexes que celles présentées ici. Cependant, ces expressions ne sont pas actives par
défaut, et ne sont donc accessibles qu’en activant une option complémentaire du shell. Ces extensions ne
seront pas décrites ici, mais vous pouvez consulter la page de manuel de bash si vous désirez en savoir
plus à ce sujet.
Structures de contrôle
Tout langage de programmation digne de ce nom dispose de structures de contrôles évoluées permettant
de contrôler l’exécution du programme, de réaliser des boucles et de structurer l’ensemble d’un
programme. Le shell n’échappe pas à la règle, et fournit la plupart des constructions classiques. Cette
section a pour but d’exposer leurs syntaxes.
101
Chapitre 5. Commandes Unix de base
{
cd /tmp
rm *.bak
}
Notez que l’accolade fermante est considérée comme une instruction à part entière. Cela signifie que si
l’on ne met pas l’accolade fermante sur une ligne indépendante, il faut faire précéder l’instruction
précédente d’un point-virgule. De même, il faut le faire suivre d’un autre point-virgule s’il ne se trouve
pas à la fin d’une ligne.
Les instructions des instructions composées créées à l’aide des accolades sont exécutées au sein du shell
courant. Les variables qu’elles définissent, ainsi que les changements de répertoires, sont donc toujours
valides à l’issue de l’exécution de ces instructions. Si cela n’est pas désirable, on pourra créer des
instructions composées à l’aide de parenthèses. Les instructions seront alors exécutées dans un autre
shell, lancé pour l’occasion, et elles n’auront donc pas d’effet de bord imprévu dans le shell appelant. Par
exemple, le répertoire courant à l’issue de l’instruction composée précédente est le répertoire /tmp/,
alors que l’instruction composée suivante :
(
cd /tmp
rm *.bak
)
Note : On ne confondra pas les instructions composées utilisant des parenthèses et les substitutions
de résultat de commande. Les instructions composées renvoient le code d’erreur de la dernière
instruction exécutée, alors que le résultat des substitutions est ce que la commande a écrit sur son
flux de sortie standard.
command1 || command2
command1 && command2
102
Chapitre 5. Commandes Unix de base
où command1 et command2 sont deux commandes du shell (composées ou non). Avec l’opérateur ||, la
commande command2 n’est exécutée que si le code de retour de la commande command1 est non nul,
ou, autrement dit, si cette commande ne s’est pas exécutée correctement. Inversement, avec l’opérateur
&&, la commande command2 n’est exécutée que si la première commande s’est exécutée correctement (et
renvoie donc un code de retour nul). Par exemple, la commande suivante :
permet d’effacer tous les fichiers d’extension .txt, ou d’afficher le message d’erreur « Aucun fichier
à supprimer » s’il n’existe pas de fichier ayant une telle extension.
Les instructions composées peuvent être utilisées comme n’importe quelle commande normale. En
particulier, elles peuvent être utilisées dans des commandes plus complexes, par exemple comme
destination d’un tube. C’est ce que faisait l’exemple de déplacement de toute une arborescence dans la la
section intitulée Syntaxe des tubes.
Les tests
Sous Unix, chaque processus reçoit plusieurs valeurs en paramètres et renvoie un code de retour. La
plupart des paramètres sont passés en ligne de commande, et sont récupérés directement par le processus,
mais d’autres paramètres peuvent être fournis par le processus appelant par l’intermédiaire de variables
d’environnement et de descripteurs de fichiers. Le code de retour, quant à lui, est un entier signalant si
l’exécution du processus s’est terminée correctement ou si des erreurs ont eu lieu. Si les codes d’erreurs
varient grandement d’un programme à un autre, la valeur 0 signifie toujours, et ce quel que soit le
programme, que l’exécution s’est déroulée correctement.
Il est possible de tester le code de retour d’une commande avec l’instruction if. La syntaxe la plus
simple pour un test est la suivante :
if commande ; then
action
fi
où commande est la commande dont on désire tester le code de retour, et action est la commande à
exécuter si ce code vaut 0 (c’est-à-dire, si la commande commande s’est exécutée correctement).
Il peut paraître réducteur de ne pouvoir tester que le code de retour d’une commande. Mais en fait, c’est
une fonctionnalité très puissante du shell, car elle permet de réaliser tous les types de tests imaginables.
En effet, il existe une commande spéciale, [, qui permet de réaliser divers types de tests sur les
paramètres qu’on lui passe, et d’ajuster son code d’erreur en conséquence. Par exemple, pour tester
l’égalité d’une variable d’environnement avec une chaîne de caractères, on utilisera la syntaxe suivante :
Notez que dans cette syntaxe, le test effectué est une commande complète. Cela implique qu’il faut
mettre une espace entre chaque paramètre, et en particulier entre le nom de la commande ([), le premier
opérande ($variable), l’opérateur utilisé (==), le deuxième opérande (valeur) et le caractère de
marque de fin de test (]).
103
Chapitre 5. Commandes Unix de base
La commande [ est capable d’effectuer tous les tests standards. Par défaut, elle considère que les deux
opérandes du test sont des chaînes de caractères, et elle utilise l’ordre lexicographique pour les comparer.
Les tests d’égalité et d’inégalité sont effectués respectivement avec les opérateurs == et !=. Les
opérateurs d’antériorité dans l’ordre lexicographique sont < et <=, et les opérateurs de postériorité sont
> et >=. Notez que l’utilisation de ces opérateurs peut être relativement pénible, parce que les caractères
< et > sont interprétés par le shell en tant que redirections. Par conséquent, il faut souvent les précéder
du caractère d’échappement antislash.
L’ordre lexicographique convient dans la plupart des cas, mais il n’est pas très approprié pour la
comparaison de valeurs numériques. Par exemple, le test suivant :
if [ -1 \< -2 ] ; then
echo "-1 est plus petit que -2"
fi
est vérifié, car le caractère 1 précède le caractère 2 dans l’ordre lexicographique. La commande [ fournit
donc la possibilité d’utiliser une autre syntaxe pour comparer les entiers. Cette syntaxe utilise les options
lt et gt respectivement pour les tests d’infériorité stricte et de supériorité stricte, et les options le et ge
respectivement pour les tests d’infériorité et de supériorité ou d’égalité. Ainsi, le test :
if [ $i -gt 3 ] ; then
echo "$i est supérieur à 3"
fi
Notez que la deuxième commande [ n’est exécutée que si le premier test est vérifié. L’utilisation de
l’opérateur || se fait selon le même principe. Il est bien entendu possible de regrouper plusieurs
commandes de test ensemble, à l’aide de parenthèses.
Comme dans la plupart des langages informatiques, l’instruction if peut prendre une forme plus
complexe pour traiter les cas où le test n’est pas vérifié. Ainsi, pour exécuter une action spécifique pour
le cas où le test serait faux, on peut utiliser la syntaxe suivante :
if commande ; then
action1
else
action2
fi
104
Chapitre 5. Commandes Unix de base
où commande est toujours la commande dont le code de retour sera testé, action1 est l’action qui doit
être réalisée si cette commande a renvoyé le code de retour 0, et action2 la commande à exécuter dans
le cas contraire. De même, si l’on veut enchaîner des tests, on utilisera le mot clé elif. La syntaxe
générale du test est donc la suivante :
if commande1 ; then
action1
elif commande2 ; then
action2
elif commande3 ; then
...
else
actionn
fi
Note : Pour des raisons d’optimisation, le shell peut simuler le comportement du programme [, et
éviter ainsi de le lancer à chaque fois qu’il a à faire un test. Cependant, le principe originel était bien
celui décrit ci-dessus. Cette description, bien que n’étant plus tout à fait exact, permet de mieux
comprendre la syntaxe du shell.
Il est possible de récupérer la valeur du code de retour de la dernière commande exécutée grâce à
la variable spéciale $?. Cependant, il est très rare d’avoir à manipuler cette valeur directement, car
les structures de contrôle du shell telles que if permettent d’effectuer les actions qui s’imposent
sans avoir à la connaître.
Pour ceux qui savent programmer en C, sachez que le code de retour est la valeur renvoyée par la
fonction C exit ou par l’instruction return de la fonction principale main. Les paramètres de la ligne
de commande, quant à eux, sont récupérables par l’intermédiaire des paramètres de la fonction
principale main.
Il ne faut pas oublier que la fonction première du shell est de permettre les manipulations de fichiers. Il
n’est donc pas étonnant que la commande [ permette également de réaliser tous les tests imaginables sur
les fichiers. Ces tests vont de l’existence d’un fichier au test de sa nature et de ses attributs, en passant par
les tests sur l’identité de son propriétaire et de son groupe. La syntaxe générale de ces tests est la
suivante :
où option est une option de la commande [ décrivant la propriété testée, et fichier est le nom du
fichier sur lequel le test doit porter.
Les principales options utilisables dans les tests sur les fichiers sont récapitulées dans le tableau
ci-dessous :
105
Chapitre 5. Commandes Unix de base
Option Signification
-e Test d’existence d’un fichier ou d’un répertoire.
-d Test d’existence d’un répertoire.
-f Test d’existence d’un fichier normal.
-s Test d’existence d’un fichier et vérification que sa taille est non nulle.
-L Test d’existence d’un lien symbolique.
-b Test d’existence d’un fichier spécial de périphérique de type bloc (disque dur,
CD-ROM, lecteur de cassettes, etc.).
-c Test d’existence d’un fichier spécial de périphérique de type caractère (port série,
port parallèle, carte son...).
-p Test d’existence d’un tube.
-r Test d’existence du fichier et d’accessibilité en lecture de ce fichier.
-w Test d’existence du fichier et d’accessibilité en écriture de ce fichier
-x Test d’existence du fichier et de possibilité d’exécution de ce fichier.
-g Test d’existence du fichier et de présence du bit setgid sur ce fichier.
-u Test d’existence du fichier et de présence du bit setuid sur ce fichier
-k Test d’existence du fichier et de présence du bit sticky sur ce fichier.
-O Test d’existence du fichier et d’appartenance de ce fichier à l’utilisateur effectif
courant.
-G Test d’existence du fichier et d’appartenance de ce fichier au groupe effectif
courant.
-N Test d’existence du fichier et de modification de ce fichier depuis la dernière fois
qu’il a été lu.
Note : Ce tableau n’est pas exhaustif, mais les options les plus importantes et les plus utilisées s’y
trouvent.
Vous pourrez vous rafraîchir la mémoire sur les notions de bit setuid, setgid et sticky, ainsi que sur
les notions d’utilisateur et de groupe effectifs en relisant la la section intitulée Sécurité et utilisateurs
dans Chapitre 3.
La commande [ accepte également les options -nt et -ot, qui permettent respectivement de tester si un
fichier est plus récent ou plus vieux qu’un autre, en se basant sur les dates de dernière modification de
ces fichiers. Ces deux opérateurs s’utilisent avec la syntaxe suivante :
où fichier1 et fichier2 sont les deux fichiers sur lesquels la comparaison doit porter, et option est
l’une des options -nt ou -ot.
106
Chapitre 5. Commandes Unix de base
Le branchement conditionnel
Lorsqu’on veut effectuer différentes opérations selon la valeur d’une variable, l’instruction if peut
devenir très lourde à utiliser. En effet, si le nombre de valeurs différentes est grand, elle peut conduire à
écrire un grand nombre de tests. Le shell fournit donc une instruction de branchement conditionnel, qui
permet de spécifier quelle action doit être prise pour chaque valeur de la variable.
Le branchement conditionnel s’utilise de la manière suivante :
case valeur in
( motif1 | motif2 | ... ) commande1 ;;
( motifn | motifn+1 | ... ) commande2 ;;
.
.
.
esac
où motif1, motif2... motifn+1 sont des motifs spécifiant les valeurs possibles pour la valeur valeur,
et commande1, commande2, etc. sont les commandes à exécuter pour les valeurs de ces motifs.
La commande exécutée est la première commande pour laquelle la variable correspond à l’un de ses
motifs correspondants. Une fois exécutée, la recherche se termine, et l’exécution reprend à la suite du
branchement conditionnel. Par exemple ce branchement conditionnel :
case $i in
( *.txt ) echo "$i est un fichier texte" ;;
( *.gz ) echo "$i est compressé avec gzip" ;;
( *.tar ) echo "$i est une archive" ;;
esac
affiche la nature du fichier dont le nom est stocké dans la variable i à partir de son extension.
Le code de retour du branchement conditionnel est 0 si la variable ne correspond à aucun des motifs, ou
le code de retour de la commande exécutée sinon.
Les boucles
Il existe deux types de boucles : le while et le until. La syntaxe des boucles while est la suivante :
while commande ; do
action
done
où commande est une commande dont le code de retour est utilisé comme critère de la fin de la boucle, et
action est l’instruction (composée ou non) exécutée à chaque itération de la boucle. Comme on le voit,
le shell utilise le même principe pour les boucles que pour les tests pour évaluer une condition. Tant que
la commande commande renvoie un code de retour égal à 0, l’instruction action est exécutée.
L’instruction until utilise la même syntaxe que l’instruction while :
until commande ; do
action
done
107
Chapitre 5. Commandes Unix de base
à ceci près que l’instruction action est exécutée tant que la commande commande renvoie un code de
retour non nul. L’instruction until utilise donc simplement le test inverse de celui de l’instruction
while.
Bien entendu, il est possible d’utiliser la commande [ pour effectuer des tests plus complexes que le
simple test du code de retour d’une commande. Par exemple, la boucle suivante calcule la somme des dix
premiers entiers :
result=0
i=0
while [ $i -le 10 ] ; do
result=$(($result + $i))
i=$(($i + 1))
done
echo $result
Les itérations
Les itérations sont des boucles qui s’exécutent pour chaque élément d’un ensemble donné. Le shell gère
les itérations par l’intermédiaire de l’instruction for. La syntaxe de cette instruction est la suivante :
où variable est un nom de la variable utilisée pour l’itération, ensemble est l’ensemble des valeurs
que peut prendre cette variable, et action est la commande (simple ou composée) à exécuter pour
chaque valeur de cette variable.
Le principe des itérations est très simple. Pour chaque valeur indiquée dans l’ensemble des valeurs, la
commande est exécutée, avec la valeur en question accessible dans la variable utilisée pour l’itération.
Par exemple, la commande suivante :
for i in *.txt ; do
mv $i ${i/%.txt/.doc}
done
permet de renommer tous les fichiers portant l’extension .txt en fichier du même nom, mais avec
l’extension .doc.
Il n’est pas nécessaire de préciser l’ensemble des valeurs que peut prendre la variable. Dans ce cas,
l’ensemble utilisé sera celui de tous les paramètres du script ou de la fonction. Nous verrons plus loin
comment réaliser des fonctions et des scripts, ainsi que la manière de récupérer leurs paramètres.
108
Chapitre 5. Commandes Unix de base
continuer dans de bonnes conditions, soit parce que le traitement est terminé. C’est notamment le cas
lorsqu’une erreur se produit, ou lorsqu’on recherche une valeur spécifique en itérant sur les valeurs
possibles d’un ensemble.
Le shell fournit donc les instructions break et continue, qui permettent respectivement de sortir de la
boucle courante et de passer directement à l’itération suivante. Ces deux commandes peuvent être
utilisées aussi bien à l’intérieur des boucles while et until que dans les itérations écrites avec
l’instruction for. Par exemple, le calcul de la somme des dix premiers entiers aurait pu être écrit de la
manière suivante :
result=0
i=0
while true ; do
result=$(($result + $i))
i=$(($i + 1))
if [ $i ==11 ] ; then break ; fi
done
echo $result
Les instructions break et continue peuvent prendre un paramètre entier indiquant le niveau
d’imbrication de la boucle sur laquelle elles s’appliquent. Ce paramètre doit impérativement être
supérieur à sa valeur par défaut, c’est-à-dire 1. Ainsi, pour sortir directement d’une double boucle
lorsqu’on est dans le corps de la boucle la plus imbriquée, on utilisera la commande suivante :
break 2
Les fonctions
Le langage du shell est un langage procédural. Cela signifie que l’on peut créer des fonctions pour
regrouper des séries d’instructions couramment exécutées. La syntaxe permettant d’écrire de telles
fonctions est la suivante :
function nom () {
instructions
}
où nom est le nom de la fonction, et instructions est la liste des commandes à exécuter dans cette
fonction.
Vous constaterez qu’il n’y a pas de déclaration des paramètres de cette fonction. C’est normal : les
paramètres des fonctions sont passés implicitement dans les variables d’environnement $1, $2, $3, etc.
En fait, comme nous le verrons plus loin, cette syntaxe est également celle utilisée pour récupérer les
paramètres de la ligne de commande des scripts shell. Cela signifie que les paramètres du script ne sont
pas accessibles dans le corps d’une fonction, puisqu’ils sont masqués par les paramètres de la fonction.
Les autres variables utilisées dans les fonctions sont des variables globales. Celles qui sont déclarées
dans une fonction sont donc également globales, et restent accessibles même après l’exécution de cette
109
Chapitre 5. Commandes Unix de base
fonction. Si l’on veut définir des variables locales, on précédera la définition de la variable du mot clé
local :
local variable=valeur
function somme () {
local result=0
local i=0
while [ $i -le $1 ] ; do
result=$(($result + $i))
i=$(($i + 1))
done
return $result
}
Ce code d’erreur pourra être récupéré par l’appelant dans la variable d’environnement $? :
somme 10
echo $?
où variable1, variable2, etc. sont les noms des variables d’environnement dans lesquelles les
résultats de la saisie doivent être placés.
La commande read utilise les séparateurs indiqués dans la variable d’environnement IFS pour découper
la ligne lue dans le flux d’entrée standard. Si le nombre de variables spécifié est inférieur au nombre de
110
Chapitre 5. Commandes Unix de base
mots de cette ligne après découpage, les premières variables d’environnement reçoivent les premiers
mots, et la dernière reçoit le reste de la commande. Par exemple, la commande suivante :
permet de lire le premier mot d’une ligne dans la variable d’environnement MOT et de placer le reste
dans la variable RESTE.
La commande read dispose d’une syntaxe simplifiée, qui ne prend aucun paramètre. Dans ce cas, la ligne
lue dans le flux d’entrée standard est placée telle quelle dans la variable d’environnement REPLY. Il est à
la charge du programmeur d’analyser son contenu.
Le shell dispose également d’une instruction évoluée permettant de réaliser des menus simplifiés :
l’instruction select. Cette instruction construit un menu à partir d’un certain nombre de choix, chaque
choix étant précédé par un numéro, et demande à l’utilisateur de taper le numéro de son choix. Elle
affecte alors la valeur du choix correspondant à une variable d’environnement, et exécute une commande
pour le traitement du choix. La syntaxe générale de l’instruction select est donnée ci-dessous :
où variable est le nom de la variable devant recevoir la valeur choisie par l’utilisateur, liste est la
liste des valeurs que cette variable peut prendre, et action est la liste des instructions à exécuter pour
chaque choix effectué.
Si le choix de l’utilisateur est incorrect, la variable de contrôle reçoit la valeur nulle. Le programmeur
peut récupérer la valeur saisie par l’utilisateur dans la variable d’environnement REPLY et effectuer un
traitement d’erreur approprié.
L’instruction select est une boucle. Le menu est reproposé après chaque exécution de l’action action.
La sortie de cette boucle ne peut se faire que si un caractère de fin de fichier (CTRL + D) est lu sur le flux
d’entrée standard, ou si une option de menu spécifique est proposée pour quitter cette boucle. Vous
trouverez un exemple de menu simplifié ci-dessous :
select LU in A B C D Sortir; do
case $LU in
("A") echo "Vous avez choisi A" ;;
("B") echo "Vous avez choisi B" ;;
("C") echo "Vous avez choisi C" ;;
("D") echo "Vous avez choisi D" ;;
("Sortir") break ;;
esac
done
111
Chapitre 5. Commandes Unix de base
Les alias
Il est incontestable que certaines commandes peuvent avoir une grande complexité, et il peut être
fastidieux de les retaper complètement à chaque fois que l’on en a besoin. D’autre part, la saisie d’une
longue ligne de commande multiplie les risques de faire une faute de frappe et d’avoir à corriger la
commande. Cela peut au mieux faire perdre son temps à l’utilisateur, et au pire l’énerver.
Le shell fournit donc un mécanisme pour donner un nom simplifié aux commandes complexes : le
mécanisme des alias. Les alias représentent en fait des chaînes de caractères complexes, et sont
remplacés automatiquement par le shell lorsqu’il analyse les lignes de commandes. C’est un mécanisme
plus souple que celui des variables d’environnement, et qui permet de définir des macro-commandes plus
facilement qu’avec les fonctions du shell.
Pour créer un alias, vous devrez utiliser la syntaxe suivante :
alias nom=chaîne
où nom est le nom de l’alias, et chaîne est la chaîne de caractères représentée par cet alias. Par exemple,
pour faire un alias nommé beep permettant de faire un bip sonore, on pourra utiliser la commande
suivante :
Cet alias pourra être simplement utilisé simplement en tapant beep en ligne de commande.
Vous pouvez visualiser la liste des alias existant simplement à l’aide de la commande alias, appelée sans
paramètres. Je vous recommande de consulter cette liste, pour vous donner une idée des alias courants,
qui se révèlent généralement très utiles.
La suppression des alias se fait à l’aide de la commande unalias. Sa syntaxe est la suivante :
unalias nom
Note : Les alias ne sont remplacés par la chaîne de caractères qu’ils représentent que lorsque le
shell analyse la ligne de commande. Cela signifie que les définitions d’alias ne sont valides qu’après
validation de cette ligne. On évitera donc de définir des alias dans la déclaration d’une instruction
composée, car cet alias ne sera pas disponible à l’intérieur de son propre bloc d’instructions.
Par défaut, les alias ne sont disponibles que dans les shells interactifs. Ils ne peuvent donc pas être
utilisés dans les scripts shell. La notion de script shell est détaillée dans la la section intitulée Les
scripts shell.
112
Chapitre 5. Commandes Unix de base
langage shell, simplement en stockant plusieurs commandes dans un fichier. On appelle ces fichiers des
scripts shell.
L’écriture d’un script shell n’est pas plus compliquée que de taper les commandes du programme les
unes à la suite des autres dans un shell interactif. La seule différence est que les scripts shell peuvent être
rejoués plusieurs fois, recevoir des paramètres en ligne de commande et renvoyer un code de retour.
Tout script shell est en fait un fichier texte sur lequel on a mis les droits d’exécution. Il contient les
différentes commandes qu’il doit exécuter. Sa première ligne est très importante, elle permet d’indiquer
au shell exécutant quelle est la nature du fichier. La syntaxe de cette ligne est la suivante :
#!shell
où shell est le chemin absolu sur le shell ou l’interpréteur de commande capable d’exécuter ce script.
En pratique, pour bash, on utilisera toujours la ligne suivante :
#!/bin/bash
Les paramètres des scripts shell sont accessibles exactement comme des paramètres de fonction. On
récupérera donc le premier paramètre avec l’expression $1, le deuxième avec l’expression $2, le
troisième avec l’expression $3, etc.
Le code de retour d’un shell pourra être fixé à l’aide de la commande exit. Par exemple :
exit 0
Ce code de retour pourra être récupéré par l’appelant à l’aide de l’expression $?.
Nous n’irons pas plus loin dans la description du shell bash, car ce n’est pas le but de ce document. Vous
pouvez vous référer à un bon livre d’Unix ou aux pages de manuel si vous désirez approfondir le sujet.
Comme vous avez dû vous en rendre compte dans cette section, les shells Unix sont des véritables
langages de programmation, qui dépassent de très loin les interpréteurs de commandes du type DOS. De
plus, il existe plusieurs autres langages dont nous n’avons pas parlé ici, chacun étant conçu souvent pour
réaliser un certain type de tâche (administration système, manipulation de fichiers textes, création de
pages Web dynamiques, création d’interfaces utilisateur en mode fenêtré, pilotage d’applications, etc.).
Si vous vous y intéressez, vous verrez que le sujet est réellement vaste et passionnant.
113
Chapitre 6. Administration du système de base
Un certain nombre d’opérations que l’on peut faire avec un système Unix ne rentre pas dans le cadre
d’une utilisation quotidienne, mais est destinée plutôt à l’administration du système lui-même. Ces
opérations peuvent être réalisées à l’aide de commandes Unix spéciales, généralement réservées à
l’administrateur du système, ou peuvent être réalisées en modifiant les fichiers de configuration du
système.
Il est très probable que le programme d’installation ou le programme de configuration de votre
distribution vous permette d’effectuer ces tâches de manière relativement aisée ou conviviale.
L’utilisation de ces programmes est très simple, puisqu’en général il suffit de répondre à quelques
questions et les modifications sont effectuées automatiquement pour vous. Il est fortement recommandé
de toujours essayer les programmes de ce type en premier lieu, car eux seuls connaissent les spécificités
de chaque distribution. Cela dit, ces programmes ne peuvent pas tout prévoir, parce que Linux est un
système capable d’effectuer un grand nombre de tâches très diversifiées d’une part, et parce que ce que
vous voulez en faire personnellement ne correspond pas forcément à un standard prédéterminé d’autre
part.
Cette partie décrira donc les commandes d’administration et de maintenance les plus importantes et le
mécanisme général d’amorçage des systèmes Linux. Les principaux fichiers de configuration permettant
de modifier le comportement du système seront également décrits afin de permettre un usage courant de
Linux dans de bonnes conditions. Les notions les plus avancées concernant l’administration système ne
seront en revanche pas abordées, car cela dépasserait le cadre de ce document. Les lecteurs les plus
intéressés pourront toujours se référer à un guide d’administration Unix.
L’administration du système est un peu moins sensible que son installation. En effet, les seuls risques que
l’on encourt sont de détruire les fichiers de configuration du système, et donc de devoir les recréer
manuellement. Il n’y a pas de manipulation de partitions ou de système de fichiers à créer, aussi le risque
de perdre des données est-il nettement plus faible. Cependant, les opérations d’administration se feront
sous le compte root, ce qui implique une prudence extrême. C’est pour cette raison que nous allons
commencer par sauvegarder l’ensemble des fichiers de configuration, afin de pouvoir revenir à l’état
initial après installation, sans repasser par la case départ.
Cette commande créera une archive nommée [Link] dans le répertoire personnel de
l’administrateur système. On notera que, pour certaines distributions, quelques fichiers de configuration
sont placés dans le répertoire /sbin/init.d/. Pour ces distributions, on utilisera donc plutôt la
commande suivante :
114
Chapitre 6. Administration du système de base
De cette manière, si l’on a un gros problème avec la configuration de la machine, on peut revenir
simplement à la configuration utilisée juste après l’installation du système avec la simple commande
suivante :
115
Chapitre 6. Administration du système de base
entendu, le problème reste entier si l’horloge matérielle de votre PC n’est pas compatible. Dans ce cas, la
solution la plus simple est de régler l’heure système à chaque démarrage, manuellement ou à l’aide de
scripts de correction de la date renvoyée par l’horloge matérielle.
La valeur du compteur de l’horloge système est toujours interprétée en temps universel (« UTC » en
anglais, abréviation de « Universal Time Coordinated »), c’est-à-dire le temps de référence valide dans le
monde entier. Ce temps ne comprend pas les fuseaux horaires ni les réglementations concernant les
heures d’hiver et d’été. Cette convention est utilisée partout dans le système, ce qui est la condition sine
qua non pour que tous les ordinateurs du monde utilisent la même date et la même heure. Ainsi, deux
ordinateurs connectés à Internet peuvent communiquer sans se poser de questions quant à leurs
localisations respectives, ce qui simplifie beaucoup les choses. Notez également que le fait de compter le
temps en secondes permet de s’affranchir des conventions de découpage du temps et des calendriers
utilisés dans chaque pays.
Bien entendu, les dates présentées à l’utilisateur doivent être traduites en temps local, corrigé des écarts
pour l’heure d’été et l’heure d’hiver. Cela est réalisé par tous les programmes qui doivent afficher ces
dates (par exemple, les simples commandes ls et date). Cette conversion est effectuée par le système en
fonction du fuseau horaire et des plages de validité des horaires d’été et d’hiver.
La solution la plus simple pour régler la date et l’heure de votre machine est donc de régler l’horloge
matérielle sur le temps universel, et de définir le fuseau horaire dans lequel elle se trouve, pour que le
système puisse calculer l’heure locale. Malheureusement, les systèmes d’exploitation de Microsoft ne
voient pas la chose de la même manière. Ils attendent que l’horloge matérielle soit réglée à l’heure
locale. Par conséquent, si Linux est installé sur un ordinateur disposant déjà de Windows, vous devrez
régler l’heure de votre ordinateur en temps local. A priori, cela ne fait aucune différence, le système étant
également capable de calculer le temps universel à partir de l’heure locale et de la zone horaire.
Cependant, cela a un inconvénient : il est nécessaire de mettre à l’heure l’horloge système en cas de
déplacement de la machine, et à chaque changement d’horaire d’été ou d’hiver. Bien sûr, Windows est
supposé être capable de mettre à jour l’heure matérielle en « observation avec l’heure d’été / d’hiver ».
Mais il utilise pour cela des règles qui sont fixées définitivement dans le système et qui ne peuvent pas
être mises à jour avec les réglementations locales (par exemple, la règle de changement d’heure a été
modifiée en 1996, si bien que Windows 95 n’a jamais pu fonctionner correctement sur ce point...).
Quoi qu’il en soit, la mise à l’heure d’un système Linux requiert la définition de la zone horaire, la mise
à l’heure du système et la mise à l’heure de l’horloge matérielle. La définition de la zone horaire est
primordiale et doit avoir lieu avant toute autre opération, car le réglage des horloges dépend évidemment
de cette zone.
Les zones horaires sont définies par un ensemble de règles, qui comprennent chacune la période de
validité de la règle (en général avec une date de départ et une date de fin) et la différence entre le temps
universel et le temps local lorsque cette règle s’applique (gestion des horaires d’été et d’hiver compris).
Toutes ces règles portent le nom de la zone géographique dans laquelle elles sont valides. Vous pourrez
trouver des exemples de définitions de règles (ainsi que l’historique des conventions concernant le
temps) dans le répertoire « timezone » des sources de la bibliothèque C GNU.
Les fichiers de règles des zones horaires doivent être compilés avec le programme zic et installés dans le
répertoire /usr/share/zoneinfo. Normalement, votre système dispose de la totalité des règles, déjà
compilées, des différentes zones horaires du monde. Le programme zic permet également de définir la
zone horaire active. Cette opération se fait dans les fichiers de démarrage de votre système, avec une
commande similaire à la suivante :
zic -l zone
116
Chapitre 6. Administration du système de base
où zone est le chemin relatif du fichier de définition des règles de la zone horaire locale, par rapport au
répertoire de base /usr/share/zoneinfo. Pour les systèmes situés en France métropolitaine, la
commande utilisée est donc celle-ci :
zic -l Europe/Paris
Une fois la zone horaire fixée, il est possible de régler l’horloge système. Il existe deux solutions pour
cela. La première solution est d’utiliser la commande système date. Cette commande, appelée sans
paramètres, permet d’obtenir la date système, exprimée en temps local. Mais elle permet également de
modifier la date et l’heure système avec l’option -s. La syntaxe complète utilisée est donnée ci-dessous :
Il n’est pas nécessaire de préciser l’année si celle-ci ne doit pas être changée. De même, vous pouvez ne
donner que l’heure, si la date du jour est correcte. En revanche, vous devez obligatoirement préciser
l’heure si vous changez la date. Notez que l’heure doit être donnée en temps local, à moins que l’option
-u ne soit précisée. Le système réglera son horloge en temps universel automatiquement, selon les règles
de zones horaires en vigueur qui ont été indiquées par zic. Vous pouvez obtenir l’heure exacte en
appelant le 3699.
La deuxième solution est celle qui est utilisée au démarrage du système. Elle consiste à initialiser
l’horloge système à partir de l’horloge matérielle. Cette opération se fait normalement à l’aide de la
commande clock (qui en fait est un lien symbolique vers hwclock, mais la commande Unix
traditionnelle est clock). La syntaxe de cette commande est la suivante :
clock [-u] -s | -w | -a
L’option -s permet d’initialiser l’horloge système à partir de la date et de l’heure stockées dans l’horloge
matérielle. C’est typiquement cette commande qui est utilisée dans les scripts de démarrage du système.
L’option -w permet de réaliser l’opération inverse, c’est-à-dire sauvegarder la date et l’heure de l’horloge
système dans l’horloge matérielle. Elle n’est en général utilisée qu’après avoir remis à l’heure l’horloge
système. L’option -a permet, quant à elle, de corriger l’avance ou le retard que l’horloge matérielle peut
prendre.
Ce dernier point mérite quelques explications complémentaires. En fait, l’horloge matérielle n’est pas
extrêmement précise, et peut se décaler petit à petit de l’heure réelle. Heureusement, ce décalage est
constant, ce qui fait qu’il est possible de le mesurer et de le prendre en compte. Le programme clock
utilise le fichier /etc/adjtime pour enregistrer de combien est ce décalage afin de pouvoir effectuer les
corrections. Le principe de fonctionnement est le suivant :
• lors du premier réglage de l’horloge matérielle (avec l’option -w), il enregistre l’instant de ce réglage
dans le fichier /etc/adjtime ;
• lors des réglages suivants, il calcule le temps qui s’est écoulé depuis le réglage précédent, et le
décalage entre l’heure de l’horloge matérielle et l’heure à laquelle celle-ci aurait dû se trouver. Il
117
Chapitre 6. Administration du système de base
enregistre ce décalage et met à jour la date de mise à l’heure (pour pouvoir refaire ce calcul
ultérieurement) ;
• lorsqu’on l’appelle avec l’option -a, clock ajuste l’horloge matérielle. Pour cela, il regarde la date
courante, calcule le temps écoulé depuis la dernière mise à l’heure ou le dernier ajustement, en déduit
l’avance ou le retard de l’horloge matérielle, et la remet à l’heure en conséquence. Il enregistre
également la date de cet ajustement comme nouvelle date de mise à l’heure, afin de ne pas faire deux
fois l’ajustement pour cette période la prochaine fois.
De cette manière, il est possible de maintenir l’horloge système à une valeur proche de la réalité (sans ce
genre de mécanisme, il est courant de prendre 5 minutes d’écart en trois ou quatre mois, ce qui est déjà
considérable).
Les scripts d’initialisation de votre système doivent donc certainement contenir au moins les deux lignes
suivantes après le réglage de la zone horaire :
Dans tous les cas, l’option -u permet d’indiquer que l’horloge matérielle est réglée en temps universel.
Si votre machine ne dispose pas d’autre système que Linux, il est recommandé de procéder ainsi et
d’utiliser systématiquement cette option.
Note : Il est important de définir la zone horaire avec zic avant d’utiliser clock. En effet, si l’horloge
matérielle est réglée en temps local, clock ne pourra pas déterminer l’heure en temps universel.
D’autre part, clock initialise la structure de zone horaire interne noyau, que celui-ci utilise
notamment pour l’écriture des dates en temps local sur les systèmes de fichiers FAT (Eh oui, les
dates des fichiers des systèmes de fichiers FAT sont enregistrées en temps local...).
Sachez également que l’horloge système peut également se décaler sensiblement sur de longues
périodes. Évidemment, ce phénomène ne peut se détecter que si le système reste actif
suffisamment longtemps, ce qui en pratique ne se produit que dans les serveurs (n’oubliez pas que
Linux peut fonctionner des mois sans interruption...). Si vous êtes intéressé par la manière de
resynchroniser l’horloge système pour de telles configurations, vous devriez vous intéresser à la
diffusion du temps sur le réseau Internet avec le protocole NTP (« Network Time Protocol »). En
général, la resynchronisation de l’heure système doit se faire progressivement afin de ne pas
perturber la ligne du temps pour les applications. Cela peut être fait avec le programme adjtimex.
118
Chapitre 6. Administration du système de base
L’une des premières étapes dans l’installation d’un système est donc de créer un compte utilisateur
normal, qui devra être utilisé pour le travail quotidien. Le compte root ne doit donc être réservé qu’aux
tâches d’administration, et toute opération réalisée sous cette identité doit être contrôlée deux fois avant
d’être effectivement lancée. Les programmes d’installation des distributions demandent donc toujours un
mot de passe pour protéger le compte root et le nom et le mot de passe pour au moins un compte
utilisateur standard après une nouvelle installation. Le mot de passe root doit être choisi avec un grand
soin, surtout si l’ordinateur est susceptible d’être connecté à Internet. En effet, la moindre erreur de
configuration au niveau des services fournis par l’ordinateur, couplée avec un mot de passe faible, risque
de laisser votre ordinateur à la merci de pirates mal intentionnés.
Ces mêmes programmes d’installation peuvent être utilisés par la suite pour ajouter de nouveaux
utilisateurs dans le système. Il est d’ailleurs recommandé de les utiliser dès qu’une telle opération doit
être effectuée. Cela dit, il est bon de connaître la manière dont les utilisateurs sont gérés dans les
systèmes Unix, aussi une approche plus bas niveau sera-t-elle adoptée dans cette section.
L’exemple classique de ces opérations est tout simplement l’opération de login sur une console : le
programme getty de gestion de la console demande le nom de l’utilisateur, puis passe ce nom au
programme login qui l’authentifie en lui demandant son mot de passe. Si l’authentification a réussi, il
119
Chapitre 6. Administration du système de base
prend l’identité de cet utilisateur et lance son shell préféré. La suite des opérations dépend du shell. S’il
s’agit de bash, le fichier de configuration /etc/profile est exécuté (il s’agit donc du fichier de
configuration dans lequel toutes les options communes à tous les utilisateurs pourront être placées par
l’administrateur), puis les fichiers de configuration ~/.bash_profile et ~/.bashrc sont exécutés.
Ces deux fichiers sont spécifiques à chaque utilisateur et permettent à chacun d’entre eux de spécifier
leurs préférences personnelles. Le fichier ~/.bash_profile n’est exécuté que lors d’un nouveau login,
alors que le fichier ~/.bashrc est exécuté à chaque nouveau lancement de bash.
Bien entendu, ces opérations nécessitent que des informations relatives aux utilisateurs soient stockées
dans le système. Historiquement, elles étaient effectivement stockées dans le fichier de configuration
/etc/passwd. Cela n’est, en général, plus le cas. En effet, cette technique se révèle peu pratique lorsque
plusieurs ordinateurs en réseau sont accédés par des utilisateurs itinérants. Dans ce genre de
configuration, il est courant de recourir à un service réseau permettant de récupérer les informations
concernant les utilisateurs à partir d’un serveur centralisé. Plusieurs solutions existent actuellement (NIS,
LDAP, etc.), mais elles fonctionnent toutes plus ou moins selon le même principe. De plus, même pour
des machines isolées, le fichier /etc/passwd ne contient plus que les informations « publiques » sur les
utilisateurs. Les informations utilisées pour l’authentification sont désormais stockées dans un autre
fichier de configuration, qui n’est lisible que pour l’utilisateur root : le fichier /etc/shadow. La raison
première de procéder ainsi est d’éviter que des utilisateurs malicieux puissent « casser » les mots de
passe.
Note : Les mots de passe n’ont jamais été stockés en clair dans le fichier passwd. Le mécanisme
d’authentification repose en effet sur une fonction à sens unique générant une empreinte. Les
fonctions de ce type ne disposent pas de fonction inverse, il n’est donc virtuellement pas possible de
retrouver un mot de passe à partir de son empreinte. Lorsqu’un utilisateur saisit son mot de passe,
l’empreinte est recalculée de la même manière que lorsqu’il l’a défini initialement, et c’est cette
empreinte qui est comparée avec celle qui se trouve dans le fichier /etc/passwd ou le fichier
/etc/shadow. Ainsi, il est nécessaire de connaître le mot de passe en clair pour authentifier
l’utilisateur, mais à aucun moment ce mot de passe n’est stocké sur le disque dur.
Cela dit, même si la récupération des mots de passe est quasiment impossible, la connaissance des
empreintes des mots de passe peut être d’une aide précieuse. Un intrus potentiel peut essayer de
calculer les empreintes de tous les mots de passe possibles et imaginables à l’aide d’un dictionnaire
ou de mots de passe probablement choisis par les utilisateurs peu inventifs, et comparer le résultat
avec ce qui se trouve dans le fichier de mot de passe. S’il y a une correspondance, l’intrus pourra
pénétrer le système et tenter d’utiliser d’autres failles pour acquérir les droits de l’utilisateur root.
Cette technique, dite attaque du dictionnnaire, est tout à fait réalisable, d’une part parce que la
puissance des machines actuelles permet de calculer un nombre considérable d’empreintes à la
seconde, et d’autre part parce que bon nombre de personnes utilisent des mots de passe triviaux
(leur date de naissance, le nom de leur chien, etc.) facilement devinables et testables.
Les systèmes Unix utilisent deux techniques pour pallier ces problèmes. La première est de ne pas
calculer l’empreinte du mot de passe tel qu’il est fourni par l’utilisateur, mais de la calculer avec une
donnée générée aléatoirement et stockée dans le fichier de mot de passe. Cette donnée, que l’on
appelle classiquement « sel », jour le rôle de vecteur d’initialisation de l’algorithme de génération
d’empreinte. Le sel n’est jamais le même pour deux utilisateurs, ce qui fait que deux utilisateurs qui
auraient le même mot de passe n’auraient toutefoirs pas la même empreinte. Cela complique la
tâche des attaquants qui utilisent la force brute, car ils doivent ainsi recalculer les empreintes pour
chaque utilisateur.
La deuxième technique utilisée est tout simplement de ne pas laisser le fichier des empreintes
accessible à tout le monde. C’est pour cela que le fichier de configuration /etc/shadow a été
introduit. Étant lisible uniquement par l’utilisateur root, un pirate ne peut pas récupérer les
120
Chapitre 6. Administration du système de base
empreintes de mots de passe pour les comparer avec des empreintes de mots de passe
précalculées. Il doit donc essayer les mots de passe un à un, ce qui peu en décourager plus d’un,
surtout si le système se bloque pendant un certain temps après quelques tentatives infructueuses...
La technique d’authentification par mot de passe peut paraître relativement primitive, à l’heure où les
cartes à puce sont légions et où l’on commence à voir apparaître des scanners d’empreintes digitales. En
fait, c’est une bonne solution, mais qui ne saurait en aucun cas être exhaustive en raison des problèmes
mentionnés ci-dessus. L’idéal est donc d’utiliser plusieurs systèmes d’authentification en série, ce qui
laisse libre cours à un grand nombre de possibilités.
Il est évident que la technique des mots de passe traditionnellement utilisée sur les systèmes Unix
n’évoluera pas aisément vers de nouveaux mécanismes d’authentification. C’est pour cela que les
programmes devant réaliser une opération d’authentification ou de gestion des utilisateurs de manière
générale ont été modifiés pour utiliser la bibliothèque PAM (abréviation de l’anglais « Pluggable
Authentification Modules »). Cette bibliothèque permet de réaliser les opérations d’identification et
d’authentification de manière externe aux programmes qui l’utilisent, et se base pour ces opérations des
fichiers de configuration et des modules dynamiquement chargeables. Ainsi, grâce à la bibliothèque
PAM, l’administrateur peut définir avec précision les différentes opérations réalisées pour identifier et
authentifier les utilisateurs, sans avoir à modifier les programmes qui ont besoin de ces fonctionnalités.
De plus, il est possible d’ajouter de nouveaux modules au fur et à mesure que les besoins évoluent, et de
les intégrer simplement en modifiant les fichiers de configuration.
De nos jours, la plupart des distributions utilisent la bibliothèque PAM. Bien entendu, il existe des
modules qui permettent de réaliser les opérations d’identification et d’authentification Unix classiques, et
ce sont ces modules qui sont utilisés par défaut. Nous verrons le format des fichiers de configuration de
la bibliothèque PAM plus en détail dans les sections suivantes.
Note : Les mécanismes décrits ici ne sont sûrs que dans le cadre d’une connexion sur un terminal
local. Cela dit, il faut bien prendre conscience que la plupart des applications réseau sont de
véritables passoires ! En effet, ils utilisent des protocoles qui transmettent les mots de passe en clair
sur le réseau, ce qui implique que n’importe quel pirate peut les capter en moins de temps qu’il n’en
faut pour le dire. Les protocoles applicatifs suivants sont réputés pour être non sûrs et ne devront
donc JAMAIS être utilisés sur un réseau non sûr (et donc, à plus forte raison, sur Internet) :
• FTP, qui permet de transférer et de récuperer des fichiers sur une machine distante ;
• X, qui permet aux applications graphiques d’afficher leurs fenêtres sur un terminal X.
Cette liste n’est pas exhaustive mais regroupe déjà les protocoles réseau des applications les plus
utilisées.
La sécurisation de ces protocoles ne peut se faire qu’en les encapsulant dans un autre protocole
utilisant un canal de communication chiffré. L’un des outils les plus courant pour cela est sans doute
ssh. Cet outil sera décrit dans la la section intitulée Utilisation de SSH dans Chapitre 9> du chapitre
traitant du réseau.
121
Chapitre 6. Administration du système de base
Comme vous pouvez le constater, cette commande prend en paramètre le login de l’utilisateur,
c’est-à-dire le nom qu’il devra utiliser pour s’identifier sur le système, et un certain nombre d’options
complémentaires. Ces options sont récapitulées dans le tableau suivant :
Option Signification
-c Permet de définir le champ commentaire du fichier de mot de passe.
-d Permet de fixer le répertoire personnel de l’utilisateur.
-e Permet de fixer la date d’expiration du compte. Cette date doit être spécifiée au
format AAAA-MM-JJ.
122
Chapitre 6. Administration du système de base
Option Signification
-f Permet de définir le nombre de jours avant que le compte ne soit désactivé une fois
que le mot de passe est expiré. La valeur -1 permet de ne jamais désactiver le
compte.
-g Permet de définir le groupe principal auquel l’utilisateur appartient. Il s’agit
souvent du groupe users.
-G Permet de donner la liste des autres groupes auxquels l’utilisateur appartient. Cette
liste est constituée des noms de chacun des groupes, séparés par des virgules.
-m Permet de forcer la création du répertoire personnel de l’utilisateur. Les fichiers du
modèle de répertoire personnel stockés dans le répertoire /etc/skel/ sont
automatiquement copiés dans le nouveau répertoire. Si ces fichiers doivent être
copiés à partir d’un autre répertoire, il faut spécifier celui-ci à l’aide de l’option -k
-p Permet de donner le mot de passe initial du compte. Cette option ne doit jamais être
utilisée, car le mot de passe apparaît dans la ligne de commande du processus et
peut être lue par un utilisateur mal intentionné. On fixera donc toujours le mot de
passe initial de l’utilisateur à l’aide de la commande passwd.
-s Permet de spécifier le shell par défaut utilisé par l’utilisateur.
-u Permet de spécifier l’UID de l’utilisateur. Cette valeur doit être unique en général,
cependant, il est possible de forcer l’utilisation d’un même UID pour plusieurs
utilisateurs à l’aide de l’option -o. Cela permet de créer un deuxième compte pour
un utilisateur déjà existant.
L’ajout d’un groupe se fait avec la commande groupadd, qui suit la syntaxe suivante, beaucoup plus
simple que celle de useradd :
où nom est le nom du groupe et GID son numéro. Il n’est normalement pas possible de définir un groupe
avec un identifiant numérique déjà attribué à un autre groupe, sauf si l’on utilise l’option -o.
De la même manière, la suppression d’un utilisateur peut se faire manuellement en effaçant son
répertoire personnel et en supprimant les lignes qui le concernent dans les fichiers /etc/passwd,
/etc/shadow et /etc/group. Il est également possible d’utiliser la commande userdel. Cette
commande utiliser la syntaxe suivante :
où login est le nom de l’utilisateur. L’option -r permet de demander à userdel d’effacer récursivement
le répertoire personnel de l’utilisateur, ce qu’elle ne fait pas par défaut. Il existe également une
commande groupdel pour supprimer un groupe d’utilisateurs (cette commande supprime le groupe
seulement, pas les utilisateurs qui y appartiennent !).
Note : Comme pour la plupart des autres opérations d’administration système, il est fortement
probable que l’outil de configuration fourni avec votre distribution dispose de toutes les
fonctionnalités nécessaires à l’ajout et à la suppression des utilisateurs. Il est recommandé d’utiliser
cet outil, car il peut effectuer des opérations d’administration complémentaires que les outils
standards n’effectuent pas forcément, comme la définition des comptes mail locaux par exemple.
123
Chapitre 6. Administration du système de base
124
Chapitre 6. Administration du système de base
module après son exécution. Enfin, la troisième colonne donne le chemin d’accès complet au module,
éventuellement suivi des options qui doivent lui être communiquées pour son exécution.
Les modules peuvent être utilisés dans l’un des contextes suivants :
• auth, qui est le contexte utilisé par les programmes qui demandent l’authentification de l’identité de
utilisateur ;
• account, qui est le contexte utilisé par les programmes qui désirent obtenir des informations sur
l’utilisateur (répertoire personnel, shell, etc.)
• password, qui est le contexte utilisé par les applications qui cherchent à revalider l’authentification de
l’utilisateur. Les programmes comme passwd par exemple, qui demandent le mot de passe de
l’utilisateur avant d’en fixer un nouveau, sont susceptibles d’utiliser ce contexte ;
• session, qui est le contexte utilisé par les applications lorsqu’elles effectuent les opérations de
gestion d’ouverture et de fermeture de session. Ce contexte peut être utilisé pour réaliser des tâches
administratives, comme l’enregistrement de l’utilisateur dans la liste des utilisateurs connectés ou le
chargement des préférences personnelles de l’utilisateur par exemple.
Une même application peut définir plusieurs jeux de règles pour plusieurs contextes différents, et
certains modules peuvent être utilisés dans plusieurs contextes différents également. Cependant,
lorsqu’une application réalise une demande à la bibliothèque PAM, cette demande n’est exécutée que
dans le cadre d’un contexte bien défini. Attention cependant, une même application peut effectuer
plusieurs opérations successivement dans des contextes différents. Par exemple, le programme login peut
utiliser le contexte auth pour valider l’identité de l’utilisateur, puis le contexte account pour
déterminer le répertoire personnel de l’utilisateur, et enfin le contexte session pour enregistrer
l’utilisateur dans le journal des utilisateurs connectés.
Le comportement de la bibliothèque PAM en fonction du résultat de l’exécution des modules dépend de
ce qui est spécifié dans la deuxième colonne des lignes de ces modules. Les options qui peuvent y être
utilisées sont les suivantes :
• required, qui permet d’indiquer que le succès de l’opération effectuée par le module est nécessaire
pour que l’opération effectuée dans le contexte spécifié dans la première colonne de la ligne réussisse.
Un échec sur cette ligne ne provoque pas l’arrêt de l’analyse du fichier de configuration, ce qui permet
d’appeler d’autres modules, par exemple pour générer des traces dans les fichiers de traces du système.
Cependant, quel que soit le comportement des modules suivants, l’opération demandée par le
programme appelant échouera ;
• requisite, qui permet d’indiquer que le succès de l’opération effectuée par le module est nécessaire,
faute de quoi l’opération réalisée par le programme appelant échoue immédiatement. Les autres
modules ne sont donc pas chargés en cas d’échec, contrairement à ce qui se passe avec l’option
required ;
• sufficient, qui permet d’indiquer que le succès de l’exécution du module garantira le succès de
l’opération demandée par le programme appelant. Les modules suivants seront chargés malgré tout
après l’appel de ce module, sauf s’il s’agit de modules de type required ;
• optional, qui permet d’indiquer que le résultat du module ne doit être pris en compte que si aucun
autre module ne peut déterminer si l’opération est valide ou non. Dans le cas contraire, le module est
chargé, mais son résultat est ignoré.
125
Chapitre 6. Administration du système de base
À titre d’exemple, nous pouvons présenter deux implémentations possibles du fichier de configuration
par défaut /etc/pam.d/other. Une configuration extrêmement sûre interdira l’accès à toute
fonctionnalité fournie par un programme n’ayant pas de fichier de configuration. Dans ce cas de
configuration, on utilisera un fichier comme celui-ci :
Nous voyons que toutes les opérations de type authentification ou de revalidation de l’identité sont
d’abord tracées dans les fichiers de traces du système, puis déclarées comme interdites. Une telle
configuration peut être un peu trop restrictive car, en cas d’erreur dans un fichier de configuration d’une
application, l’accès à cette application peut être interdit systématiquement. Une autre configuration, plus
permissive, cherchera à utiliser les mécanismes d’identification et d’authentification Unix classiques.
Cela se fait avec les modules pam_unix_auth, pam_unix_acct, pam_unix_passwd et
pam_unix_session :
Les autres fichiers de configuration ne seront pas décrits ici, car ils dépendent de chaque application et de
chaque distribution. Vous pouvez consulter ceux qui sont installés sur votre système si vous désirez en
savoir plus.
Nous ne décrirons pas non plus la syntaxe des fichiers de configuration des différents modules, car cela
dépasserait largement le cadre de ce document. Cela dit, la plupart de ces fichiers sont parfaitement
commentés et leur modification ne devrait pas poser de problème particulier. À titre d’exemple, on peut
présenter le cas du module de gestion des limites des ressources consommées par les utilisateurs. Si l’on
désire restreindre le nombre de processus que les utilisateurs peuvent lancer, on pourra ajouter la ligne
suivante dans le fichier /etc/security/[Link] :
Il faudra également demander le chargement de ce module dans les fichiers de configuration des
applications fournissant un accès au système. Pour cela, on ajoutera une ligne telle que celle-ci à la fin de
leur fichier de configuration :
Il est également possible de limiter le nombre de login de chaque utilisateur, la quantité de mémoire qu’il
peut consommer, la durée de connexion autorisée, la taille maximum des fichiers qu’il peut manipuler,
126
Chapitre 6. Administration du système de base
etc. Vous trouverez de plus amples renseignements sur la configuration des modules de PAM dans le
guide d’administration de PAM pour Linux, que l’on trouvera avec les sources de PAM
([Link]
Les options indiquent les opérations à effectuer. La première option est bien entendu l’option -i, qui
permet l’installation d’un paquetage :
rpm -i paquetage
rpm -U paquetage
rpm -e paquetage
127
Chapitre 6. Administration du système de base
La commande permettant d’obtenir les informations (auteur, description, version) sur un paquetage
contenu dans un fichier rpm est la suivante :
Enfin, la commande pour lister tous les fichiers d’un paquetage contenu dans un fichier rpm est la
suivante :
Cette commande affiche les chemins complets, ce qui permet de savoir dans quel répertoire chaque
fichier sera installé.
Il existe beaucoup d’autres options disponibles. Cependant, leur description dépasserait le cadre de ce
document. Vous pouvez toujours consulter la page de manuel rpm si vous désirez plus d’informations.
où type est le type du paquetage, site est l’emplacement du référentiel, distribution est le nom de
la distribution, et sections une liste des sections dans lesquelles les paquetages pourront être trouvés.
Le type de paquetage le plus courant est deb, qui est utilisé pour les paquetages binaires pour la
distribution Debian. Par exemple, la ligne suivante permet de référencer le site principal de Debian aux
États-Unis :
Par défaut, le fichier /etc/apt/[Link] contient les références sur les principaux sites Internet
de Debian. Si vous voulez installer des paquetages que vous avez téléchargés, il va vous falloir y rajouter
une ligne telle que celle-ci :
128
Chapitre 6. Administration du système de base
où base est un répertoire dans lequel vous devez placer un sous-répertoire contenant vos paquetages, et
répertoire est le nom de ce sous-répertoire. Vous pouvez bien entendu classer vos paquetages dans
différents sous-répertoires, du moment que vous ajoutez les lignes adéquates dans le fichier
[Link].
apt-get recherchera alors, dans chacun de ces sous-répertoires, un fichier d’index contenant la liste des
paquetages. Ce fichier doit être nommé [Link], et peut être créé simplement en compressant le
résultat de la commande dpkg-scanpackages. La commande à utiliser pour créer un tel fichier est la
suivante :
où répertoire est le sous-répertoire du répertoire de base dans lequel vous avez placé vos paquetages
binaires. Cette ligne de commande suppose que le répertoire courant soit le répertoire base spécifié dans
la ligne que vous avez ajouté dans le fichier [Link].
Dans le cas des CD-ROMs, la procédure est plus simple. En effet, l’utilitaire apt-cdrom permet de
prendre en compte un CD-ROM de manière automatique, avec une simple commande telle que celle-ci :
où répertoire est le répertoire servant de point de montage de votre CD-ROM. Cette commande
ajoute la référence du CD-ROM dans le fichier /var/lib/apt/[Link]. Il n’existe pas de
commande pour supprimer un CD-ROM de cette liste.
Une fois les sources de paquetages définies, leur manipulation est élémentaire. Avant toute chose, il est
nécessaire de mettre à jour la liste des paquetages dans le système de paquetages. Cette opération doit
être réalisée de manière assez régulière en général, car cette liste évolue assez rapidement. Pour effectuer
cette opération, il suffit simplement d’exécuter la commande update d’apt-get :
apt-get update
paquetage est ici le nom du paquetage à installer. Si ce paquetage est déjà installé et que l’on désire le
réinstaller, par exemple pour le réparer ou pour le mettre à jour ajoutera l’option --reinstall :
La suppression d’un paquetage est toute aussi simple. Elle se fait évidemment avec la commande
remove :
Cette commande supprime le paquetage, mais ne détruit pas les fichiers de configuration qu’il a installé.
Cela permet d’éviter de perdre les éventuelles modification que l’on pourrait y avoir apportées. Si l’on
désire supprimer ces fichiers également, il faut ajouter l’option --purge :
129
Chapitre 6. Administration du système de base
La mise à jour de tous les paquetages existants se fait simplement avec la commande upgrade d’apt-get :
apt-get upgrade
Cette commande ne permet pas toujours de résoudre les nouvelles dépendances sur les paquetages. C’est
pour cela que la commande dist-upgrade a été définie. Elle permet de mettre à jour le système complet
(mais est évidemment bien plus longue).
Enfin, si vous désirez obtenir des informations sur un paquetage, vous devez utiliser le programme
apt-cache. Ce programme permet de rechercher un paquetage à l’aide de mots-clefs, et d’afficher les
informations complètes sur le paquetage. Par exemple, pour obtenir des informations sur un paquetage, il
faut utiliser la commande suivante :
où paquetage est le nom du paquetage. De même, pour obtenir la liste des paquetages qui se rapporte à
un mot-clef particulier, il faut utiliser la commande search d’apt-cache :
où mot-clé est le mot-clé que l’on doit rechercher dans les paquetages.
installpkg paquetage
removepkg paquetage
upgradepkg paquetage
Cette commande supprime toutes les anciennes versions du paquetage après avoir installé la nouvelle. La
commande upgradepkg peut également accepter en paramètre l’option --install-new, qui permet
d’installer le paquetage s’il n’est pas encore installé, et l’option --reinstall, qui permet de réinstaller
le paquetage s’il est déjà installé.
130
Chapitre 6. Administration du système de base
Enfin, la Slackware fournit l’outil pkgtool, qui est un peu plus convivial à utiliser que les outils en ligne
de commande précédents. Cet outil fournit une interface utilisateur en mode texte permettant d’installer,
de supprimer, d’obtenir des informations sur les paquetages, ainsi que de reconfigurer le système.
Note : Un processus « zombie » est un processus qui vient de se terminer et dont aucun processus
n’a lu le code de retour. De tels processus apparaissent généralement lorsque leur processus père
se termine avant eux car, généralement, c’est toujours le processus père qui lit le code de retour de
ses processus fils.
init niveau
où niveau est le niveau d’exécution à atteindre. Cela dit, cette manière de faire est assez rare, car en
général on n’a pas besoin de changer de niveau d’exécution, sauf pour arrêter et redémarrer la machine.
Mais pour ces opérations, les commandes shutdown, halt et reboot sont déjà disponibles.
131
Chapitre 6. Administration du système de base
Le niveau d’exécution dans lequel le système doit se placer lors de son démarrage peut également être
précisé en paramètre du noyau lors du démarrage. Vous devrez donc utiliser une commande semblable à
celle-ci : LILO boot:linux niveau si vous utilisez LILO, ou kernel noyau niveau si vous
utilisez le GRUB pour démarrer le noyau noyau Linux dans le niveau d’exécution niveau. Ainsi, pour
passer en mode monoutilisateur (c’est-à-dire le mode de maintenance), il suffit de taper la commande
suivante à l’amorçage de LILO :
LILO boot:linux 1
kernel /boot/vmlinuz 1
Note : Il est également possible d’utiliser le paramètre single, qui est synonyme du niveau
d’exécution 1.
Le comportement d’init est défini dans le fichier de configuration /etc/inittab. Ce fichier contient la
description des niveaux d’exécution, le niveau par défaut dans lequel le système se place au démarrage, et
les actions qu’init doit effectuer lorsque certains événements arrivent. En particulier, il est indiqué quels
sont les scripts qui doivent être exécutés lors du changement de niveau d’exécution. Il est fortement, mais
alors très fortement déconseillé de toucher au fichier /etc/inittab pour des raisons bien évidentes.
Vous trouverez de plus amples renseignements dans les pages de manuel d’init et d’inittab.
Lorsqu’on change de niveau d’exécution, ainsi qu’au démarrage du système, init appelle des scripts de
configuration pour effectuer les opérations de configuration du système et de lancement et d’arrêt des
différents services. Comme on l’a vu, ces scripts sont spécifiés dans le fichier /etc/inittab. En
général, ils sont tous placés dans le répertoire /etc/rc.d/ (ou /sbin/init.d/, selon votre
distribution). Ce répertoire contient donc :
Le script appelé lors du démarrage du système est en général spécifié directement dans /etc/inittab.
Vous pouvez y ajouter les commandes spécifiques à votre système, comme par exemple les commandes
de configuration du matériel. Ce fichier n’est exécuté qu’une seule fois et est placé directement dans
/etc/rc.d/ (ou dans /sbin/init.d/).
En revanche, les scripts appelés lors du changement de niveau d’exécution sont souvent placés dans des
sous-répertoires du répertoire rc.d ou init.d. Ils sont classés à raison d’un répertoire par niveau
d’exécution. Ces sous-répertoires portent le nom de rc0.d, rc1.d, rc2.d, etc. pour les différents
niveaux d’exécution. En fait, un seul script est exécuté par init lorsqu’on change de niveau d’exécution,
et ce script se charge d’exécuter les bons scripts dans les sous-répertoires de rc.d ou init.d.
132
Chapitre 6. Administration du système de base
Classiquement, ce script principal est appelé avec le numéro du niveau d’exécution en paramètre, et il
commence par appeler les scripts de sortie du niveau d’exécution courant, puis les scripts d’entrée dans
le nouveau niveau d’exécution.
La distinction entre les scripts d’entrée et de sortie dans chaque répertoire rc?.d se fait par la première
lettre du script. Sur certaines distributions, la lettre ’K’ correspond aux scripts de sortie et la lettre ’S’ au
script d’entrée (ces deux lettres correspondent respectivement aux mots anglais « Kill » et « Start »). De
plus, l’ordre dans lequel ces scripts doivent être exécutés est indiqué par le nombre suivant cette lettre
dans le nom du script. Cela dit, ces conventions peuvent varier selon votre distribution. Consultez votre
documentation pour plus de détails à ce sujet.
Il est assez courant que les répertoires rc?.d ne contiennent que des liens symboliques vers les fichiers
de scripts, et que ceux-ci soient tous placés directement dans le répertoire /etc/rc.d/ (ou
/sbin/init.d/). La raison en est qu’un même script peut être utilisé pour différents niveaux
d’exécution, et qu’il n’a donc pas de raison d’être dans le répertoire d’un niveau plutôt que celui d’un
autre.
De même, il est assez courant que chacun de ces scripts gère à la fois l’entrée et la sortie du niveau
d’exécution, selon le paramètre qu’il reçoit lors de son appel. Parmi les paramètres les plus courants, on
retrouve les suivants :
133
Chapitre 6. Administration du système de base
En général, les commandes [Link] ne sont rien d’autre que des liens vers les programmes de création
spécifiques des systèmes de fichiers.
Les commandes de création des systèmes de fichiers peuvent prendre des options particulières, qu’il faut
donc pouvoir leur fournir via mkfs. mkfs transfère donc toutes les options qu’il trouve après la
spécification du type de système de fichiers telles quelles aux programmes de création spécifique des
systèmes de fichiers. La liste des options effectivement disponibles peut être consultée dans les pages de
manuel respectives de ces programmes.
où fichier est le fichier contenant le système de fichiers à monter (en général, il s’agit d’un fichier
spécial de périphérique, mais ce peut également être une image disque), et base est le point de montage,
c’est-à-dire le répertoire à partir duquel le système de fichiers doit être accédé. L’option -t permet
d’indiquer le type du système de fichiers. Notez qu’en général il n’est pas nécessaire de le préciser, car le
noyau sait reconnaître la plupart des systèmes de fichiers automatiquement.
Pour information, les types de systèmes de fichiers les plus utilisés sont les suivants :
134
Chapitre 6. Administration du système de base
Si le répertoire de montage n’est pas vide, les fichiers qui s’y trouvent sont masqués par le système de
fichiers monté. Il est donc recommandé de ne monter les systèmes de fichiers que dans des répertoires
vides.
Pour les supports de système de fihciers amovibles, il arrive parfois que Linux ne puisse pas déterminer
la géométrie ou la table de partition du support de données. Par exemple, lorsque l’on insère une carte
mémoire dans un lecteur de carte, Linux considère que le périphérique n’a pas changé (puisque le lecteur
de carte est toujours branché) et ne relit donc pas les informations de la carte mémoire. Il peut donc être
nécessaire de demander explicitement au système de relire la table de partition du périphérique. Cela
peut être réalisé avec l’option --rereadpt de la commande blockdevnbsp;:
où périphérique est le fichier spécial de périphérique dont la table de partition doit être relue.
La commande mount peut prendre diverses options pour le montage des systèmes de fichiers. Par
exemple, elle permet de monter des systèmes de fichiers en lecture seule, ou de monter des systèmes de
fichiers placés dans des images disques. Ces options sont introduites par l’option de ligne de commande
-o, et doivent être séparées les unes des autres par des virgules.
Par exemple, pour monter un système de fichiers ISO9660 en lecture seule, on utilisera la ligne de
commande suivante :
Une autre option utile pour le montage des CD-ROMs est sans doute l’option session, qui permet
d’indiquer le numéro de la session à monter dans le cas des CD-ROMs multisessions. Par exemple, pour
monter la deuxième session d’un CD-ROM multisession, on utilisera une ligne de commande telle que
celle-ci :
Le système de fichiers EXT3 prend également des options supplémentaires par rapport au système de
fichiers EXT2. Ces options permettent de contrôler la manière dont la journalisation des opérations sur
disque est réalisée. Avec EXT3, le journal peut être utilisé pour stocker toutes les opérations concernant
la structure de données même du système de fichiers (c’est-à-dire ce que l’on appelle les
135
Chapitre 6. Administration du système de base
« méta-données » du système de fichiers) et les opérations concernant les données des fichiers
elles-mêmes. La différence est importante et il faut bien la comprendre. Si l’on choisit de ne journaliser
que les méta-données du système de fichiers, les informations concernant les répertoires, les fichiers et
les droits d’accès seront toujours dans un état cohérent. En revanche, les données stockées dans les
fichiers eux-mêmes peuvent être a priori fausses à la suite d’un redémarrage impromptu. Si, en revanche,
on décide de stocker également les informations concernant les données des fichiers dans le journal, le
contenu des fichiers sera également garanti, au détriment d’une perte de performances notable. Le mode
de fonctionnement à utiliser est spécifié à l’aide de l’option data du système de fichiers, qui doit donc
être fixée lors de l’opération de montage. Cette option peut prendre l’une des trois valeurs suivantes :
• journal, qui permet d’effectuer une journalisation complète des méta-données et des données des
fichiers. Il est donc garanti que le contenu des fichiers est toujours cohérent, tout comme l’est le
système de fichiers. Cette option procure le maximum de sécurité, mais c’est également celle qui
pénalise le plus les performances du système (les données sont écrites deux fois, une fois dans le
journal, et une fois sur disque) ;
• ordered, qui est l’option par défaut et qui permet de ne journaliser que les méta-données, mais qui
garantit également que les tampons d’écriture sont vidés avant chaque journalisation d’une opération
disque. Tout comme avec l’option journal, il est garantit que le système de fichiers est dans un état
cohérent. Les données des fichiers seront également cohérentes avec les structures de données du
système de fichiers. Cependant, rien ne garantit que le contenu des fichiers sera lui aussi cohérent en
interne, car même si les données sont écrites avant toute modification du système de fichiers, aucun
contrôle n’est effectué pour que les écritures soient réalisées dans l’ordre dans lequel les applications
les ont effectuées. Cela dit, les performances sont meilleures qu’avec l’option journal, tout en
garantissant une sécurité quasi totale des fichiers ;
• writeback, qui permet de ne journaliser que les méta-données du système de fichiers. Le contenu des
fichiers peut donc être incorrect, voire même contenir des données aléatoires à la suite d’un arrêt brutal
du système, mais le système de fichiers est toujours dans un état correct. Cette option permet donc
simplement de rendre facultative la vérification et la réparation des systèmes de fichiers EXT2 au
redémarrage. Les performances sont quasiment aussi bonnes que pour le système de fichiers EXT2.
Enfin, il est possible de monter un système de fichiers plusieurs fois, éventuellement avec des options
différentes, dans différents points de montage. De même, il est possible de monter une partie d’un
système de fichiers seulement dans un autre répertoire, par exemple pour réaliser un raccourci vers un
sous ensemble du système de fichiers hôte. Vous pouvez consulter la page de manuel de la commande
mount pour obtenir plus de détail à ce sujet.
Vous pourrez trouver la liste des autres options acceptées par mount et par les systèmes de fichiers dans
la page de manuel mount.
136
Chapitre 6. Administration du système de base
que l’on désire l’arrêter avant de couper le courant, ou que l’on désire retirer un lecteur amovible avant
de le faire, afin qu’il puisse effectuer les synchronisations nécessaires. Ne pas le faire risquerait de
provoquer des pertes de données irrémédiables. Cette opération s’appelle simplement le démontage.
Note : Bien entendu, les commandes d’arrêt du système se chargent (entre autres) de démonter
tous les systèmes de fichiers avant d’éteindre l’ordinateur.
La commande permettant de démonter un système de fichiers est beaucoup plus simple que celle
permettant de les monter, car aucune option n’est nécessaire. Il suffit en effet d’exécuter l’une des
commandes suivantes :
umount fichier
ou :
umount base
Dans ce commandes, fichier représente le fichier contenant le système de fichiers à démonter, et base
est le répertoire dans lequel ce système de fichiers est monté. On peut utiliser l’un ou l’autre de ces
paramètres, la commande umount se débrouillera pour retrouver l’autre automatiquement. On notera
qu’il est impossible de démonter un système de fichiers qui est en cours d’utilisation par quelqu’un. En
particulier, il ne faut pas être dans le répertoire servant de point de montage pour pouvoir démonter un
système de fichiers, car dans ce cas on est en train de l’utiliser. Faites bien attention à l’orthographe de la
commande umount, elle a perdu son ’n’ depuis bien longtemps déjà, et on ne l’a jamais retrouvé. Si
vous savez où il se trouve, faites-le savoir.
Pour les supports de systèmes de fichiers amovibles, le démontage du système de fichiers peut ne pas être
suffisant. En effet, il peut être nécessaire d’arrêter le périphérique correctement avant de l’ejecter. C’est
en particulier le cas pour les systèmes de fichiers sur les clefs USB par exemple. Cette opération peut être
réalisée à l’aide de la commande eject :
eject périphérique
où périphérique est le fichier spécial du périphérique à ejecter. Cette commande réalise également
l’opération de démontage sur les systèmes de fichiers montés avant d’ejecter le disque.
137
Chapitre 6. Administration du système de base
Toutefois, même le meilleur système du monde ne saurait être à l’abri des secteurs défectueux du disque
dur sur lequel il est installé. Il est donc parfois nécessaire d’effectuer une vérification manuelle des
systèmes de fichiers, et il faut savoir le faire même quand plus rien ne fonctionne.
Un système de fichiers ne se manipule que lorsqu’il est démonté. Cela pose évidemment quelques
problèmes pour le système de fichiers racine, puisqu’on ne peut pas accéder aux outils de vérification
sans le monter. Pour ce système de fichiers, il n’y a donc que deux possibilités :
• soit on utilise une disquette de démarrage contenant les outils de vérification et de réparation des
systèmes de fichiers ;
• soit on monte le système de fichiers racine en lecture seule.
La deuxième solution est la seule réalisable si l’on ne dispose pas de disquette de démarrage. Par
conséquent, c’est cette méthode qui sera décrite ici.
La première étape consiste à passer en mode mono utilisateur, afin de s’assurer que personne ni aucun
programme n’accède au système de fichiers racine en écriture. Pour cela, il suffit de taper la commande
suivante :
init 1
qui fait passer le système dans le niveau d’exécution 1. On peut également passer le paramètre single
au noyau lors de l’amorçage du système, comme il l’a été expliqué dans la section précédente. Ensuite, il
faut s’assurer que le système de fichiers racine est en lecture seule, ce qui se fait avec la commande
suivante :
mount -n -o remount,ro /
Note : Normalement, le noyau monte toujours le système de fichiers racine en lecture seule lors de
l’amorçage. Ce sont les scripts de démarrage du système, lancés par init, qui le remontent en
lecture / écriture s’il est dans un état correct. Il est donc fortement probable, si votre système ne
démarre plus correctement, que le système de fichiers racine soit déjà en lecture seule après un
démarrage en mode de maintenance. La commande précédente n’est donc décrite qu’à titre indicatif.
Une fois le système de fichiers racine monté en lecture seule, on peut utiliser le programme fsck afin de
le vérifier et éventuellement le réparer. En réalité, ce programme ne fait rien d’autre que d’appeler un
programme spécifique pour chaque système de fichiers, de la même manière que mkfs appelle des
programmes spécifiques pour les créer. Par exemple, pour les systèmes de fichiers EXT2 et EXT3, fsck
appelle le programme [Link] (qui est un lien vers e2sfck).
138
Chapitre 6. Administration du système de base
La ligne de commande à utiliser pour vérifier un système de fichiers avec fsck est la suivante :
fsck -a fichier
où fichier est le fichier spécial du périphérique ou le fichier image contenant le système de fichiers à
vérifier. Il faut donc, généralement, spécifier la partition sur laquelle le système de fichiers racine se
trouve. L’option -a demande à fsck d’effectuer les éventuelles corrections automatiquement en cas
d’erreur sur le système de fichiers ainsi vérifié, sans confirmation de la part de l’utilisateur.
Il est également possible de demander la vérification de tous les systèmes de fichiers enregistrés dans le
fichier de configuration /etc/fstab. Ce fichier contient la liste des systèmes de fichiers les plus utilisés
et leurs options respectives. Il suffit donc d’ajouter l’option -A :
fsck -a -A
Il n’est évidemment plus nécessaire de spécifier le fichier spécial du périphérique contenant le système
de fichiers à vérifier, puisque cette information est enregistrée dans le fichier /etc/fstab. La syntaxe
de ce fichier sera décrite dans la section suivante.
Si le disque dur contient des secteurs défectueux, il peut être nécessaire de les marquer comme tels dans
les structures du système de fichiers afin de ne pas les utiliser par la suite. De manière générale, la
recherche de ces blocs peut être faite à l’aide du programme badblocks. Cette commande effectue un
test de lecture de tous les blocs du disque sur lequel le système de fichiers se trouve, et génère une liste
des blocs défectueux. Vous pouvez l’appeler directement et fournir cette liste au programme e2fsck à
l’aide de son option -l, mais le plus simple est encore de demander à e2fsck d’appeler badblocks
lui-même. Pour cela, il suffit de lui passer l’option -c, ce qui se fait en faisant précéder cette option d’un
double-tiret dans la ligne de commande de fsck :
fsck -a -- -c périphérique
Note : L’option -c est spécifique à e2fsck et peut ne pas fonctionner avec d’autres systèmes de
fichiers. En particulier, certains systèmes de fichiers ne sont pas capable de gérer correctement les
blocs défectueux des disques durs. C’est le cas du système de fichiers ReiserFS.
Le programme badblocks peut également effectuer un test d’écriture sur le disque dur, si on lui
communique l’option -w. Il va de soi que ce type de test est destructif, car toutes les données du
disque sont alors écrasées par des motifs particuliers. Il ne faut donc JAMAIS utiliser cette option sur
un système de fichiers contenant des données !
De manière général, il vaut mieux prévenir que guérir, aussi est-il recommandé d’utiliser la commande
badblocks au moins une fois avant d’utiliser un système de fichiers. Cette vérification peut être réalisée
de manière automatique lors de la création du système de fichiers à l’aide de l’option -c de la commande
mke2fs.
Une fois que vous aurez terminé la vérification du système de fichiers, vous pourrez le remonter en
lecture et écriture avec la commande suivante :
mount -n -o remount,rw /
139
Chapitre 6. Administration du système de base
Cette commande est similaire à celle que l’on a vue pour monter le système de fichiers en lecture seule, à
ceci près que l’option rw est utilisée à la place de l’option ro. Cette option permet de remonter le
système de fichiers en lecture et en écriture (« rw » est l’abréviation de l’anglais « Read Write »).
mount périphérique
ou :
mount répertoire
• l’option defaults, qui permet de choisir les options par défaut pour ce système de fichiers ;
140
Chapitre 6. Administration du système de base
• l’option auto, qui permet de faire en sorte que le système de fichiers soit monté automatiquement au
démarrage du système ;
• l’option user, qui permet d’autoriser le montage de ce système de fichiers par les utilisateurs ;
• l’option ro, qui permet de monter le système de fichiers en lecture seule ;
• l’option rw, qui permet de monter le système de fichiers en lecture et écriture ;
• l’option exec, qui permet d’autoriser l’exécution des fichiers exécutables sur ce système de fichiers si
celui-ci ne supporte pas la notion de droit d’exécution ;
• l’option acl, qui permet d’autoriser l’utilisation des ACLs (« Access Control List ») pour fixer les
droits des utilisateurs sur les fichiers ;
• l’option uid=utilisateur, qui permet de spécifier le numéro utilisateur de l’utilisateur
propriétaire du répertoire racine de ce système de fichiers ;
• l’option gid=groupe, qui permet de spécifier le numéro groupe du groupe d’utilisateurs auquel le
répertoire racine du système de fichiers appartient ;
• l’option mode=valeur, qui permet de fixer les droits sur le répertoire racine du système de fichiers à
monter. La valeur valeur est donnée en octal ;
• l’option umask=valeur, qui permet de fixer les droits sur les fichiers qui ne sont pas gérés par le
système de fichiers. La valeur valeur est donnée en octal ;
• les options codepage=cp et iocharset=charset, qui permettent de fixer les tables de conversion
des caractères pour les systèmes de fichiers pour lesquels les noms de fichiers doivent être transcodés.
141
Chapitre 6. Administration du système de base
monter les systèmes de fichiers FAT et FAT32 de telle sorte que tous les fichiers appartiennent à
l’utilisateur root par défaut, et de donner cependant tous les droits à tous les utilisateurs sur ces fichiers.
On prendra garde à ces options, car elles permettent à quiconque d’écrire des fichiers sous le nom de
root, et donc constituent un grave défaut dans la sécurité du système.
Les options codepage et iocharset permettent de spécifier respectivement la page de codes et le jeu
de caractères utilisés pour les systèmes de fichiers qui ne stockent pas les noms de fichiers Unix
nativement. En particulier, elles permettent de modifier la page de code et le jeu de caractères
sélectionnés par défaut dans la configuration du noyau pour les systèmes de fichiers FAT. L’option
codepage est utilisée pour donner la page de codes utilisée pour la conversion des noms de fichiers en
noms de fichiers courts. En général, pour les systèmes français, la page de codes utilisée est la page de
codes 850. Il faut donc donner à cette option la valeur cp850. L’option iocharset quant à elle est
utilisée pour faire la conversion des noms de fichiers Unix en Unicode. Elle est utilisée pour les systèmes
de fichiers VFAT, car ceux-ci stockent les noms de fichiers longs en Unicode. Pour la plupart des
systèmes, le jeu de caractères le plus approprié est sans doute le jeu de caractères ISO8859-1. Aussi
faut-il généralement donner à cette option la valeur iso8859-1. Cette option n’est pas nécessaire pour
les systèmes de fichiers FAT purs, puisque ceux-ci ne savent pas gérer les noms de fichiers longs.
Les deux derniers champs de /etc/fstab spécifient des options pour des programmes annexes.
L’avant-dernier contrôle le comportement du programme de sauvegarde dump, et le dernier celui du
programme de vérification de système de fichiers fsck. Consultez les pages de manuel pour plus de
détails à ce sujet.
Si vous disposez de systèmes de fichiers FAT ou FAT32, vous pourrez monter ces partitions
automatiquement lors du démarrage du système. Comme les systèmes de fichiers basés sur la FAT ne
peuvent pas gérer les droits des utilisateurs, vous allez devoir faire un choix pour fixer ces droits à une
valeur raisonnable. Vous pouvez par exemple donner le droit de lecture à tous les utilisateurs, mais le
droit d’écriture uniquement à l’administrateur système. La ligne à ajouter dans le fichier /etc/fstab
sera alors la suivante :
où partition est la partition contenant le système de fichiers FAT, et répertoire est le répertoire
servant de point de montage pour cette partition. Cette ligne permettra de monter automatiquement ce
système de fichiers en tant que FAT32 au démarrage du système. Les fichiers binaires seront exécutables,
bien qu’ils ne soient pas stockés sur un système de fichiers EXT2. Si vous voulez laisser les droits
d’écriture aux utilisateurs, vous pouvez utiliser la ligne suivante à la place de celle indiquée ci-dessus :
Cette ligne permet de monter le système de fichiers FAT en laissant les droits d’exécution et d’écriture
aux utilisateurs. Cependant, aucun fichier exécutable de ce système de fichiers ne pourra être lancé, car
l’option exec n’a pas été précisée.
Par ailleurs, certaines distributions spécifient des options incorrectes pour le système de fichiers
/dev/pts/ dans le fichier /etc/fstab. Veuillez vous assurer que la ligne utilisée pour ce système de
fichiers est bien identique à la ligne suivante :
142
Chapitre 6. Administration du système de base
Si ce n’est pas le cas, certains émulateurs de terminaux développés récemment ne fonctionneront pas
correctement. Le système de fichiers /dev/pts/ est en effet un système de fichiers virtuel, géré
directement par le noyau, dans lequel des fichiers spéciaux de périphériques utilisés par les émulateurs de
terminaux sont placés. Si les droits ne sont pas correctement fixés sur le répertoire racine de ce système
de fichiers, les émulateurs de terminaux utilisant cette fonctionnalité ne pourront se connecter au système
que sous le compte root. Il faut donc impérativement corriger cette ligne, si vous voulez que les
utilisateurs normaux puissent utiliser ces émulateurs. Notez également qu’il faut que tout le monde ait les
droits d’écriture et de lecture sur le fichier spécial de périphérique /dev/ptmx pour que les utilisateurs
non privilégiés puissent utiliser ce système de fichiers virtuel.
Vous devrez également ajouter le système de fichiers virtuel /dev/shm/ dans votre fichier /etc/fstab.
Ce système de fichiers permet aux applications qui le désirent d’utiliser des segments de mémoire
partagée de manière compatible avec la norme POSIX, par exemple pour réaliser des communications
inter-processus. Ce système de fichiers permet en effet de créer des fichiers qui sont directement stockés
dans la mémoire virtuelle et qui peuvent être ouverts par plusieurs processus simultanément, ce qui
permet d’utiliser les fonctionnalités classiques de partage de fichiers pour partager des zones de mémoire
entre plusieurs processus. Ce type de communication peut être utilisé par des processus courants, aussi
faut-il vous assurer que la ligne suivante se trouve bien dans la fichier fstab :
Bien entendu, vous devrez créer le point de montage /dev/shm/ si celui-ci n’existe pas avant de monter
ce système de fichiers virtuels.
Vous pouvez monter les systèmes de fichiers virtuels du noyau, qui vous permettront d’obtenir des
informations sur votre système et d’en modifier le comportement, en ajoutant les deux lignes suivantes
dans le fichier /etc/fstab :
La première ligne monte le système de fichiers /proc/, qui contient tous les paramètres du noyau et
permet de paramétrer son comportement, et la deuxième contient le système de fichiers /sys/, qui
contient une vue de tous les objets systèmes gérés par le noyau. Ce système de fichiers n’est disponible
qu’avec les versions 2.6 et plus du noyau. Ces deux lignes ne sont généralement pas nécessaires, car ces
systèmes de fichiers sont montés automatiquement dans les scripts d’initialisation des distributions.
Enfin, si vous utilisez des périphériques USB, il vous faudra également monter le système de fichiers
virtuel /proc/bus/usb/ en ajoutant la ligne suivante dans le fichier fstab :
Cette ligne doit être placée après celle qui effectue le montage du système de fichiers virtuel /proc/.
143
Chapitre 6. Administration du système de base
systèmes de fichiers stockés sur les supports amovibles nécessite toujours un montage et un démontage
manuel, et même si ces opérations sont simplifiées, elles restent gênantes.
Il est toutefois possible de faire en sorte que ces systèmes de fichiers soient montés à la demande, c’est à
dire dès qu’un accès est réalisé dans les répertoires de montage dédiés à ces systèmes par un quelconque
programme. Ainsi, il n’est plus nécessaire de monter ces systèmes de fichiers manuellement. Le
démontage quant à lui peut être réalisé automatiquement après un temps d’inactivité, ou manuellement,
lorsqu’on veut retirer le lecteur amovible. Notez que le démontage reste vital si le système de fichiers est
accédé en écriture, car des données pourraient être perdues si l’on supprime le lecteur avant qu’elles ne
soient écrites.
Les opérations de montage et de démontage sont réalisées par un démon, que le noyau appelle
automatiquement dès qu’une opération susceptible de concerner un système de fichiers amovible se
produit. Ce démon se nomme automount, et il s’appuie donc sur une fonctionnalité dédiée du noyau
Linux. Pour que le montage automatique des systèmes de fichiers fonctionne, il faut activer soit l’option
« Kernel automounter support », soit l’option « Kernel automounter version 4 support
(also supports v3) » du menu « File systems » du programme de configuration du noyau.
Note : Un démon est un processus qui tourne en arrière plan dans le système. Les démons
fonctionnent souvent dans le compte root et offrent des services de base que les autres programmes
utilisent. Le terme « démon » provient de la traduction littérale « daemon », ce qui signifie « ange »
en réalité. Le démon se place donc en tant qu’intermédiaire entre Dieu (c’est-à-dire le noyau) et les
hommes (c’est-à-dire les applications normales). Le terme « daemon » a été ensuite éclairci et défini
comme l’acronyme de l’anglais « Disk And Execution MONitor ».
Le démon automount peut surveiller plusieurs points de montage, s’ils sont tous placés dans le même
répertoire. Le noyau surveille simplement les accès sur les sous-répertoires de ce répertoire, et signale à
automount toutes les opérations susceptibles de nécessiter un montage de système de fichiers.
Les informations spécifiques aux points de montage doivent être stockées dans un fichier de
configuration, que l’on doit fournir à automount en ligne de commande. Cette ligne de commande est
donc typiquement de la forme suivante :
où durée est la durée d’inactivité avant démontage automatique du système de fichiers, répertoire est
le répertoire dont les sous-répertoires seront utilisés comme points de montage des systèmes de fichiers
(il s’agit généralement du répertoire /mnt/), et fichier est le fichier de configuration pour les points
de montage placés dans ce répertoire. La durée d’inactivité doit être spécifiée en secondes, et la valeur
par défaut est de cinq minutes. Pour désactiver le démontage automatique, il suffit de spécifier une valeur
nulle.
Note : automount est capable d’utiliser d’autres méthodes de paramétrage des systèmes de
fichiers amovibles que des fichiers de configuration, principalement utilisées dans le contexte du
montage automatique des systèmes de fichiers en réseau. Ces méthodes de paramétrage ne seront
toutefois pas décrites ici, vous pouvez consulter la page de manuel du démon automount pour plus
de détails à ce sujet.
144
Chapitre 6. Administration du système de base
Les fichiers de configuration pour automount sont généralement placés dans le répertoire /etc/, et
portent un nom de la forme « [Link] », où nature est la nature des systèmes de fichiers décrits
par ce fichier. Par exemple, le fichier de configuration pour les lecteurs amovibles locaux pourrait
s’appeler /etc/[Link]. Ce fichier de configuration est constitué de plusieurs lignes, à raison
d’une ligne par point de montage. Chaque ligne utilise la syntaxe suivante :
Vous noterez que les options sont précédées d’un tiret (’-’), et que les fichiers spéciaux de périphérique
sont précédés de deux points (’:’). Une fois ce fichier défini, vous n’aurez plus qu’à lancer automount
avec la ligne de commande suivante :
En général, les distributions lancent automatiquement le démon automount au démarrage, via le script
d’initialisation [Link]. Ce script utilise le fichier de configuration /etc/[Link] pour
déterminer les noms des fichiers de configuration à fournir en paramètre aux démons automount, ainsi
que pour déterminer les options avec lesquelles ils doivent être lancés. Ce fichier est constitué de lignes,
à raison d’une ligne par instance du démon automount qui doit être lancée. Le format de ces lignes est le
suivant :
où répertoire est le répertoire spécifié en ligne de commande à automount, fichier est le fichier de
configuration, et option est la liste des options à lui fournir. Par exemple, pour lancer automatiquement
automount comme dans l’exemple précédent, la ligne suivante devrait être ajoutée dans le fichier
/etc/[Link] :
/mnt /etc/[Link] -t 60
Note : Vous noterez que lorsque les systèmes de fichiers ne sont pas montés, le répertoire
contenant leurs points de montage est vide. De ce fait, les chemins sur ces répertoires devront être
saisis explictement pour forcer le montage des systèmes de fichiers. Cela peut être gênant lorsque
l’on utilise les fonctionnalités de complétion automatique des shells, ou lorsqu’on cherche à localiser
un fichier dans un de ces répertoires avec un gestionnaire de fichiers ou une boîte de dialogue d’un
145
Chapitre 6. Administration du système de base
programme graphique. Une solution pour résoudre ce problème est de forcer une référence aux
points de montage. Pour cela, il suffit de définir des liens symboliques sur les points de montage, et
d’utiliser ces liens symboliques vers ces points de montage. Par exemple, on pourra définir les liens
symboliques /cdrom et /floppy pour référencer les points de montage /mnt/cdrom et
/mnt/floppy, et laisser automount monter les systèmes de fichiers relatifs et créer les répertoires
des points de montage dès qu’on accèdera aux liens symboliques.
où loopX est le fichier spécial de périphérique de type bloc virtuel à utiliser, et fichier est le fichier
dans lequel les données de ce périphérique doivent être stockées. Une fois cette association faite, on peut
utiliser ce périphérique comme un véritable périphérique. Ainsi, pour créer un système de fichiers dans
un fichier image de 10 Mo, on procédera comme suit :
146
Chapitre 6. Administration du système de base
Note : La commande dd permet de copier un certain nombre de blocs, ici 10240 (option count) de
1024 octets (taille indiquée par l’option bs) du fichier spécial de périphérique /dev/zero dans le
fichier image. Cette commande a déjà été présentée dans le chapitre d’installation pour réaliser une
copie du secteur de boot principal du disque dur.
En réalité, les commandes de création de systèmes de fichiers peuvent également créer directement
les systèmes de fichiers dans des fichiers images. La manière classique de procéder a toutefois été
présentée ici pour la bonne compréhension du mécanisme de gestion des fichiers images.
Le montage d’un système de fichiers placé dans l’image disque est ensuite réalisable de manière tout à
fait classique, en utilisant le fichier spécial de périphérique /dev/loopX adéquat dans la commande
mount. Toutefois, cette commande permet de réaliser le montage d’une image de manière simplifiée
grâce à son option loop. Celle-ci permet de configurer le périphérique virtuel image de manière
automatique avant de réaliser le montage. Elle prend donc en paramètre le fichier spécial de périphérique
virtuel à utiliser, ainsi que le chemin sur le fichier image contenant le système de fichiers. Ainsi, pour
monter une image de CD-ROM, vous pouvez utiliser la commande suivante :
Lorsque l’on n’a plus besoin du périphérique de type bloc virtuel, il est possible de supprimer
l’association avec le support de données simplement avec la commande suivante :
losetup -d /dev/loopX
où X est toujours le numéro du fichier spécial de périphérique virtuel. Lorsque l’on utilise l’option loop
de la commande mount, cette opération est réalisée automatiquement par la commande umount et ne
doit plus être effectuée manuellement.
Agrégation de volumes
Les agrégats de volumes de Linux permettent de construire un périphérique virtuel constitué d’un certain
nombre de volumes de données. Ceux-ci peuvent être regroupés pour réaliser un volume de grande taille,
ou mis en parallèle afin de répliquer les données sur plusieurs disques par exemple. Il est donc possible,
grâce à cette fonctionnalité, de regrouper plusieurs disques durs ou plusieurs partitions en une seule
partition logique, ou au contraire de subdiviser de manière fine des partitions ou des disques existants.
De même, il est possible de prendre en charge au niveau logiciel les fonctionnalités RAID normalement
disponibles uniquement avec du matériel spécialisé. Nous ne présenterons toutefois pas ces
fonctionnalités ici.
La réalisation des agrégats de volumes se fait à l’aide de l’outil dmsetup. Cet outil peut être récupéré sur
le site de Redhat ([Link] s’il n’est pas fourni avec votre distribution. Son
147
Chapitre 6. Administration du système de base
installation se fait par compilation des sources, par exécution des commandes suivantes dans le répertoire
des sources :
./configure
make
make install
La principale commande de dmsetup est celle qui permet de créer un nouvel agrégat. Cela se fait
simplement grâce à l’option create :
où agrégat est le nom de l’agrégat et définition est le nom d’un fichier contenant la définition de cet
agrégat. Si vous ne fournissez pas ce paramètre, dmsetup attendra que vous le définissiez en ligne de
commande.
La définition d’un agrégat se fait de manière générale à l’aide de plusieurs lignes, à raison d’une ligne
par composante de l’agrégat. Chaque ligne a la forme suivante :
début est le secteur de début de la plage de secteurs de l’agrégat qui seront stockés dans la composante.
taille est le nombre de secteurs de cette plage. méthode est la méthode d’agrégation utilisée, elle est
suivie par des options qui lui sont spécifiques. La méthode la plus classique est sans doute linear, qui
permet de stocker des données de l’agrégat dans les secteurs correspondants de la composante. Dans le
cas de la méthode linéaire, ces secteurs sont spécifiés simplement avec le nom du fichier spécial de
périphérique contenant les secteurs, et le numéro du premier secteur à partir duquel la composante sera
stockée.
Par exemple, pour créer un agrégat des deux partitions /dev/hda2 et /dev/hdb1, respectivement de
tailles 16579080 et 59665410 secteurs, il suffit d’utiliser les deux lignes suivantes :
On constatera que le secteur de départ dans l’agrégat de la deuxième composante est le secteur suivant le
dernier secteur défini par la première composante. De manière générale, il n’est pas possible de définir
des trous dans un agrégat. La totalité des deux partitions est utilisée dans cet exemple, pour créer un
volume de taille totale 40 Go environ (pour rappel, un secteur de disque dur fait 512 octets, les deux
partitions de cet exemple font donc environ 8 et 32 Go).
Une fois l’agrégat créé, un fichier spécial de périphérique portant le nom de l’agrégat doit apparaître
dans le répertoire /dev/mapper/. Ce fichier spécial de périphérique peut être utilisé comme n’importe
quel fichier spécial de périphérique, pour y créer un système de fichiers, pour le monter et pour le
démonter. Par exemple, pour créer un agrégat group0 avec les définitions précédentes, il suffit
d’exécuter la commande suivante :
où [Link] est le fichier contenant les deux lignes définissant les composantes vues ci-dessus. La
création et le montage du système de fichiers se font ensuite avec les commandes suivantes :
148
Chapitre 6. Administration du système de base
mke2fs /dev/mapper/group0
mount /dev/mapper/group0 /mnt/group
où /mnt/group/ est le nom du répertoire où le système de fichiers agrégé doit être monté.
Lorsqu’un agrégat n’est plus utilisé, il peut être supprimé à l’aide de l’option remove de dmsetup
Cela ne supprime bien entendu pas les données, mais détruit l’association entre les composantes de cet
agrégat.
Note : Les fonctionnalités d’agrégation de volumes ne sont disponibles que si les options
« Multiple devices driver support (RAID and LVM) », « Device mapper support » et
« Crypt target support » du noyau ont été activées dans le menu « Multi-device support (RAID
and LVM) » du programme de configuration du noyau.
dmsetup utilise le fichier spécial de périphérique /dev/mapper/control pour communiquer avec le
noyau. Vous devrez donc créer ce fichier si votre distribution ne le fournit pas. Pour cela, vous
pouvez exécuter le script devmap_mknot.sh fourni dans le répertoire scripts/ des sources de
dmsetup. Ce script permet également de créer le répertoire /dev/mapper/ si celui-ci n’existe pas.
149
Chapitre 6. Administration du système de base
La technique d’agrégation crypt prend en paramètre l’algorithme de chiffrement à utiliser, la clef privée
à utiliser pour chiffrer le volume agrégé, un décalage à ajouter au numéro du secteur pour déterminer le
vecteur d’initialisation, le fichier spécial de périphérique sur lequel les données chiffrées seront écrites, et
le numéro du secteur de ce périphérique à partir duquel les données seront écrites. Les décalages fournis
permettent de n’utiliser qu’une partie d’un périphérique de type bloc pour stocker les données chiffrées.
En général, ces valeurs seront nulles, car les données sont souvent stockées sur la totalité du périphérique
hôte.
Ainsi, la définition d’une composante de l’agrégat chiffré se fait selon la syntaxe suivante :
où clef est une clef de taille comprise entre 16 et 32 octets. Si cet agrégat a été nommée cr0, vous
pourrez ensuite créer le système de fichiers simplement avec la commande suivante :
et le monter dans le répertoire /mnt/secure/ avec une commande telle que celle-ci :
Enfin, il est possible d’utiliser un fichier en tant que périphérique de stockage des données chiffrées. Pour
cela, il faut associer ce fichier à un fichier de type bloc virtuel à l’aide de la commande losetup. Ce
fichier peut ensuite être utilisé pour définir un agrégat, comme n’importe quel autre fichier spécial de
périphérique.
150
Chapitre 6. Administration du système de base
151
Chapitre 6. Administration du système de base
simplement en écrivant dans son fichier spécial de périphérique. Ainsi, si vous tapez la commande
suivante sous le compte root :
Ces lignes indiquent à init que plusieurs processus getty doivent être lancés sur les différents terminaux
virtuels. Le programme getty est le programme qui vous demande votre nom d’utilisateur sur les
terminaux virtuels. Plus précisément, getty initialise le terminal, demande le nom d’utilisateur et lance le
programme login en lui fournissant le nom saisi, afin que celui-ci demande le mot de passe de cet
utilisateur.
Si vous désirez rajouter des terminaux de login à votre configuration, vous devrez donc rajouter des
lignes de ce genre dans le fichier /etc/inittab. En fait, ces lignes sont constituées de quatre champs :
• le premier champ est le numéro de la ligne. En pratique, ce numéro doit être celui du terminal virtuel
qui sera utilisé par getty ;
• le champ suivant (« 2345 ») contient les numéros des niveaux d’exécution dans lesquels cette ligne est
valide. Ces numéros doivent être spécifiés les uns à la suite des autres, sans séparateur. Dans l’exemple
donné ci-dessus, ces lignes sont valides dans les niveaux d’exécution 2 à 5 compris, c’est-à-dire tous
les niveaux d’exécution classiques ;
• le troisième champ indique à init des options pour le lancement du programme getty. Dans l’exemple
donné ci-dessus, le programme getty doit être relancé immédiatement dès qu’il se termine. Cela est le
comportement désiré, puisque la terminaison de getty correspond à la déconnexion de l’utilisateur
courant, et qu’il faut laisser la possibilité de se reconnecter aux suivants ;
• le dernier champ indique le programme à lancer et ses options de ligne de commande. Dans notre cas,
il s’agit de /sbin/getty. Les options indiquées sont la vitesse de la ligne de communication utilisée,
le nom du terminal sur lequel getty doit travailler et son type (ici, ce sont des terminaux de type
« linux »).
Vous pouvez bien entendu vous baser sur les lignes existantes pour en créer de nouvelles. L’opération est
très simple : il suffit de renuméroter les lignes et les terminaux virtuels utilisés. Prenez garde cependant à
152
Chapitre 6. Administration du système de base
ne pas affecter à getty un terminal utilisé par XWindow. Il est recommandé d’effectuer ces modifications
dans le niveau d’exécution 2 pour ne pas être gêné par XWindow.
Une fois les modifications ajoutées, vous pourrez demander à init de relire son fichier de configuration
avec la commande suivante :
init Q
Configuration de la console
Comme nous venons de le voir, tous les terminaux virtuels utilisent la même console. La suite logique
des opérations est donc de voir comment on réalise la configuration de celle-ci... Nous allons donc voir
dans ce chapitre la manière de paramétrer le clavier et l’affichage du texte à l’écran.
Pour cela, il est nécessaire de bien comprendre les mécanismes mis en œuvre pour le traitement des
codes émis par le clavier d’une part, et pour l’affichage des symboles des lettres à partir de leurs codes
d’autre part. Ces mécanismes sont relativement évolués et complexes, mais permettent de paramétrer
avec précision la disposition des touches du clavier, le comportement des applications et l’allure des
symboles affichés à l’écran.
Le plus simple pour comprendre le fonctionnement de la console est encore de voir les différentes étapes
entrant en ligne de compte de l’appui sur une touche jusqu’à l’action correspondant à cet appui. Notez
bien que cette action n’est pas forcément l’affichage d’une lettre à l’écran : cela dépend de l’application
qui a traité l’événement correspondant à l’appui sur la touche. Il est toutefois nécessaire de présenter
auparavant quelques notions sur la manière dont les caractères sont représentés dans les programmes.
153
Chapitre 6. Administration du système de base
utilisés par les autres pays. Ces conventions constitue ce que l’on appelle une page de codes. Chaque
pays est donc susceptible d’utiliser une page de codes qui lui est spécifique. Par exemple, la page de
codes 437 représente l’encodage utilisé aux États-Unis, et la 850 celle utilisée en France.
Historiquement, les pages de codes n’ont pas été immédiatement standardisées, ce qui a conduit à la
prolifération de pages différentes et parfois incompatibles. Ainsi, les pages de codes utilisées en France
sont les pages de codes 850 sous DOS, 1252 sous Windows, ISO 8859-1 et ISO 8859-15 sous Unix. Ces
deux dernières constituent la norme actuelle, et sont celles qui doivent être utilisées de préférence. La
norme ISO 8859-1 est également connue sous le nom latin-1, et la norme ISO 8859-15 sous le nom
latin-0. La norme latin-0 est une extension de la latin-1, qui ne prévoyait pas le codage de certains
caractères européens (comme le o e dans l’o français) et le symbole de l’Euro.
Le défaut majeur de l’ASCII et de ses dérivés est de travailler sur des nombres à 8 bits. Si le nombre de
256 caractères différents convient pour la plupart des pays occidentaux, ce n’est pas le cas de quelques
autres pays, qui utilisent un nombre de symboles de très loin supérieur à 256. C’est notamment le cas du
Japon et de la Chine, qui ne peuvent pas encoder tous leurs idéogrammes sur des nombres à 8 bits. Il a
donc fallu introduire d’autres types d’encodages, plus riches, permettant de satisfaire aux besoins de tout
le monde.
Après des tentatives infructueuses d’encodages à taille variable (un ou plusieurs octets selon le caractère
codé), Unicode a été introduit et normalisé sous le nom ISO 10646. Unicode est une convention de
codage universelle des caractères, qui utilise pour cela des nombres 32 bits (il existe également une
version plus ancienne qui n’utilise que 16 bits). Chaque caractère est représenté par un nombre et un
seul, comme pour l’ASCII. Cependant, avec ses 16 ou 32 bits, le jeu de caractères Unicode est
suffisamment large pour coder tous les caractères de toutes les langues du monde. Bien entendu, tous les
codes ne sont pas utilisés, et le jeu de caractère Unicode est discontinu. Pour des raisons de
compatibilité, les 256 premiers caractères Unicode sont les mêmes que ceux définis dans la norme ISO
8859-1 (ce qui rend malheureusement non compatible la norme ISO 8859-15, plus complète). Les autres
caractères sont affectés à d’autres plages de codes, qui sont parfaitement définies. Ainsi, l’utilisation
d’Unicode permettra, à terme, de n’avoir plus qu’une seule page de codes pour tous les pays.
Malheureusement, Unicode est une évolution relativement récente, et la plupart des programmes
travaillent encore avec des caractères 8 bits, ce qui rend l’utilisation d’Unicode prématurée. Linux, quant
à lui, est capable de gérer l’Unicode. Cependant, pour des raisons d’économie de place, il ne l’utilise pas
directement. Il préfère en effet utiliser l’encodage UTF-8 (abréviation de l’anglais « Unicode Tranfer
Format »). Cet encodage est un encodage à taille variable, qui permet d’encoder les caractères Unicode
avec de un à six octets selon leur emplacement dans la page de codes Unicode.
154
Chapitre 6. Administration du système de base
Linux effectue donc un travail d’uniformisation en interprétant les scancodes et en les traduisant en
d’autre codes, les keycodes. Ces codes sont toujours les mêmes, quel que soit le clavier utilisé. Les
keycodes simplifient le traitement des données provenant du clavier en définissant un code de touche
unique à chacune des touches du clavier. Les keycodes sont également souvent appelés les codes de
touches virtuelles, car ils correspondent aux scancodes d’un clavier virtuel uniforme et commun à toutes
les plates-formes. La gestion des événements clavier par l’intermédiaire des keycodes est donc beaucoup
plus aisée, car il n’y a plus à se soucier ici que de ce clavier virtuel. La correspondance entre les
scancodes, donc les touches physiques, et les keycodes, ou codes de touches virtuelles, est définie dans le
pilote du clavier. La plupart des claviers courants sont pris en charge et, en général, peu de personnes ont
besoin de modifier ce type d’information. Toutefois, afin de permettre l’intégration des claviers futurs, il
est possible de compléter la table de conversion des scancodes en codes de touches virtuelles.
L’interprétation des keycodes est une opération relativement compliquée et peu commode à cause du
grand nombre de dispositions de clavier existantes et, pour chaque type de clavier, des différentes
déclinaisons existantes en fonction des langages des divers pays qui les utilisent. C’est pour cela qu’une
autre association, qui permet de définir le comportement à obtenir pour chaque combinaison de codes de
touches virtuelles, a été introduite. Cette correspondance est décrite dans un fichier que l’on appelle
couramment le plan de clavier (ou keymap en anglais). Les keymaps contiennent donc, pour chaque
touche ou combinaison de touches virtuelles utilisée, la définition d’une action à effectuer ou d’un code
de caractère à renvoyer. Ces codes sont renvoyés en ASCII, codés selon la page de codes définie dans le
plan de clavier. Cependant, certaines touches ne sont pas associées à une lettre ASCII et ne peuvent donc
pas être représentées par des codes simples. C’est le cas, par exemple, des touches du curseur et des
touches de suppression du clavier. Ces touches sont donc signalées aux programmes à l’aide de
séquences de codes appelées les codes d’échappement. Les codes d’échappement sont en réalité des
séquences de codes ASCII dont le premier est le code du caractère d’échappement Escape (dont le
numéro est 27, quelle que soit la page de codes utilisée). Ces séquences sont donc utilisées typiquement
pour signaler aux programmes qui les lisent qu’un traitement particulier doit être effectué, comme par
exemple le déplacement du curseur.
155
Chapitre 6. Administration du système de base
Les programmes peuvent peuvent travailler à n’importe lequel des trois niveaux de traitement que l’on
vient de décrire. Les programmes qui récupèrent directement les scancodes travaillent en mode raw (ce
qui signifie en anglais que les données sont « brutes »). Ils n’utilisent donc pas la traduction en codes de
touches virtuelles et doivent nécessairement connaître les caractéristiques physiques des claviers qu’ils
veulent supporter. C’est le cas par exemple des serveurs X. Les programmes qui utilisent les keycodes
travaillent dans le mode nommé medium raw ou keycode. Cependant, la plupart des programmes
travaillent avec les codes issus du plan de clavier, qui sont normalisés et font bénéficier d’une plus
grande portabilité (y compris avec d’autres systèmes Unix que Linux). Dans ce cas, on dit qu’ils
travaillent en mode ASCII, ou xlate (abréviation de l’anglais « translate », ce qui signifie « traduction »).
Note : En fait, la console peut également travailler en Unicode, dans le mode UTF-8. Ce mode
permet de travailler directement en Unicode, si vous le désirez. Cependant, vous devrez vous
assurer dans ce cas que tous les programmes que vous utilisez sont capables de fonctionner avec
un encodage à taille variable.
Dans tous les cas, les programmes lisent les données provenant du clavier sur la console, par
l’intermédiaire du fichier spécial de périphérique /dev/console. En fait, ces programmes ne savent pas
qu’ils lisent les données du clavier local. Pour eux, ces données semblent provenir d’un terminal VT102,
et ils traitent ces données comme celles provenant de n’importe quel terminal. Cela signifie que ces
données semblent provenir d’une ligne de communication, à laquelle le terminal local est connecté. Et
qui dit ligne de communication, dit paramètres de transmission des informations sur la ligne ! Les
caractères issus de la keymap peuvent donc subir un traitement supplémentaire, en fonction des
paramètres de la ligne de communication (virtuelle) utilisée par la console. Cependant, il n’est en général
pas nécessaire de modifier ces paramètres, puisque la ligne de communication utilisée est bien entendue
idéale (quitte à être virtuelle, autant être idéale, non ?).
Gloups !? Que c’est compliqué ! C’est effectivement la réflexion que vous êtes en droit de vous faire.
Cependant, si l’on prend un peu de distance par rapport à ce mécanisme en trois passes, on comprend son
intérêt. Premièrement, la contrainte initiale est la complexité des scancodes. Sur ce point, il n’y a rien à
dire. Grâce aux keycodes, il n’est plus nécessaire de se soucier du modèle de clavier utilisé. Ensuite,
grâce aux keymaps, il est possible de faire l’association entre les keycodes et les lettres écrites sur les
touches du clavier. Ainsi, la disposition du clavier, ainsi que les raccourcis claviers, peuvent être
complètement paramétrés. Enfin, les applications qui gèrent les touches spéciales du clavier peuvent
interpréter les codes d’échappement, qui sont ceux renvoyés par le terminal de la console. Dans tous les
cas, les programmes qui lisent les données du clavier considèrent que ces données proviennent d’un
terminal classique. Ils n’ont donc pas besoin de faire des hypothèses sur l’origine des données, et leur
programmation en est d’autant plus simple.
Passons maintenant aux travaux pratiques. La commande kbd_mode permet de déterminer le mode de
fonctionnement du clavier. Si vous l’essayez à partir d’une console, vous verrez que le clavier est en
mode ASCII. Inversement, si vous tapez cette commande à partir d’une session X, vous constaterez que
XWindow utilise le clavier en mode raw, et gère donc les scancodes lui-même. Vous pouvez également
visualiser les codes renvoyés dans les trois modes de fonctionnement du clavier avec la commande
showkey. Lancée avec l’option -s, elle permet d’afficher les scancodes lors de l’appui sur chaque
touche. Vous pourrez constater que toutes les touches ne renvoient pas le même nombre de codes. Vous
pourrez utiliser l’option -k pour visualiser les keycodes renvoyés par le noyau lors de l’appui et du
relâchement des touches. Enfin, si vous utilisez l’option -a, vous verrez les codes de touches ASCII.
Vous pourrez constater que les touches spéciales renvoient des séquences de codes d’échappement.
156
Chapitre 6. Administration du système de base
Note : Notez également que certaines touches renvoient des caractères de contrôle (notés ^A à ^Z).
Ces caractères correspondent en fait aux codes ASCII allant de 1 à 26 et ne sont pas des
séquences d’échappement. Ils peuvent également être générés avec les combinaisons de touches
CTRL+A à CTRL+Z. Si vous ne me croyez pas, tapez la commande ls dans une console et tapez la
combinaison de touches CTRL+M (celle affectée à la touche Entrée). Vous verrez, c’est comme si
vous aviez tapé Entrée !
Le programme showkey ne peut pas être lancé sous XWindow, parce que celui-ci gère lui-même le
clavier. showkey se termine de lui-même au bout de dix secondes après la dernière frappe, ou lors
de l’appui de la séquence de touches CTRL+D s’il est en mode ASCII.
Les codes qui ne sont pas reconnus comme étant des codes d’échappement sont traités en tant que
caractères normaux. Le gestionnaire de la console doit donc déterminer quel caractère doit être imprimé
à l’écran pour chaque code fourni par l’application. Cela n’est pas une opération facile, parce que les
polices de caractères, qui contiennent la définition de la représentation graphique des caractères,
n’utilisent pas forcément la page de codes active dans le système. Cela signifie que les caractères définis
dans la police n’apparaissent pas forcément dans le même ordre que celui de la page de codes, et pour
cause : une police peut parfaitement être utilisable dans plusieurs pays différents ! Cela complique donc
157
Chapitre 6. Administration du système de base
un peu plus les choses, puisqu’il faut utiliser une table de conversion entre la page de codes du texte à
afficher et l’encodage propre de la police.
Afin de réaliser cette conversion, le gestionnaire de la console Linux commence par convertir tous les
caractères qu’il reçoit en « Unicode ». Si la console est en mode UTF-8, cette opération est immédiate,
car l’UTF-8 est un encodage Unicode. En revanche, si la console est en mode ASCII, cette opération
nécessite l’emploi d’une table de conversion. Linux dispose de quatre tables de conversion :
• la première table permet de faire la conversion entre la page de codes ISO 8859-1 et Unicode (cette
conversion est, par définition, immédiate) ;
• la deuxième table permet de faire la conversion entre les codes graphiques des terminaux VT100 et
Unicode ;
• la troisième table permet d’effectuer la conversion entre la page de codes 437 et Unicode ;
• et la quatrième et dernière table est réservée à l’usage personnel de l’utilisateur.
La dernière table est très utile, car elle permet de définir une nouvelle table de conversion si nécessaire.
Par défaut, elle convertit les codes reçus en codes Unicode spéciaux, qui représentent les codes utilisés
par la police de caractères chargée. Ainsi, lorsque cette table est utilisée, les codes reçus par la console
seront utilisés directement pour localiser les caractères dans la police de caractères. Cela ne peut
fonctionner que si les applications utilisent le même encodage que la police de caractères courante.
Linux dispose de deux jeux de caractères, nommés respectivement G0 et G1, qui permettent de
sélectionner la table de conversion à utiliser. Par défaut, ces jeux de caractères pointent respectivement
sur la première et la deuxième table de conversion, mais cela peut être modifié à l’aide de codes
d’échappement. Seul un jeu de caractères est actif à un moment donné. Par défaut, il s’agit du jeu G0, ce
qui implique que la table de conversion utilisée par défaut est la table ISO 8859-1 vers Unicode. Il est
également possible de changer de jeu de caractères, à l’aide d’un code de contrôle. Ce mécanisme ne
sera pas décrit plus en détail ici, car il ne nous sera pas utile.
Note : En fait, la recherche des codes de contrôle est effectuée a posteriori, après la conversion en
Unicode.
Dans tous les cas, les codes envoyés par l’application sont donc convertis en Unicode (16 bits). Ils
peuvent donc être reconvertis aisément dans l’encodage utilisé par la police de caractère chargée en
mémoire vidéo. Par défaut, cette opération est triviale, et l’encodage cible est donc l’encodage ISO
8859-1, sauf si la quatrième table de conversion a été utilisée. Dans ce cas en effet, l’encodage cible est
le même encodage que celui utilisé par l’application (tout se passe donc comme si rien ne s’était passé).
Enfin, la dernière opération est tout simplement l’écriture du code dans la mémoire vidéo. Ce code est
utilisé par la carte graphique comme index dans la police de caractère, et le caractère ainsi localisé est
affiché.
158
Chapitre 6. Administration du système de base
Gloups !? Que c’est compliqué ! Ça ne va pas recommencer ? Eh si ! Mais, encore une fois, ce
mécanisme permet de rendre indépendant les applications des polices de caractères. Chacun peut utiliser
l’encodage qu’il désire, et grâce à un petit passage en Unicode, tous les caractères finissent par être
représentés par le bon symbole à l’écran... En fait, le passage par Unicode donne la possibilité de définir
les tables de conversion des polices uniquement par rapport à Unicode, et non par rapport à tous les
encodages possibles que les applications peuvent utiliser. Cela permet donc l’utilisation de polices de
caractères diverses et variées, sans avoir à modifier les applications.
Configuration du clavier
Bien que les distributions modernes fournissent les outils nécessaires à la configuration correcte du
clavier, vous aurez peut-être à intervenir pour le personnaliser selon vos propres désirs. La configuration
du clavier comprend la définition des scancodes, la définition du plan de clavier, et le réglage de la
vitesse de répétition et de la touche de verrou numérique.
Définition de scancodes
La définition des scancodes est une opération qui nécessite une bonne connaissance du fonctionnement
du clavier des PC. Heureusement, rares sont les personnes qui disposent de claviers non standards,
c’est-à-dire, en pratique, de claviers disposant de plus de 105 touches. Notez que Linux reconnaît
parfaitement les touches « Windows » qui ont été introduites par Microsoft, et il n’y a donc pas lieu de
définir leurs scancodes. Cependant, les claviers les plus récents disposent de touches « Internet » ou
« Multimedia », qui ne sont pas encore reconnues par Linux en standard. L’utilisation de ces touches se
traduit donc simplement par un message d’erreur dans les traces systèmes. Si vous disposez d’un tel
clavier, et que vous désirez utiliser ces touches, vous allez devoir les définir dans la table des scancodes
du noyau.
159
Chapitre 6. Administration du système de base
Pour réaliser cette opération, il faut avant tout déterminer les scancodes envoyés par le clavier lors de
l’appui sur la touche à définir. Comme nous l’avons indiqué plus haut, les scancodes peuvent être
visualisés avec l’option -s de showkey :
showkey -s
Les scancodes sont exprimés en hexadécimal, c’est-à-dire en base 16. Dans cette base, les lettres A à F
représentent les chiffres manquants à la base 10, c’est-à-dire les chiffres ayant respectivement pour
valeur 10, 11, 12, 13, 14 et 15.
En général, le clavier envoie un scancode lors de l’appui sur une touche, puis le même scancode
augmenté de 128 lors de son relâchement. Le nombre de 128 provient du fait que le bit de poids fort du
scancode est mis à un lors du relâchement de la touche. Ainsi, la touche ’A’ des claviers français renvoie
le scancode 16 lors de l’appui, soit 0x10 en hexadécimal, et le scancode 144, soit 0x90, lors du
relâchement (notez que la valeur 128 se note 0x80 en hexadécimal, et que l’on a bien 0x90 = 0x10 +
0x80).
Cependant, certaines touches renvoient des scancodes plus complexes. Ces touches sont généralement
des touches qui ont été ajoutées après la définition des premiers claviers PC, et qui ont sensiblement le
même rôle qu’une touche déjà présente. C’est exactement le cas de la touche CTRL de droite par rapport
à la touche CTRL de gauche. Pour cette raison, les scancodes de ces touches sont les mêmes que ceux de
certaines touches « classiques », mais ils sont précédés du préfixe 0xE0, qui indique qu’il s’agit d’une
touche étendue. Par exemple, la touche CTRL de gauche (c’est-à-dire la première touche de contrôle qui
ait été utilisée) utilise le scancode 0x1D à l’appui, et le scancode 0x9D au relâchement. La touche CTRL
de droite renvoie donc la séquence suivante à l’appui :
0xE0 0x1D
0xE0 0x9D
L’intérêt de procéder ainsi est que les vieux programmes, incapables de gérer les codes de touches
étendus, ignoraient purement et simplement le code 0xE0. Ainsi, ils confondaient les deux touches CTRL,
ce qui est le comportement désiré.
D’autres touches étendues utilisent des séquences de scancodes variables. Par exemple, les touches du
curseur (entre la touche Entrée et le pavé numérique) ont été ajoutées pour simplifier le déplacement du
curseur à l’écran. Initialement, on n’utilisait que les touches du pavé numérique, en combinaison de la
touche Majuscule de droite si le verrou numérique était enclenché. Par conséquent, la séquence de
scancodes générée lors de l’utilisation de la touche Flèche Haute du pavé numérique était 0x48 si le
verrou numérique n’était pas enclenché, et 0x2A 0x48 sinon (soit le scancode de la touche Majuscule
de gauche suivi du scancode de la touche 8 du pavé numérique). Lors du relâchement, la séquence était
inversée (et augmentée de 128) : 0xC8 ou 0xC8 0xAA selon l’état du verrou numérique. La touche
Flèche Haute étendue renvoie donc deux séquences de scancodes différents selon l’état du verrou
numérique 0xE0 0x48 ou 0xE0 0x2A 0xE0 0x48.
160
Chapitre 6. Administration du système de base
Lors du relâchement, la séquence suivante complexe 0xE0 0xC8 ou 0xE0 0xC8 0xE0 0xAA est émise
selon l’état du verrou numérique. Notez que l’état du verrou numérique est maintenu en interne par
l’électronique du clavier, indépendamment de l’état de la diode lumineuse du verrou numérique. Celui-ci
peut en effet être enclenché sans que la diode soit allumée, si le programme de gestion du clavier ne
synchronise pas le clavier et sa diode.
Enfin, pour couronner le tout, certaines touches spéciales utilisent une séquence de scancodes
spécifiques. Par exemple, la touche Pause ne renvoie que la séquence 0xE1 0x1D 0x45 0xE1 0x9D
0xC5 à l’appui. Elle utilise donc le préfixe 0xE1 au lieu de 0xE0, et simule l’appui et le relâchement
immédiat des touches CTRL + Verrou Numérique (ce qui était la manière de provoquer la pause
avant l’introduction de la touche Pause).
Comme vous pouvez le constater, tout cela est très compliqué. Heureusement, le noyau fait le ménage
pour vous et élimine les touches suivantes :
• les touches non étendues sont traitées immédiatement (scancodes 0x01 à 0x58) ;
• la touche Pause est gérée automatiquement ;
• les codes 0x2A et 0xAA de la touche Majuscule de droite sont automatiquement éliminés.
Grâce à ce traitement, les seuls scancodes que vous manipulerez sont les scancodes simples non connus,
et les scancodes précédés du préfixe 0xE0.
L’association d’un scancode inconnu à un keycode se fait à l’aide de l’utilitaire setkeycodes. Sa syntaxe
est la suivante :
0xE0 0x20
Il va de soi qu’il faut s’assurer que chaque keycode n’est utilisé qu’une fois (à moins, bien entendu, de
vouloir que plusieurs touches aient le même comportement). Pour cela, vous aurez sans doute besoin de
voir les correspondances entre scancodes et keycodes. La commande suivante vous donnera la liste de
ces correspondances :
getkeycodes
161
Chapitre 6. Administration du système de base
Les keycodes sont présentés à raison de huit par ligne. Le scancode de la touche décrite par le premier
élément de chaque ligne est affiché en tête de la ligne. Les autres scancodes peuvent être déduits en
ajoutant le numéro de la colonne dans laquelle se trouve chaque keycode au numéro du scancode du
premier keycode.
Chaque touche dispose d’un code numérique qui est une puissance de deux. Lorsqu’elles sont utilisées
dans une combinaison avec une touche donnée, la somme de ces valeurs est calculée pour déterminer le
numéro du symbole dans la liste des symboles associés à la touche. Comme on peut le voir, toutes les
valeurs possibles allant de 0 à 255 sont réalisables selon la combinaison de touches utilisée, ce qui
permet donc de définir effectivement 256 symboles différents pour chaque touche du clavier.
162
Chapitre 6. Administration du système de base
Cependant, les touches Shift et Ctrl sont utilisées plusieurs fois dans le tableau, précisément trois fois,
la première ne faisant pas de distinction entre la touche de droite et la touche de gauche. En pratique
donc, toutes les combinaisons ne sont pas réalisables. Mais en réalité, les touches de contrôle du clavier
sont des touches comme les autres, et peuvent être placées n’importe où dans le plan de clavier. Il est
donc parfaitement possible de réaliser une distinction entre les touches Majuscule, Majuscule
Droite et Majuscule Gauche (et de même pour les touches Ctrl). Par exemple, on peut associer la
touche Majuscule à la touche Echap, ce qui permet de faire la distinction entre les trois variantes de
touches de majuscules... Heureusement, il n’est pas nécessaire d’aller jusque là. Les plans de clavier
n’utilisent en pratique que les quatre premières touches de contrôle, qui sont celles que vous connaissez.
La définition des symboles accessibles pour une touche utilise la syntaxe suivant :
où keycode est le keycode qui identifie la touche en question, et symbole est un des symboles acceptés
dans les plans de clavier. Vous pourrez obtenir la liste des symboles utilisés grâce à la commande
suivante :
dumpkeys --long-info
Vous pourrez voir par exemple les symboles A, B, C, etc. qui représentent les lettres classiques, ainsi que
des symboles spéciaux comme exclamdown, hyphen, cedilla, etc. pour les lettres non alphabétiques.
Il existe également des symboles pour les touches spéciales comme Backspace, Delete, Escape.
Enfin, le symbole VoidSymbol permet de signaler l’absence de symbole pour la combinaison de touches
considérée.
En théorie, il faut définir la liste des 256 symboles accessibles pour chaque touche. Le premier symbole
est donc le symbole obtenu par appui direct de la touche, le deuxième est celui obtenu par la
combinaison Majuscule + Touche, le troisième celui de la combinaison AltGr + Touche, le
quatrième par Majuscule + AltGr + Touche, etc. Évidemment, il est très fastidieux de définir ces
256 possibilités. Pour simplifier le format des plans de clavier, il est possible de ne spécifier que les
combinaisons utilisées, ce qui réduit en pratique à quatre colonnes de symboles un plan de clavier
français. De plus, les derniers symboles sont facultatifs s’ils sont tous VoidSymbol. Vous pouvez
indiquer au début du plan de clavier les valeurs des combinaisons de touches de modifications qui seront
effectivement utilisées avec la syntaxe suivante :
keymaps valeurs
où valeurs est la liste des valeurs ou des plages de valeurs des combinaisons de touches utilisées. Les
éléments de cette liste sont séparés par des virgules, et les plages de valeurs sont indiquées par leurs
première et dernière valeurs, séparées par un tiret.
Vous pouvez également utiliser une autre syntaxe, qui permet de ne modifier que les symboles associés à
certaines combinaisons de touches. Cette syntaxe est très utile lorsque vous ne désirez modifier que
quelques affectations de touches :
163
Chapitre 6. Administration du système de base
Dans cette syntaxe, modificateur est la liste des modificateurs devant intervenir dans la combinaison
de touches, et keycode et symbole sont toujours le keycode de la touche et le symbole à générer. Les
modificateurs autorisés sont les noms des touches de modification indiquées dans le tableau ci-dessus,
plus le modificateur plain, qui signifie qu’aucune touche de modification n’est utilisée. Par exemple, la
ligne suivante :
plain keycode 16 = q
alt keycode 30 = a
permet d’affecter le symbole a à la combinaison de touches Alt + Q (n’essayez surtout pas ces deux
exemples, vous deviendriez fou).
Note : Par défaut, les symboles utilisables dans les plans de clavier sont les symboles du jeu de
caractères ISO 8859-1. D’autres encodages sont utilisables, mais celui-ci convient parfaitement pour
un clavier français.
Comme nous l’avons dit plus haut, la deuxième partie d’un plan de clavier permet d’affecter des chaînes
de caractères à certaines touches. Cela est facilement réalisable, avec la syntaxe suivante :
où symbole est le nom d’un des symboles affecté précédemment à une touche, et chaîne est une chaîne
de caractères. Les chaînes de caractères étant délimitées par des guillemets anglais (« " »), ceux-ci ne
peuvent pas être utilisés en tant que caractères de ces chaînes. Pour résoudre ce problème, on peut utiliser
un antislash comme caractère d’échappement :
\"
Vous pouvez également spécifier des caractères directement à l’aide de leur valeur en base huit, à l’aide
de la syntaxe suivante :
\0valeur
où valeur est la valeur du caractère. Bien entendu, l’antislash étant utilisé comme caractère
d’échappement, il doit lui-même être précédé d’un caractère d’échappement si l’on désire l’utiliser dans
une chaîne de caractères :
\\
Ainsi, si l’on veut faire en sorte que la touche F4 affiche la chaîne de caractères « Coucou », il suffit
d’utiliser la ligne suivante dans le plan de clavier :
164
Chapitre 6. Administration du système de base
string F4 = "Coucou"
Bien entendu, les chaînes de caractères les plus utiles sont celles qui définissent les séquences
d’échappement pour les touches spéciales. Par exemple, la définition de la touche Page Haut est la
suivante :
Vous pouvez reconnaître ces séquences d’échappement à la présence du caractère octal 033, soit 27 en
décimal, qui n’est rien d’autre que le caractère Escape dans le jeu de caractères ISO 8859-1. Ne vous
inquiétez par pour l’instant de la forme apparemment compliquée de ces séquences d’échappement, nous
verrons plus loin comment elles sont utilisées.
Enfin, les plans de clavier contiennent la définition des compositions. Les compositions de touches sont
accessibles à l’aide d’une touche spéciale dite de composition, dont le symbole est Compose dans le plan
de clavier (il est donc nécessaire que ce symbole soit affecté à l’une des touches du clavier pour utiliser
les compositions). Lorsqu’on appuie sur la touche de composition, le clavier attend deux autres touches,
dont les caractères serviront de base au caractère composé. Par exemple, les caractères ’^’ et ’a’ donne le
caractère composé ’â’.
Les compositions utilisent la syntaxe suivante :
où caractère est un des deux caractères à composer et résultat est le caractère résultant de la
composition. Notez bien que les compositions se font sur les caractères, et pas sur les touches. Elles sont
donc actives quel que soit la méthode obtenue pour générer ces caractères (combinaison de touches ou
touches simples).
Note : Le noyau définit la plupart des compositions nécessaires pour le jeu de caractères ISO
8859-1. Ne les cherchez donc pas en vain dans votre plan de clavier, vous ne les trouverez pas
forcément...
D’une manière générale, vous pourrez trouver de plus amples renseignements concernant les plans
de clavier dans la page de man keymaps.
Il est long et difficile de créer un plan de clavier de toutes pièces. Heureusement, encore une fois, cette
description n’était que didactique. Vous n’aurez certainement même pas à modifier votre plan de clavier
(sauf si vous voulez faire des expériences), car des plans de claviers prédéfinis sont fournis avec toutes
les distributions. Ces plans de clavier sont en général stockés dans le répertoire
/usr/lib/kbd/keymap. Pour les claviers de PC français, je vous conseille tout particulièrement le plan
de clavier [Link] du sous-répertoire i386/azerty. Ce plan de clavier permet d’accéder à
toutes les touches utilisées par le français, plus la plupart des touches utilisées en Europe. Il utilise
l’encodage ISO 8859-15, afin d’avoir accès aux rares caractères manquants dans l’encodage ISO 8859-1.
Le chargement d’un plan de clavier est très simple. Il suffit de taper la commande suivante sous le
compte root :
165
Chapitre 6. Administration du système de base
loadkeys keymap
où keymap est le nom du fichier contenant le plan de clavier à utiliser. Si l’on ne spécifie pas de fichier,
loadkey attend que vous tapiez la spécification des touches directement. Vous pourrez valider en
générant le caractère EOF (abréviation de « End Of File », ce qui signifie « Fin de fichier ») à l’aide de la
combinaison de touche CTRL + D, ou abandonner avec le classique CTRL + C.
En général, les distributions utilisent la commande loadkey dans les fichiers d’initialisation du système,
pour charger le plan de clavier que vous avez choisi à l’installation dès le démarrage. Il est recommandé
de ne modifier le plan de clavier courant que par l’intermédiaire du programme de configuration du
système fourni avec votre distribution.
où num, caps et scroll sont des options permettant de préciser respectivement l’état des verrous
numériques, majuscules et défilement. Ces options sont de la forme +num, -num pour le verrou
numérique, et de forme similaire pour les autres verrous. Comme leur syntaxe l’indique, elles permettent
d’enclencher ou de désenclencher l’état des verrous correspondants du clavier.
L’état des verrous du clavier est conservé par chaque terminal virtuel, indépendamment les uns des
autres. Cette commande devra donc être répétée pour tous les terminaux virtuels utilisés. L’option -D
permet de rendre les changements permanents pour le terminal sélectionné. Ainsi, si ce terminal est
réinitialisé, la modification sera conservée. C’est en général l’effet désiré. Sachez qu’il est également
possible d’effectuer une modification temporaire, et de ne modifier que l’affichage des diodes (sans
changer l’état des verrous).
Il est recommandé de placer les quelques lignes suivantes dans les fichiers d’initialisation de votre
système afin d’activer le verrou numérique pour tous les terminaux, si votre distribution ne vous permet
pas de le faire par l’intermédiaire de son programme de configuration :
Ces lignes appellent la commande setleds sur les terminaux virtuels 1 à 12.
166
Chapitre 6. Administration du système de base
Le deuxième utilitaire est kbdrate. Sa fonction est de fixer les paramètres de délai d’attente avant
répétition lorsqu’on maintient une touche enfoncée, ainsi que la vitesse de répétition utilisée une fois que
ce délai d’attente est dépassé. Sa syntaxe est elle aussi très simple :
où taux est le taux de répétition, et délai est le délai d’attente avant le début des répétitions de la
touche enfoncée. L’option -s indique à kbdrate de ne pas afficher de messages pendant l’exécution de la
commande. Les délais d’attente spécifiés peuvent être de 250, 500, 750 ou 1000 millisecondes. Les taux
de répétition utilisables vont de 2 à 30 caractères par seconde. Toutefois, les claviers ne peuvent pas
accepter toutes les valeurs intermédiaires pour le taux de répétition. Vous trouverez la liste exhaustive
des valeurs admissibles dans la page de manuel kbdrate.
setfont police
où police est le fichier de police à charger. Si vous ne spécifiez aucun fichier de police, la police par
défaut sera chargée.
Notez que les fichiers de polices peuvent utiliser un encodage particulier spécifique, qui ne correspond à
aucune des tables de conversion prédéfinies du noyau. Pour ces polices, il est nécessaire de spécifier des
tables de conversion qui leurs sont propres. Ces tables permettent de convertir les codes des caractères
reçus par la console en codes Unicode spéciaux. Tous ces codes appartiennent à une plage de codes
Unicode réservée au système, et que Linux utilise pour définir les codes qui permettront d’accéder
directement aux caractères de la police. L’association entre les codes de caractères de l’application et
leurs descriptions dans la police de caractères est donc réalisée grâce à ces tables de conversion.
Vous pouvez charger une table de conversion spécifique à l’aide de l’utilitaire mapscrn. Cet utilitaire
prend en ligne de commande un fichier contenant la table de conversion, et charge cette dernière dans la
quatrième table de conversion du noyau (c’est-à-dire la table réservée à l’utilisateur) :
mapscrn fichier
167
Chapitre 6. Administration du système de base
cat
Il vous faudra alors taper sur la touche Echap, puis saisir « (K » ou « )K », et enfin signaler la fin de
fichier avec un CTRL + D. Faites bien attention à ce que vous faîtes : en cas d’erreur, le jeu de caractères
utilisé peut rendre l’écran totalement illisible. Si cela devait se produire, vous devrez taper à l’aveugle la
commande reset. Cette table s’assure que le jeu de caractères actif est le jeu de caractères G0, et que
celui-ci utilise la première table de conversion. Vous pourrez également recharger la police par défaut à
l’aide de setfont.
Heureusement, la plupart des polices de caractères contiennent également la table de conversion à
utiliser, et setfont effectue tout le travaille en une seule passe. Il charge la police de caractères dans la
carte graphique, puis sa table de conversion dans le noyau, et s’assure enfin que le jeux de caractères G0
soit actif et utilise cette table. Ainsi, l’utilisation de mapscrn est devenue facultative.
La dernière étape dans la configuration de la police de caractères est le chargement de la table de
conversion Unicode vers les indices des caractères dans la police. Cette table est essentielle, puisque
c’est elle qui indique l’emplacement des caractères de la police à utiliser pour chaque code Unicode. Ces
tables dépendent donc de l’encodage utilisé par la police de caractères.
Le chargement des tables de conversion est réalisée par le programme loadunimap. La syntaxe de ce
dernier est la même que celle de mapscrn :
loadunimap fichier
où fichier est un fichier de conversion approprié. Vous trouverez de tels fichiers dans le répertoire
/usr/lib/kbd/consoletrans. Les fichiers proposés permettent d’utiliser les polices de caractères
encodées selon les encodages les plus courants.
Bien entendu, certaines polices disposent de leur propre table d’encodage. Encore une fois, l’utilisation
de loadunimap est rendue facultative par setfont, qui se charge d’effectuer tout le travail. C’est
notamment le cas pour les polices [Link] et [Link], dont le « u » en fin
d’extension indique la présence de la table de conversion Unicode.
168
Chapitre 6. Administration du système de base
identiques, et qu’un certain nombre de paramètres doivent être définis tant au niveau des terminaux qu’au
niveau des lignes de communication utilisées.
Ces paramètres peuvent être fixés avec la commande stty. Leur nombre interdit ici une description
exhaustive, d’autant plus que pour un terminal local, ils sont tous initialisés à des valeurs par défaut
correctes, et vous n’aurez pas à les modifier. Vous pouvez toutefois consulter la page de manuel de stty
pour de plus amples renseignements à ce sujet.
Si vous êtes curieux, vous pourrez obtenir à tout moment la liste des paramètres de la ligne de
communication d’un terminal avec l’option -a de stty :
stty -a
Comme vous pourrez le constater, le nombre des options utilisées est assez impressionnant. Sont définis,
entre autres, les paramètres de vitesse de communication de la ligne (option speed), le format des
données transférées sur la ligne (option parodd pour la parité impaire, option cs8 pour des paquets 8
bits, etc.), la géométrie du terminal (options rows et columns), les caractères de contrôle affectés à un
certain nombre d’actions (comme, par exemple, le caractère « ^Z », accessible par la combinaison de
touches CTRL + Z, qui permet de suspendre l’exécution du programme utilisant la ligne, et le caractère
« ^C », qui permet de le tuer) et des options de gestion des caractères transférés (par exemple, echo fait
en sorte que tout caractère entrant est immédiatement ré-émis sur la console, ce qui permet de voir ce que
l’on tape).
Parmi ces paramètres, les plus intéressants sont sans doute ceux définissant les actions associées aux
différentes touches de contrôle. Vous pourrez modifier ces paramètres avec la syntaxe suivante :
où action est l’une des actions gérées par stty, comme par exemple susp pour suspendre le processus
en cours, intr pour le tuer, etc. Remarquez que l’action kill n’a rien à voir avec la gestion des signaux
des processus. Elle permet simplement d’effacer la ligne courante du terminal.
169
Chapitre 6. Administration du système de base
C’est pour ces diverses raisons que les systèmes Unix disposent d’une base de donnée de définition des
terminaux. Cette base de donnée contient tous les codes d’échappement que chaque type de terminal est
capable de gérer, décrits d’une manière uniforme. Ainsi, les programmes désirant gérer correctement les
terminaux n’ont qu’à consulter cette base de données pour interpréter et récupérer les codes
d’échappement utilisés par le terminal. Historiquement, la définition des terminaux était réalisée dans le
fichier de configuration /etc/termcap. Ce fichier est obsolète et a été remplacé par la base de données
terminfo, que tous les programmes modernes doivent à présent utiliser. Cependant, le fichier de
configuration /etc/termcap a été conservé par compatibilité avec les vieux programmes qui l’utilisent
encore.
Le fichier termcap comprend une ligne pour chaque type de terminal décrit. Cette ligne est constituée
d’un certain nombre de champs, séparés par le caractère ’:’. Le premier champ de chaque ligne contient
la description du terminal que cette ligne décrit. Les champs suivants sont des définitions des variables
contenant les séquences d’échappement du terminal.
Les informations descriptives du terminal sont les suivantes :
variable=séquence
où variable est le nom de la variable, et séquence est la séquence d’échappement associée à cette
variable. Notez que certaines variables ne prennent pas de paramètres, et que leur présence dans la
description du terminal signale simplement un comportement particulier de celui-ci. Notez également
que pour les variables numériques, le caractère d’égalité est remplacé par un caractère dièse (’#’).
Un certain nombre de variables peuvent être définies pour chaque terminal. Ce sont ces variables qui sont
utilisées par les programmes pour retrouver les séquences d’échappement du terminal. Par conséquent,
les noms de ces variables sont fixés une fois pour toutes, et elles représentent toujours la même
fonctionnalité. La liste des fonctionnalités est, encore une fois, très grande, et les variables utilisables
sont listées exhaustivement dans la page de manuel termcap.
Note : Il est évident que les lignes du fichier /etc/termcap peuvent devenir très longues. Il est donc
possible de les étaler sur plusieurs lignes physiques, en insérant le caractère de continuation de
ligne antislash (’\’). Après chaque retour à la ligne, il faut utiliser une indentation à l’aide du caractère
de tabulation.
lx|linux|Console Linux:\
:do=^J:co#80:li#25:cl=\E[H\E[J:sf=\ED:sb=\EM:\
:le=^H:bs:am:cm=\E[%i%d;%dH:nd=\E[C:up=\E[A:\
170
Chapitre 6. Administration du système de base
:ce=\E[K:cd=\E[J:so=\E[7m:se=\E[27m:us=\E[36m:ue=\E[m:\
:md=\E[1m:mr=\E[7m:mb=\E[5m:me=\E[m:is=\E[1;25r\E[25;1H:\
:ll=\E[1;25r\E[25;1H:al=\E[L:dc=\E[P:dl=\E[M:\
:it#8:ku=\E[A:kd=\E[B:kr=\E[C:kl=\E[D:kb=^H:ti=\E[r\E[H:\
:ho=\E[H:kP=\E[5~:kN=\E[6~:kH=\E[4~:kh=\E[1~:kD=\E[3~:kI=\E[2~:\
:k1=\E[[A:k2=\E[[B:k3=\E[[C:k4=\E[[D:k5=\E[[E:k6=\E[17~:\
:k7=\E[18~:k8=\E[19~:k9=\E[20~:k0=\E[21~:K1=\E[1~:K2=\E[5~:\
:K4=\E[4~:K5=\E[6~:\
:pt:sr=\EM:vt#3:xn:km:bl=^G:vi=\E[?25l:ve=\E[?25h:vs=\E[?25h:\
:sc=\E7:rc=\E8:cs=\E[%i%d;%dr:\
:r1=\Ec:r2=\Ec:r3=\Ec:
Cette ligne permet de définir le terminal associé à la console Linux. Vous pourrez par exemple
reconnaître le nombre de colonnes et de lignes (variables co et li), ainsi que les codes d’échappement
associés aux touches du curseur (variable ku, kd, kr et kl respectivement pour les touches haut, bas,
droite et gauche). Par exemple, la variable cl donne la séquence d’échappement utilisable pour effacer
l’écran et faire revenir le curseur en haut à gauche (séquence d’échappement « Esc [ H Esc [ J »).
Comme il l’a déjà été dit plus haut, la liste complète des variables peut être obtenue en consultant la page
de manuel termcap, et ce fichier ne sera pas décrit plus en détail ici.
La base de données terminfo a été introduite pour combler certaines limitations du fichier termcap. Si
le principe de fonctionnement est presque le même, les informations fournies tiennent compte des
terminaux plus récents et de nouvelles fonctionnalités. Cela signifie en pratique que de nouvelles
variables ont été définies pour décrire les nouveaux terminaux. Inversement, certaines variables de
termcap ont disparu parce qu’elles devenaient obsolètes, et ont été remplacées par des variables
équivalentes de terminfo.
La principale différence entre terminfo et termcap est que la description des terminaux n’est plus
stockée dans un fichier de configuration en mode texte. Toutes les données sont désormais stockées dans
des fichiers binaires, qui peuvent être générés à l’aide du programme tic. Ces fichiers binaires sont
usuellement placés dans les sous-répertoires du répertoire /usr/share/terminfo/. En fait, le nombre
de fichiers de description est tellement grand qu’ils ont été regroupés par ordre alphabétique. Ainsi, le
répertoire /usr/share/terminfo contient des sous-répertoires dont les noms sont les premières lettres
des fichiers de description, et chaque fichier de description est situé dans le répertoire correspondant. Par
exemple, le fichier de description des terminaux Linux se nomme tout simplement linux. Comme la
première lettre de son nom est ’l’, il est stocké dans le répertoire /usr/share/terminfo/l/, avec les
descriptions de tous les autres terminaux dont le nom commence par ’l’.
Note : En fait, les fichiers de description de terminaux peuvent être placés à un autre emplacement
que l’emplacement par défaut. Les bibliothèques de programme utilisant les informations de
terminfo cherchent en effet en premier dans le chemin référencé par la variable d’environnement
TERMINFO, puis dans le répertoire .terminfo du répertoire de l’utilisateur. Ce n’est que si ces
deux recherches échouent qu’elles utilisent les informations du répertoire par défaut.
Comme nous l’avons dit, les fichiers de description sont des fichiers binaires, qui ont été compilés à
l’aide du compilateur tic. Cependant, vous pouvez parfaitement visualiser le contenu de ces fichiers ou
comparer deux fichiers à l’aide de l’utilitaire infocmp. Par exemple, vous pouvez visualiser sous une
171
Chapitre 6. Administration du système de base
forme lisible les informations du fichier de description des terminaux Linux avec la commande suivante :
infocmp linux
Comme vous pouvez le constater, le format de ces informations est similaire à celui de celles qui sont
enregistrées dans le fichier /etc/termcap. Les principales différences sont que les différents champs
sont séparés par des virgules (’,’) au lieu du caractère deux points (’:’), et qu’il est possible de les
répartir sur plusieurs lignes physiques (il est donc inutile d’utiliser le caractère antislash en fin de ligne
physique pour indiquer la continuation de la ligne logique). De plus, le nom des variables utilisées dans
les fichiers terminfo n’est pas le même a priori. Cependant, le principe d’utilisation de ces variables reste
le même, chacune d’entre elles permet de définir une des fonctionnalités gérées par le terminal et de
définir la séquence d’échappement nécessaire à l’obtention de cette fonctionnalité si nécessaire. Vous
172
Chapitre 6. Administration du système de base
pourrez trouver la liste exhaustive des variables utilisables dans la page de manuel terminfo. Le format
des fichiers de configuration de terminfo ne sera donc pas décrit plus en détail dans ce document.
Qu’ils utilisent des bibliothèques basées sur termcap ou terminfo, les programmes doivent tous
connaître le nom du terminal courant pour récupérer les informations qui permettent de l’utiliser dans ces
bases de données. C’est précisément ce à quoi sert la variable d’environnement TERM. Cette variable
contient en permanence le nom du terminal courant, que les programmes peuvent utiliser comme index
dans les bases de données termcap ou terminfo. Ainsi, si vous désirez travailler sur un terminal
Linux, vous pourrez fixer le type de terminal correct avec la commande suivante :
export TERM=linux
La liste des noms de terminaux utilisables peut être obtenue en lisant directement le fichier termcap.
Cette liste peut être obtenue plus facilement pour terminfo, à l’aide de l’utilitaire toe (abréviation de
l’anglais « Table Of terminfo Entry »).
Bien entendu, vous n’aurez à définir la valeur de TERM que si cette variable d’environnement n’est pas
correctement définie, ce qui est très rare. En fait, cela ne peut se produire que lors d’une connexion à
distance sur un autre ordinateur, dont les terminaux ne sont pas de type Linux.
173
Chapitre 6. Administration du système de base
Ainsi, si vous voulez gérer correctement le clavier français sous le shell bash, vous devrez vous assurer
que les lignes suivantes sont placées dans votre fichier inputrc :
Ce fichier commence par autoriser le traitement des caractères dont le bit « meta », c’est-à-dire le
huitième bit, est positionné. C’est en particulier le cas de tous les caractères accentués dans les
principales pages de codes ; ces options sont donc nécessaires pour pouvoir utiliser ces caractères dans le
shell. La suite du fichier définit les actions associées à chaque code d’échappement du terminal. Le
caractère d’échappement est représenté ici par la chaîne de caractères « \e ». Comme les codes
d’échappement sont différents pour la console et pour les émulateurs de terminaux de XWindow, il est
nécessaire de les redéfinir en fonction de la nature du terminal. Ce fichier présente un exemple
d’expression conditionnelle sur le nom du terminal, tel qu’indiqué dans la variable d’environnement
TERM, afin de ne redéfinir ces codes que pour ces terminaux.
174
Chapitre 6. Administration du système de base
reconnaître que la plupart des distributions fournissent un vim « brut de fonderie », ce qui fait que seuls
ceux qui se lancent dans la lecture de son aide peuvent parvenir à l’utiliser correctement. Les options qui
sont proposées ici sont donc données simplement à titre indicatif, mais permettront peut-être de rendre
vim un peu plus ergonomique.
Les options de configuration de vim sont stockées dans deux fichiers. Le premier fichier est le fichier de
configuration commun à tous les utilisateurs, vimrc. Ce fichier peut être placé soit dans le répertoire
/etc/, soit dans le répertoire /usr/share/vim/, selon votre distribution. Le deuxième fichier est le
fichier de préférences personnelles de chaque utilisateur, et se nomme .vimrc. Il est normalement placé
dans le répertoire personnel de l’utilisateur.
Plusieurs types d’options peuvent être indiquées dans ces fichiers de configuration. Les premières
associent les actions à effectuer aux codes d’échappement générés par les touches du curseur. Les autres
spécifient simplement le comportement de l’éditeur et le paramétrage de ses principales fonctionnalités.
Vous trouverez ci-dessous les principales options que vous pourrez ajouter à votre fichier de
configuration vimrc. Ces options rendront sans doute l’utilisation de vim beaucoup plus agréable.
" Éviter à tout pris la compatibilité avec vi, qui est insupportable :
set nocompatible
175
Chapitre 6. Administration du système de base
176
Chapitre 6. Administration du système de base
" Faire en sorte que le "backspace" efface même les sauts de lignes :
set bs=2
Vous constaterez que certains caractères de contrôle sont utilisés dans ce fichier de configuration, dont le
caractère de contrôle « ^[ », qui représente le caractère d’échappement. Ces caractères sont représentés
avec la notation classique « ^C », où « C » est la lettre à utiliser avec la touche CTRL pour obtenir ce
caractère. Ces notations ne font que représenter les caractères de contrôle, et doivent être remplacées par
les caractères qu’elles représentent dans le fichier de configuration. Pour saisir ces caractères spéciaux,
vous devrez passer en mode insertion dans vi, puis utiliser la combinaison de touches CTRL+V. Ce
raccourci permet d’indiquer à vi qu’il doit insérer les codes d’échappement directement issus du clavier,
sans les interpréter. Vous pourrez alors taper la séquence de touches générant le caractère de contrôle ou
la séquence d’échappement désirée. Par exemple, vous pourrez obtenir le caractère « ^H » en tapant la
combinaison de touches CTRL+H, et le caractère « ^? » en appuyant sur la touche Backspace (retour
arrière). Les caractères d’échappement peuvent être générés par la touche Echap ou directement par les
touches du curseur.
Note : En fait, vous pouvez également utiliser les chaînes de caractères « \e » et « <Esc> » pour
représenter le caractère d’échappement. Mais certaines options ne fonctionnent pas avec ces
notations, et je vous les déconseille.
Vous pouvez bien entendu ajouter d’autres options dans ce fichier de configuration. En pratique, toutes
les options utilisables dans le mode de commande de vim peuvent être fixées définitivement dans ce
fichier. Vous obtiendrez de l’aide sur ces options grâce à la commande « :help » de vim.
177
Chapitre 6. Administration du système de base
# Première section :
#command
\e[B forw-line
\e[A back-line
\e[6~ forw-scroll
\e[5~ back-scroll
\177 back-screen
^H back-screen
\e[3~ back-screen
\e[2~ visual
\e[1~ goto-line
\eOH goto-line
\e[4~ goto-end
\eOF goto-end
\eOM forw-line
# Deuxième section :
#line-edit
\177 backspace
^H backspace
\e[3~ delete
\e[1~ home
\e[H~ home
\eOH home
\e[4~ end
\e[F~ end
\eOF end
\e[5~ up
\e[6~ down
178
Chapitre 6. Administration du système de base
\e[2~ insert
\e[E insert
\e[G insert
\eOE insert
\eOo insert :
\eOj insert *
\eOm insert -
\eOk insert +
\eOl insert +
\eOM insert
\eOw insert 7
\eOx insert 8
\eOy insert 9
\eOt insert 4
\eOu insert 5
\eOv insert 6
\eOq insert 1
\eOr insert 2
\eOs insert 3
\eOp insert 0
\eOn insert .
# Troisième section :
#env
LESSCHARSET=latin1
Conformément à un usage courant, les commentaires sont introduits par le caractère dièse (’#’) dans ce
fichier de configuration. Cependant, certains commentaires sont utilisés pour identifier le début des trois
sections du fichier. Il s’agit des commentaires « #command », « #line-edit » et « #env ». Il ne faut
donc surtout pas supprimer ces commentaires dans votre fichier de configuration.
Encore une fois, le caractère d’échappement est symbolisé par la chaîne de caractère « \e ». De même,
les caractères de contrôle sont représentés par la notation classique « ^C », où C est la touche utilisée en
combinaison avec CTRL pour générer ce caractère de contrôle. Notez que, contrairement au fichier de
configuration /etc/vimrc, ces notations peuvent être utilisées directement dans le fichier de
configuration de less.
Ce fichier de configuration pourra être compilé avec le programme lesskey afin de générer le fichier
binaire utilisé par less. Pour cela, il faudra simplement utiliser la syntaxe suivante :
lesskey fichier
où fichier est le nom du fichier de configuration à compiler. Le fichier binaire généré est par défaut
celui référencé par la variable d’environnement LESSKEY. Si cette variable n’est pas définie, un fichier
.less sera créé dans le répertoire personnel de l’utilisateur.
179
Chapitre 6. Administration du système de base
Configuration de la souris
L’installation de la souris est une opération très simple à réaliser. La seule chose importante est de bien
connaître les différents types de souris et de ne pas les confondre. Autrefois, la plupart des souris étaient
des souris connectées sur le port série (souris sérielles). Aujourd’hui, ces souris se font de plus en plus
rares, et le port de prédilection est le port PS/2. Ce port a été introduit par IBM dans ses ordinateurs PS/2
et est quelque peu plus pratique que le port série, car il définit une interface standard pour toutes les
souris. De plus, il permet de dégager un des ports série, ce qui simplifie la configuration des modems. Le
port PS/2 ressemble au port clavier du même type, et en fait on peut se tromper et brancher la souris à la
place du clavier et inversement. Il ne faut surtout pas confondre les souris PS/2 avec les souris Bus, qui
ont été vendues autrefois et que l’on ne trouve quasiment plus à présent. Ces souris pouvaient se
connecter sur des cartes spéciales voire, parfois, sur la carte graphique.
Pour que l’installation de la souris se fasse correctement, il faut s’assurer que les options concernant la
souris ait bien été définies dans la configuration du noyau de Linux. Cela n’est pas nécessaire pour les
souris série. Vous pouvez consulter la la section intitulée Compilation du noyau Linux dans Chapitre 7
pour plus de détails sur la configuration du noyau. Lorsque cette étape est faite, il ne reste plus qu’à
indiquer au programme de gestion de la souris à quel type de souris il a affaire. Ce programme, nommé
gpm, permet d’utiliser la souris en mode texte. La configuration de la souris pour XWindow sera vue
dans le Chapitre 10.
La configuration de gpm se fait normalement par l’intermédiaire du programme de configuration de votre
distribution. Lorsqu’on n’utilise pas XWindow, gpm est lancé automatiquement au démarrage. Il se peut
que votre programme de configuration vous demande le type de souris à utiliser. Dans ce cas, il faut
choisir le bon type, faute de quoi gpm ne fonctionnera pas correctement. Attention, si vous désirez
utiliser une souris à molette (souris disposant d’une petite roue entre les deux boutons, et permettant de
faire défiler le contenu des fenêtres), le type de souris à utiliser est « imps2 » et non simplement « ps2 ».
Pour avoir la liste des types de souris gérés par gpm, il suffit de le lui demander avec la ligne de
commande suivante :
gpm -t help
où type est le type de la souris que gpm doit utiliser et /dev/mouse est un lien vers le fichier spécial de
périphérique gérant votre souris.
Configuration de l’imprimante
Il existe deux systèmes d’impression concurrents sous Linux : LPRng (« Line Printer Next Generation »)
et CUPS (« Common Unix Printing System »). LPRng est une évolution du système initial, LPR, qui est
devenu très vite obsolète en raison de l’évolution des technologies d’impression. En effet, celui-ci a été
conçu à l’époque où les imprimantes étaient encore des imprimantes matricielles et ne pouvaient
imprimer qu’en noir et blanc. CUPS, quant à lui, a été créé pour fournir une infrastructure complètement
180
Chapitre 6. Administration du système de base
nouvelle et pour s’affranchir des limitations de LPRng. C’est donc la solution d’avenir, mais il n’est pas
rare de trouver encore des systèmes basés sur LPRng. D’autre part, la compatibilité au niveau des
commandes d’impression est assurée par CUPS, ce qui fait que la présentation de LPRng n’est pas
superflue.
Quelle que soit la technologie d’impression utilisée, l’imprimante reste généralement accessible par un
port local. En effet, la plupart des imprimantes sont connectées sur le port parallèle ou sur un port USB
(les imprimantes professionnelles mises à part, celles-ci disposant généralement d’une interface réseau).
Nous supposerons donc dans la suite de ce document que l’imprimante est connectée soit sur le port
parallèle (accessible via le fichier spécial de périphérique /dev/lp0), soit sur un port USB (accessible
via le fichier /dev/usb/lp0).
181
Chapitre 6. Administration du système de base
182
Chapitre 6. Administration du système de base
Comme on le voit, avec APSFILTER, le langage d’impression universel est le langage PostScript. Bien
entendu, cela est idéal si l’on dispose effectivement d’une imprimante PostScript, mais même dans le cas
contraire, les impressions se font parfaitement grâce à GhostScript.
183
Chapitre 6. Administration du système de base
La première option vous permet de choisir le pilote de l’imprimante, qui donc en général est un des
pilotes fournis avec l’interpréteur GhostScript. Vous devez sélectionner le pilote de votre imprimante ou,
à défaut, celui de l’imprimante qui s’en rapproche le plus. La deuxième option vous permet de
sélectionner l’interface de l’imprimante. Vous pourrez indiquer le port de l’imprimante ou, s’il s’agit
d’une imprimante réseau, la manière d’y accéder. Les autres options du menu quant à elles sont
relativement simples, et vous permettront respectivement de sélectionner le format du papier, la qualité et
le mode d’impression, ainsi que la résolution de l’imprimante.
Vous pourrez (et devriez) tester la configuration ainsi définie avec l’option ’T’. Si le résultat vous
convient, installez l’imprimante avec l’option ’I’. Vous pouvez installer plusieurs imprimantes ou
plusieurs files d’impression pour la même imprimante en répétant les étapes précédentes. Au final,
terminez l’installation avec l’option ’Q’, et envoyez une carte postale à l’auteur du logiciel.
Commandes d’impression
La commande d’impression de LPRng est la classique commande lpr (abréviation de l’anglais « off Line
PRint », ce qui signifie « impression différée »). Cette commande est très simple à utiliser, comme le
montre la syntaxe suivante :
lpr fichier
où fichier est le nom du fichier à imprimer. Cette commande se contente de placer le fichier à
imprimer dans un répertoire affecté à la file d’attente des travaux d’impression. Le travail d’impression
est ensuite effectué par le démon lpd, qui fait passer chaque fichier à imprimer à travers la série de filtres
pour le convertir dans le langage de l’imprimante, puis qui alimente l’imprimante.
La liste des travaux d’impression en attente peut être consultée avec la commande lpq. Chaque travail en
attente porte un numéro, grâce auquel on peut le manipuler. Entre autres opérations, il est possible de
l’abandonner à l’aide de la commande lprm.
184
Chapitre 6. Administration du système de base
Enfin, pour consulter et contrôler l’état des files d’impression, on peut utiliser la commande lpc. Cette
commande peut prendre des options en ligne de commande afin de préciser l’opération à effectuer. Par
exemple, l’option status permet d’obtenir l’état de chacune des files d’impression. Les autres options
permettent d’arrêter le travail en cours, de le suspendre, de désactiver l’imprimante pour les travaux
suivants, et inversement de relancer les travaux d’impression sur cette file.
option = valeur
Il existe un grand nombre d’options, nombre d’entre elles sont facultatives. Cependant, il est impératif
que le démon lpd puisse trouver l’imprimante à utiliser. Par conséquent, il faut lui fournir au moins l’une
des deux options suivantes :
• l’option lp permet de spécifier le fichier spécial de périphérique auquel l’imprimante est connectée ;
• les options rm et rp permettent de spécifier respectivement le nom d’un serveur d’impression distant
(« remote » en anglais) et de l’imprimante à utiliser sur ce serveur (« remote printer »).
Le démon lpd doit également connaître le répertoire dans lequel les travaux en attente seront stockés
(répertoire dit de « spool »). Ce répertoire peut être défini avec l’option sd.
D’autres options peuvent être utiles, comme sh (cette option ne prend pas de valeur), qui permet de
supprimer la page de garde au début de chaque impression, et mx, qui permet de spécifier la taille
maximale des travaux d’impression soumis. Cette dernière option permet de fixer des quotas
d’impression selon la taille des documents, afin de donner la possibilité aux autres documents d’être
imprimés. Cette option utilise une syntaxe particulière :
mx#taille
où taille est la taille maximale autorisée, exprimée en kilo-octets. Le fait de spécifier une taille nulle
permet de supprimer ce contrôle.
185
Chapitre 6. Administration du système de base
ascii|lp:lp=/dev/lp:sd=/var/spool/lpd/ascii:mx#0:sh
Comme vous pouvez le constater, il n’y a aucune spécification des filtres d’impression à utiliser dans cet
exemple. Les travaux sont donc directement envoyés à l’impression, sans traduction préalable. Il est donc
nécessaire qu’ils soient déjà au format de l’imprimante. Si l’on veut utiliser des filtres d’impression, il
faut utiliser l’une des options if, cf, df, gf, nf, rf, tf ou vf. Chacune de ces options permet de
spécifier la ligne de commande d’un filtre d’impression spécifique. Le choix du filtre utilisé pour un
travail d’impression est effectué lors de l’appel à la commande lpr, à l’aide d’une option en ligne de
commande. Le filtre if est le filtre par défaut, il n’y a donc besoin d’aucune option pour l’utiliser. Les
autres filtres peuvent être sélectionnés respectivement avec les options -c, -d, -g, -n, -f, -t et -v.
Comme on le voit, le sous-système d’impression ne reconnaît pas automatiquement le format de fichier
utilisé. D’autre part, le nombre de filtres utilisables est limité à 8, ce qui peut ne pas suffire étant donné la
prolifération des formats de fichiers. Pour résoudre ce problème, APSFILTER utilise un filtre générique
(utilisé en tant que filtre par défaut) qui, lui, est capable de reconnaître le format du fichier à imprimer et
de le diriger vers un autre filtre ou une série de filtres. Comme on l’a vu ci-dessus, l’ultime filtre utilisé
est en général l’interpréteur GhostScript. Ainsi, il n’y a plus de limite sur le nombre de filtres utilisables,
et les filtres sont sélectionnés automatiquement en fonction de la nature du document à imprimer.
186
Chapitre 6. Administration du système de base
187
Chapitre 6. Administration du système de base
Listen [Link]:631
Cette commande permet de ne répondre qu’aux requêtes provenant de la machine locale, sur le port
dédié au protocole d’impression IPP, à savoir le port 631. Bien entendu, vous pourrez ajouter d’autres
machines si vous disposez d’un réseau local, simplement en ajoutant d’autres options Listen. Notez
que l’usage de cette option est incompatible avec l’option Port, qu’il faut donc commenter au préalable,
faute de quoi cupsd ne répondra à aucune requête.
Note : Comme on le verra dans le chapitre sur la configuration réseau, l’adresse réseau [Link]
représente soi-même dans les communications réseau. Cela signifie ici que seuls les clients de la
machine locale pourront utiliser le système d’impression.
188
Chapitre 6. Administration du système de base
Il est également possible de fixer des droits sur les différents répertoires de configuration de l’interface
Web, ainsi que sur les répertoires virtuels utilisés par le protocole IPP lorsque des requêtes sont faites par
les clients. Ainsi, il est possible de ne permettre l’impression que pour des clients qui vérifient certains
critères. Les règles définissant les droits d’accès aux répertoires sont indiquées dans des sections
Location, dont la syntaxe est similaire à celle des balises du langage XML. Par exemple, la section qui
décrit les droits d’accès au répertoire de configuration /admin est typiquement de la forme suivante :
<Location /admin>
AuthType Basic
AuthClass System
Order Deny,Allow
Deny From All
Allow From [Link]
</Location>
Vous constaterez que plusieurs informations sont données dans ce type de section. Premièrement, le type
d’authentification utilisé est spécifié à l’aide de l’option AuthType. Les différentes valeurs possibles
pour cette option sont décrites dans le tableau suivant :
Valeur Signification
None Aucune identification n’est faite.
Basic L’identification est réalisée via les mécanismes d’authentification HTML classique.
cupsd attend ici un nom d’utilisateur et un mot de passe Unix classiques, qui
doivent donc exister dans le fichier /etc/passwd. Notez qu’avec ce mode
d’authentification, le mot de passe est envoyé en clair du navigateur Internet utilisé
pour réaliser la connexion vers le serveur Web du démon cupsd. Cela signifie que
si la communication ne se fait pas en local, une tierce personne pourrait voir le nom
d’utilisateur et le mot de passe en écoutant les communications résau. Ce mode
d’authentification est donc extrêmement dangereux.
Digest L’identification se fait de la même manière que pour le mode Basic, mais le nom
de l’utilisateur et le mot de passe ne sont pas transmis en clair. Au lieu de cela,
seules les signatures de ces informations, obtenues à l’aide d’une fonction de
chiffrement à sens unique, sont transmises sur le réseau. Il n’est donc plus possible
de déterminer le nom de l’utilisateur et son mot de passe en clair. De plus, les mots
de passe utilisés ne sont pas forcément les mêmes que ceux du système, et ils sont
stockés de manière indépendante dans le fichier passwd.md5 du répertoire
/etc/cups/. Ces mots de passe peuvent être ajoutés avec la commande
lppasswd. Ce mode d’authentification est donc plus sûr, notez toutefois qu’il reste
possible pour un attaquant de se connecter avec le nom de l’utilisateur et son mot
de passe chiffré une fois ceux-ci capturés.
Pour chaque méthode d’authentification, il est possible de préciser le critère utilisé pour vérifier les droits
d’accès du client. Ce critère est fixé par l’option AuthClass. Celle-ci peut prendre les valeurs
suivantes :
189
Chapitre 6. Administration du système de base
Valeur Signification
Anonymous Aucune critère n’est utilisé, tout le monde peut accéder à la page spécifiée dans la
directive Location. Il va de soi que l’utilisation de ce critère avec les autres modes
d’authentification que None est absurde.
User L’utilisateur authentifié doit être un utilisateur du système Unix sous-jacent.
System L’utilisateur authentifié doit être membre du groupe système. Ce groupe est, par
défaut, le groupe sys, mais il peut être modifié à l’aide de l’option SystemGroup
du fichier de configuration [Link].
Group L’utilisateur authentifié doit être membre du groupe spécifié par l’option
AuthGroupName du fichier de configuration [Link]. Ce groupe doit être un
des groupes du système Unix sous-jacent, sauf si le mode d’authentification
Digest est utilisé. En effet, dans ce cas, le groupe de l’utilisateur doit être celui
stocké avec son mot de passe dans le fichier de mots de passe de CUPS
(c’est-à-dire le fichier /etc/cups/passwd.md5).
Les mots de passe cups utilisés pour l’authentification dans le mode d’authentification Digest peuvent
être ajoutés à l’aide de la commande lppasswd. Cette commande permet également de fixer le groupe de
l’utilisateur lorsque le critère d’accès utilisé est le critère Group. La syntaxe générale de cette commande
est la suivante :
où groupe est le nom de groupe de l’utilisateur (uniquement utilisé pour le mode d’authentification
Digest) et utilisateur est son nom d’utilisateur. À l’issue de cette commande, lppasswd demande
deux fois le mot de passe de l’utilisateur et met à jour le fichier passwd.md5.
La deuxième série d’informations fournie dans les sections Location sont les droits sur les machines
capables d’accéder à la page Web. L’option Order indique l’ordre d’évaluation des directives suivantes.
Il est recommandé d’interdire en premier, et de regarder ensuite si la machine cliente a le droit de se
connecter. C’est ce qui est fait dans l’exemple précédent, avec les options « Deny From All » et
« Allow From [Link] », qui indiquent que seule la machine locale a le droit de se connecter au
serveur d’impression.
190
Chapitre 6. Administration du système de base
pas recommandé. En effet, la commande crontab permet d’installer, de supprimer et de consulter les
fichiers crontab de chaque utilisateur, et ce de manière sûre.
La commande crontab peut être utilisée pour afficher le contenu du fichier de configuration de
l’utilisateur qui l’appelle, à l’aide de l’option -l :
crontab -l
crontab -r
Enfin, l’option -e permet d’éditer le fichier crontab, à l’aide de l’éditeur spécifié dans la variable
d’environnement VISUAL ou EDITOR. Par défaut, l’éditeur vi sera utilisé.
En tant qu’administrateur du système, il est possible de modifier les paramètres pour n’importe quel
utilisateur. Pour cela, il faut préciser le login de l’utilisateur avec l’option -u. Il est recommandé
d’utiliser également l’option -u si l’on a effectué un su, car la commande crontab peut ne pas pouvoir
déterminer l’utilisateur qui l’a appelé dans ce cas.
Le format des fichiers crontab est suffisamment riche pour permettre de spécifier avec finesse les
conditions d’exécution des opérations programmées. En général, le début du fichier contient la définition
de variables d’environnement utilisées par crontab. La suite du fichier est réservée aux commandes
programmées. Chaque programmation est réalisée sur une ligne du fichier crontab. Les lignes
contiennent 5 champs spécifiant la date et l’heure à laquelle la commande doit être exécutée, un nom
d’utilisateur éventuel et la commande elle-même. Le nom d’utilisateur ne doit être spécifié que dans le
fichier /etc/crontab, qui définit les commandes du système. Il spécifie alors au nom de quel
utilisateur la commande doit être exécutée. Pour les fichiers crontab propres à chaque utilisateur, il n’est
bien entendu pas nécessaire d’indiquer ce nom.
Les 5 champs de la partie décrivant la date d’exécution de la commande fournissent respectivement les
informations suivantes :
191
Chapitre 6. Administration du système de base
Il est possible d’utiliser un intervalle de valeurs pour chacun de ces champs, en indiquant la première et
la deuxième valeur, séparées d’un tiret. Il est également possible de faire une liste de valeurs et
d’intervalles, en séparant chaque donnée par une virgule. Si l’on veut spécifier toutes les valeurs
possibles pour un champ, on peut utiliser le caractère ’*’. Enfin, il est possible d’indiquer que la
commande doit être exécutée toutes les n valeurs pour chaque champ. Pour cela, il suffit de faire suivre le
champ d’une barre oblique de division (’/’) et du nombre n. Ainsi, si l’on trouve l’expression « */3 »
pour les heures, la commande sera exécutée toutes les trois heures.
La spécification de la commande doit être faite sur une seule ligne. Le caractère de pourcentage (’%’) a
une signification spéciale, sauf s’il est précédé d’un antislash (’\’). Les données qui suivent le premier
pourcentage sont passées telles quelles dans l’entrée standard de la commande. Les caractères
pourcentages suivants sont interprétés comme des saut de lignes (donc une validation). Ainsi, la
commande suivante :
rm -i [Link]%y%
permet de supprimer le fichier [Link] et de répondre ’y’ à la commande rm. Le caractère ’y’ est
passé ici dans le flux d’entrée standard de rm.
Comme vous pouvez le voir, le fichier /etc/crontab du système permet de programmer des opérations
périodiques, comme les sauvegardes, la destruction des fichiers temporaires, ou toute autre tâche de
maintenance. Ne vous étonnez donc pas si votre ordinateur semble s’activer tout seul régulièrement, à
heure fixe (par exemple, sur le coup de 11 heures ou minuit). C’est le fonctionnement normal de votre
système, qui s’occupe de toutes les tâches ménagères qu’il s’est réservé pour une heure où normalement
tout le monde dort...
Les utilisateurs peuvent également définir leur propre crontab pour effectuer les opérations périodiques
qu’il désirent. Par exemple, ils peuvent programmer une commande qui leur rappellera un rendez-vous.
Gestion de l’énergie
192
Chapitre 6. Administration du système de base
d’exploitation est en charge de lire ces informations et d’interpréter les opérations définies dans la table
ACPI. Ainsi, c’est bien le système d’exploitation qui se charge de la gestion de l’ordinateur.
L’implémentation de l’interpréteur ACPI de Linux est l’implémentation de référence réalisée par Intel.
Dans le meilleur des mondes, il ne devrait donc y avoir aucun problème pour utiliser l’ACPI sous Linux.
Malheureusement, bon nombre de BIOS fournis par les fabricants sont bogués et ne respectent pas la
norme ACPI. En effet, l’implémentation ACPI de Microsoft est incorrecte et son interpréteur accepte des
erreurs de syntaxe que leur compilateur ACPI laisse passer (ce qui somme toute est cohérent, ils ne
pouvaient pas faire moins sans que le résultat ne cesse de fonctionner). Ce n’est pas le cas de
l’interpréteur ACPI de Linux puisque, par définition, elle ne peut se conformer à celle de Microsoft et
être compatible bogue à bogue.
Le résultat est, hélas, catastrophique, puisque les fonctionnalités ACPI de ces machines ne peuvent pas
être utilisées totalement sous Linux. Microsoft aurait voulu exploiter sa position dominante et corrompre
le standard d’Intel pour isoler les concurrents qu’il n’aurait pas fait mieux (avis personnel). La seule
solution est de récupérer la table ACPI du BIOS, de la désassembler pour en obtenir le code source, et de
tenter de la recompiler avec le compilateur d’Intel (pas celui de Microsoft). Les erreurs apparaissent
donc et peuvent ainsi être corrigées. Une fois la table ACPI corrigée, il faut soit convaincre le fabricant
de l’ordinateur de mettre un nouveau BIOS à disposition, soit paramétrer le noyau pour qu’il charge cette
table au lieu de prendre celle du BIOS pour argent comptant. Corriger une table ACPI boguée est une
opéraiton extrêmement technique et absolument hors sujet, et faire en sorte que le noyau l’utilise
nécessitait de patcher les sources du noyau jusqu’à la version 2.6.9. À présent, cela est faisable
directement à partir du programme de configuration du noyau, mais je n’en parlerais pas plus ici. Vous
pouvez consulter le site web de l’ACPI ([Link] pour plus de détails à ce sujet. Si
vous rencontrez des problèmes de ce type, je vous suggère de trouver un Linuxien confirmé, ou de faire
une croix sur les fonctionnalités ACPI qui ne sont pas opérationnelles sous Linux.
• l’option « Power Management support » permet d’activer les fonctionnalités de mise en veille du
système sur disque. Il est possible ainsi de sauvegarder l’ensemble du système sur la partition
d’échange du système, et de le redémarrer et le restaurer (options « Suspend-to-Disk Support »
et « Default resume partition »). Cette option permet également d’activer le menu de gestion
de l’énergie par APM.
• le menu « ACPI (Advanced Configuration and Power Interface) Support » permet d’activer les
fonctionnalités ACPI. Il donne accès à l’option « ACPI Support », qui elle-même donne accès à de
nombreuses options pour les différents composants gérant l’ACPI.
• le menu « CPU Frequency scaling » donne accès à l’option « CPU Frequency scaling ». Cette
option permet d’activer la gestion des fonctions d’économie d’énergie des processeurs pour les
portables. Ces processeurs sont en effet capables de changer de fréquence d’exécution pour, lorsque
l’ordinateur est utilisé pour des tâches peu consommatrices de ressources, abaisser la consommation de
l’ordinateur et augmenter l’autonomie du système lorsqu’il fonctionne sur batterie. Les sous-options
permettent de spécifier les politiques de gestion de l’énergie ainsi que le type de processeur utilisé.
193
Chapitre 6. Administration du système de base
Les fonctionnalités ACPI prises en charge par le noyau sont exposées à l’utilisateur au travers des
systèmes de fichiers virtuels /proc/ et /sys/.
Le répertoire /proc/acpi/ contient essentiellement un sous-répertoire pour chaque composant ACPI
pris en charge par le noyau. Dans chacun de ces sous-répertoires, vous trouverez des fichiers contenant
les informations courantes sur ces différents sous-systèmes.
Le sous-répertoire /sys/power/ vous permettra quant à lui de modifier le niveau d’économie d’énergie
utilisé par votre ordinateur. En particulier, le fichier state vous permettra de le suspendre ou de le
mettre en veille. Pour cela, il vous faut simplement écrire le mode désiré dans ce fichier avec la
commande echo :
où mode est le mode désiré. Vous obtiendrez la liste des modes acceptés par Linux en lisant ce fichier
avec la commande cat :
cat /sys/power/state
En général, les modes standby, mem et disk sont disponibles. standby correspond à la mise en veille
simple de l’ordinateur. mem permet de réaliser une suspension du système en mémoire, et correspond
donc à un niveau d’économie d’énergie supérieur. Enfin, disk permet d’éteindre complètement
l’ordinateur après avoir stocké son état dans la partition d’échange. Cette commande correspond au
niveau maximum d’économie d’énergie.
Note : Ces fonctionnalités sont relativement expérimentales et peuvent ne pas toutes fonctionner.
Généralement, seul la suspension sur disque semble fonctionner, souvent sous condition que
certains gestionnaires de périphériques soient déchargés avant la mise en veille.
Si vous disposez d’un portable, il est probable que votre processeur soit capable de fonctionner à
différentes fréquences. Il est possible de lire la fréquence courante et de la modifier par l’intermédiaire
des fichiers du répertoire /sys/devices/system/cpu/cpu0/cpufreq/. La fréquence courante peut
être lue via le fichier cpuinfo_cur_freq. Il n’est pas possible de modifier directement cette valeur.
Toutefois, le noyau donne la possibilité de la modifier via la politique de gestion d’énergie via le fichier
scaling_governor. Les valeurs possibles pour ce fichier peuvent être lues dans le fichier
scaling_available_governors.
Généralement, les politiques disponibles sont powersave et performance. Ces politiques permettent
respectivement de changer la fréquence du processeur vers les fréquences indiquées dans les fichiers
scaling_min_freq et scaling_max_freq. Ce sont donc dans ces fichiers que l’on pourra définir les
fréquences utilisables. La liste des fréquences accessibles est fournie par le fichier
scaling_available_frequencies.
194
Chapitre 6. Administration du système de base
Le démon ACPI
Le noyau expose les fonctionnalités de surveillance de l’ordinateur de l’interface ACPI via le fichier
spécial de périphérique /proc/acpi/event. Dès qu’un événement se produit (passage de
l’alimentation sur batterie pour un portable, hausse anormale de la température du processeur, appui sur
le bouton de mise en marche / arrêt, etc.), une ligne signalant cet événement est ajoutée à ce fichier
virtuel.
Les applications ne doivent pas lire ce fichier directement, cette tâche étant normalement attribuée au
démon acpid. Ce démon surveille le fichier d’événement du noyau et fournit un mécanisme de
notification plus générique (c’est à dire moins spécifique à Linux) aux applications. Ainsi, les
applications peuvent se connecter au démon ACPI et être prévenue des événements que le noyau émet.
Le démon ACPI permet aussi de programmer des actions en réponse aux événements ACPI. Pour cela, il
consulte les fichiers de configuration placés dans le répertoire /etc/acpi/events/ et exécute les
actions qui y sont enregistrées.
Ces actions sont définies par des paires de lignes evénément / action permettant de renseigner, pour
chaque type d’événement, l’action à effectuer. Les lignes de définition des événements utilisent des
expressions rationnelles pour sélectionner les événements ou les groupes d’événements associés à
l’action. Les lignes d’action quant à elles permettent d’indiquer la ligne de commande à exécuter en cas
d’apparition de ces événements.
Par exemple, le fichier de configuration par défaut capte l’ensemble des événements ACPI et les passe
aux script /etc/acpi/acpi_handler.sh à l’aide de ces deux simples lignes :
event=.*
action=/etc/acpi/acpi_handler.sh %e
L’expression rationnelle utilisée dans la ligne de définition des événements signale que toute chaîne de
caractères doit correspondre. L’action en réponse est l’exécution du script acpi_handler.sh. La chaîne de
caractères complète définissant l’événement est passée en premier paramètre et est représentée par le
symbole %e.
Si les événements intéressants étaient tous les événements concernant le bouton d’alimentation de
l’ordinateur, l’expression rationnelle utilisée aurait été la suivante :
event=button power.*
Comme vous pouvez le constater, le format utilisé pour les descriptions des événements envoyés par le
noyau doit être connu pour pouvoir écrire les expressions rationnelles devant les sélectionner. Ces
descriptions sont envoyées par le script par défaut acpi_handler.sh dans les fichiers de traces du
système. Vous pourrez donc les y trouver après avoir généré les événements ACPI corresondants.
Pour donner un exemple, voici comment ce script peut être modifié afin de faire en sorte que la fermeture
du couvercle d’un portable le mette en veille immédiatement sur disque :
#!/bin/sh
195
Chapitre 6. Administration du système de base
case "$1" in
button)
case "$2" in
power) /sbin/init 0
;;
# Traite l’événement de fermeture du couvercle :
lid)
# Vérifie que le couvercle est fermé :
grep -q "close" /proc/acpi/button/lid/LID/state
if [ $? -eq 0 ] ; then
# Met en veille prolongée l’ordinateur :
/usr/sbin/[Link] disk
fi
;;
# Trace les événements de type "bouton" non traités :
*) logger "ACPI action $2 is not defined"
;;
esac
;;
# Trace tous les autres événements non traités :
*)
logger "ACPI group $1 / action $2 is not defined"
;;
esac
Ce script capte l’événement lid (« couvercle » en anglais) et vérifie l’état du capteur de fermeture du
couvercle, accessible via le fichier d’état /proc/acpi/button/lid/LID/state (l’emplacement de ce
fichier peut varier selon les ordinateurs). Si ce fichier indique que le couvercle est fermé, le script
utilitaire [Link] est appelé pour mettre en veille l’ordinateur.
Ce dernier script utilise le fichier /sys/power/state pour effectuer cette mise en veille :
#!/bin/sh
Comme vous pouvez le constater, il est nécessaire de prendre en compte l’horloge système avant et après
une suspension. En effet, sans cela, l’horloge système reprendrait exactement à la date de la suspension
lors du réveil. Le stockage de l’heure courante avant suspension est également nécessaire, afin de
maintenir le fichier de configuration /etc/adjtime cohérent.
Note : Une autre solution aurait été de faire le test sur l’état du bouton dans le script de suspension
et d’appeler celui-ci directement en réponse à l’événement « button lid ».
196
Chapitre 7. Notions de compilation et
configuration du noyau
Ce chapitre présente les notions de base de compilation et de fichiers sources de programmes. Il est
certain que le lecteur de ce document n’a pas forcément l’intention de programmer sous Linux,
cependant, il est nécessaire de connaître les notions qui vont être décrites ici. En effet, il n’est pas rare,
voire il est même courant, d’avoir à recompiler une application lorsqu’on travaille avec Linux. Cela n’est
pas étonnant, quand on sait que toute bonne installation passe par la recompilation du noyau de Linux !
La raison de cet état de fait provient sans nul doute du fait que la licence GNU impose de fournir les
fichiers sources aux utilisateurs d’une part, et que le langage C et Unix sont historiquement fortement
liés.
Nous allons commencer par donner la définition des notions de base et les étapes intervenant dans le
processus de génération des fichiers binaires des programmes. Nous verrons ensuite comment installer
(et compiler !) la suite de compilateurs GCC du projet GNU, et nous présenterons les étapes intervenant
dans la compilation et l’installation d’un nouveau noyau. Ces informations pourront être utiles pour la
lecture du chapitre traitant de la configuration du matériel puisque, bien souvent, la prise en charge d’un
périphérique nécessite la compilation de ses pilotes au niveau du noyau.
Notions de base
197
Chapitre 7. Notions de compilation et configuration du noyau
excellence.
Note : Par exemple, l’expression mathématique « x=1 » est toujours valide, c’est une simple
équation. En revanche, elle n’est pas toujours vraie, cela dépend de la valeur de x. En particulier, si
x représente 3, on a « 3 = 1 », ce qui est valide, mais faux. Notez bien la différence.
Un langage de programmation est un langage formel qui permet de définir les tâches qu’un ordinateur
doit effectuer, et de décrire les objets informatiques sur lesquels il doit travailler. Un langage de
programmation est donc un code, et tout programme doit être écrit dans un tel langage. Pratiquement, les
langages de programmation sont des langages très simples, disposant de constructions du type « si ...
alors ... » ou « pour chaque ... fait ... ». Les programmes étant écrits avec de tels
langages, il est clair qu’un programme ne fait que ce qui a été écrit : ni plus, ni moins. Il faut donc tout
dire à l’ordinateur quand on écrit un programme, ce qui en général est relativement fatigant et compliqué.
C’est le prix à payer pour la rigueur de l’informatique : l’ordinateur ne se trompe jamais, parce qu’il ne
fait qu’obéir aux ordres donnés dans un langage formel (donc précis). Celui qui se trompe, c’est en
général le programmeur, et assez couramment l’utilisateur.
Note : Notez qu’un programme est un texte valide s’il vérifie la grammaire du langage formel dans
lequel il est écrit. Cela ne l’empêchera pas de faire n’importe quoi si on l’exécute. Un programme
« vrai » est donc un programme syntaxiquement correctement écrit et qui en plus fait ce que l’on
désire qu’il fasse. Il n’y en a pas beaucoup... surtout que dans bien des cas, on ne s’est jamais posé
clairement la question de savoir ce que doivent faire les programmes que l’on écrit !
Le C est un langage de programmation relativement simple, qui se trouve sur tous les types d’ordinateurs
et de systèmes d’exploitation. Les programmes sont plus difficile à écrire en C que dans d’autres
langages de programmation, mais ils sont plus performants. Le C est très utilisé pour écrire les systèmes
d’exploitation : le noyau Linux lui-même est écrit en C. Le C++ est un langage plus évolué, qui est
dérivé du C. Il est beaucoup plus riche, et il permet d’écrire des programmes plus compliqués et de les
faire évoluer plus facilement. Bien que plus lents que ceux écrits en C, les programmes écrits en C++
sont toujours très performants par rapport à ceux écrits dans d’autres langages.
Les programmes sont en général écrits dans un certain nombre de fichiers. Ces fichiers sont appelés les
fichiers sources, du fait qu’ils sont à l’origine du programme. Le texte de ces fichiers est appelé le code
source, ou plus simplement le code.
Il va de soi que le code source est écrit dans un langage de programmation, qui n’est pas compréhensible
tel quel par le matériel de l’ordinateur. Pour exécuter un programme à partir de son code source, il n’y a
que deux solutions :
• disposer d’un autre programme, nommé interpréteur, capable de lire le code source et d’effectuer les
opérations décrites dans le code source ;
• disposer d’un autre programme, nommé compilateur, capable de traduire le code source en langage
binaire, qui sera alors directement exécutable par l’ordinateur.
Les programmes interprétés sont fatalement relativement lents, puisque l’interpréteur doit analyser en
permanence les fichiers sources pour le traduire en opération à exécuter à la volée.
198
Chapitre 7. Notions de compilation et configuration du noyau
En revanche, les programmes compilés sont beaucoup plus rapides à l’exécution, puisque la phase
d’analyse du code source a été réalisée au préalable et se fait en dehors de la phase d’exécution. Ces
programmes peuvent donc s’exécuter nativement, sans être ralenti par l’interpréteur.
Note : Si vous avez bien suivi, on se trouve face au problème de l’œuf et de la poule. En effet, les
interpréteurs et les compilateurs sont eux-mêmes des programmes écrits dans un langage
informatique. Quel est donc le premier compilateur ou interpréteur ? Ce problème a effectivement dû
être résolu au début de l’informatique, de la manière la plus simple : les premiers programmeurs
entraient directement le langage machine en binaire dans les ordinateurs (via les câblages ou les
cartes perforées...). Quand on sait le travail que cela représentait, et le nombre d’erreurs que cela a
pu générer, on comprend facilement pourquoi les compilateurs et les interpréteurs font partie des
tous premiers programmes qui ont été développés...
Dans les systèmes Unix, les deux types de programmes existent. Les programmes interprétés constituent
ce que l’on appelle des scripts. Le système utilise le shell pour les interpréter. La plupart des opérations
d’administration du système utilisent des scripts, car il est toujours plus facile d’écrire et de tester un
script que d’écrire un programme en C. Les programmes compilés sont notamment le noyau lui-même,
199
Chapitre 7. Notions de compilation et configuration du noyau
le shell, les commandes de base et les applications. Ce sont eux qui en fin de compte effectuent le travail,
et ils sont souvent appelés à partir de scripts. Nous avons déjà vu des exemples de scripts lors de la
configuration du système. Pour l’instant, nous allons nous intéresser au langage C et au processus de
compilation.
La compilation est l’opération qui consiste à lire un fichier source et à le traduire dans le langage binaire
du processeur. Ce langage est absolument incompréhensible par les êtres humains, cependant, il existe un
langage de programmation qui permet de coder directement le binaire : il s’agit de l’assembleur.
En général, le processus de compilation génère un fichier binaire pour chaque fichier source. Ces fichiers
binaires sont nommés fichiers objets, et porte de ce fait l’extension « .o » (ou « .obj » dans les systèmes
Microsoft). Comme un programme peut être constitué de plusieurs fichiers sources, il faut regrouper les
fichiers objets pour générer le fichier exécutable du programme, fichier que l’on appelle également le
fichier image en raison du fait que c’est le contenu de ce fichier qui sera chargé en mémoire par le
système pour l’exécuter et qu’il contient donc l’image sur disque des instructions des programmes en
cours d’exécution. L’opération de regroupement des fichiers objets pour constituer le fichier image
s’appelle l’édition de liens, et elle est réalisée par un programme nommé le linker (éditeur de liens en
français). Ce programme regarde dans tous les fichiers objets les références partielles aux autres fichiers
objets et, pour chaque « lien » ainsi trouvé, il complète les informations nécessaires pour en faire une
référence complète. Par exemple, un fichier source peut très bien utiliser une fonctionnalité d’un autre
fichier source. Comme cette fonctionnalité n’est pas définie dans le fichier source courant, une référence
partielle est créée dans le fichier objet lors de sa compilation, mais il faudra tout de même la terminer en
indiquant exactement comment accéder à la fonctionnalité externe. C’est le travail de l’éditeur de liens,
lorsqu’il regroupe les deux fichiers objets.
Certains fichiers objets sont nécessaires pour tous les programmes. Ce sont notamment les fichiers objets
définissant les fonctions de base, et les fonctions permettant d’accéder au système d’exploitation. Ces
fichiers objets ont donc été regroupés dans des bibliothèques (également couramment appelées
« librairies »), que l’on peut ainsi utiliser directement lors de la phase d’édition de liens. Les fichiers
objets nécessaires sont alors lus dans la bibliothèque et ajoutés au programme en cours d’édition de liens.
Les bibliothèques portent souvent l’extension « .a » (ou « .lib » dans les systèmes Microsoft).
Malheureusement, la solution consistant à stocker dans des bibliothèques les fonctions les plus utilisées
souffre de la duplication du code contenu dans ces bibliothèques dans tous les programmes, d’où une
200
Chapitre 7. Notions de compilation et configuration du noyau
perte de place considérable. De plus, la mise à jour d’une bibliothèque nécessite de refaire l’édition de
liens de tous les programmes qui l’utilisent, ce qui n’est pas réalisable en pratique. C’est pour cela que
les bibliothèques dynamiques ont été crées : une bibliothèque dynamique n’est pas incluse dans les
fichiers des exécutables qui l’utilisent, mais reste dans un fichier séparé. Les bibliothèques sont
regroupés dans un répertoire bien défini du système de fichiers, ce qui permet de les partager entre
différents programmes. Ainsi, la mise à jour d’une bibliothèque peut se faire sans avoir à toucher tous les
programmes qui l’utilisent. Le problème est cependant que l’édition de liens reste incomplète, parce que
les références aux objets des bibliothèques dynamiques sont toujours externes. Il existe donc un
programme spécial, l’éditeur de liens dynamiques (« ld », pour « Link Dynamically »), qui résout les
dernières références incomplètes lors du chargement de chaque programme. Les bibliothèques
dynamiques portent l’extension « .so » (pour « Shared Object »), ou « .dll » dans les systèmes Microsoft
(pour « Dynamic Link Library »).
Évidemment, le chargement des programmes est un peu plus lent avec les bibliothèques dynamiques,
puisqu’il faut réaliser l’édition de liens dynamiques lors de leur lancement. Cependant, ce processus a été
optimisé, et les formats de fichiers binaires utilisés contiennent toutes les informations précalculées pour
faciliter la tâche de l’éditeur de liens dynamiques. Ainsi, la différence de performance est devenue à
peine décelable.
Processus de génération
Classiquement, les fichiers sources C et C++ se divisent en deux grande catégories :
• les fichiers d’en-tête, qui contiennent les déclarations des symboles du programme ;
• les fichiers C (ou C++), qui contiennent leurs définitions.
Le fait de faire cette distinction entre la déclaration (qui consiste à dire : « telle chose existe ») et la
définition (qui consiste à décrire la chose précédemment déclarée) permet de faire en sorte que l’on peut
utiliser les fichiers objets sans avoir les fichiers sources. En effet, la déclaration permet de réaliser les
références partielles dans les programmes, tandis que les fichiers objets contiennent bien entendu la
définition binaire de ce qui a été déclaré.
Pour compiler un programme, on n’a donc réellement besoin que de trois types de fichiers :
En C et C++, les fichiers sources de déclaration portent l’extension « .h » (plus rarement « .hpp » pour
les fichiers de déclaration C++), et les fichiers de définition portent l’extension « .c » pour les
programmes écrits en C et « .C » (ou « .cpp », ou encore « .c++ ») pour les programmes écrits en C++.
Il va de soi que la réalisation d’un programme peut nécessiter la création d’un grand nombre de fichiers,
tous plus ou moins dépendants les uns des autres. Pour pouvoir s’y retrouver plus facilement, les
programmeurs utilisent un programme spécial : make. Ce programme est capable de réaliser toutes les
opérations nécessaires à la création des fichiers exécutables d’un programme à partir de ses fichiers
201
Chapitre 7. Notions de compilation et configuration du noyau
sources. Pour cela, il utilise un fichier contenant la définition des opérations à réaliser, ainsi que la
description des dépendances entre les différents fichiers sources. Ce fichier est appelé le fichier makefile.
Grâce à make, l’utilisateur de base que vous êtes va pouvoir compiler la plupart des programmes sans
avoir la moindre notion de programmation.
En général, la compilation d’un programme passe par les étapes suivantes :
./configure
à partir du répertoire où se trouvent les fichiers sources. Ce script effectue tous les tests sur le système et
l’environnement de développement, et génère le fichier makefile. Le programme configure est en général
fourni avec les logiciels GNU. Il permet de déterminer l’environnement logiciel et système et de générer
le fichier makefile et des fichiers d’en-têtes contenant la définition de quelques options du programme.
Dans quelques cas particuliers, vous aurez à utiliser des options de configure afin de préciser certains
paramètres. L’option --host permet d’indiquer le type de la machine cible, dans le cas où configure ne
parvient pas à le déterminer automatiquement :
--host=machine
où machine est la description de votre machine. Pour les PC fonctionnant sous Linux, cette description
est de la forme « ix86-pc-linux-gnu », où le ’x’ représente le numéro de la génération du processeur
du PC. Par exemple, pour un Pentium ou un AMD K6, la description sera « i586-pc-linux-gnu ».
L’option --enable-shared permet de générer des bibliothèques dynamiques lors de la compilation.
Cela procure un gain de place évident. Enfin, l’option --prefix permet de préciser le répertoire de base
dans lequel le programme sera installé a priori. Cette option s’utilise de la manière suivante :
--prefix=répertoire
où répertoire est le répertoire de base de l’installation. La connaissance de ce répertoire est utile aux
autres programmes pour localiser les composants qui vont être installés. Dans la plupart des cas, la
valeur par défaut du préfixe convient, mais il est parfois nécessaire de le modifier. C’est en particulier le
cas lorsque vous désirez mettre à jour un programme déjà installé et que votre distribution n’utilise pas le
répertoire par défaut. Dans ce cas, il convient d’indiquer le répertoire de base dans lequel ce programme
a été installé, afin de le remplacer au lieu de le dupliquer d’une part, et afin que les autres programmes
puissent trouver la nouvelle version à la place de l’ancienne d’autre part.
La troisième étape est très simple aussi. Il suffit de taper la commande suivante :
202
Chapitre 7. Notions de compilation et configuration du noyau
make
make install
Bien entendu, ces différentes étapes varient parfois avec le logiciel à installer. Cependant, il existe
quasiment toujours un fichier texte indiquant comment effectuer ces opérations dans le répertoire des
fichiers sources. Ce fichier porte souvent le nom de « readme », « install », ou quelque chose de
similaire.
Avec les notions que vous venez de voir, vous devriez pouvoir compiler quasiment tous les programmes
que vous pourrez récupérer sous la forme de fichiers sources. Un dernier détail cependant : la
compilation est une opération très gourmande en ressources. Cela signifie qu’elle peut consommer
beaucoup de ressources processeur, de mémoire, de disque et de temps. Pour des gros programmes, il
n’est pas rare de passer jusqu’à une heure de compilation, même sur une machine récente. Notez
également que les facteurs limitants dans les compilations sont souvent la rapidité du processeur et du
disque dur, ainsi que la quantité de mémoire vive disponible.
Compilation de GCC
La clef de voûte du processus de compilation est bien entendu la suite de compilateurs GCC du projet
GNU. Cette suite comprend un compilateur pour les languages C, C++, Objective C, Fortran, Java et
Ada. La plupart des distributions fournissent ces outils sur leur CD d’installation, mais ne les installent
pas par défaut. Il est toutefois recommandé d’installer au moins le compilateur C/C++ et les outils de
développement associés, ainsi que les fichiers d’en-tête des bibliothèques de base du système
(bibliothèque C, en-têtes de XWindow, des bibliothèques utilitaires et des bibliothèques de base des
environnements graphiques Gnome et KDE).
Le choix de la version de GCC utilisée est extrêmement important, car la stabilité et les performances du
système en dépendront directement. De plus, certains programmes exigeront une version spécifique du
compilateur pour être compilés, soit parce qu’ils n’ont été testés qu’avec cette version par les
développeurs, soit parce qu’ils utilisent une fonctionnalité qui n’est disponible que dans les versions
récentes de GCC.
La version stable de GCC la plus utilisée est sans doute la version 3.4.4. Cette version conviendra dans la
majorité des cas, et est fortement recommandée pour les possesseurs de machines dont le processeur
n’est pas de type x86 ou qui sont en 64 bits. De toutes les versions antérieures, seule la version 2.95.3 et
les versions 3.2.x et 3.3.x sont réellement utilisables. Les versions 3.0.x et 3.1.x ont toutes souffert de
bugs graves et ne doivent donc pas être utilisés. En pratique, on utilisera de préférence la version 3.4.4,
pour les raisons suivantes :
• elle permet de compiler de programmes pour les processeurs les plus récents, tels que les IA-64
d’Intel, les x86-64 d’AMD et les PowerPC d’IBM ;
203
Chapitre 7. Notions de compilation et configuration du noyau
• elle permet d’utiliser les instructions spécifiques des processeurs les plus récents, même d’architecture
x86 ;
• la bibliothèque standard C++ fournie avec cette version respecte nettement mieux la norme C++ que
les versions antérieures, et elle permet d’utiliser les caractères Unicode dans les programmes C++ ;
• elle dispose des dernières optimisations ajoutées à GCC.
On prendra garde au fait que certaines distributions utilisent régulièrement des versions non stabilisées
des programmes de base tels que GCC, la bibliothèque C ou le noyau. C’est en particulier le cas de la
Redhat et de toutes ses dérivées, telle la Mandrake par exemple. Tout cela est fort dommageable, car les
paquetages binaires de ces distributions sont systématiquement incompatibles avec ceux des autres d’une
part, et il est quasiment impossible d’envisager une compilation correcte d’un programme avec ces
distributions d’autre part. En pratique, les possesseurs de distributions Redhat et dérivées s’abstiendront
donc de faire une mise à jour manuelle de GCC, de la bibliothèque C ou même du noyau, car les
programmes installés sur leur machine risqueraient de ne plus fonctionner. Les utilisateurs de ces
distributions devraient faire une mise à jour complète de leur distribution dans ce cas.
Note : En ce qui concerne les numéros de version, il faut savoir que le dernier chiffre caractérise
souvent le numéro de correctif. Plus ce chiffre est élevé, moins le programme a de chances de
comporter de bogues. En pratique, on évitera généralement d’installer systématiquement les
dernières versions des logiciels lorsque ces versions sont les premières d’une nouvelle série. Ainsi,
un programme de version x.y.0 est certainement peu fiable. Il faudra attendre au moins la version
x.y.1 ou mieux la x.y.2, pour pouvoir l’utiliser sereinement. Sachez également que le numéro
intermédiaire sert, pour certains logiciels, à indiquer les versions de développement. C’est par
exemple le cas du noyau Linux, pour lequel les numéros de version impairs correspondent aux
versions de développement et les numéros pairs aux versions stables. Ce n’est pas le cas pour la
bibliothèque C ou GCC. De plus, certains logiciels utilisent un schéma de version à quatre chiffres, le
dernier chiffre correspondant généralement aux correctifs mineurs n’entraînant théoriquement
aucune régression. C’est également le cas du noyau Linux depuis la version 2.6.8. Ainsi, dans un
numéro de version x.y.z.t, x représente généralement la version majeure du logiciel (et n’est
changée qu’en cas d’incompatibilité majeure ou de refonte complète), y est le numéro de la branche
(une convention permettant de distinguer les branches de développement des branches stables y
est parfois appliquée), z est le numéro de version dans la branche, et t le numéro du patch
regroupant les corrections de sécurité ou de petite taille.
Prérequis
À moins que vous ne réussissiez à mettre la main sur une version de GCC déjà compilée pour Linux,
vous ne disposerez que des sources. Les sources de GCC peuvent être récupérées sur Internet sur le site
de GCC ([Link] Ces sources sont fournies sous la forme d’une archive au format tar-gzip.
Le nom de cette archive est « [Link] ».
Un autre prérequis est bien entendu que vous disposiez également d’un compilateur C sur votre système.
Ce compilateur peut très bien être une ancienne version de GCC, mais il est impératif de disposer d’un
compilateur C correct. Le code de GCC a été écrit pour pouvoir être compilé de manière minimale avec
la plupart des compilateurs C existants. Il faut également que ce compilateur porte le nom de « cc » ou
204
Chapitre 7. Notions de compilation et configuration du noyau
« gcc » et soit dans l’un des répertoires de la variable d’environnement PATH, ou que la variable CC ait
été définie avec le chemin absolu du compilateur.
où archive est le nom de l’archive compressée contenant ces sources. Dans notre cas, ce doit être
[Link]. Cette commande a pour conséquence de créer l’arborescence des répertoires des
sources de GCC dans le répertoire où elle a été exécutée.
Une fois cette opération effectuée, il est conseillé de créer un autre répertoire, ailleurs que dans le
répertoire des sources de GCC, dans lequel la compilation aura lieu. Dans toute la suite, nous
supposerons que le répertoire des sources se nomme srcdir, et que le répertoire de compilation se
nomme objdir.
Configuration
L’étape suivante est d’aller dans le répertoire de compilation et de lancer le programme de configuration
de GCC dans ce répertoire. Cela peut être réalisé avec les commandes suivantes :
cd objdir
srcdir/configure [options]
Comme on l’a vu ci-dessus, le programme de configuration configure peut recevoir des options en ligne
de commande. Il est recommandé de fournir l’option --enable-__cxa_atexit, qui permet de rendre
GCC compatible avec la version 3 de la norme inter-vendeurs spécifiant le format des interfaces binaires
pour les compilateurs C++, et donc de garantir la compatibilité binaire ascendante avec les versions
futures de GCC. Cela vous permettra d’éviter d’avoir à recompiler toutes les bibliothèques C++ lors des
mises à jours ultérieures de GCC. Il est également recommandé d’utiliser l’option
--enable-long-long, qui ajoute le support du type de données « long long, » qui permet de
manipuler des données 64 bits sur les machines 32 bits comme les PC, ainsi que l’option
--enable-threads, qui permet d’ajouter le support des threads aux langages.
srcdir/configure --enable-__cxa_atexit \
--enable-long-long --enable-threads --host=configuration
205
Chapitre 7. Notions de compilation et configuration du noyau
Le nombre de compilateurs fournis avec la suite de compilateurs GCC est impressionnant. Cependant,
seuls les compilateurs C et C++ sont réellement essentiels. Aussi est-il possible de ne prendre en charge
que certains langages à l’aide de l’option --enable-languages. Cette option doit être suivie des noms
des langages pour lesquels le compilateur doit être créé, séparés par des virgules. Ainsi, on peut
n’installer que les compilateurs C/C++ et Java en ajoutant l’option suivante à la ligne de commande :
--enable-languages=c,c++,java
Enfin, si votre distribution utilise le compilateur GCC comme compilateur de base du système, et que
vous désirez remplacer la version de votre distribution par la version que vous allez compiler, il faut
changer le répertoire d’installation de GCC. Normalement, GCC s’installe dans le répertoire
/usr/local/ ce qui fait qu’il ne remplace pas la version de votre distribution. Vous devez donc
spécifier les répertoires de base pour l’installation. Pour cela, il suffit d’ajouter les options suivantes :
--prefix=/usr
Compilation
La compilation de GCC peut ensuite être réalisée. Autant vous prévenir tout de suite : c’est une opération
très longue, qui de plus demande beaucoup d’espace disque. Il faut au moins prévoir 800 Mo d’espace
disque, et presque trois heures sur une machine à 500 Mhz. Cela est dû au nombre de langages supportés
par les versions récentes de GCC, à la technique employée lors de sa compilation. La plupart des
compilateurs C ne sont en effet pas capables de compiler GCC avec toutes ses fonctionnalités, aussi la
compilation se déroule-t-elle en trois étapes :
• une version allégée de GCC est compilée avec le compilateur natif du système dans une première
passe ;
• cette version est utilisée pour compiler la version complète de GCC ;
• la version complète est utilisée pour se recompiler, afin de tester les différences entre les deux versions
complètes.
Ainsi, GCC se compile lui-même !
Ces trois opérations peuvent être exécutées à l’aide d’une seule commande :
make bootstrap
Installation de GCC
Lorsque la compilation s’est terminée, vous pouvez installer GCC. Il est recommandé de supprimer le
compilateur que vous avec utilisé pour compiler GCC, sauf si, bien entendu, il s’agissait déjà de GCC.
206
Chapitre 7. Notions de compilation et configuration du noyau
En effet, il n’est pas nécessaire de le conserver, puisque vous utiliserez désormais GCC. L’installation de
GCC est, encore une fois, très simple :
make install
207
Chapitre 7. Notions de compilation et configuration du noyau
Note : Les utilisateurs des distributions Redhat dérivées (telle que la Mandrake par exemple) doivent
impérativement utiliser les sources fournies par leur distribution. En effet, les noyaux de ces
distributions sont patchés à mort pour utiliser des fonctionnalité non stabilisées de la version de
développement du noyau de Linux, et sans lesquelles la plupart des programmes et la bibliothèque
C elle-même ne fonctionneraient plus. Je déconseille aux utilisateurs de ces distributions de se
lancer dans l’aventure d’une quelconque compilation d’un des composants système.
Il est recommandé d’installer les sources du noyau dans un autre répertoire que celui où se trouvent les
fichiers sources de votre distribution, car ceux-ci contiennent les fichiers d’en-tête C qui ont été utilisés
pour générer la bibliothèque C du système et sont donc nécessaires à la compilation des programmes. Le
remplacement des fichiers sources du noyau imposerait donc, en toute rigueur, de recompiler la
bibliothèque C du système (en pratique cependant, il est rare que les en-têtes du noyau soient modifiés au
point de générer des incompatibilités, du moins dans une même série de noyaux). Cette opération est
extrêmement technique, risquée et longue, il est donc logique que l’on s’en dispense. Les plus motivés
trouveront en annexe la manière de procéder pour recompiler la bibliothèque C.
Généralement, les fichiers sources de Linux sont installés dans le répertoire /usr/src/linux/.
Certaines distributions font une copie des fichiers d’en-tête du noyau qui ont servi pour la génération de
la bibliothèque C dans les répertoires /usr/include/linux/, /usr/include/asm/
/usr/include/asm-generic. Si ce n’est pas le cas, il faudra renommer temporairement le répertoire
/usr/src/linux/ avant d’installer les sources du nouveau noyau, ou au moins en faire une
sauvegarde. Une autre solution est d’installer les fichiers du noyau dans un répertoire
/usr/src/linux<version>/ et d’utiliser un lien symbolique /usr/src/linux/ pour sélectionner
la version que l’on veut compiler. Cela permet de conserver plusieurs jeux de sources de versions
différentes, et de travailler sur la version courante dans le répertoire /usr/src/linux/ facilement. Les
commandes suivantes permettront d’extraire les sources dans le répertoire dédié au sources de Linux.
Elles supposent qu’il existe déjà un lien symbolique /usr/src/linux/ vers le répertoire devant
accueillir ces fichiers sources :
cd /usr/src
rm linux
tar xvfz linux-[Link].[Link]
ln -s linux-[Link] linux
Une fois le nouveau noyau compilé et installé, on pourra rétablir la dépendance de la bibliothèque C sur
les fichiers d’en-tête de l’ancien noyau en rétablissant le lien symbolique à sa valeur initiale.
Si l’on dispose déjà d’une version complète des fichiers sources, et que l’on désire appliquer un patch, il
faut décompresser le fichier de patch avec la commande suivante :
gunzip [Link]
208
Chapitre 7. Notions de compilation et configuration du noyau
où [Link] représente le fichier de patch compressé (en supposant qu’il ait été compressé à l’aide
de gzip). L’application du patch se fait de la manière suivante :
Cette commande doit être lancée à partir du répertoire /usr/src/. Elle suppose que les fichiers sources
de Linux pourront être trouvées dans le répertoire ./linux/. Dans cette ligne de commande, fichier
représente le nom du fichier de patch précédemment décompressé, et l’option -p0 indique au programme
patch d’utiliser les noms de répertoires relatifs au répertoire courant (à savoir ./linux/). Si les sources
sont installées dans un autre répertoire, il faudra modifier l’option -px passée en paramètre au
programme patch, où x est le nombre de niveaux de répertoires à ignorer pour l’application du patch.
Consultez la page de manuel patch pour plus de détails sur cette option.
Il est recommandé de télécharger au moins une fois l’ensemble des sources du noyau, et de ne pas
utiliser les sources fournies avec la distribution que vous utilisez. En effet, certaines distributions
modifient les sources et on ne peut donc pas leur appliquer les patches standards. Toutefois, les fichiers
sources fournis avec les distributions contiennent souvent d’autres patches non encore intégrés
officiellement dans le noyau. Si l’une des fonctionnalités apportées par ces patches est utilisée, on devra
se contenter des sources de la distribution.
make config
Cette commande pose une série de questions auxquelles il faut pouvoir répondre correctement du
premier coup. On n’a pas le droit à l’erreur ici, faute de quoi il faut tout reprendre à zéro.
Il est nettement préférable d’utiliser la version texte, qui fournit les options de configuration sous la
forme de menus. Cela peut être réalisé avec la commande suivante :
make menuconfig
Certains préféreront l’une des versions X11 du programme de configuration, que l’on peut obtenir avec
les commandes
make xconfig
ou
make gconfig
Sachez cependant que certaines options ne sont toutefois pas correctement proposées dans ce mode, et
que la version textuelle du programme de configuration reste recommandée.
209
Chapitre 7. Notions de compilation et configuration du noyau
Quelle que soit la méthode utilisée, il faut répondre par ’Y’ (pour « Yes »), ’N’ (pour « No ») ou ’M’ (pour
« Module ») lorsque c’est possible. ’Y’ et ’M’ incluent la fonctionnalité courante dans le noyau, ’N’ la
supprime. ’M’ permet d’utiliser la fonctionnalité en tant que module du noyau. En général, l’utilisation
des modules permet d’alléger le noyau car les fonctionnalités sont chargées et déchargées
dynamiquement. Cependant, les fonctionnalités nécessaires au démarrage de Linux, comme les
gestionnaires de disques et systèmes de fichiers par exemple, ne doivent en aucun cas être placées dans
des modules, car le système ne pourrait alors pas démarrer.
Le choix des options de configuration est réellement très large, car celles-ci couvrent un ensemble de
fonctionnalités très large. La description exhaustive de ces options est à la fois fastidieuse et inutile, car
vous n’utiliserez pas tous les gestionnaires de périphériques et toutes les fonctionnalités de Linux avec
un même ordinateur. Il s’agit donc de répondre aux questions appropriées pour votre configuration, mais
de le faire avec rigueur : la moindre erreur de configuration peut empêcher votre système de fonctionner
correctement, voire l’empêcher de démarrer tout simplement. Vous trouverez une description rapide des
principales options de configuration dans l’Annexe A. Les options les plus utiles seront également
décrites lorsque cela sera nécessaire dans le chapitre de configuration du matériel.
cp vmlinuz [Link]
Il faut également indiquer au gestionnaire d’amorçage qu’il faut qu’il donne maintenant la possibilité de
démarrer l’ancienne version du noyau sous ce nouveau nom. Pour LILO, il suffit d’éditer le fichier
/etc/[Link] et d’y ajouter une nouvelle configuration. En pratique, cela revient à dupliquer la
configuration du noyau actuel et à changer simplement le nom du noyau à charger (paramètre « image »
de la configuration dans /etc/[Link]) et le nom de la configuration (paramètre « label »). Vous
devrez aussi rajouter l’option « prompt » si elle n’y est pas déjà, afin que LILO vous demande la
configuration à lancer à chaque démarrage. Dans notre exemple, le nom du noyau à utiliser pour la
configuration de sauvegarde sera [Link]. De même, si la configuration initiale de Linux porte le
nom « linux », vous pouvez utiliser le nom « oldlinux » pour la configuration de sauvegarde.
Une fois le fichier [Link] mis à jour, il faut vérifier que l’on peut bien charger l’ancien système.
Pour cela, il faut réinstaller LILO et redémarrer la machine. La réinstallation de LILO se fait exactement
de la même manière que son installation, simplement en l’invoquant en ligne de commande :
210
Chapitre 7. Notions de compilation et configuration du noyau
lilo
Si LILO signale une erreur, vous devez corriger immédiatement votre fichier [Link] et le réinstaller.
Pour le GRUB, la définition d’une nouvelle configuration se fait également en dupliquant la
configuration initiale et en changeant le nom de l’option de menu du GRUB et le chemin sur le fichier du
noyau sauvegardé. Veillez également à bien ajouter une option timeout pour avoir la moindre chance de
sélectionner la configuration à lancer. Tout cela doit être effectué dans le fichier de configuration
/boot/grub/[Link]. Contrairement à LILO, il n’est pas nécessaire de réinstaller le GRUB pour que
les modifications de ce fichier soient prises en compte au démarrage suivant.
Vous pourrez alors redémarrer redémarrer la machine avec la commande suivante :
reboot
Le gestionnaire d’amorçage utilisé vous propose alors de choisir le système d’exploitation à lancer. Il
faut ici sélectionner la configuration de sauvegarde pour vérifier qu’elle est accessible et fonctionne bien.
Le système doit alors démarrer en utilisant la copie sauvegardée du noyau. Si cela ne fonctionne pas, on
peut toujours utiliser le noyau actuel en sélectionnant le noyau initial et en corrigeant la configuration du
gestionnaire d’amorçage.
Lorsque vous vous serez assuré que le système peut démarrer avec la sauvegarde du noyau, vous pourrez
installer le nouveau noyau. Son image a été créée par make dans le répertoire
/usr/src/linux/arch/i386/boot/, sous le nom bzImage. L’installation se fait donc simplement
par une copie dans /boot/ en écrasant le noyau actuel vmlinuz :
cp /usr/src/linux/arch/i386/boot/bzImage /boot/vmlinuz
cp [Link] /boot
Ce fichier contient la liste de tous les symboles du nouveau noyau, il est utilisé par quelques utilitaires
systèmes.
Si vous utiliser LILO, il vous faudra le réinstaller à nouveau pour qu’il prennent en compte le nouveau
noyau. Cela se fait avec la même commande que celle utilisée précédemment :
lilo
reboot
211
Chapitre 7. Notions de compilation et configuration du noyau
et vérifier que le nouveau noyau fonctionne bien. S’il ne se charge pas correctement, c’est que les options
de configuration choisies ne sont pas correctes. Il faut donc utiliser le noyau sauvegardé, vérifier ses
choix et tout recommencer. Attention cependant, cette fois, il ne faut pas recommencer la sauvegarde du
noyau puisque cette opération écraserait le bon noyau avec un noyau défectueux.
Si le nouveau noyau démarre correctement, il ne reste plus qu’à installer les modules.
make modules_install
Au préalable, il est recommandé de décharger tous les modules présents en mémoire. Cela peut être
réalisé à l’aide de la commande modprobe et de son option -r.
Les modules sont installés dans le répertoire /lib/module/version/, où version est le numéro de
version du noyau courant. Il est possible que des modules d’autres versions du noyau existent dans leurs
répertoires respectifs. Si vous n’en avez plus besoin, vous pouvez les effacer. Attention cependant si vous
avez installé des modules additionnels non fournis avec le noyau dans ces répertoires, vous pourriez
encore en avoir besoin.
Comme on l’a déjà vu, les modules sont utilisés par le chargeur de module du noyau, grâce à la
commande modprobe. Cette commande a besoin de connaître les dépendances entre les modules afin de
les charger dans le bon ordre. Il faut donc impérativement mettre à jour le fichier
/lib/modules/version/[Link] à chaque fois que l’on installe les modules, à l’aide de la
commande suivante :
depmod -a
Note : La commande depmod -a est exécutée automatiquement lors de l’installation des modules du
noyau. Toutefois, elle devra être exécutée manuellement si l’on installe des modules non fournis
avec le noyau.
212
Chapitre 8. Configuration du matériel et des
périphériques
Ce chapitre présente les concepts nécessaires à l’installation de cartes filles additionnelles et à la
configuration des périphériques complémentaires sous Linux. La procédure d’installation des disques
durs, graveurs, cartes son, cartes graphiques, cartes vidéo et cartes réseau sera donc décrite, ainsi que la
manière de les configurer pour obtenir un fonctionnement correct sous Linux.
213
Chapitre 8. Configuration du matériel et des périphériques
code majeur et de code mineur. Comme nous le verrons plus tard, c’est par l’intermédiaire de ces codes
que le noyau est capable de retrouver le gestionnaire de périphériques à utiliser pour satisfaire aux
requêtes des clients qui accèdent à un fichier spécial de périphérique. Il y a donc, en général, une
association unique entre ces codes et les gestionnaires de périphériques. La liste des codes majeurs et
mineurs déjà affectés à des périphériques est donnée dans le fichier
/usr/src/linux/Documentation/[Link] (ce fichier vous donnera donc une idée des
périphériques qui peuvent être ou qui seront gérés par Linux).
Les fichiers spéciaux de périphériques sont tous stockés dans le répertoire /dev/. En général, ce
répertoire contient un grand nombre de fichiers spéciaux de périphériques, même pour des périphériques
inexistants sur votre machine. Ces fichiers sont généralement installés automatiquement par les
distributions, qui laissent au noyau le soin de signaler que le périphérique est absent lorsqu’un
programme tente d’accéder à un fichier spécial auquel aucun matériel ne correspond. Les fichiers fournis
par les distributions sont donc, en théorie, susceptibles de couvrir toutes les gammes de périphériques
courants, et vous n’aurez pas à toucher au répertoire /dev/. Cependant, si vous devez créer un fichier
spécial de périphérique vous-même, vous devrez utiliser la commande mknod. Sa syntaxe est
relativement simple :
où fichier est le nom du fichier spécial de périphérique à créer, type est une lettre indiquant le type du
fichier spécial (’c’ pour les fichiers de type caractère et ’b’ pour les fichiers de type bloc), et majeur et
mineur sont les codes majeur et mineur du périphérique. Je vous invite à consulter la page de manuel de
la commande mknod pour plus d’informations.
Modules du noyau
Les modules du noyau sont des bibliothèques que l’on peut charger dans le noyau lorsque celui-ci a
besoin d’une certaine fonctionnalité. Une fois chargés, les modules font partie intégrante du noyau et
ajoutent leurs fonctions à celles existantes. Ces bibliothèques sont normalement stockées dans le
répertoire /lib/modules/version/, où version est le numéro de version du noyau pour lequel ces
modules ont été créés.
Beaucoup de fonctionnalités du noyau peuvent être configurées pour être utilisées sous la forme de
modules. Dans le cas des pilotes de périphériques, les modules permettent de réaliser un noyau générique
et de prendre en charge dynamiquement les différents périphériques de l’ordinateur. Certains pilotes ne
fonctionnent d’ailleurs que sous la forme de modules, aussi faut-il savoir les manipuler. Les modules sont
également fortement utilisés pour la configuration automatique des périphériques connectables à chaud.
insmod module
ou :
214
Chapitre 8. Configuration du matériel et des périphériques
modprobe module
depmod -a
Il faudra donc appeler cette commande après chaque installation ou suppression de modules dans le
système.
La liste de modules qui ont été chargés peut être obtenue aisément avec la commande lsmod :
lsmod
Enfin, la commande rmmod permet de décharger un module, avec la ligne de commande suivante :
rmmod module
On préférera cependant l’utilisation de la commande modprobe avec l’option -r pour décharger les
modules, car cette commande est capable de décharger récursivement les modules dont dépendait le
module à décharger lorsqu’ils ne sont eux-même plus utilisés. La syntaxe est alors la suivante :
modprobe -r module
215
Chapitre 8. Configuration du matériel et des périphériques
La liste des paramètres que l’on peut passer à un module dépend bien évidemment du module. Vous
pouvez obtenir la liste des options supportées par un module à l’aide de l’option -p de la commande
modinfo :
modinfo -p module
Nous verrons par la suite des exemples de passage de paramètres pour les modules les plus courants.
Le fichier [Link] permet également de définir la manière dont le chargement et le
déchargement des modules doit être faite. Pour cela, il permet de spécifier une ligne de commande
complète pour ces opérations. Ces lignes de commandes sont introduites via les mots-clefs install et
remove. La syntaxe de ces mots-clés est la suivante :
où module est le nom du module à charger ou à décharger, et commande est la ligne de commande de
l’opération à effectuer pour cela.
Par exemple, si le port parallèle est utilisé pour accéder à un périphérique nécessitant une opération
d’initialisation quelconque, celle-ci peut être exécutée lors du chargement du module à l’aide du mot clé
install :
modprobe -c
Cette commande vous permettra également de recréer un nouveau fichier de configuration si d’aventure
vous perdiez celui fourni avec votre distribution.
216
Chapitre 8. Configuration du matériel et des périphériques
dépendances entre les modules. À chaque fois que le noyau a besoin d’une fonctionnalité qui n’est pas
encore chargée, il effectue une requête à modprobe en lui demandant de charger le module manquant.
Le nom du module dont le noyau demande le chargement à modprobe dépend évidemment de la
fonctionnalité demandée et ne correspond pas forcément à un nom de module existant. Par exemple, le
module de gestion des ports parallèles se nomme, sur les ordinateurs de type PC, parport_pc.
Toutefois, lorsque le noyau désire accéder au port parallèle, il n’utilise pas ce nom, mais plutôt un nom
générique, qui est le même pour toutes les architectures matérielles supportées par Linux. Ce nom est
parport_lowlevel. Ainsi, le noyau utilise la commande suivante pour charger le module de prise en
charge du port parallèle :
modprobe -k parport_lowlevel
L’option -k permet d’indiquer à modprobe qu’il est appelé par le noyau, donc dans le contexte de
chargement automatique des modules.
modprobe doit donc faire la correspondance entre le nom de module demandé par le noyau et le nom
d’un module réel. C’est encore une fois dans le fichier de configuration /etc/[Link] que cette
correspondance est enregistrée. Pour cela, un certain nombre d’alias peuvent être définis pour identifier
les modules réels. Chaque alias est introduit par le mot clé alias, dont la syntaxe est donnée ci-dessous :
où nom est le nom de l’alias, et module est le nom du module réel. Lorsque la commande modprobe est
appelée avec le nom d’un alias en paramètre, elle commence par rechercher le nom du module réel dans
le fichier [Link], puis elle le charge en mémoire.
Par exemple, pour charger le module parport_pc automatiquement lorsque le noyau a besoin d’accéder
au port parallèle, on devra ajouter la définition d’alias suivante dans le fichier [Link] :
217
Chapitre 8. Configuration du matériel et des périphériques
Vous pouvez constater que le mécanisme d’alias permet de rendre le noyau indépendant des modules
utilisés, puisque l’association entre le nom du module utilisé par le noyau et le module réel et ses
paramètres est maintenu dans le fichier de configuration [Link]. L’inconvénient de cette
méthode est en revanche qu’il faut connaître les noms de modules utilisés par le noyau pour chaque
fonctionnalité. Ces noms sont assez variables et dépendent de la fonctionnalité demandée. En général, ce
nom apparaît dans les messages de traces du noyau lorsqu’il ne parvient pas à localiser un module lors de
son chargement automatique. Ces messages de traces peuvent être affichés à l’aide de la commande
dmesg. Il est donc possible de déterminer la liste des modules que le noyau a tenté de charger
relativement facilement. Toutefois, cela n’indique pas forcément la fonctionnalité implémentée par le
module en question, et encore moins l’application qui a tenté d’utiliser cette fonctionnalité.
Il est heureusement beaucoup plus facile de savoir quelle est la fonctionnalité demandée lorsque celle-ci
a trait à un périphérique de l’ordinateur. En effet, le nom de module utilisé par le noyau pour chaque
gestionnaire de périphérique est construit à partir des informations définissant ce fichier, ce qui permet de
l’identifier et donc de trouver le module à charger pour prendre en charge ce périphérique. En général, le
noyau utilise un nom de module de la forme « char-major-xxxx » pour les périphériques de type
caractère, et un nom de la forme « block-major-xxxx » pour les périphériques de type bloc. Les
caractères xxxx identifient le code majeur de ce périphérique, plus rarement son code mineur. Ainsi, le
périphérique accédé par le noyau est parfaitement identifié tant du point de vue de sa nature (disque,
périphérique de type caractère...) que du point de vue de ses codes majeur et mineur. Il est donc facile
d’en déduire le gestionnaire de périphérique nécessaire à la gestion de ce fichier spécial de périphérique,
et de définir l’alias permettant de faire la correspondance entre le nom du module utilisé par le noyau et
le module réel à charger.
Par exemple, pour les cartes son, le nom de module char-major-14 est utilisé pour demander le
chargement du module de gestion du son, parce que les cartes son utilisent toutes le code majeur 14. Il
faut donc définir un alias sur ce nom de module vers le module du gestionnaire de cartes son. Comme on
218
Chapitre 8. Configuration du matériel et des périphériques
le verra dans la section traitant de la configuration des cartes son, ce module pourra lui-même demander
le chargement de modules complémentaires, en fonction de la carte son réellement utilisée et des
fonctionnalités demandées. Le numéro de code mineur sera indiqué lors de ces opérations.
Si vous devez modifier le [Link], sachez qu’il s’agit d’une opération délicate, car elle
nécessite de bien connaître les mécanismes de nommage utilisés par le noyau, les noms des modules
réels et leurs paramètres de configuration. En général, vous trouverez les informations sur les entrées à
ajouter ou à modifier dans le fichier d’aide du module correspondant, que vous pourrez trouver dans les
sources du noyau (dans le répertoire /usr/src/linux/Documentation/). Quoi qu’il en soit, la
modification de [Link] peut générer de nouvelles dépendances entre les modules. Il est donc
nécessaire d’exécuter la commande depmod -a après chaque modification de ce fichier.
Il existe un grand nombre d’options, et leur syntaxe varie en fonction du sous-système qui les utilise. Le
fichier de documentation [Link] du répertoire Documentation/ des sources du
noyau vous donnera la liste complète de ces options. Nous verrons quelques-unes de ces options
spécifiquement dans la suite du chapitre, lorsque nous décrirons les paramètres des gestionnaires de
périphériques.
D’une manière générale, les fonctionnalités développées récemment et utilisable soit en tant que module,
soit en tant que fonctionnalité intégrée directement dans le noyau, utilisent une syntaxe générique
permettant de fixer leurs options. Cette syntaxe est la suivante :
[Link]ètre=valeur
où module est le nom que du module du noyau qui implémente cette fonctionnalité lorsqu’elle est
utilisée sous la forme de module, paramètre est le nom de l’option de ce module du noyau telle qu’elle
est donnée par la commande modinfo, et valeur est sa valeur. Ainsi, si vous voulez intégrer une
fonctionnalité d’un module dans le noyau, il suffit simplement d’ajouter les paramètres complémentaires
dans la ligne de commande de celui-ci en fonction des options définies dans le fichier
/etc/[Link]. Nous verrons la manière de procéder plus loin dans ce chapitre.
219
Chapitre 8. Configuration du matériel et des périphériques
Note : Intégrer un pilote de périphérique directement dans le noyau peut être intéressant si ce
périphérique est inamovible et que l’on ne veut pas avoir à prendre en charge les modules. Toutefois,
ce n’est pas une bonne idée lorsqu’on installe ce périphérique et qu’on cherche à le configurer. En
effet, il est souvent nécessaire de redémarrer pour prendre en compte de nouveaux paramètres
dans ce cas, alors qu’avec les modules du noyau, un déchargement et un rechargement suffit. Par
contre, lorsque votre configuration sera finie, vous pourrez parfaitement vous passez des modules et
désactiver les fonctions de détection automatique du matériel utilisées par la plupart des
distributions : vous gagnerez ainsi plusieurs dizaines de secondes au démarrage de votre ordinateur.
Dans certaines situations, l’usage des modules reste impératif. C’est par exemple le cas lorsque
plusieurs périphériques identiques sont installés dans l’ordinateur, et que le gestionnaire de
périphérique impose d’être chargé plusieurs fois. Dans ce cas, il faut le charger sous forme de
module, avec, pour chaque périphérique, un nom de module différent. Cela est évidemment
infaisable si l’on intègre le gestionnaire de périphérique directement dans le noyau.
Agents hotplug
Dès qu’un événement de type apparition ou disparition d’un périphérique sur un bus se produit, le noyau
appelle le programme référencé dans le fichier hotplug du répertoire /proc/sys/kernel/ et fournit à
ce programme toutes les informations nécessaires à la configuration du périphérique : le type de
périphérique qui vient d’apparaître ou de disparaître, ainsi que la description complète de ce
périphérique.
Par défaut, le programme appelé par le noyau est le script /sbin/hotplug. Ce script identifie la nature du
périphérique pour lequel le noyau signale un événement et délègue le travail de configuration à des
sous-programmes, que l’on appelle « agents ». Ainsi, il existe un agent pour les périphériques USB, un
agent pour les périphériques PCI, un agent pour les périphériques FireWire, etc. Tous ces agents sont
normalement situés dans le répertoire /etc/hotplug/ et ont un nom de la forme
[Link]
220
Chapitre 8. Configuration du matériel et des périphériques
• la variable ACTION, qui contient la description de l’événement qui s’est produit pour ce périphérique ;
• la variable PRODUCT, qui contient les identificateurs du vendeur, du produit et du périphérique pour
le périphérique considéré ;
• la variable TYPE, qui contient la classe et la sous-classe du périphérique, ainsi que son protocole de
communication ;
• et la variable INTERFACE, qui contient les paramètres de classe, sous-classe et de protocole pour les
interfaces, si le périphérique USB est de classe 0.
Des variables similaires sont définies pour les autres classes de périphériques.
[Link]
221
Chapitre 8. Configuration du matériel et des périphériques
Note : Certains modules peuvent ne pas contenir de table de déclaration des périphériques qu’ils
prennent en charge (cela relève du bogue). hotplug ne peut donc pas les charger automatiquement,
car ces modules n’apparaissent pas dans les fichiers d’association du noyau. Il serait possible de
rajouter explicitement les lignes manquantes dans ces fichiers, mais comme ils sont écrasés à
chaque exécution de depmod, cette solution n’est pas pérenne. Par conséquent, hotplug utilise
également des fichiers d’association complémentaires, que l’on peut modifier. Ces fichiers sont
placés dans le répertoire /etc/hotplug/.
222
Chapitre 8. Configuration du matériel et des périphériques
Normalement, le script hotplug et les agents utilisateurs doivent être fournis avec votre distribution.
Vous n’aurez donc généralement pas à l’installer ni à vous préoccuper sur la manière dont les
périphériques connectables à chaud doivent être configurés. En revanche, vous devrez activer la prise en
charge des périphériques connectables à chaud au niveau du noyau. Pour cela, il faut simplement valider
l’option « Support for hot-pluggable devices » du menu « General setup » dans la
configuration du noyau. Cette option ajoute également l’entrée hotplug dans le répertoire
/proc/sys/kernel/ du système de fichiers virtuels /proc/ du noyau.
Enfin, si vous désirez également utiliser les fonctionnalités de chargement de firmware du noyau, il vous
suffit simplement de placer les fichiers de firmware dans le répertoire /usr/lib/hotplug/firmware/
et d’activer également l’option « Hotplug firmware loading support » du sous-menu « Generic
Driver Options » du menu « Device Drivers ».
Avantages d’udev
udev permet de résoudre plusieurs problèmes concernant les fichiers spéciaux de périphériques. Le plus
évident pour l’utilisateur est que seuls les fichiers spéciaux des périphériques effectivement présents et
pris en charge par un gestionnaire de périphérique apparaissent dans le répertoire /dev/. Ce répertoire
n’a donc plus à contenir les fichiers spéciaux de périphériques pour tous les périphériques pris en charge
par Linux. Le répertoire /dev/ en est donc d’autant réduit et beaucoup plus lisible.
223
Chapitre 8. Configuration du matériel et des périphériques
Un autre avantage d’udev est que les codes majeurs et mineurs des fichiers spéciaux de périphériques
peuvent à présent être attribuées dynamiquement par le noyau lorsque les gestionnaires de périphériques
s’initialisent. Cela a plusieurs conséquences :
• il n’y a plus besoin d’avoir recours à une autorité centrale pour obtenir les valeurs de codes mineurs et
majeurs, ceux-ci pouvant être déterminés dynamiquement par le noyau ;
• il n’y a plus de risque de conflit entre deux périphériques, le noyau s’assurant de l’unicité des codes
utilisés ;
• la limitation du nombre de périphériques due au nombre limité de codes majeurs et mineurs n’existe
plus (il suffit de consulter la liste du fichier /usr/src/linux/Documentation/[Link] pour
constater qu’il reste peu de codes libres pour les périphériques à venir).
Enfin, udev permet de simplifier considérablement la configuration du système. Par exemple, il est
possible de fixer de manière permanente le nom des fichiers spéciaux des périphériques amovibles. De
plus, du fait du nombre plus réduit de fichiers spéciaux de périphériques, le répertoire /dev/ peut être un
système de fichiers virtuel, monté sur un disque en mémoire.
224
Chapitre 8. Configuration du matériel et des périphériques
Les fichiers de définition de la politique de nommage des fichiers spéciaux de périphériques contiennent
des lignes définissant chacune une règle de nommage. La ligne utilisée est choisie en fonction de critères
de sélection basés sur les informations fournies par le noyau. Par exemple, il est possible de sélectionner
le bus du périphérique (à l’aide du mot clé BUS), le nom donné au périphérique par le noyau (mot-clé
KERNEL), ou encore l’identifiant du périphérique sur le bus (mot clé ID). Il est même possible d’exécuter
un programme externe pour obtenir des informations complémentaires, et utiliser le résultat de cette
commande comme critère de sélection (mot clé PROGRAM). Vous pouvez consulter la page de manuel de
udev pour plus de détails sur la définition des critères de sélection des règles de nommage.
Outre les critères de sélection, les règles de nommage donnent bien entendu le nom du fichier spécial de
périphérique à créer, son propriétaire et son groupe, ainsi que les permissions sur ce fichier, à l’aide des
mots clefs NAME, OWNER, GROUP et MODE. Il est également possible de définir des liens symboliques
complémentaires (par exemple /dev/cdrom ou /dev/modem) sur les fichiers spéciaux de périphériques
ainsi créés (option SYMLINK). Les noms ainsi définis peuvent être paramétrés par les différentes
informations sur le périphérique grâce à des variables spécifiques. La page de manuel de udev vous
donnera encore une fois de plus amples informations à ce sujet.
Les permissions indiquées dans les fichiers du répertoire /etc/udev/permissions.d/ ne sont
utilisées que si les règles de nommage ne donnent aucune permission. La syntaxe de ces fichiers est
beaucoup plus simple, puisqu’elle associe, pour chaque nom de fichier spécial de périphérique, le
propriétaire, le groupe et les droits d’accès (spécifiés en octal).
Comme vous pouvez le constater, les fichiers de configuration de udev permettent de paramétrer de
manière très souple et très précise la manière dont les fichiers spéciaux de périphériques sont créés. La
contrepartie est tout de même une certaine complexité dans la définition des règles de nommage et
d’attribution des permissions, mais vous n’aurez généralement pas à vous en préoccuper, car les
distributions fournissent des fichiers de configuration adaptés à la plupart des usages.
225
Chapitre 8. Configuration du matériel et des périphériques
Bus = "scsi"
Device = "[Link]"
Device path = "/sys/devices/pci0000:00/[Link].0/usb2/2-2/2-2:1.0/host1/[Link]"
delete = <store method only>
detach_state = "0"
device_blocked = "0"
max_sectors = "240"
model = "MINI DATA DRIVE "
queue_depth = "1"
rescan = <store method only>
rev = "1.00"
scsi_level = "3"
state = "running"
timeout = "30"
type = "0"
vendor = " "
Device = "[Link]"
Device path = "/sys/devices/pci0000:00/[Link].2/usb1/1-1/1-1:1.0/host2/[Link]"
delete = <store method only>
detach_state = "0"
device_blocked = "0"
max_sectors = "240"
model = "USB DISK Pro "
queue_depth = "1"
rescan = <store method only>
rev = "1.08"
scsi_level = "3"
226
Chapitre 8. Configuration du matériel et des périphériques
state = "running"
timeout = "30"
type = "0"
vendor = " "
Supposons à présent que les deux clefs se distinguent par le nom de leur modèle, par exemple « USB
DISK Pro » et « MINI DATA DRIVE ». Il est à présent possible d’affecter des fichiers spéciaux de
périphériques de manière fixe à chacune de ces clefs, en ajoutant les règles suivantes dans le fichier
[Link] :
Ces règles permettent d’associer aux périphériques SCSI normalement nommés « /dev/sdxx » les fichiers
spéciaux de périphériques /dev/usbda et /dev/usbdb (ainsi que les fichiers spéciaux de périphérique
pour accéder à leurs partitions) respectivement aux deux modèles de clefs USB. Vous noterez ici que le
mot clé SYSFS permet de récupérer les informations du système de fichiers virtuel /sys/ (en particulier,
ici, le nom du modèle des périphériques). Les caractères génériques sont utilisés afin de ne pas chercher
une correspondance trop stricte entre les noms de modèle et les critères de sélection. En effet, les noms
des modèles peuvent être suivis d’un ou de plusieurs espaces, qui ne sont pas significatifs ici.
Initialisation du système
Pour terminer cette description du mécanisme de création dynamique des fichiers spéciaux de
périphériques, signalons qu’il est nécessaire de créer manuellement les fichiers spéciaux des
périphériques des gestionnaires de périphériques intégrés au noyau lors de l’initialisation du système. En
effet, les événements hotplug ne sont pas émis par le noyau dans ce cas. Ces gestionnaires doivent donc
être recherchés dans le système de fichiers /sys/ et, pour chacun d’eux, udev doit être appelé
explicitement. Ce travail est généralement réalisé par le programme udevstart, que les distributions
exécutent au démarrage du système, après avoir mis en place l’éventuel système de fichier en mémoire
/dev/ (et /après avoir monté le système de fichiers virtuel /sys).
Notez bien que udevstart ne permet de créer les fichiers spéciaux de périphériques que pour les
périphériques dont les gestionnaires de périphériques sont chargés dans le noyau au moment de son
exécution. De même, udev ne permet de créer les fichiers spéciaux de périphériques que pour les
périphériques connectables à chaud. Par conséquent, aucun fichier spécial de périphérique ne sera créé
pour les périphériques classiques dont le gestionnaire de périphérique n’est pas chargé avant l’exécution
de udevstart. Comme aucune application ne peut accéder à ce fichier, le noyau ne chargera pas non plus
le module du gestionnaire de périphérique, et le périphérique ne fonctionnera pas. Ce problème se
rencontre par exemple pour le gestionnaire de périphérique du port parallèle et pour les vieux
périphériques ISA. Dans ce cas de configuration, il est recommandé soit d’intégrer les gestionnaires de
périphériques directement dans le noyau, soit de charger les modules correspondants dès le démarrage du
système, avant l’exécution de udevstart, soit de créer explicitement les fichiers spéciaux de
périphériques pour les périphériques en question après son exécution. Cette dernière solution peut être
227
Chapitre 8. Configuration du matériel et des périphériques
• « SCSI disk support », pour les disques durs SCSI, ainsi que pour certains périphériques de masse
qui apparaissent comme des disques durs SCSI (c’est en particulier le cas pour les clefs USB et un
grand nombre d’appareils photo numériques) ;
• « SCSI tape support », pour les lecteurs de cartouches SCSI. Les possesseurs de lecteurs de
cartouches OnStream SC-x0 devront plutôt utiliser l’option « SCSI OnStream SC-x0 tape
support », car le gestionnaire de périphériques standard n’est pas capable de les prendre en charge ;
228
Chapitre 8. Configuration du matériel et des périphériques
• « SCSI CD-ROM support », pour les lecteurs de CD-ROM SCSI et pour les graveurs de CD-ROM
IDE, si l’on décide d’utiliser l’émulation SCSI avec certains logiciels de gravage (voir plus loin pour
plus de détails à ce sujet) ;
• « SCSI generic support », pour les autres périphériques dont l’utilisation requiert l’utilisation
d’un programme applicatif spécifique. Il s’agit ici des graveurs de CD, des scanners et autres
périphériques spéciaux.
Certains périphériques SCSI disposent de plusieurs numéros d’unités logiques sur leur bus. Il peut donc
être nécessaire, pour ces périphériques, d’activer l’option « Probe all LUNs on each SCSI
device » afin de pouvoir les utiliser correctement. Les autres options ne sont pas essentielles, consultez
leur aide pour plus de détails à leur sujet.
En plus des options générales de la prise en charge du SCSI, il est impératif de sélectionner le
gestionnaire de périphériques capable de piloter votre contrôleur SCSI. Cela peut être fait dans le
sous-menu « SCSI low-level drivers ». Vous devrez y activer la prise en charge pour votre matériel,
aucune règle ne peut donc être définie à ce niveau. Consultez la documentation de votre matériel pour
déterminer le gestionnaire de périphériques adéquat à utiliser.
Une fois la configuration du noyau effectuée, vous n’avez plus qu’à le compiler et à l’installer pour
pouvoir utiliser vos périphériques. La manière de procéder a été décrite en détail dans la la section
intitulée Compilation du noyau Linux dans Chapitre 7.
Note : Même si les interfaces IDE ont à présent réduit l’écart avec les interfaces SCSI au niveau du
taux de transfert des données, elles ont toujours un train de retard par rapport à elles. En effet, les
périphériques SCSI sont d’une part capables de communiquer entre eux sur leur bus, déchargeant
ainsi totalement le processeur de ce travail de transfert des données, et d’autre part capables de
traiter plusieurs requêtes d’affilée sans l’intervention du processeur. Ces fonctionnalités déchargent
le bus système, mais sont également extrêmement utiles pour les systèmes d’exploitation
multitâches. Ceux-ci peuvent en effet envoyer plusieurs commandes aux périphériques et effectuer
d’autres traitements pendant qu’elles s’exécutent en asynchrone. Les disques SCSI ont donc un
taux d’occupation du processeur et du bus système nettement moindre, et permettent aux systèmes
tels que Linux d’atteindre un degré de réactivité inégalé avec les disques IDE classiques. Cela dit,
les périphériques IDE coûtent nettement moins cher que les périphériques SCSI, et c’est sans doute
là la clef de leur succès.
229
Chapitre 8. Configuration du matériel et des périphériques
En général, Linux configure les contrôleurs des disques durs de manière quasi optimale, et il n’est
généralement pas nécessaire de modifier leur paramétrage. Cependant, les contrôleurs IDE peuvent être
configurés ou optimisés manuellement grâce à l’utilitaire hdparm. Comme son nom l’indique, cet
utilitaire permet de modifier les paramètres des disques durs et des contrôleurs IDE. Il permet également
de tester les performances de votre configuration, et peut donc servir d’outil de diagnostic très utile. La
mesure du débit de votre sous-système disque (sans les mécanismes de cache du système) peut être en
effet réalisée facilement avec la commande suivante :
hdparm -t périphérique
Note : Si vous obtenez des valeurs inférieures ou égales à 6 Mo/s, vous avez réellement un
problème de configuration. Les premiers disques UltraDMA 33 peuvent atteindre facilement 8 à 10
Mo/s, les disques UltraDMA 66 atteignent facilement 17 à 22 Mo/s, et les disques les plus récents en
UltraDMA 100 peuvent aller encore bien au delà.
Faites bien attention à ne pas utiliser l’option -T à la place de l’option -t. En effet, vous mesureriez
le débit dans le sous-système disque complet de Linux, avec ses mécanismes de cache. Vous
obtiendriez alors des taux de transfert nettement plus grands (dix fois plus au moins), qui ne
représenteraient pas le taux de transfert réel de votre interface IDE.
L’utilitaire hdparm permet également de fixer un certain nombre de paramètres des disques durs. Par
exemple, l’activation ou la désactivation de l’UltraDMA se fait simplement avec l’option -d. Cette
option prend en paramètre un entier pouvant valoir 1 ou 0, selon que l’UltraDMA doit être activé ou non.
Cette option peut être complétée d’autres options d’optimisation pour les disques modernes, pour
lesquels on peut également préciser le mode de transfert à utiliser. Ce mode peut être indiqué à l’aide de
l’option -X, qui prend en paramètre un nombre dont la valeur est le numéro du mode plus une constante
identifiant le type de transfert utilisé. Les transferts de type PIO (c’est à dire le mode dans lequel le
processeur effectue lui-même les transferts par l’intermédiaire des ports d’entrée / sortie) utilisent la
constante 8, les transferts de type DMA simple utilisent la constante 32, et les transferts en UltraDMA
utilisent la constante 64. Ainsi, la sélection du mode UltraDMA mode 2 pour le disque maître du premier
contrôleur IDE se fait avec la commande suivante :
La valeur 66 utilisée ici signifie donc que les transfers se font en UltraDMA (constante 64), mode 2
(valeur 2).
Note : Pour que l’UltraDMA soit utilisable, il faut bien entendu que les pilotes IDE de votre noyau
Linux le gèrent. Généralement, les noyaux des distributions en sont capables, mais si d’aventure ce
n’était pas le cas, vous devriez recompiler votre noyau. Les options à activer dans le programme de
configuration du noyau sont les options suivantes du menu « ATA/IDE/MFM/RLL support » :
• « Generic PCI IDE chipset support » du menu « IDE, ATA and ATAPI Block devices » ;
230
Chapitre 8. Configuration du matériel et des périphériques
Vous devrez également activer le support pour les jeux de composants utilisés par votre carte mère.
L’utilitaire hdparm permet également d’activer et de désactiver le mode 32 bits de ces contrôleurs à
l’aide de l’option -c. Comme pour l’option -d, l’option -c prend en paramètre un indicateur pouvant
valoir 1 ou 0 et permettant d’activer ou de désactiver le mode 32 bits du contrôleur. Notez que certains
contrôleurs ne supportent pas correctement le mode de fonctionnement 32 bits et peuvent perdre des
données si vous l’activez.
Note : Prenez garde lorsque vous utilisez la commande hdparm. Si vous spécifiez des paramètres
incorrects ou non pris en charge par votre matériel, vous pouvez fort bien bloquer complètement vos
contrôleurs IDE, et planter ainsi le système en un temps très court. Si d’aventure cela se produisait,
il faudrait attendre un peu de temps, jusqu’à ce que le système s’aperçoive de la mauvaise
configuration des contrôleurs et les réinitialisent avec leurs paramètres initiaux. Vous pouvez
détecter ce genre de réinitialisation dans les messages du noyau, que vous pouvez à tout moment
afficher avec la commande dmesg. Sachez toutefois que le risque de corruption du système de
fichiers en cas de mauvaise configuration reste bien réel, et qu’il vaut mieux un système légèrement
plus lent qu’un système qui détruit vos données en un temps record.
Lorsque vous aurez trouvé les paramètres optimaux de vos contrôleurs de disque, vous pourrez demander
au système de conserver ces paramètres par défaut en ajoutant l’option -k1 dans la ligne de commande
de hdparm. Par exemple, pour configurer de manière permanente le premier disque IDE en UltraDMA
mode 2 et en accès 32 bits, il faut utiliser la commande suivante :
Note : Prenez garde toutefois au fait que les réinitialisations du contrôleur en cas d’erreur
reprendront systématiquement les mêmes paramètres, ce qui peut réellement bloquer complètement
votre sous-système disque (et planter irrémédiablement votre système). Dans ce cas, il ne vous
restera plus que le redémarrage brutal, avec les risques de pertes de données qui en découlent.
La configuration des disques durs et des contrôleurs IDE pourra également être ajoutée dans le script de
démarrage de votre système. Ce script est généralement placé dans le répertoire /etc/rc.d/ ou dans le
répertoire /sbin/init.d/ selon votre distribution. Bien entendu, il faut réellement être sûr de la
commande de configuration utilisée, car elle sera exécutée systématiquement à chaque démarrage.
231
Chapitre 8. Configuration du matériel et des périphériques
graveurs de CD comme des périphériques de sauvegarde amovibles. Cette fonctionnalité est en effet
encore à l’étude, elle sera sans doute disponible sous peu.
Configuration du noyau
L’utilisation des graveurs de CD/DVD ne requiert généralement pas d’option particulière au niveau de la
configuration. Autrement dit, si vous pouvez utiliser votre graveur comme un simple lecteur, alors vous
pouvez également l’utiliser pour graver. Cependant, il peut-être intéressant d’activer le support de
certains systèmes de fichiers pour utiliser correctement les lecteurs et les graveurs.
Les principales options de configuration du noyau ayant trait aux lecteurs et aux graveurs de CD/DVD
sont récapitulées ci-dessous :
« SCSI support »
Cette option permet d’activer la gestion des périphériques SCSI dans votre noyau. Il va de soi qu’il
faut l’activer si vous disposez d’un graveur SCSI. Cette fonctionnalité peut être activée sous forme
de module ou non. La réponse recommandée est ’N’.
232
Chapitre 8. Configuration du matériel et des périphériques
Enfin, il faut choisir le pilote bas niveau permettant de gérer son graveur de CD. Pour les graveurs IDE
ATAPI il n’y a pas de pilote bas niveau à inclure. Pour les graveurs SCSI, il faut choisir le pilote
approprié de votre carte ou de votre contrôleur SCSI.
Une fois cette configuration effectuée, il ne reste plus qu’à compiler le noyau et les modules et à les
installer. La manière de procéder a été décrite dans la section traitant de la compilation du noyau.
233
Chapitre 8. Configuration du matériel et des périphériques
• cdrecord, qui permet de piloter le graveur de CD et d’effectuer les tâches nécessaires pour le gravage ;
• mkisofs, qui permet de créer des images disques ISO 9660, éventuellement avec les extensions Joliet
(CD Windows 95), Rock Ridge (CD Unix) ou HFS (CD Macintosh) ;
• cdda2wav, qui permet d’extraire les données numériques des CD audio ;
• cdrdao, qui permet de réaliser des gravages bas niveau et en mode « Disk At Once ».
Vous pourrez vérifier que votre configuration fonctionne correctement si vous disposez d’un périphérique
SCSI ou si vous utilisez l’émulation SCSI avec la commande suivante :
cdrecord -scanbus
Cette commande recherche tous les périphériques SCSI du système. Vous devrez normalement y trouver,
en plus de vos autres périphériques SCSI, votre graveur de CD. Cette commande ne fonctionne pas si
vous utilisez un graveur IDE.
234
Chapitre 8. Configuration du matériel et des périphériques
L’option dev permet de spécifier le périphérique du graveur à utiliser. Cette option peut prendre en
paramètre soit le fichier spécial de périphérique du graveur (par exemple /dev/hdc), soit un triplet de
valeur permettant d’identifier un périphérique sur le bus SCSI (par exemple 0,1,0). La première valeur
représente le bus SCSI sur lequel le graveur est branché, la deuxième le numéro de périphérique du
graveur sur ce bus SCSI et la troisième son numéro d’unité logique (« Logical Unit Number »). Le
numéro du bus SCSI et le numéro de périphérique peuvent être obtenus avec la commande cdrecord
-scanbus présentée ci-dessus si vous utilisez un graveur SCSI. Le numéro d’unité logique est, dans la
majorité des cas, 0.
Le nombre n donné dans la ligne de commande précédente doit valoir le facteur multiplicateur de la
vitesse de gravage. Vous pouvez essayer avec des valeurs faibles pour commencer, afin d’être sûr que
tout se passe bien. Le fichier de périphérique /dev/source quant à lui représente le fichier spécial de
périphérique du lecteur de CD utilisé pour lire le CD-ROM. L’option -isosize permet de demander à
cdrecord de lire la taille de la piste à graver dans le système de fichiers ISO9660 du CD source. Enfin,
l’option -dummy permet de faire toutes les opérations en conservant le laser du graveur éteint, ce qui
revient à faire un test. Si vous voulez réellement graver votre CD, il suffit de supprimer cette option.
Il va de soi que si vous ne disposez pas d’un lecteur de CD en plus de votre graveur, vous ne pouvez pas
utiliser la commande précédente. Dans ce cas, vous devrez faire une image disque en extrayant toutes les
données du CD source. Cela peut être réalisé avec la commande suivante :
dd if=/dev/source of=image
où /dev/source est le fichier spécial de périphérique du lecteur utilisé pour faire l’image, et image est
le fichier image qui doit être créé.
Le gravage d’une image disque peut être réalisé avec la commande suivante :
où les options sont les mêmes que dans les commandes précédentes.
Si vous désirez créer une image disque à partir des fichiers de votre disque dur, vous pouvez utiliser
mkisofs. Ce programme permet de créer une image disque ISO9660, avec les extensions Rock Ridge
pour activer les fonctionnalités des systèmes de fichiers Unix (noms de fichiers plus longs, liens
symboliques, droits d’accès...), et éventuellement les extensions Joliet utilisées par les systèmes
Windows 95, Windows NT, Windows 2000 et XP (noms de fichiers longs Microsoft). Le prix à payer
pour cette amélioration est la perte de quelques centaines de kilo octets, ce qui est dérisoire étant donné
le gain en portabilité. La ligne de commande à utiliser pour créer une image disque est la suivante :
Les options -r ou -R, -J et -hfs ou -apple permettent respectivement d’utiliser les extensions Rock
Ridge, Joliet ou HFS (pour les disques devant être lus sur les Macintosh). Il est possible de faire des
images disque hybrides, qui pourront être lues sur plusieurs systèmes d’exploitation différents. La seule
contrepartie est la perte de quelques dizaines de kilo-octets, ce qui est dérisoire. La distinction entre
l’option -r et l’option -R est que -r modifie les attributs des fichiers Unix afin que le CD puisse être
utilisé sur un autre ordinateur que celui sur lequel le CD a été créé. En particulier, le propriétaire et le
groupe des fichiers voient leurs valeurs fixées à 0. L’option -V permet de fixer le nom du volume dans
235
Chapitre 8. Configuration du matériel et des périphériques
l’image. Il est possible de placer ce nom entre guillemets. Cette fonctionnalité est intéressante si ce nom
comprend des espaces.
Il est possible de créer des CD multisessions à condition de spécifier l’emplacement de cette session lors
de la création de l’image disque. Cela se fait avec l’option -C de mkisofs. Cette option prend en
paramètre le numéro du secteur de début et le numéro du secteur de fin de la session à la suite de laquelle
la nouvelle session doit être écrite, séparés par des virgules. Si l’on veut également importer la session
précédente (c’est-à-dire permettre l’accès aux données des sessions précédentes comme si elles étaient
également présentes dans la session à écrire), il faut utiliser l’option -M, à laquelle il faut indiquer le
fichier spécial de périphérique du lecteur contenant le disque dont la session doit être importée.
La détermination des secteurs de début et de fin de la session précédente peut être difficile, mais
cdrecord est capable d’obtenir cette information avec la commande suivante :
Appelé ainsi, cdrecord affiche les secteurs de début et de fin de la dernière session du disque du lecteur
spécifié par son option dev, directement dans le format attendu par mkisofs.
L’option -o de mkisofs permet de spécifier le nom du fichier image qui doit être créé. Les paramètres
suivant l’option -o constituent la liste des répertoires et des fichiers qui doivent être insérés dans le
CD-ROM. Par défaut, chaque répertoire ou fichier indiqué en paramètre est placé dans le répertoire
racine du CD-ROM, et l’arborescence des sous-répertoires est respectée. Cependant, il est possible de
placer un des répertoires ou fichiers indiqués en paramètre dans un autre répertoire du CD-ROM, à l’aide
de la syntaxe suivante :
destination=source
-x répertoire
où image est le nom de votre fichier image à tester. Cette commande monte le système de fichiers de
cette image dans le répertoire /cdrom. La commande umount peut être utilisée pour démonter ce
système de fichiers de la manière habituelle.
Lorsque votre image disque est satisfaisante, vous pouvez la graver avec la première ligne de commande
suivante :
Vous noterez la présence de l’option -multi, qui permet de demander à cdrecord de créer un disque
multisession. Bien entendu, vous pouvez vous passer de cette option si votre disque n’est pas
multisession.
236
Chapitre 8. Configuration du matériel et des périphériques
La création d’une image disque nécessite d’avoir une place disque égale à la taille de la session à ajouter,
ce qui peut être contraignant. Sur les systèmes suffisamment puissants, il est possible de créer l’image
disque et de la graver à la volée en créant un tube entre mkisofs et cdrecord. Dans ce cas, il ne faut pas
donner de nom à l’image disque dans la ligne de commande de mkisofs, et utiliser l’option - dans la
ligne de commande de cdrecord pour lui demander de prendre les données sur son entrée standard.
Malheureusement, cette technique n’est pas utilisable facilement pour les disques multisessions, parce
que la lecture des informations de la session précédente peut se faire en même temps que le début du
gravage. Pour résoudre ce problème, il faut utiliser l’option -waiti de cdrecord, qui lui demande
d’attendre l’arrivée des premières données dans le tube avant d’ouvrir le fichier spécial de périphérique
du graveur. La ligne de commande complète devient alors assez complexe, comme vous pouvez en juger :
Les commandes présentées ci-dessus ne permettent pas de travailler avec des CD audio. Pour extraire les
données audio d’un CD, vous devrez utiliser le programme cdda2wav» :
L’option -H permet d’éviter la création des fichiers d’information .inf sur les pistes extraites par
cdda2wav. L’option -B permet d’utiliser le nom nom complété d’un numéro pour les fichiers son créés.
Les pistes seront donc stockées dans des fichiers portant les noms nom_01, nom_02, etc. L’option -t
permet d’indiquer la piste début et la piste fin afin de sélectionner les pistes dont les données audio
doivent être extraites. Si la piste de fin n’est pas précisée, toutes les pistes depuis la piste de début jusqu’à
la dernière piste du CD seront extraites. De même, si la piste de début n’est pas précisée, l’extraction
commencera à partir de la première piste. L’option -O permet d’indiquer le type de fichier de sortie, wav
indique ici que les fichiers créés seront au format WAV des fichiers son de Windows. Il est également
possible d’utiliser le type de fichier raw, avec lequel les fichiers seront prêts à être gravés tels quels.
Enfin, l’option dev permet de spécifier le périphérique à utiliser pour lire les données audio. La syntaxe
de cette option est la même que celle utilisée par cdrecord.
Le gravage des pistes audio peut être réalisé avec la commande suivante :
L’option -nofix permet ici d’éviter de fermer la session. Elle doit être utilisée si l’on désire rajouter des
pistes audio sur le CD-ROM ultérieurement. Si, en revanche, elle est omise, cdrecord fermera
automatiquement la session après l’écriture de la dernière piste, et plus aucune donnée ne pourra être
ajoutée. La commande suivante vous permettra de fixer le disque a posteriori :
Enfin, si vous disposez d’un graveur de CD réinscriptible, vous pourrez utiliser la commande suivante
pour effacer un CDRW :
237
Chapitre 8. Configuration du matériel et des périphériques
238
Chapitre 8. Configuration du matériel et des périphériques
Play a été développé. Ce standard établit un protocole de communication matériel permettant au BIOS de
configurer automatiquement les périphériques ISA en évitant les conflits sur les ressources partagées (le
plus souvent, les lignes d’interruption).
Ce protocole a soulagé bien des gens, mais suppose un support spécifique de la part du système
d’exploitation, puisque les paramètres matériels de chaque carte Plug and Play ne sont pas fixés d’un
démarrage à l’autre de la machine. Il faut donc que le système soit ou capable de récupérer ces
paramètres, ou de refaire la configuration du matériel. Cette deuxième solution est souvent imposée par
le fait que bon nombre de BIOS sont bogués et effectuent une mauvaise configuration des cartes Plug
and Play.
Le Plug and Play a été une amélioration sensible, mais n’a pas résolu les problèmes concernant les
ressources limitées des PC. Heureusement, depuis l’avènement du bus PCI, ces limitations se sont
estompées. En effet, le bus PCI permet non seulement aux périphériques de s’autoconfigurer et de se
déclarer dans le système PCI, mais également de partager une même ligne d’interruption et de prendre le
contrôle du bus mémoire. Ainsi, il n’y a virtuellement plus aucune difficulté pour installer une carte PCI
dans un ordinateur. De nos jour, on ne trouve quasiment plus de cartes ISA, et la plupart des cartes mères
n’acceptent même plus ces cartes.
Mais ne croyez pas pour autant que le bus PCI soit idéal, c’est loin d’être le cas. En effet, il ne permet
pas encore l’ajout et la suppression de cartes à chaud (c’est-à-dire lorsque le système est allumé), et
fonctionne désormais à une vitesse bien trop faible compte tenu de la vitesse des processeurs, cartes
graphiques et circuits mémoire. Il est donc encore appelé à évoluer.
Le sous-système PCI de Linux permet d’utiliser directement les cartes PCI, sans configuration
particulière. Les périphériques ISA, en revanche, peuvent être plus difficiles à configurer. S’ils ne sont
pas Plug and Play, il n’y a pas d’autre choix que de spécifier leurs paramètres matériels directement, soit
lors de la compilation du noyau, soit à l’aide d’options de boot lorsque le système démarre, soit à l’aide
d’options dans le fichier /etc/[Link] si leur gestionnaire est compilé sous forme de module.
La première solution est la plus technique, puisqu’elle nécessite de reconfigurer et de recompiler le
noyau, les deux autres relèvent de la configuration simple.
Les cartes ISA Plug and Play constituent un cas à part car, comme il l’a été dit ci-dessus, la plupart des
BIOS Plug and Play sont bogués et les initialisent mal. Il est donc nécessaire que le système les initialise
lui-même, et détermine par la même occasion leur configuration matérielle. En pratique, il existe deux
possibilités pour effectuer ces deux opérations. La première possibilité est de laisser le noyau faire tout le
travail de configuration des cartes et d’allocation des ressources. La deuxième possibilité est d’effectuer
la configuration des cartes ISA Plug and Play au niveau applicatif dans les scripts de démarrage du
système. Cette solution est relativement technique, et ne doit être utilisée que lorsqu’on désire contrôler
finement les ressources allouées par les périphériques dans le système.
Si l’on désire utiliser les fonctionnalités Plug and Play du noyau, il n’y a strictement rien à faire. Linux
se charge simplement d’initialiser automatiquement les cartes ISA Plug and Play lors du démarrage du
système, de leur attribuer les paramètres matériels adéquats, et de communiquer ces paramètres aux
gestionnaires de périphériques. Il prendra également en charge la gestion des conflits avec les autres
périphériques, qu’ils soient ISA non Plug and Play ou PCI. Par conséquent, vous n’aurez aucune
configuration spécifique à effectuer.
Mais Linux fournit également la possibilité de contrôler soi-même les ressources allouées à chaque
périphérique, pour ceux qui veulent avoir la maîtrise totale de leur matériel ou ceux qui ont une
configuration tellement spécifique qu’elle nécessite un paramétrage manuel. Dans ce cas, l’initialisation
des cartes ISA Plug and Play ne se fera pas lors du démarrage du noyau, mais plutôt ultérieurement. En
239
Chapitre 8. Configuration du matériel et des périphériques
général, on effectue cette tâche dans les scripts d’initialisation du système, mais ce n’est pas une
obligation. Quoi qu’il en soit, comme l’attribution des ressources aux cartes est différée, les gestionnaires
de périphériques ne peuvent pas être inclus dans le noyau. Il est donc nécessaire d’utiliser les modules du
noyau pour ces gestionnaires. Les paramètres matériels pourront alors être communiqués simplement à
ces gestionnaires lors du chargement des modules, à l’aide d’options dans le fichier de configuration
/etc/[Link].
La configuration manuelle des cartes ISA Plug and Play se fait classiquement à l’aide des outils
« isapnp ». Parmi ces outils se trouve le programme isapnp, que l’on utilise pour initialiser les cartes
ISA Plug and Play. Cet utilitaire utilise les informations qui se trouvent écrite dans le fichier de
configuration /etc/[Link] pour déterminer les plages d’entrée/sortie, les canaux DMA et les
lignes d’interruption à utiliser pour chaque carte.
La rédaction manuelle du fichier [Link] n’est pas une tâche aisée. Heureusement, cela peut être
réalisé automatiquement, à l’aide d’un autre utilitaire nommé pnpdump. Celui-ci affiche la liste des
différentes possibilités de configuration pour chaque périphérique ISA Plug and Play. Cette liste est
affichée exactement sous une forme exploitable par isapnp, ce qui fait qu’il est très simple de créer un
fichier de configuration correct en faisant une redirection de sa sortie standard dans un fichier :
Le fichier de configuration ainsi créé contient les différentes configurations possibles. Cependant, elles
sont toutes commentées, et aucun périphérique ISA ne sera configuré sans intervention supplémentaire.
Il va donc falloir éditer ce fichier et retirer les commentaires devant les options de configuration qui vous
intéressent. Les lignes de commentaires commencent toutes par un caractère dièse (’#’). Il suffit donc
d’effacer ce caractère pour les décommenter. Vous devez choisir les options à décommenter de telle
manière qu’aucun conflit d’adresse, d’interruption ou de canal DMA n’existe dans votre système. Pour
chaque périphérique, plusieurs possibilités sont offertes, mais vous ne devez retirer les commentaires que
devant les lignes d’une seule de ces possibilités. Les zones à décommenter sont clairement identifiées
dans le fichier [Link] généré par pnpdump, il vous suffit donc d’effectuer le choix de la
configuration à utiliser. Enfin, il ne faut pas oublier de retirer le commentaire devant la ligne suivante :
(ACT Y)
à la fin des différentes options de configuration pour chaque carte correctement configurée, faute de quoi
elle ne sera pas activée lors de l’appel à isapnp.
En général, il est souhaitable d’appeler la commande isapnp à chaque démarrage du système, dans un
des scripts de démarrage. Vous devrez donc inclure une ligne telle que celle-ci :
/sbin/isapnp /etc/[Link]
dans le fichier de démarrage principal de votre système. Ce fichier peut se trouver dans le répertoire
/etc/rc.d/ (ou dans /sbin/init.d/ selon la distribution que vous utilisez). La plupart des
distributions permettent de paramétrer l’appel à cette commande à l’aide d’une option de configuration
modifiable à l’aide de leur programme de configuration. Consultez la documentation de votre distribution
pour plus de détails à ce sujet.
Une fois que vous aurez déterminé la configuration correcte pour vos périphériques dans le fichier
/etc/[Link], vous pourrez charger les modules du noyau gérant ces périphériques. Cela peut
240
Chapitre 8. Configuration du matériel et des périphériques
nécessiter la modification du fichier /etc/[Link]. Afin de limiter les risques d’erreur, vous
devriez procéder comme suit :
• déterminer le fichier spécial de périphérique utilisé par les applications pour accéder à votre
périphérique ;
• déterminer le nom du module que le noyau tentera de charger lorsqu’un programme tentera d’utiliser
ce fichier spécial de périphérique ;
• rechercher la ligne définissant l’alias pour ce nom de module, afin de savoir quel est le module qui sera
effectivement chargé par modprobe. Vous pouvez également trouver ce nom dans la documentation
de la configuration du noyau pour le gestionnaire du périphériques que vous configurez, ou en
regardant directement dans le répertoire d’installation des modules /lib/modules/ ;
• ajouter éventuellement la ligne « options module paramètres » permettant de spécifier les
paramètres de chargement paramètres pour le module module ;
• ajouter éventuellement les lignes « install » et « remove », permettant d’effectuer des actions
complémentaires lors du chargement et du déchargement du module.
Comme il l’a été indiqué dans la la section intitulée Modules du noyau, la détermination des noms de
modules utilisés par le noyau pour les requêtes de chargement automatique n’est pas facile. Vous aurez
sans doute à vous servir du type, du code majeur et du code mineur de ce fichier spécial de périphérique.
Vous pourrez obtenir ces informations à l’aide de la commande ls -l fichier, où fichier est le nom du
fichier spécial de périphérique. Le type de ce fichier est indiqué dans le premier caractère des droits du
fichiers. Le caractère ’c’ indique que le périphérique est un périphérique de type caractère, et le caractère
’b’ indique qu’il s’agit d’un périphérique de type bloc. Les numéros de codes majeur et mineur quant à
eux sont indiqués juste après les informations concernant le propriétaire et le groupe du fichier,
généralement égaux à « root ».
Quoi qu’il en soit, il est fortement recommandé de lire la documentation du module gérant votre
périphérique Plug and Play. Cette documentation est en général située dans le répertoire
/usr/src/linux/Documentation/.
Pour tester si les modifications que vous avez effectuées sont correctes, vous pouvez essayer de charger
le module avec la commande suivante :
modprobe module
où module est le nom du module à charger. Vous pouvez également vérifier que ce module se charge
bien lorsqu’une requête sur le fichier spécial de périphérique correspondant est effectuée, avec par
exemple la commande suivante :
où périphérique est le fichier spécial de périphérique à tester. Vous pouvez voir si le module s’est
correctement chargé en demandant la liste des modules chargés à l’aide de la commande lsmod. Cette
commande vous indique également l’état de chaque module, ainsi que le nombre de fois qu’il est utilisé
et par qui. Si un module est marqué « uninitialized », vous avez de fortes chances de devoir
241
Chapitre 8. Configuration du matériel et des périphériques
redémarrer l’ordinateur et de revoir votre configuration, car un module qui se trouve dans cet état est
inutilisable et peut parfois même refuser de se décharger.
Fonctionnalités du matériel
Les fonctionnalités fournies par les gestionnaires de son de Linux varient dans de larges proportions,
selon le matériel utilisé. La quasi totalité des cartes son gèrent bien entendu l’essentiel : la restitution de
fichiers audio numériques. Les fonctionnalités des cartes son sont à ce niveau relativement disparates :
les différences vont du taux d’échantillonage utilisé jusqu’à la possibilité de les faire fonctionner en full
duplex (enregistrement et lecture simultanée) ou non. Cette dernière fonctionnalité est essentielle pour
les applications de téléphonie sur Internet par exemple.
De plus, très peu de cartes son sont capables de gérer la restitution des fichiers MIDI correctement (les
fichiers MIDI sont des fichiers musicaux permettant de stocker les séquences de notes à jouer pour
restituer le morceau, au lieu de stocker le son lui-même sous forme numérique). La plupart des cartes son
ne fournissent aucun support matériel pour cela, et la restitution des notes des fichiers MIDI se fait
généralement à l’aide d’un synthétiseur logiciel. C’est en particulier le cas pour toutes les cartes son
intégrées sur les cartes mères des ordinateurs récents. Les gestionnaires de périphériques de Linux ne
fournissent pas de synthétiseur logiciel, en revanche il existe plusieurs programmes permettant de lire les
fichiers MIDI, moyennant une consommation plus ou moins importante des ressources de calcul de
l’ordinateur.
La plupart des cartes son bas de gamme disposent toutefois d’un synthétiseur en modulation de
fréquence (synthétiseur dit « FM »), qui permet de simuler des notes d’instrument de musique,
généralement avec une qualité très médiocre. Certains pilotes de cartes son de Linux permettent
d’utiliser ces synthétiseurs, mais ce n’est toujours pas la panacée. En réalité, si l’on veut restituer
correctement les notes des fichiers MIDI, il faut utiliser une carte son disposant de ce que l’on appelle
une table d’échantillons. Ces tables permettent de stocker dans la mémoire de la carte son des
échantillons de sons d’instruments de musique enregistrés en qualité numérique. La carte son peut ainsi
reconstituer le son de toutes les notes de musique fidèlement, avec une très grande ressemblance avec
l’instrument réel. Ces cartes sont bien entendu plus coûteuses, mais la qualité sonore est incomparable à
ce niveau (les cartes SoundBlaster AWE et Live en particulier disposent de tables d’échantillons). Linux
permet parfaitement d’utiliser ces cartes, et même de charger de nouveaux jeux d’échantillons dans la
mémoire de la carte pour changer la sonorité des instruments.
Je ne saurais donc que trop vous conseiller de bien vous renseigner avant l’achat d’une carte son, car ce
sujet n’est pas très souvent pris en considération lors de l’achat. Bien entendu, si vous ne désirez pas
utiliser votre carte son dans ses derniers retranchements, vous pouvez vous contenter des cartes intégrées
sur les cartes mères. Dans les autres cas, renseignez-vous.
Configuration du noyau
La plupart des cartes son vendues actuellement sont des cartes PCI, qui se configurent relativement
aisément. Cependant, il existe encore un bon nombre de cartes son ISA, dont la configuration peut être
plus technique, surtout si elles ne sont pas Plug and Play.
242
Chapitre 8. Configuration du matériel et des périphériques
La première étape lors de la configuration de votre carte son sera la sélection du gestionnaire de
périphériques à utiliser dans le programme de configuration du noyau. En ce qui concerne les cartes son,
les options de configuration se trouvent dans le menu « Sound ». Vous y trouverez deux jeux de pilotes :
les pilotes ALSA (« Advanced Sound Linux Architecture ») et les pilotes OSS (« Open Sound
System »). Les pilotes ALSA sont les plus modernes, et devront être utilisés en priorité, car ils
fournissent le plus de fonctionnalités. Les pilotes OSS sont des pilotes plus anciens, qui sont toutefois
maintenus à titre de compatibilité d’une part et, d’autre part, parce que certaines cartes son ne sont pas
encore totalement prises en charge par les pilotes ALSA. Les pilotes OSS sont eux-mêmes classés en
deux catégories : les pilotes classiques (première partie des options du menu) et les pilotes OSS purs. Ces
derniers utilisent une spécification d’interface de programmation commune permettant l’accès aux cartes
son, mais il n’y a pas de différence au niveau des applications pour l’utilisation de ces pilotes. Vous
devez choisir le gestionnaire de périphériques ALSA ou OSS qui convient le mieux à votre matériel.
L’erreur la plus classique que l’on peut faire au niveau du choix du pilote est de supposer que l’on
possède une carte compatible Sound Blaster alors que ce n’en est pas une. Je tiens à préciser que
quasiment aucune carte dite « compatible » sous Windows ne l’est sous Linux. La compatibilité sous
Linux, c’est le fait d’avoir quasiment la même électronique ou du moins les mêmes interfaces au niveau
matériel. Sous Windows, la compatibilité n’existe qu’au niveau des interfaces fournies par le pilote de la
carte son. Par conséquent, il vous faut savoir exactement de quel nature est votre carte son, et non ce que
vous avez retenu des arguments commerciaux du fabricant. Notez en particulier que certaines cartes
Sound Blaster ne sont pas compatibles Sound Blaster (Creative Labs est renommé en ce qui concerne les
incompatibilités entre les différents modèles de cartes son). C’est notamment le cas pour les cartes sons
SB64 PCI et SB128 PCI, qui sont en réalité des cartes son ESS1370 ou ESS1371, et dont l’électronique
est fabriquée par la société Ensoniq (cette société a été rachetée par Creative Labs, qui vend ces cartes en
s’appuyant sur son image de marque et qui sème ainsi la confusion sur le marché). En conclusion, si
vous ne voulez pas essayer plusieurs pilotes et recompiler le noyau jusqu’à ce que vous trouviez le bon,
renseignez-vous bien sur la nature de votre carte son (si possible avant de l’acheter, au moins afin de
savoir exactement ce que vous aurez). Vous pouvez également taper la commande lspci afin de voir les
périphériques réellement présents sur le bus PCI. La commande système dmesg peut également vous être
utile. Elle permet de réafficher la liste des messages de traces générés par le noyau, et vous y trouverez
donc les messages relatif à la phase de détection des périphériques.
Lorsque vous aurez choisi le gestionnaire de périphériques adéquat, vous aurez le choix entre le compiler
à l’intérieur du noyau (en choisissant l’option ’Y’) ou le compiler sous forme de module (en choisissant
l’option ’M’). Il est possible soit de charger ces pilotes en tant que module, soit de les intégrer au noyau.
En général, il est préférable d’utiliser les modules, car les programmes de configuration audio peuvent
ainsi détecter automatiquement les cartes son utilisées. De plus, certaines fonctionnalités non essentielles
sont souvent désactivées par défaut par les pilotes, et doivent être activées explicitement à l’aide d’une
option lors du chargement du module ou d’un paramètre à fournir au noyau lors de son amorçage. Les
modules sont donc là aussi plus faciles à utiliser, car ils éviteront de redémarrer le système à chaque
essai. Cependant, pour la plupart des paramètres matériels (en particulier les lignes d’interruptions, les
ports d’entrée/sortie et les canaux d’accès direct à la mémoire), Linux déterminera automatiquement les
valeurs correctes. Cette configuration n’est donc pas à faire, et votre carte son fonctionnera généralement
immédiatement.
Les vielles cartes son ISA qui ne sont pas Plug and Play devront généralement également être intégrées
au noyau. En effet, pour ces cartes sons, la configuration logicielle est très simple, puisqu’on ne peut pas
les configurer du tout, et l’on n’a donc pas besoin de modules du tout. Bien entendu, il faut que vous
ayez résolu manuellement les conflits possibles de matériel de votre ordinateur en fixant les switchs
adéquats sur vos cartes filles, mais cela ne concerne pas Linux. Pour ces cartes, il faut généralement
243
Chapitre 8. Configuration du matériel et des périphériques
indiquer au noyau les paramètres matériels (IRQ, DMA et ports d’entrée/sortie) lors de la configuration.
Il se peut toutefois que vous ne puissiez pas spécifier ces paramètres matériels dans les menus de
configuration de Linux. Bien qu’en théorie il soit possible de modifier les fichiers sources de Linux
directement pour indiquer ces paramètres, ce n’est pas à la portée du commun des mortels. Par
conséquent, on utilisera malgré tout dans ce cas les modules du noyau, et les options matérielles seront
indiquées dans le fichier de configuration /etc/[Link]. Notez que c’est également de cette
manière que vous devrez procéder si vous désirez configurer vous-même l’allocation des ressources pour
les cartes son ISA Plug and Play, ou, autrement dit, si vous préférez utiliser l’outil isapnp au lieu des
fonctionnalités Plug and Play du noyau.
# Permet le chargement des pilotes OSS ou l’émulation des pilotes OSS par ALSA :
alias char-major-14 soundcore
Les systèmes de son gérés par ces modules permettent de prendre en charge plusieurs cartes son. Chaque
carte son est bien entendu référencée par le numéro de code mineur du fichier spécial de périphérique
utilisé. Il faut donc définir, pour chaque carte son, le module du gestionnaire de périphérique de cette
carte son. Cela se fait en définissant les alias pour les noms de modules génériques snd-card-n pour
ALSA et sound-slot-n pour OSS, où ’n’ est le numéro de la carte son.
Par exemple, si l’on dispose d’une carte son SoundBlaster 128 avec les pilotes ALSA, le module à utiliser
est snd-ens1370 ou snd-ens1371 selon le modèle (parce que ces cartes son sont en réalité des cartes
Ensoniq). Le fichier de configuration /etc/[Link] devra donc contenir les alias suivants :
244
Chapitre 8. Configuration du matériel et des périphériques
Si vous désirez utiliser les pilotes OSS, le module à utiliser pour ce type de carte se nomme es1371, ce
qui fait que le fichier de configuration /etc/[Link] se réduit dans ce cas à :
Les modules des gestionnaires de périphériques peuvent prendre des options permettant de contrôler les
ressources matérielles et les fonctionnalités prises en charge. Vous pourrez trouver la liste des différents
modules de pilotes de périphériques disponibles, ainsi que leurs options, dans la documentation fournie
dans le répertoire Documentation/sound/ des sources du noyau.
Enfin, les pilotes de périphériques OSS n’implémentent pas forcément l’ensemble des fonctionnalités
classiques des cartes son. Lorsqu’une de ces fonctionnalité est demandée, le pilote peut donc demander
le chargement d’un module complémentaire. Le nom utilisé par le noyau pour ce module est
« sound-service-n-m », où ’n’ est le code majeur du fichier spécial de périphérique de la carte son et
m le code de la fonctionnalité utilisée. Ces codes correspondent aux numéros de codes mineurs des
fichiers spéciaux de périphériques permettant d’accéder à ces fonctionnalités. Ainsi, la valeur 0
correspond au mixeur (fichier spécial de périphérique /dev/mixer), la valeur 2 correspond au port
MIDI (fichier spécial de périphérique /dev/midi), et les codes 3 et 4 au canal de la carte son (fichiers
spéciaux de périphériques /dev/dsp et /dev/audio). La liste des fichiers spéciaux de périphériques
utilisés par OSS peut être consultée dans le fichier Documentation/[Link].
Si vous utilisez les pilotes ALSA, vous devrez ajouter les alias suivants dans le fichier
/etc/[Link] afin de charger à la demande les modules d’émulation des services OSS :
245
Chapitre 8. Configuration du matériel et des périphériques
touche permet également d’activer ou de désactiver certaines fonctionnalités de votre carte son. Lorsque
les réglages vous conviendront, vous pouvez simplement quitter alsamixer en appuyant sur la touche
’Échap’.
Les réglages réalisés de cette manière ne sont pas permanents. Cela signifie que d’un redémarrage à
l’autre de la machine, les valeurs par défaut seront reprises. ALSA fournit donc également l’outil alsactl,
qui permet d’enregistrer les paramètres des cartes son dans le fichier de configuration
/etc/[Link]. Pour cela, il suffit simplement d’appeler cette commande avec l’option store :
alsactl store
alsactl permet également de restaurer les paramètres sauvegardés, à l’aide de son option restore. On
aura donc tout intérêt à placer une ligne telle que celle-ci dans les fichiers d’initialisation de sa
distribution, si ce n’est déjà fait :
alsactl restore
Par ailleurs, pour les cartes son qui disposent d’un synthétiseur FM, il peut être intéressant d’activer cette
fonctionnalité. Généralement, les pilotes ALSA désactivent cette fonctionnalité. Elle peut toutefois être
réactivée en spécifiant le port d’entrée / sortie du synthétiseur FM de la carte son à l’aide de l’option
fm_port. du module prenant en charge votre carte son. De même, vous pourrez activer la gestion des
pilotes MIDI en ajoutant l’option mpu_port et en indiquant le numéro de port pour le port MIDI. Vous
pouvez consulter le fichier de documentation
Documentation/sound/alsa/[Link] des sources du noyau Linux pour plus
d’informations à ce sujet. En général, le numéro de port utilisé pour les synthétiseurs FM est le numéro
0x388, et le numéro du port MIDI est le 0x300. Par exemple, pour une carte son CMI, la ligne suivante
pourra être ajoutée dans le ficher de configuration [Link] :
Si vous désirez compiler en dur le pilote de votre carte son, vous devrez fournir ces informations en ligne
de commande à l’amorçage du noyau. Vous devez donc ajouter, pour chacun de ces paramètres, une
option à la ligne de commande du noyau. Par exemple, pour une carte son CMI, il faudrait ajouter les
options suivantes dans le fichier de configuration du GRUB ou dans le fichier [Link] :
La première option permet d’indiquer que cette carte son est la première carte son du système. Elle peut
être nécessaire si vous avez intégré dans le noyau des pilotes pour d’autres cartes son, réelles ou
virtuelles. Les autres options sont directement déduites de celles spécifiées dans le fichier
[Link].
Enfin, vous aurez sans doute à charger une banque de sons dans le pilote, que vous utilisiez une synthèse
FM ou une table d’échantillons. La manière de procéder est toutefois différente selon la carte son
utilisée. Pour les cartes sons qui ne disposent que d’une émulation FM, il faut utiliser le programme
sbiload. Ce programme est fourni avec les outils complémentaires d’ALSA, et disponible sur le site web
246
Chapitre 8. Configuration du matériel et des périphériques
Cette commande permet de charger dans le périphérique MIDI ALSA 65:0 les fichiers de définition de
notes std.o3 et drums.o3. Ces fichiers sont fournis avec sbiload (pas dans toutes les versions
toutefois). L’option --opl3 permet d’indiquer le format de ces fichiers. Quant à l’option -p, elle permet
d’indiquer le port MIDI dans le pilote ALSA. Les numéros de ports disponibles peuvent être obtenus
avec la commande suivante :
sbiload -l
Pour les cartes son qui disposent d’une table d’échantillons, le programme à utiliser est différent. Pour
les cartes Sound Blaster AWE et Sound Blaster Live, ce programme se nomme sfxload. Ce programme
peut être trouvé sur le site [Link] Vous trouverez également les
fichiers de patches utilisables avec les cartes son AWE sur ce site. Vous pouvez utiliser le fichier de
définition des patches de Creative, que vous trouverez normalement soit sur une installation de Windows
avec une carte son AWE, soit sur vos CD d’installation, soit sur Internet. Le fichier fourni par Creative se
nomme [Link].
Pour charger les patches dans la mémoire de la carte, il suffit d’utiliser la commande suivante :
sfxload /usr/lib/[Link]
(en supposant que le fichier de patches soit placé dans le répertoire /usr/lib/). Vous pourrez placer
cette commande dans les scripts de démarrage de votre système ou dans une option de chargement du
module de prise en charge de votre carte son.
247
Chapitre 8. Configuration du matériel et des périphériques
fichiers MIDI. Dans ce cas, il faut utiliser un programme externe capable de synthétiser le son à partir
d’échantillons enregistrés sur le disque dur et d’envoyer les données audio ainsi créées à la carte son pour
la lecture.
Pour les cartes son ne disposant pas de la possibilité de lire les fichiers MIDI, il ne reste que la solution
de l’émulation logicielle. Le meilleur synthétiseur logiciel sous Linux est incontestablement le logiciel
Timidity. Timidity est un programme de lecture de fichiers MIDI très complet, paramétrable et capable
d’utiliser des banques de sons externes variées. De plus, le moteur de Timidity est utilisé par de
nombreux autres programmes, en particulier par le lecteur KMidi de KDE.
L’auteur originel de Timidity ne le maintient plus. Cependant, d’autres programmeurs ont pris le relais et
l’ont amélioré pour en faire la version Timidity++. Cette dernière version peut être trouvée sur Internet
sur le site de Timidity ([Link] L’archive que vous récupérerez ne contient pas
forcément le programme : il peut ne s’agir que des fichiers sources permettant de le générer. Les notions
de fichiers sources et de compilation de programmes exécutables seront expliquées en détail dans le
chapitre suivant. En attendant, si vous récupérez les sources, vous pourrez suivre les indications données
ci-dessous pour compiler et installer Timidity.
Timidity peut utiliser différentes interfaces utilisateur, accessibles via différentes bibliothèques. De plus,
il est capable d’utiliser différentes interfaces pour lire et jouer les morceaux. En particulier, il peut être
utilisé comme un serveur MIDI via ALSA afin que tous les programmes MIDI puissent y accéder via les
interfaces standard d’ALSA. De même, il est capable de partager le canal audio de sortie de la carte son
via le serveur de son aRts de KDE. Pour utiliser ces fonctionnalités, il faut configurer les sources avec la
ligne de commande suivante :
Une fois cela fait, vous pourrez générer l’exécutable avec la commande suivante :
make
make install
248
Chapitre 8. Configuration du matériel et des périphériques
/usr/lib/timidity ». Notez que cette ligne est facultative et peut être commentée si vous n’avez pas
déplacé ce répertoire. Le deuxième répertoire est plus important, puisque c’est le répertoire d’installation
des patches. Il s’agit cette fois de remplacer la ligne « dir c:\eawpats » par la ligne « dir
répertoire », où répertoire est le répertoire où vous avez extrait les fichiers patches.
Une fois que vous aurez terminé ces modifications, vous pourrez lire un fichier MIDI simplement en
utilisant la ligne de commande suivante :
timidity fichier
où fichier est le nom du fichier MIDI à lire. Si vous désirez utiliser l’interface graphique de Timidity,
vous n’avez qu’à ajouter l’option -ig à la ligne de commande précédente. Enfin, si vous désirez utiliser
Timidity en tant que séquenceur système ALSA et permettre le mixage du flux audio qu’il produit avec
les flux des autres applications par l’intermédiaire du serveur de son aRts de l’environnement de
développement de KDE, vous devrez utiliser les options -iA -OR -B2,8 -EFreverb=0. Les
programmes MIDI devront ensuite se connecter sur le port MIDI 128:0 d’ALSA.
L’installation de KMidi ne pose pas de problème particulier, puisqu’il est fourni avec KDE et que KDE
est normalement inclus dans toute bonne distribution. La seule opération que vous ayez à faire est
simplement de modifier le fichier de configuration de KMidi pour lui indiquer l’emplacement des fichiers
de patches. Or comme KMidi est basé sur les sources de Timidity, il utilise le même fichier de
configuration [Link] que Timidity. Ce fichier est normalement situé dans le répertoire
/base/kde/share/apps/kmidi/config/, où base représente le répertoire de base d’installation de
KDE. Vous n’aurez donc qu’à répéter les opérations faites sur le fichier de configuration de Timidity
avec le fichier de configuration de KMidi.
249
Chapitre 8. Configuration du matériel et des périphériques
module du noyau, dont le but est de contrôler les accès au ressources matérielles et de garantir ainsi la
stabilité globale du système.
La configuration des fonctionnalités 3D des cartes graphiques sous Linux nécessite donc d’intervenir à la
fois dans le noyau et au niveau du serveur X. Pour ce qui est du noyau, il faut tout d’abord s’assurer que
les fonctionnalités d’accès direct au matériel sont bien supportées. Ces fonctionnalités sont couramment
appelées « DRI », ce qui est l’abréviation de l’anglais « Direct Rendering Infrastructure ». Pour activer
les fonctionnalités DRI, vous devrez, dans la configuration du noyau, valider l’option « Direct Rendering
Manager » du menu « Character devices », ainsi que le type de carte graphique utilisée (3Dfx, 3dlabs,
ATI Rage 128 ou ATI Radeon, chipset i810 ou Matrox G200/G400).
Note : Les fonctionnalités 3D des cartes graphiques basées sur les puces NVidia ne sont pas
supportées directement par [Link] et par le noyau. En revanche, NVidia fournit un pilote pour Linux
pour ces cartes, qui, bien qu’il n’utilise pas DRI, dispose également d’un module du noyau et d’un
module pour [Link].
Quelle que soit votre carte graphique, vous aurez également sans doute intérêt à activer le support du bus
AGP dans le noyau, si bien sûr votre carte graphique est une carte AGP. Pour cela, il suffit d’activer
l’option « /dev/agpgart (AGP support) » dans le menu « Character devices » de la configuration du
noyau, ainsi que le type de chipset utilisé par votre carte mère.
Une fois la configuration du noyau faite, vous pourrez le recompiler et l’installer. La manière de procéder
a été décrite en détail dans la la section intitulée Compilation du noyau Linux dans Chapitre 7.
Vous devrez également vous assurer que le fichier spécial de périphérique /dev/agpgart est bien
présent dans le répertoire /dev/. Son code majeur est 10, et son code mineur est 175. De même, si vous
avez compilé les options précédentes sous la forme de modules du noyau, assurez-vous qu’ils sont bien
référencés dans le fichier [Link].
La suite des opérations se passe alors au niveau de la configuration du serveur X de [Link]. L’activation
du support de l’AGP et d’OpenGL se fait simplement en rajoutant deux options dans le fichier de
configuration /etc/X11/[Link]. Vous devez trouver la section « Modules » et lui ajouter les deux
lignes suivantes :
Section "Module"
.
.
.
Load "dri"
Load "glx"
.
.
.
EndSection
Vous trouverez de plus amples renseignements sur la manière de procéder dans le Chapitre 10.
Note : Pour le pilote fourni par NVidia pour [Link], il n’est pas nécessaire de demander le
chargement du module DRI, car il ne l’utilise pas.
Il est supposé ici que le serveur X utilisé correspond bien à la carte graphique et dispose des
fonctionnalités 3D. Si ce n’est pas le cas, vous devrez sans doute réinstaller [Link].
Les programmes utilisant OpenGL utilisent souvent une bibliothèque complémentaire nommée
GLUT. Cette bibliothèque est fournie avec la couche d’émulation logicielle d’OpenGL MESA.
250
Chapitre 8. Configuration du matériel et des périphériques
Toutefois, la bibliothèque GLUT n’est disponible que dans les programmes d’exemples de MESA.
Vous devrez donc réinstaller MESA complètement si votre distribution ne fournit pas la bibliothèque
GLUT.
Note : La configuration des cartes basées sur la puce Bt848 (option de menu « BT848 Video For
Linux ») n’est accessible que si vous avez également activé l’option « I2C bit-banging interfaces » du
menu « I2C support » (lui-même situé dans le menu « Character devices »).
De plus, le pilote prenant en charge les puces du type Bt848 ne prend pas en charge la gestion du
son. Ces puces n’intègrent en effet pas de gestion du son, et nécessitent de brancher la sortie audio
de la carte TV sur l’entrée ligne d’une carte son. Toutefois, un mixeur est disponible. Celui-ci est pris
251
Chapitre 8. Configuration du matériel et des périphériques
en charge automatiquement pour les pilotes de son ALSA. Pour les pilotes OSS en revanche, un
gestionnaire spécifique devra être activé. L’option correspondante est l’option « TV card (bt848)
mixer support ». Pour les puces Bt878, qui sont plus récentes, une carte son intégrée est fournie, et
il existe un pilote complet ALSA et OSS, que l’on devra également activer.
Une fois le noyau recompilé et installé, il faut modifier trouver les paramètres adaptés à votre matériel.
En effet, bien que Linux soit parfaitement capable de déterminer les ressources requises par les cartes
vidéo, il est rare que le matériel soit correctement identifié par les gestionnaires de périphériques. Cela
est dû au fait que les gestionnaires se basent plus sur les composants courants permettant de faire
l’acquisition vidéo que sur les modèles de cartes de chaque fabricant. La palme revient sans doute au
gestionnaire pour les cartes basées sur les puces Bt848 et ses dérivées, puisqu’il est capable de faire
fonctionner toutes les cartes vidéo de tous les fabricants qui utilisent cette puce. Par conséquent, il faut
indiquer le modèle de la carte au gestionnaire, et bien souvent le modèle de tuner doit également être
spécifié.
Si vous avez compilé les gestionnaires de périphériques sous forme de module, vous pourrez spécifier le
type de carte et le type de tuner simplement dans le fichier de configuration /etc/[Link], à
l’aide des options du module du gestionnaire de périphérique adéquat. Pour les cartes basées sur la puce
Bt848, le gestionnaire de périphérique est pris en charge par le module bttv. Le type de carte peut lui
être communiqué à l’aide de l’option card. Cette option peut prendre comme valeur un numéro
identifiant le modèle de la carte. Les valeurs actuellement supportées sont indiquées dans le fichier
[Link] du répertoire /usr/src/linux/Documentation/video4linux/bttv/. Le type
de tuner quant à lui doit être spécifié à l’aide de l’option tuner. Cette option prend, elle aussi, une valeur
numérique indiquant la nature du tuner utilisé. Les valeurs supportées sont données dans le fichier
[Link]. En pratique, il est fort probable que vous utilisiez le type de tuner 3, qui correspond
au tuner Philips SECAM, car la France utilise le standard SECAM pour les émissions TV.
Ainsi, si vous disposez d’une carte MIRO PCTV (carte de type 1) basée sur le tuner Philips SECAM,
vous devriez avoir les lignes suivantes dans votre fichier [Link] :
Vous devrez bien entendu adapter ces lignes selon votre propre configuration.
Si vous ne désirez pas utiliser les modules du noyau, vous devrez fournir ces paramètres au gestionnaire
de périphérique via la ligne de commande du noyau. Les options à utiliser peuvent alors être déduites des
options du module, comme on l’a expliqué dans la la section intitulée Configuration des périphériques
intégrés au noyau. Pour notre exemple, ces paramètres seraient les suivants :
[Link]=1 [Link]=3
252
Chapitre 8. Configuration du matériel et des périphériques
Si vous avez compilé les fonctionnalités de l’interface I2C sous forme de module (option de menu « I2C
bit-banging interfaces »), vous aurez également à ajouter ces lignes dans votre fichier de configuration
[Link] :
Pour information, I2C est un protocole de communication entre micro-contrôleurs, que la plupart des
cartes mères sont capables de gérer. Cette fonctionnalité n’est nécessaire que pour les cartes basées sur la
puce Bt848.
Enfin, si vous utilisez les pilotes OSS pour la gestion du mixer de votre carte d’acquisition vidéo (ce qui
est nécessaire pour les cartes vidéo basées sur les puces Bt848, parce qu’ALSA ne fournit pas de pilote
pour ces cartes à l’heure actuelle), vous devrez définir les alias nécessaires au chargement des modules
de cette carte lors de l’accès aux périphériques audio. Par exemple, pour une carte basée sur la puce
Bt848, les alias suivants doivent être ajoutés dans le fichier de configuration [Link] :
Note : Vous pouvez rencontrer quelques problèmes lors de la configuration de votre carte TV.
Généralement, si vous n’obtenez aucune image, c’est que vous vous êtes trompé de tuner. Revoyez
dans ce cas l’option type du module tuner. Si vous obtenez bien une image, mais pas de son, c’est
sans doute que vous vous êtes trompé dans le type de carte, ou que vous avez oublié d’inclure le
support du son pour les cartes à base de Bt848. On notera que, comme pour les cartes son, seule la
compatibilité matérielle importe. Par exemple, les cartes Studio PCTV de Pinacle vendues en France
sont en réalité des cartes Miro PCTV et ne sont pas reconnues comme des cartes Studio PCTV par
Linux... Si vous avez des problèmes de son, vous devrez donc revoir la configuration du noyau ou
modifier la valeur passée à l’option card du module bttv. Dans tous les cas, n’hésitez pas à utiliser la
commande lspci, qui permet de visualiser les informations du bus PCI, et la commande dmesg, qui
permet de voir la liste des messages du noyau.
Vous pouvez également avoir quelques problèmes de droits sur les fichiers spéciaux de
périphériques /dev/videoX. Le symptôme classique est dans ce cas que tout fonctionne
parfaitement sous le compte root, mais pas sous les comptes utilisateurs. Dans ce cas, on pourra
résoudre ces problèmes en créant un groupe d’utilisateurs video, auquel appartiendront tous les
utilisateurs ayant le droit d’utiliser la carte d’acquisition TV, et de changer le groupe des fichiers
spéciaux de périphériques /dev/videoX.
Enfin, l’utilisation des cartes d’acquisition TV nécessite d’activer les fonctionnalités DGA ou Xv du
serveur X. Ces fonctionnalités permettent aux programmes d’accéder directement à la mémoire
vidéo, et donc de faire l’incrustation de l’image décodée par la carte TV dans la surface d’affichage
d’un écran. La manière d’activer les fonctionnalités DGA et Xv sera précisée dans le chapitre traitant
de la configuration du serveur X.
253
Chapitre 8. Configuration du matériel et des périphériques
Note : Comme pour toute onde proche des 2.4 GHz, l’influence des ondes radio Wifi sur les corps
organiques humides n’est pas neutre (la problématique se pose bien entendu également pour les
téléphones portables). En effet, les effets sont strictement les mêmes que ceux des ondes des fours
à micro-ondes : ces ondes sont à la fréquence propre des molécules d’eau, qui entrent donc en
résonnance en leur présence (cette interaction est due à la polarité de la molécule H2O, elle même
due à son asymétrie - les atomes d’hydrogène et d’oxygène ne sont pas en ligne - et à la différence
d’eléctronégativité entre les atomes d’hydrogène et d’oxygène qui la constituent). Les molécules
d’eau restituent ensuite l’énergie de l’onde par diffusion de leur agitation moléculaire dans les
254
Chapitre 8. Configuration du matériel et des périphériques
molécules avoisinantes, ce qui provoque une augmentation de température. On est donc en droit de
se poser la question du danger de l’utilisation de ces ondes pour l’organisme. En général, les
puissances émises restent très faibles, et leur influence décroit de manière inversement
proporionnelle au carré de la distance à l’émetteur, ce qui fait que le danger est relativement réduit.
Toutefois, à titre personnel, et sans prétendre avoir fait la moindre étude sur le sujet, je vous invite à
la prudence lors de l’utilisation d’ordinateurs ou de téléphones portables, en raison même de leur
proximité (note : je n’ai pas de téléphone portable). Notez également que la chaleur directe dégagée
par ces appareils par effet Joule ne doit pas non plus être oubliée et est certainement encore plus
dangereuse.
Plusieurs normes de transmission ont été définies pour spécifier les interactions entre les appareils Wifi,
ainsi que les technologies de chiffrement utilisées. La norme la plus répandue est la norme 802.11b, qui
permet d’atteindre un débit de 11 Mbits/s théorique sur des distances allant jusqu’à 300 mètres en
extérieur (quelques dizaines de mètres en intérieur). Cette norme définit un mécanisme de sécurité
primitif, qui peut être considéré comme absolument inefficace de nos jours. Il est probable que le
remplaçant de cette norme soit la norme 802.11g, car elle permet une compatibilité ascendante avec les
équipements 802.11b (elle utilise la même plage de fréquences). Il s’agit d’une amélioration conséquente
du 802.11b, puisque le débit théorique est relevé à 54 Mbits/s (30 Mbits/s rééls). Une autre norme
concurrente du 802.11g a été définie, mais elle semble ne pas avoir autant d’avenir. Il s’agit de la norme
802.11a, qui utilise une plage de fréquence à 5 GHz. Les problèmes d’interférences sont donc moindres,
mais la portée est également réduite (plus la fréquence d’une onde radio est élevée, plus sa portée est
réduite et plus elle est susceptible d’être bloquée par des objets). Enfin, la norme 802.11i, encore peu
répandue, a pour but d’améliorer la sécurité des communication en utilisant un véritable procédé
cryptographique. Cette norme pourra être transposée pour les appareils 802.11g et 802.11a. Comme vous
pouvez le constater, le terme Wifi cache bien des choses complexes, et le choix d’une technologie sur une
autre peut être assez difficile.
Malgré tous ces inconvénients, la technologie Wifi est très pratique, car elle permet de connecter
simplement des machines sans s’emmêler les pattes dans les câbles réseau. La plupart des ordinateurs
portables vendus disposent maintenant d’un adaptateur réseau sans fil Wifi, et il est très facile d’en
connecter un à un ordinateur de bureau, soit avec une carte fille, soit grâce à un adaptateur USB (il existe
même des clefs USB dont l’encombrement est réduit à celui d’un stylo). Il est donc certain que ces
technologies sont appelées à se développer et à se généraliser.
Certains matériels Wifi ne sont pas supportés nativement par Linux, soit parce que les constructeurs ne
désirent pas fournir les informations permettant aux développeurs de faire un gestionnaire de
périphérique libre, soit parce que les constructeurs n’ont eux-mêmes pas le droit de divulguer la
technologie utilisée dans leurs appareils ou parce que les réglementation locales sur les émissions radio
leur impose de tenir secret les caractéristiques de leurs appareils. Le choix d’un périphérique Wifi doit
donc se faire avec précaution. Vous pourrez consulter le site Web
([Link] de Jean Tourrilhes pour savoir le matériel
supporté par les différents pilotes disponibles.
La prise en charge des périphériques Wifi nécessite d’activer le support du Wifi dans le noyau lui-même.
Cela peut être fait en activant l’option « Wireless LAN drivers (non-hamradio) & Wireless
Extensions » du menu « Networking support » du noyau. Cette option vous donnera également accès
aux options de configuration de quelques pilotes de périphériques Wifi. Il est probable cependant que
vous devrez chercher sur Internet le pilote correspondant à votre matériel. Plusieurs projets ont en effet
été créés afin de prendre en charge le Wifi sous Linux. Dans le cas des portables estampillés « Centrino »,
255
Chapitre 8. Configuration du matériel et des périphériques
Intel a lancé lui-même (sous la demande pressante des utilisateurs) les projets pour ses propres puces.
Voyez le site [Link] pour plus de détails à ce sujet. Vous trouverez également sur
le site de Jean Tourrilhes des liens vers les projets des pilotes pour les autres puces Wifi.
Si aucun pilote Linux n’est disponible pour votre matériel, vous pourrez vous rabattre sur le projet
NDISWrapper ([Link] Ce projet a pour but de simuler la couche réseau
NDIS de Windows XP afin de pouvoir charger les gestionnaires de périphériques pour Windows fournis
par les fabricants, et les duper en leur faisant croire qu’ils s’exécutent bien sous Windows. Cette
technique reste toutefois une magouille et ne résout bien entendu pas le problème de la disponibilité de
pilotes libres.
L’installation des pilotes ne sera pas détaillée plus ici, car la manière de procéder est spécifique à chaque
matériel. Dans le cas de NDISWrapper, l’installation se fait simplement en installant NDISWrapper
lui-même et en exécutant la commande suivante :
ndiswrapper -i [Link]
où [Link] est le fichier .inf du gestionnaire de périphérique pour Windows de votre matériel.
Cette commande copie les fichiers nécessaires de ce gestionnaire de périphérique dans le répertoire
/etc/ndiswrapper/ et définit la configuration pour l’utilisation de ce périphérique. Une fois cela fait,
le chargement du module ndiswrapper suffit pour charger le gestionnaire de périphérique :
modprobe ndiswrapper
Pour les autres gestionnaires de périphériques, il suffit généralement également de charger le module du
noyau du pilote, et éventuellement de charger un firmware.
Lorsque le pilote est chargé, une nouvelle interface réseau « wlanX » apparaît dans le système, où X est
le numéro de l’interface réseau sans fil. Cette interface peut ensuite être utilisée comme n’importe quelle
interface réseau, à ceci près qu’il faut au préalable configurer les paramètres du réseau sans fil. En
particulier, il est nécessaire de spécifier le mode de fonctionnement, le canal à utiliser et l’identifiant du
réseau sans fil. Une clef de chiffrement des communications peut également être donnée (cela ne garantit
toutefois pas une sécurité absolue, sauf en 802.11i).
Les réseaux Wifi peuvent être établis de plusieurs manières. S’il s’agit de relier deux machines par Wifi,
le mode de fonctionnement utilisé le plus simple est le mode « ad hoc ». Dans ce mode, les deux
machines peuvent communiquer directement, sans avoir recours à une infrastructure quelconque.
Inversement, si plusieurs machines doivent être reliées à un réseau existant (ou simplement entre elles), il
est nécessaire d’installer ce qu’on appelle un « point d’accès », qui synchronisera les communications
entre toutes ces machines. Dans ce cas, le mode de fonctionnement utilisé est le mode « managé ».
Le canal permet de spécifier la fréquence utilisée par les périphériques sans fil. Bien entendu, toutes les
machines devant participer à la communication doivent utiliser le même canal. Le canal est donc un des
paramètres essentiel du réseau. Il existe plusieurs canaux, mais en pratique, seuls quelques-uns peuvent
être utilisés librement en France. Il s’agit des canaux 10 (2457 MHz), 11 (2462 MHz), 12 (2467 MHz) et
13 (2472 MHz).
Comme on peut être amené à créer plusieurs réseaux Wifi utilisant un même canal, il est nécessaire de
pouvoir les distinguer afin d’éviter de mélanger les transmissions. Deux possibilités s’offrent alors à
l’utilisateur : soit on utilise ce qu’on appelle un numéro de réseau virtuel (« Network ID »), soit on utilise
un nom de réseau. La première solution ne permet de définir qu’une cellule du réseau, alors que la
256
Chapitre 8. Configuration du matériel et des périphériques
deuxième permet de regrouper plusieurs de ces cellules et autorise un utilisateur à passer d’une de ces
cellules à l’autre (une cellule est une zone géographique prise en charge par un point d’accès).
Tous ces paramètres peuvent être spécifiés avec la commande iwconfig, sauf pour certains pilotes de
périphériques non standards qui nécessitent des commandes spécifiques. La syntaxe générale de cette
commande est la suivante :
où interface est le nom de l’interface réseau sans fil (par exemple wlan0), et options est la liste des
options permettant de définir les paramètres du réseau sans fil. Les principales options sont récapitulées
dans le tableau suivant :
Option Signification
channel Numéro du canal.
mode Mode de fonctionnement.
essid Nom de réseau.
nwid Numéro de réseau.
key Clef de chiffrement du
réseau.
Les modes de fonctionnement les plus courants sont le mode « ad hoc » pour le mode ad hoc, et le
mode « managed » pour l’utilisation d’un point d’accès. La page de manuel de iwconfig vous donnera la
liste des autres modes utilisables.
Par exemple, pour configurer une interface sans fil sur le canal 11, en mode managé et avec un nom de
réseau "MonWLAN", il faudra utiliser la commande suivante :
À la suite de cette commande, l’interface wlan0 sera utilisable comme n’importe quelle interface réseau.
Si vous désirez définir une clef de chiffrement pour votre réseau sans fil, vous devrez utiliser l’option
key. L’utilisation du chiffrement peut être facultative en Wifi, sauf si l’interface est configurée pour
n’accepter que les communications chiffrées. L’option key peut donc accepter, en plus de la clef de
chiffrement (dont la taille est de 64 ou 104 bits, soit 8 ou 13 octets), un paramètre indiquant si le
chiffrement est obligatoire ou non. Ce paramètre peut prendre la valeur open si le chiffrement est
facultatif, restricted s’il est obligatoire, ou tout simplement off si le chiffrement doit être désactivé.
Par exemple, pour imposer l’utilisation d’une clef de chiffrement sur l’interface wlan0, la commande
suivante devra être utilisée :
Comme vous pouvez le constater, la clef est fournie en hexadécimal (c’est-à-dire en base 16, les chiffres
au dessus de 9 étant représentés par les lettres A à F). Pour sortir du mode chiffré, la commande suivante
pourra être utilisée :
257
Chapitre 8. Configuration du matériel et des périphériques
La liste des réseaux sans fils disponibles peut être récupérée avec l’option scan de la commande iwlist.
Par exemple, la commande suivante vous affichera tous les réseaux sans fils disponibles via l’interface
réseau wlan0, ainsi que leurs caractéristiques :
La commande iwlist accepte d’autres options, dont vous trouverez la liste et la description dans sa page
de manuel.
Enfin, utilisée sans option, la commande iwconfig affiche la configuration des interfaces sans fil du
système. En particulier, vous y trouverez le mode de fonctionnement, le numéro de canal et les
identifiants du réseau, éventuellement la clef de chiffrement utilisée, ainsi que la qualité du signal radio.
le mode La page de manuel de iwconfig vous donnera de plus amples informations sur la manière dont
ces informations peuvent être interprétées.
258
Chapitre 8. Configuration du matériel et des périphériques
D’autre options pourront être définies dans le fichier de configuration [Link] pour prendre en
charge les périphériques de type bloc connectés sur port parallèle. Cela est inutile pour les imprimantes
connectées sur le port parallèle.
Si l’on désire intégrer le gestionnaire de périphérique du port parallèle dans le noyau et faire en sorte
qu’il utilise les paramètres détectés automatiquement pour ce port, la solution la plus simple est de
fournir l’option parport du noyau et de lui affecter la valeur auto :
parport=auto
Cela activera automatiquement l’utilisation de la ligne d’interruption du port parallèle. Les autres
paramètres du port parallèle peuvent être trouvés dans le fichier [Link] de la
documentation du noyau.
259
Chapitre 8. Configuration du matériel et des périphériques
où fichier est le fichier spécial de périphérique permettant d’accéder au port série à initialiser, type
est le type de port série utilisé, adresse est son adresse d’entrée / sortie et ligne est la ligne
d’interruption qu’il utilise. La commande setserial dispose de nombreuses autres options. Je vous invite
à en lire la page de manuel pour les découvrir.
Une fois le port série correctement initialisé, il est possible de fixer les paramètres de la ligne de
communication avec la commande stty. Comme on l’a déjà vu précédemment, cette commande permet
de fixer tous les paramètres des lignes de communication des terminaux et non seulement les paramètres
des lignes série, et elle dispose donc d’un grand nombre d’options. Nous n’allons nous intéresser ici
qu’aux options utilisés pour les lignes série. La page de manuel de stty pourra être consultée pour plus
de détails.
La syntaxe à utiliser pour lire les paramètres de communication d’une ligne série est la suivante :
stty -a -F périphérique
où périphérique est le fichier spécial de périphérique de la ligne. Si vous exécutez cette commande,
vous constaterez qu’un grand nombre d’information est donné. Les informations les plus utiles sont sans
doute speed, qui donne la vitesse de la ligne série, csN, qui donne le nombre N de bits de données par
caractère, [-]parenb, qui indique si un bit de parité est utilisé ou non (auquel cas le caractère ’-’ est
présent), [-]parodd, qui indique le type de parité utilisée (paire ou impaire selon la présence ou
l’absence du caractère ’-’), et [-]cstopb, qui indique le nombre de bits de stop utilisés (un ou deux
selon la présence ou l’absence du caractère ’-’). L’option [-]crtscts indique si le contrôle de flux
matériel est utilisé ou non. À titre d’exemple, voici une sortie typique de la commande stty sur le premier
port série :
260
Chapitre 8. Configuration du matériel et des périphériques
Les mêmes options peuvent être utilsées pour fixer les paramètres de la ligne de communication. La ligne
de commande à utiliser est alors la suivante :
Il existe une différence cependant : le paramètre permettant de fixer la vitesse de la ligne est décomposé
en deux options ispeed pour le flux de données entrant et ospeed pour le flux de données sortant. On
peut fixer la vitesse de la ligne avec l’option ispeed. Par exemple, pour faire passer la ligne de
communication du deuxième port série à 115200 bauds, 7 bits de données, un bit de stop et une parité
paire, il faut utiliser la ligne de commande suivante :
Il est important de bien configurer les ports série avec les mêmes paramètres de ligne que ceux utilisés
par les périphériques qui y sont connectés pour que la communication se fasse correctement.
• possibilité de connecter jusqu’à 127 périphériques sur un même port, selon une structure arborescente ;
• bande passante accrue jusqu’à 12 Mbits/s théoriques pour l’USB 1.1, et de 480 Mbits/s pour l’USB
2.0 ;
• capacité de connexion des périphériques « à chaud » et détection automatique par le système
d’exploitation ;
• possibilité d’alimentation des périphériques par le bus lui-même, évitant ainsi d’avoir des câbles
supplémentaires pour les périphériques consommant peu d’électricité.
Tous ces avantages font que le bus USB est appelé à remplacer les ports série que l’on connaît, et que l’on
n’utilise plus désormais que pour les modems, les vieilles souris série et quelques appareils extérieurs.
Notez que la simplicité du port série fera qu’il restera encore présents sur bon nombre d’appareils pour
plusieurs années encore, mais les périphériques informatiques risquent de s’en détourner de plus en plus.
La gestion de l’USB sous Linux se base profondément sur les mécanismes de détection dynamique des
périphériques connectables à chaud. Les gestionnaires de périphériques sont donc généralement des
modules du noyau chargés automatiquement lorsque ces périphériques sont détectés. Il est toutefois
également possible d’intégrér ces gestionnaires au sein du noyau, et de laisser les opérations de
261
Chapitre 8. Configuration du matériel et des périphériques
configuration des périphériques (chargement du firmware, création des fichiers spéciaux de périphériques
par udev et configuration du matériel) se faire via les mécanismes de gestion des périphériques
amovibles. Linux est capable d’utiliser la plupart des périphériques USB existant actuellement sur le
marché.
Au niveau du noyau, la configuration des périphériques USB se fait dans le menu « USB support ». Il
faut simplement activer l’option « Support for USB », sélectionner un gestionnaire pour le port USB
et choisir les gestionnaires des différents types de périphériques que l’on voudra connecter sur la
machine.
Il est impératif d’activer l’option « USB device filesystem » afin de permettres à certains outils
d’accéder, via le répertoire /proc/bus/usb/ du système de fichiers virtuel /proc/, aux périphériques
USB connectés à l’ordinateur. Ce système de fichiers doit être monté à l’aide de la commande suivante :
pour pouvoir être utilisé. Il est également possible de le monter automatiquement dans le fichier
/dev/fstab.
En fait, il existe trois types d’interfaces USB sur le marché : les interfaces EHCI (abréviation ed l’anglais
« Enhanced Host Controler Interface »), qui prennent en charge l’USB 2.0, les interfaces UHCI
(abréviation de l’anglais « Universal Host Controller Interface »), spécifiées par Intel et que les
contrôleurs de la plupart des cartes mères utilisent (chipsets Intel et VIA), et les interfaces OHCI (« Open
Host Controller Interface »), spécifiées par Compaq, et qui sont utilisées par les chipsets Compaq et ALi
principalement. Les ports USB 2.0 comprennent également un port USB 1.1 UHCI ou OHCI, qui permet
donc de connecter les anciens périphériques USB. La configuration de l’USB se restreint donc
simplement à la sélection des pilotes nécessaires pour votre matériel (option « EHCI HCD (USB 2.0)
support » si vous disposez d’un port USB 2.0, et le pilote UHCI « UHCI HCD (most Intel and
VIA) support » ou le pilote OHCI « OHCI HCD support »). Notez que le pilote EHCI ne gère que la
partie USB 2.0 de votre contrôleur USB, et que vous devez également inclure le support UHCI ou OHCI
pour pouvoir utiliser les périphériques USB 1.1.
Comme vous pouvez le constater dans le menu de configuration du noyau, un grand nombre de
périphériques USB sont gérés par Linux. Vous devez bien entendu activer les options permettant de
prendre en charge votre matériel. Il est conseillé d’inclure ces fonctionnalités sous forme de modules afin
de permettre le chargement dynamique des gestionnaires de périphériques. Cela est nécessaire pour la
configuration des périphériques connectés à chaud dans le système. Les options les plus importantes sont
sans doute « USB Audio support », pour la prise en charge des périphériques USB audio, « USB
Printer support », pour toutes les imprimantes USB et « USB Mass Storage support », pour la
prise en charge des clefs USB et de la majorité des appareils photos numériques. Les scanners USB sont
pris en charge automatiquement par les logiciels et ne requièrent pas de configuration particulière au
niveau du noyau.
Les périphériques d’entrée tels que le clavier et la souris devront, si possible, être inclus directement au
sein du noyau afin d’éviter de se retrouver sans clavier et sans souris au démarrage, en cas de problème
dans la configuration du système. Notez qu’il existe deux types de pilotes pour les périphériques
d’entrée : un pilote général (option « USB Human Interface Device (full HID) support ), qui
fonctionne avec tous les périphériques d’entrée du menu « Input core support », et des pilotes
simplifiés (options du sous-menu « USB HID Boot Protocol drivers »), que l’on utilisera pour
réaliser des systèmes embarqués ou des noyaux légers. Il est évidemment recommandé d’utiliser le
premier pilote, si réellement le support du clavier USB est nécessaire (normalement, les claviers USB
262
Chapitre 8. Configuration du matériel et des périphériques
sont pris en charge par le BIOS de l’ordinateur et apparaissent exactement comme des claviers classiques
pour le système d’exploitation).
Il est fortement recommandé, si l’on désire utiliser des périphériques USB, d’activer les fonctionnalités
de chargement dynamique des modules, de gestion des périphériques connectables à chaud et de
chargement des firmware automatique de Linux.
Configuration du noyau
La prise en charge du bus IEEE1394 au niveau du noyau est réalisable par l’intermédiaire des options du
menu « IEEE 1394 (FireWire) support (EXPERIMENTAL) ». Comme le support des périphériques
IEEE1394 sous Linux en est encore à ses balbutiements, ce menu ne peut être accédé que si l’on a activé
l’option « Prompt for development and/or incomplete code/drivers » du menu « Code
maturity level options ». Les principales options utilisables sont les suivantes :
• l’option « IEEE 1394 (FireWire) support (EXPERIMENTAL) », qui est l’option principale qui
active toutes les autres options. Il faut donc impérativement activer cette option et répondre ’Y’ ;
• l’option « Texas Instruments PCILynx support », qui permet de prendre en charge les cartes
IEEE1394 basées sur la puce PCILynx de Texas Instrument. Ce ne sont pas les cartes les plus
couramment utilisées, aussi la réponse recommandée est-elle ’N’. Si vous activez cette option, vous
pourrez configurer des paramètres complémentaires du gestionnaire de périphériques avec les options
263
Chapitre 8. Configuration du matériel et des périphériques
« Use PCILynx local RAM » (utilisation de la mémoire embarquée sur la carte PCI) et « Support
for non-IEEE1394 local ports » (utilisation de fonctionnalités complémentaires non FireWire
de ces cartes) ;
• l’option « OHCI-1394 support », qui active la prise en charge des périphériques IEEE1394
compatible OHCI (abréviation de l’anglais « Open Host Controller Interface ), qui sont les
périphériques les plus courants à présent. La réponse recommandée est ’Y’ ;
• l’option « OHCI-1394 Video support », qui permet de prendre en charge les caméras vidéo
numériques. Cette option ajoute également une fonctionnalité intéressante qui permet aux programmes
de partager les données avec le gestionnaire de périphériques directement. Cela permet d’éviter qu’une
copie de ces données ne soit réalisée entre la mémoire du noyau et la mémoire de l’application et
d’obtenir ainsi de meilleures performances. La réponse recommandée est bien évidemment ’Y’. Cette
option n’est toutefois disponible que pour les périphériques OHCI ;
• l’option « SBP-2 support (Harddisks, etc.) », qui permet de prendre en charge les disques
durs et les lecteurs de DVD connectés sur bus IEEE1394. Ces lecteurs apparaissent alors comme des
périphériques SCSI standards et pourront être montés via l’un des périphériques /dev/sdx ;
• l’option « Raw IEEE1394 I/O support », qui permet aux applications de communiquer
directement avec le bus IEEE1394 par l’intermédiaire d’un fichier spécial de périphérique. Cette
option est nécessaire au bon fonctionnement de la plupart des applications IEEE1394 et la réponse
recommandée est donc ’Y’ ;
• l’option « Excessive debugging output », qui active l’émission de messages de traces pour
toutes les données survenant sur le bus IEEE1394. Cette option saturera vos fichiers de traces très vite
et n’est réellement utile que pour les développeurs, aussi faut-il répondre ’N’.
Comme pour tous les périphériques sous Linux, les fonctionnalités IEEE1394 du noyau seront
accessibles par l’intermédiaire de fichiers spéciaux de périphériques situés dans le répertoire /dev/. Les
fonctionnalités vidéo seront accédées par l’intermédiaire d’un fichier spécial de périphérique de type
caractère et de code majeur 172. De même, l’interface de données brute activée par l’option « Raw
IEEE1394 I/O support » est exposée par l’intermédiaire d’un fichier spécial de périphérique de type
caractère et de code majeur 171. Vous devrez donc créer ces fichiers spéciaux à l’aide des deux
commandes suivantes :
Le numéro de code mineur est utilisé pour distinguer les différents ports IEEE1394 présents dans la
machine. Les lignes de commandes précédentes ne montrent que la manière de créer les fichiers spéciaux
de périphériques que pour le premier port IEEE1394.
264
Chapitre 8. Configuration du matériel et des périphériques
Il est encore rare que ces bibliothèques soient installées par les distributions, certainement parce qu’elles
sont encore en cours de développement. Leur installation nécessite donc de les compiler soi-même, ce
qui est une tâche facile si on sait le faire, mais qui peut effrayer un débutant. Rappelons une fois de plus
que le support des périphériques IEEE1394 sous Linux est encore expérimental.
La bibliothèque de programme la plus importante est celle qui permet d’utiliser la fonctionnalité d’accès
direct aux périphériques IEEE1394 par l’intermédiaire du fichier spécial de périphérique
/dev/raw1394. Les fichiers sources de cette bibliothèque peuvent être trouvées sur le site du projet
libraw1394 ([Link] Une autre bibliothèque utilisée par les
programmes vidéo est la bibliothèque libavc1394 ([Link] Cette
bibliothèque permet en effet aux programmes de piloter les caméscopes numériques par l’intermédiaire
du bus IEEE1394. Enfin, les programmes d’édition vidéo peuvent avoir besoin de la bibliothèque libdv
([Link] qui permet de manipuler les données au format DV (c’est-à-dire le format
de données utilisé par la plupart des caméscopes numériques). Cette bibliothèque ne fait pas à
proprement parler partie des bibliothèques permettant de communiquer avec les périphériques
IEEE1394, mais elle est extrêmement utile.
La compilation de ces bibliothèques se fait classiquement avec les commandes suivantes :
./configure --prefix=/usr
make
à partir du répertoire des sources. Celui-ci pourra être extrait des archives à l’aide de la commande tar
xzf archive, où archive est le nom de l’archive en question. Une fois compilées, les bibliothèques
pourront être installées avec la commande :
make install
Ces opérations ne devraient pas poser de problème particulier. Consultez le Chapitre 7 pour plus de
détails sur ces opérations.
Une fois ces bibliothèques installées, vous devriez pouvoir installer et utiliser des applications dédiées
aux périphériques IEEE1394, comme dvgrab (outil de capture vidéo), kino ou broadcast2000 (outils
d’édition de séquences vidéo). Force est de reconnaître que ces programmes sont très loins d’être finis et
réellement difficiles à utiliser.
265
Chapitre 9. Configuration du réseau
Linux est un système d’exploitation fabriqué par l’Internet et pour l’Internet. Inutile de préciser que c’est
l’un des meilleurs systèmes pour gérer et exploiter un réseau. Certains ne l’utilisent d’ailleurs que pour
cela, et profitent de ses excellentes performances sur les petites machines afin de récupérer du matériel
autrement voué à la casse. En fait, les fonctionnalités réseau de Linux sont si nombreuses que j’ai été
obligé d’y consacrer un chapitre à part entière.
La configuration d’un réseau est une opération qui nécessite quelques connaissances théoriques sur le
fonctionnement des réseaux TCP/IP. Ces informations sont assez techniques, mais indispensables pour
bien configurer les services réseau de toute machine connectée, et pas seulement les machines
fonctionnant sous Linux. Il n’est en effet pas rare de trouver des réseaux de machines fonctionnant sur
des systèmes dont la configuration est supposée être plus simple, mais dont l’organisation est une hérésie
absolue et qui risque de nécessiter une remise à plat complète à chaque interconnexion.
Cette section va donc donner quelques explications sur les notions fondamentales des réseaux
informatiques. Il traitera ensuite de la configuration des réseaux locaux, puis celle des connexions
temporaires à Internet. Les services réseau évolués tels que le partage de connexion à Internet et la
création d’un serveur de fichiers seront finalement traités en fin de chapitre.
266
Chapitre 9. Configuration du réseau
Du fait de la diversité des supports physiques de réseau, il n’est pas simple d’écrire une application
réseau qui puisse travailler dans des environnements réseau hétérogènes. Cela supposerait de connaître
les protocoles de communication pour chaque type de réseau, ce qui compliquerait à l’infini le moindre
programme et le rendrait inutilisable avec les nouveaux réseaux. Par conséquent, cette tâche ingrate a été
reléguée au plus profond des couches réseau spécifiques au support physique. Les applications quant à
elles utilisent un protocole de communication plus évolué, dont le but est d’assurer l’interopérabilité des
différents supports physiques. Ce protocole utilise toujours des paquets et une notion d’adresse, mais
cette fois ces informations sont standardisées et utilisables par toutes les applications. Les paquets de ce
protocole sont stockés dans les paquets des réseaux physiques et transmis tels quels. Ils peuvent
éventuellement être découpés en sous-paquets dans le cas où la taille des paquets du réseau serait trop
petite pour les contenir. Cette technique s’appelle l’encapsulation d’un protocole dans un autre protocole.
Le protocole IP
Les machines Unix utilisent toutes le protocole de communication de bas niveau IP (« Internet
267
Chapitre 9. Configuration du réseau
Protocol »). Ce protocole a été inventé pour permettre l’interconnexion d’un grand nombre de réseaux
physiques différents (le nom d’Internet provient d’ailleurs de cette caractéristique : « INTERconnected
NETworks »). Il permet de transmettre des informations de manière uniforme sur tous ces réseaux
physiques. Ainsi, les programmes qui utilisent IP ne voient pas les spécificités des différents réseaux
physiques. Pour eux, il ne semble y avoir qu’un seul réseau physique, dont le protocole de
communication de base est IP. Autrement dit, les applications qui utilisent le réseau se contentent
d’utiliser le protocole IP, et n’ont plus à se soucier de la manière dont il faut formater et transmettre les
informations sur chaque support physique du réseau. Ce genre de détail est laissé aux couches réseau de
chaque machine et aux passerelles reliant les divers réseaux physiques.
Comme il l’a déjà été dit ci-dessus, le protocole IP utilise des adresses pour identifier les machines sur
les réseaux. Les adresses IP sont codées sur quatre octets (nombres binaires à huit chiffres, permettant de
représenter des valeurs allant de 0 à 255), chacun définissant une partie du réseau. Ces adresses sont
utilisées un peu comme les numéros de téléphone : le premier octet définit le numéro d’un
« super-réseau » dans lequel le correspondant se trouve (ces « super-réseaux » sont appelés les réseaux
de classe A), le deuxième octet définit le numéro du sous-réseau dans le super-réseau (ces sous-réseaux
sont appelés réseaux de classe B), le troisième octet définit encore un sous-sous-réseau (réseaux dits de
classe C) et le quatrième octet donne le numéro de la machine dans ce sous-sous-réseau.
Cette numérotation permet d’affecter des adresses similaires pour les différentes machines d’un réseau,
et de simplifier ainsi la gestion de ce dernier. Elle dispose en revanche d’un inconvénient majeur :
beaucoup d’adresses sont gaspillées, car il n’y a pas suffisamment de réseaux de classe A d’une part, et
qu’on ne peut pas mélanger les machines de deux sous-réseaux dans un même réseau de classe A d’autre
part. Si l’on reprend la comparaison avec les numéros de téléphone, il y a énormément d’abonnés dont le
numéro commence par 01, mais beaucoup moins dont le numéro commence par 02, et quasiment aucun
dont le numéro commence par 08. Si l’on venait à manquer de place dans la liste des numéros
commençant par 01, on ne pourrait pas pour autant utiliser les numéros commençant par 02 pour des
raisons géographiques. C’est la même chose pour les adresses IP, sauf que les zones géographiques sont
remplacées par des sous-réseaux. Le problème est que, malheureusement, on commence à manquer
d’adresses disponibles (alors qu’il y en a plein de libres mais inutilisables parce qu’elles se trouvent dans
d’autres sous-réseaux !). Il va donc falloir effectuer une renumérotation d’ici peu, exactement comme il y
en a déjà eu dans le monde de la téléphonie...
Note : Le protocole IPv6, qui remplacera le protocole IP classique (encore appelé IPv4), a pour but
de résoudre les limitations du protocole IP utilisé actuellement. Les adresses du protocole IPv6 sont
codées sur 16 octets, ce qui résoudra définitivement le problème du manque d’adresses. De plus,
les services modernes que sont l’authentification de l’émetteur, ainsi que la qualité de service
(c’est-à-dire la garantie du délai de transmission des données, garantie nécessaire pour transmettre
de façon correcte les flux multimédia tels que le son et la vidéo en temps réel) sont fournis par IPv6.
Bien entendu, Linux est déjà capable d’utiliser IPv6 (combien de systèmes peuvent aujourd’hui
l’affirmer ?) ! Notez toutefois que pour cela, il faut recompiler le noyau et toutes les applications
réseau du système, ce qui est tout de même très lourd. Par conséquent, il vaut mieux se contenter
du protocole IP actuel. Malgré ses limitations, ce protocole reste sans doute le meilleur protocole
réseau du monde, car il allie souplesse et fonctionnalité. Il est difficilement concevable de créer un
réseau aussi grand qu’Internet avec les autres protocoles existant sur le marché...
Les adresses IP sont donc parfaitement définies à l’aide de leurs quatre nombres, que l’on note les uns à
la suite des autres et en les séparant d’un point. Comme on l’a vu, les adresses IP sont classées en
sous-réseaux, de classe A, B et C. Les adresses des réseaux de classe C ont leurs trois premiers nombres
268
Chapitre 9. Configuration du réseau
fixés, et seul le quatrième nombre change pour chaque machine du réseau. De la même manière, les
réseaux de classe B ont leurs deux premiers nombres fixés, et seuls les deux derniers nombres permettent
de distinguer les différentes machines du réseau. Enfin, les réseaux de classe A n’ont de fixé que leur
première composante, les autres sont libres. Il est donc clair qu’il existe peu de réseaux de classe A, mais
que ce sont de très gros réseaux (ils peuvent contenir jusqu’à 16 millions de machines !). En revanche, il
existe beaucoup plus de réseaux de classe C, dont la taille est plus modeste (seulement 256 machines).
Pour un réseau donné, les adresses ont donc toutes la même forme. Les premiers octets des adresses du
réseau sont toujours les mêmes (ce peut être le premier octet pour les réseaux de classe A, les deux
premiers pour les réseaux de classe B ou les trois premiers pour les réseaux de classe C). On peut donc
définir la notion d’adresse de réseau, qui est l’adresse IP d’une machine du réseau dont les parties
variables ont pour valeur 0. Par exemple, si une machine d’un réseau de classe C a pour adresse
[Link], alors l’adresse de son sous-réseau est [Link]. Cela signifie que toutes les machines de
ce réseau auront une adresse de la forme « [Link] ».
Un réseau n’appartient qu’à une et une seule classe. Les adresses IP sont réparties sur les différentes
classes de réseaux, selon la valeur des bits de poids fort de leur premier octet. Par exemple, les réseaux de
classe A sont identifiables au fait que le bit de poids fort de leur adresse est nul. Les adresses de réseau
valides pour les réseaux de ce type sont donc les adresses comprises entre [Link] et [Link]. Il n’existe
donc que 128 réseaux de classes A en tout et pour tout. Les autres réseaux ont donc le bit de poids fort de
leur adresse fixé à 1, et c’est le deuxième bit de poids fort qui est utilisé pour distinguer les réseaux de
classe B des autres. Les réseaux de classe B utilisent toujours la valeur 0 pour ce bit, leurs adresses
varient donc entre [Link] et [Link]. De même, les réseaux de classe C utilisent la valeur 1 pour le
deuxième bit de leur adresse, et ont nécessairement un troisième bit nul. Leurs adresses vont donc de
[Link] à [Link]. Les adresses pour lesquelles le troisième bit (en plus des deux premiers) est à
1 sont réservées (soit pour une utilisation ultérieure, soit pour s’adresser à des groupes d’ordinateurs en
multicast) et ne doivent pas être utilisées. Il s’agit des adresses [Link] à [Link]. Cette
dernière adresse a une signification spéciale et permet de s’adresser à tous les ordinateurs d’un réseau.
Il est possible de déterminer l’adresse du réseau auquel une machine appartient en utilisant ce qu’on
appelle le masque de sous-réseau. Le masque de sous-réseau est une série de quatre nombres ayant le
même format que les autres adresses IP, mais dont les composantes ne peuvent prendre que la valeur 0 ou
la valeur 255, les 255 devant nécessairement apparaître en premier. Les composantes des adresses IP qui
correspondent à la valeur 255 dans le masque de sous-réseau font partie de l’adresse dudit sous-réseau.
Les composantes qui correspondent à la valeur 0 dans le masque de sous-réseau n’en font pas partie, et
varient pour chaque machine du réseau. Pour reprendre l’exemple précédent, si une machine a pour
adresse IP [Link] et que son masque de sous-réseau est [Link], alors l’adresse de son
réseau est [Link]. Si le masque de sous-réseau avait été [Link] (typiquement le masque d’un
réseau de classe B), l’adresse du réseau aurait été [Link]. Comme on le voit, le masque de
sous-réseau est utilisé par le système pour déterminer rapidement l’adresse de sous-réseau d’une
machine à partir de son adresse IP. On notera que certaines combinaisons d’adresses IP et de masques de
sous-réseau sont invalides. Par exemple, les adresses affectées aux réseaux de classe C (comme
[Link] par exemple) ne peuvent pas avoir de masque de sous-réseau en [Link], car cela
impliquerait que cette adresse serait une adresse de réseau de classe B.
269
Chapitre 9. Configuration du réseau
Les adresses IP ne sont pas attribuées aux machines au hasard. Il est évident que chaque machine doit
avoir une adresse unique, et que son adresse doit appartenir à la plage d’adresses utilisée pour le
sous-réseau dont elle fait partie. Pour cela, les classes de réseau, ainsi que les adresses qu’ils utilisent,
sont attribuées par l’IANA, un organisme de gestion de l’Internet. Le rôle de l’IANA (abréviation de
l’anglais « Internet Assigned Numbers Authority ») est essentiellement d’assurer l’unicité des adresses
IP sur l’Internet. Cependant, certaines adresses sont librement utilisables pour les réseaux locaux qui ne
sont pas connectés directement à l’Internet. Les paquets utilisant ces adresses sont assurés de ne pas être
transmis sur Internet. Ces adresses peuvent donc être utilisées par quiconque. Les plages d’adresse
réservées sont les suivantes :
Ainsi, un réseau de classe A (d’adresse [Link]), 16 réseaux de classe B (les réseaux [Link] à
[Link]) et 255 réseaux de classe C (d’adresses [Link] à [Link]) sont disponibles. Vous
pouvez donc les utiliser librement.
Il est également possible de configurer les machines pour qu’elles récupèrent leurs adresses IP auprès
d’un serveur à l’aide du protocole DHCP (abréviation de l’anglais « Dynamic Host Configuration
Protocol »). Cette technique est très intéressante quand on dispose d’un grand nombre de machines qui
ne sont pas toujours toutes connectées à un réseau. Il est donc possible de redistribuer les adresses IP
d’un stock d’adresses en fonction des machines qui se connectent, et d’économiser ainsi les précieuses
adresses. En revanche, elle n’est pas appropriée pour les serveurs qui sont couramment accédés par des
postes clients, et qui doivent donc avoir une adresse IP fixe.
Certaines adresses IP ont une signification particulière et ne peuvent pas être attribuées à une machine.
270
Chapitre 9. Configuration du réseau
Par exemple l’adresse [Link] représente, pour une machine, elle-même. Cette adresse est souvent
utilisée pour accéder à un programme réseau sur la machine locale. Elle fait partie du sous-réseau de
classe A [Link], qui ne comprend pas d’autres adresses. De plus, les adresses dont les derniers
nombres (c’est-à-dire les nombres qui ne font pas partie de l’adresse du réseau) se terminent par 0 ou 255
sont réservées pour l’envoi des paquets à destination de tout le monde sur le réseau (émission dite
« broadcast »). Par exemple, les adresses [Link] et [Link] ne peuvent pas être affectées à
une machine. Ce sont typiquement ces adresses qui sont utilisées par le protocole DHCP pour émettre
des requêtes sur le réseau alors que la machine n’a pas encore d’adresse fixe.
Il est important de savoir que, par défaut, une machine ne communiquera qu’avec les machines de son
propre réseau. C’est à dire que si une machine utilise l’adresse IP [Link] et que son masque de
sous-réseau est [Link], elle ne pourra contacter que des machines dont l’adresse est de la forme
[Link]. Elle ne pourra donc pas voir par exemple une machine dont l’adresse IP est [Link].
Cela ne signifie pas que l’on doive toujours utiliser le masque [Link] pour voir toutes les machines du
monde, mais plutôt que la machine [Link] ne fait pas partie, a priori, du même réseau physique que
la machine [Link]. Il est donc inutile de chercher à la contacter (et mettre le masque de
sous-réseau à [Link] ne résoudrait évidemment pas le problème). Cependant, si deux réseaux physiques
ont nécessairement deux adresses de réseau différentes, rien n’empêche de définir, sur un même réseau,
plusieurs réseaux logiques. Ainsi, une même carte réseau peut avoir plusieurs adresses IP. La
communication avec les machines des différents réseaux logiques se fait alors par l’intermédiaire de la
même interface réseau.
Arrivé à ce stade des explications, je sens venir la question suivante : « ?! Euhhh... Mais alors, comment
peut-on voir les machines sur Internet ? Je n’ai pas de réseau, et quand je me connecte à Internet, je peux
y accéder ! Et même si j’avais un réseau, elles ne feraient certainement pas partie de mon réseau... ».
Explications :
• premièrement, vous avez un réseau, même si vous ne le savez pas. Toute machine appartient
généralement au moins à son propre réseau virtuel, sur laquelle elle est la seule machine, et où elle a
l’adresse [Link] ;
• deuxièmement, effectivement, les machines qui se trouvent sur Internet n’appartiennent pas à votre
réseau, que celui-ci existe effectivement ou soit virtuel ;
• troisièmement, toutes les informations que vous envoyez et recevez transitent par un seul ordinateur,
celui de votre fournisseur d’accès à Internet. C’est cet ordinateur qui se charge de faire le transfert de
ces informations vers les machines situées sur Internet.
271
Chapitre 9. Configuration du réseau
Lorsque vous vous connectez à Internet, vous ne faites rien d’autre que de créer un réseau (dont le
support physique est la ligne téléphonique), et vous utilisez l’ordinateur que vous avez appelé comme
passerelle par défaut. Tous les paquets destinés à un autre réseau que le vôtre (donc, en pratique, tous les
paquets si vous n’avez pas de réseau local) sont donc envoyés sur le réseau constitué de votre connexion
à Internet et arrivent donc chez votre fournisseur d’accès, qui se charge ensuite de les transmettre aux
autres ordinateurs. Notez que celui-ci peut transmettre ces paquets à une autre passerelle à laquelle il a
accès et ainsi de suite, jusqu’à ce que la destination soit atteinte.
Dans le cas d’un particulier, le choix du réseau sur lequel les paquets doivent être transmis est très facile
à faire puisqu’en général un paquet est soit à destination de la machine locale, soit à destination d’une
machine sur Internet. Pour un paquet destiné à la machine locale, le réseau virtuel local est utilisé. Tous
les autres paquets sont envoyés sur la connexion Internet. Cependant, il peut arriver qu’une machine ait
le choix entre plusieurs passerelles différentes pour envoyer un paquet dont la destination n’est pas sur
son propre réseau. Par exemple, les passerelles d’Internet peuvent être elles-mêmes connectées à
différents autres réseaux, qui sont eux-mêmes connect s à d’autres réseaux. Un paquet peut donc être
acheminé de plusieurs manières à sa destination, selon la topologie du réseau. L’ensemble des réseaux
empruntés par un paquet dans son voyage constitue ce qu’on appelle sa route.
Chaque passerelle contribue donc à déterminer la route des paquets en choisissant, pour chaque paquet,
l’interface réseau à utiliser pour transmettre ce paquet. Ce choix est fait en suivant un certain nombre de
règles basées sur l’adresse destination des paquets. Par exemple, si une passerelle reçoit un paquet dont
l’adresse destination est [Link], et qu’elle est elle-même connectée à un réseau possédant cette
machine, elle transmettra bien évidemment ce paquet sur ce réseau. Si en revanche elle ne peut localiser
la machine cible sur l’un de ses réseaux, elle l’enverra à une autre passerelle à laquelle elle a accès. Le
choix de cette passerelle est en général déterminé par des règles de la forme suivante : « Tous les paquets
destinés au sous-réseau [Link] doivent être envoyés vers la passerelle [Link] du réseau
[Link] ». Notez qu’à chaque étape de la route, seules les passerelles de l’étape suivante peuvent être
272
Chapitre 9. Configuration du réseau
Le problème des adresses IP est qu’elles ne sont pas très parlantes pour les êtres humains : que peut donc
273
Chapitre 9. Configuration du réseau
signifier [Link] ? Pas grand chose... C’est pour cela qu’on affecte des noms de machines plus
humains, comme par exemple [Link]. Ces noms suivent une convention de
nommage bien précise. En général, le premier nom est le nom de la machine elle-même, et la suite du
nom constitue ce qu’on appelle le domaine dans laquelle la machine se trouve. Ainsi, dans l’exemple
précédent, krypton est le nom d’une machine, et [Link] est le nom de son domaine. En
général, il existe plusieurs machines dans un même domaine, on pourrait donc également avoir
[Link] par exemple (malheureusement pour mon exemple, l’étoile Altaïr ne se
trouve pas dans la galaxie d’Andromède, mais bon...). Souvent, les noms de domaines sont des noms de
sociétés. La dernière partie du nom de domaine permet également de déterminer la nature du domaine,
ou sa localisation. Par exemple, l’extension .com indique clairement que le domaine est de nature
commerciale (de surcroît, il s’agit sans doute d’une société américaine, l’extension .com étant réservée
aux États-Unis). De même, l’extension .gov est utilisée pour les organismes gouvernementaux
américains, et l’extension .edu pour les universités ou les écoles américaines. L’extension .org est
utilisée pour les organisations non commerciales. Enfin, les noms de domaines des autres pays que les
États-Unis utilisent quasiment systématiquement une extension indiquant leurs pays d’origine. Ainsi,
.fr représente la France, .uk les Royaumes-Unis, etc. Notez que la notion de domaine est a priori
distincte de la notion de réseau.
La question technique qui se pose avec ces conventions de nommage « humaines » est de savoir
comment déterminer, à partir d’un nom littéral, l’adresse IP de la machine correspondante. Cette
opération n’est pas simple, et en fait elle est effectuée de deux manières :
• soit la machine locale demande à une autre machine qu’elle connaît d’effectuer la recherche de
l’adresse du correspondant ;
• soit elle dispose d’une liste de noms et d’adresses lui permettant de déterminer directement les
adresses de ses interlocuteurs.
La première solution utilise ce qu’on appelle un serveur de noms (« DNS » en anglais, abréviation de
« Domain Name Service »), qui connaît toutes les machines du réseau soit directement, soit
indirectement (donc via un autre DNS). L’opération qui consiste à retrouver l’adresse IP d’une machine à
partir de son nom s’appelle la résolution de nom de domaine. Il est évident que si le serveur de noms ne
peut être contacté, il sera impossible d’utiliser les noms de machines. En revanche, il sera toujours
possible d’utiliser leurs adresses IP directement, si on les connaît. La deuxième solution ne souffre pas
de ce défaut, elle nécessite cependant de mettre à jour la liste des noms sur tous les postes régulièrement,
ce qui est beaucoup plus complexe que la gestion centralisée d’un DNS. On ne l’utilisera donc que pour
les petits réseaux.
Le protocole TCP
Nous avons vu que le protocole IP fournit les briques de bases de toute la communication réseau sous
Unix (et Internet). Ses principales fonctionnalités sont le découpage des informations en paquets de taille
suffisamment petite pour pouvoir transiter sur tous les types de réseaux physiques, la gestion des
destinations des paquets à l’aide des adresses IP, et le choix de la route permettant d’acheminer les
paquets à destination. En revanche, il est incapable d’assurer les services plus évolués comme la gestion
de l’ordre d’arrivée des paquets et la gestion de la fiabilité du transfert des informations. C’est donc à des
protocoles plus évolués, eux-mêmes encapsulés dans IP, d’effectuer ces tâches. L’un des protocoles les
plus importants est le protocole TCP (abréviation de l’anglais « Transfer Control Protocol »). Ce
274
Chapitre 9. Configuration du réseau
protocole se charge d’établir les connexions entre deux ordinateurs, et assure la fiabilité des informations
transmises et l’arrivée des informations dans leur ordre d’envoi. Il existe d’autres protocoles, moins
connus que TCP mais tout aussi importants. On retiendra en particulier les deux protocoles suivants :
• UDP (abréviation de l’anglais « User Datagram Protocol »), qui permet d’émettre des datagrammes
sur le réseau, qui sont de simples paquets de données (c’est un protocole semblable à IP, destiné aux
applications) ;
• ICMP (abréviation de « Internet Control Message Protocol »), qui est utilisé essentiellement pour
transmettre des messages de contrôle du fonctionnement des autres protocoles (il est donc vital).
Les services réseau des machines sont organisés en couches logicielles, qui s’appuient chacune sur la
couche inférieure. Ainsi, TCP utilise IP, qui lui-même utilise le pilote qui gère l’interface réseau. Du fait
que ces couches s’appuient les unes sur les autres, on appelle souvent l’ensemble de ces couches une pile
(« stack » en anglais). Vous avez peut-être déjà entendu parler de la pile TCP/IP. Lorsqu’un service
réseau d’une machine n’est plus accessible, il se peut que ce service réseau ait planté. Si tout un
ensemble de services réseau ne fonctionne plus, c’est certainement une des couches logicielles qui est
plantée. Par exemple, une machine peut répondre à la commande ping (classiquement utilisée pour tester
les connexions réseau) et ne plus accepter la plupart des connexions réseau. Cela signifie simplement que
la couche TCP ne fonctionne plus, et que la couche ICMP (utilisée par ping) est toujours valide.
Évidemment, si la couche IP tombe en panne, la machine ne sera plus accessible du tout, sauf
éventuellement avec d’autres protocoles réseau complètement différents (IPX, Appletalk, etc.).
Seuls les mécanismes du protocole TCP seront détaillés dans la suite de ce document. Le protocole TCP
est en effet utilisé par un grand nombre de services, ce qui en fait certainement le plus connu.
Le protocole TCP utilise la notion de connexion. Une connexion est un canal de communication établi
entre deux processus par TCP. Comme les processus sont susceptibles d’utiliser plusieurs connexions
simultanément, TCP fournit la possibilité de les identifier par un numéro unique sur la machine, compris
entre 0 et 65535. Chaque numéro identifie ce qu’on appelle un port TCP. Quand un processus désire
établir une connexion avec un autre, il utilise un de ses ports et essaie de se connecter sur le port du
deuxième processus.
Il faut bien comprendre que les deux numéros de ports utilisés ne sont a priori pas les mêmes pour les
deux processus. Évidemment, il est nécessaire que les processus clients connaissent les numéros de port
des processus serveurs auxquels ils se connectent. Les numéros de ports sont donc affectés à des services
bien définis, et les serveurs qui fournissent ces services doivent bien entendu utiliser ces numéros de
ports. Ainsi, il est possible de déterminer de manière unique un programme serveur sur un réseau avec
l’adresse IP de la machine sur laquelle il fonctionne et le numéro de port qu’il écoute pour les
connexions extérieures. Les clients qui se connectent savent donc parfaitement à quel service ils accèdent
lorsqu’ils choisissent le numéro de port destination. Leur propre numéro de port est en général choisi par
le système, afin d’éviter tout conflit avec un autre processus de la même machine.
275
Chapitre 9. Configuration du réseau
Une fois établie, une connexion TCP permet d’effectuer des communications bidirectionnelles. Cela
signifie que le client et le serveur peuvent tous deux utiliser cette connexion pour envoyer des données à
l’autre. Le client envoie ses données sur le port destination du serveur, et le serveur peut renvoyer les
résultats au client en utilisant le port de celui-ci. Les paquets TCP disposent donc toujours d’un port
source (c’est-à-dire le port TCP de l’émetteur), et d’un port destination (le port du récepteur). Ainsi, le
récepteur peut renvoyer sa réponse en utilisant le port source comme port de destination du paquet
renvoyé, et inversement.
Comme il l’a déjà été dit, le protocole TCP s’assure que les informations transmises arrivent à bon port
(c’est le cas de le dire !). Pour cela, il utilise un mécanisme d’accusés réception, qui indiquent à
l’émetteur si le destinataire a bien reçu chaque paquet envoyé. Si l’accusé réception n’est pas reçu dans
un temps fixé, le paquet est ré-émis. Un paquet reçu en double à cause d’un retard dans la
communication de l’accusé réception est tout simplement ignoré. La fiabilité des informations est
également assurée. Cette fiabilité est réalisée par un mécanisme de sommes de contrôle. Si le récepteur
constate que la somme de contrôle des données reçues n’est pas celle que l’émetteur a calculé, il rejette
le paquet parce qu’il sait que les informations ont été corrompues pendant la transmission. Enfin, TCP
s’assure que les informations émises en plusieurs passes sont bien reçues dans leur ordre d’émission.
Cette réorganisation se fait grâce à une numérotation des paquets (cette numérotation sert également à
détecter les paquets reçus en double). Elle peut paraître inutile, mais la vitesse d’arrivée des paquets est
hautement dépendante de la route IP qu’ils prennent pour parvenir à destination. Les paquets qui arrivent
en avance sont donc mémorisés jusqu’à ce que tous les paquets qui les précèdent soient reçus.
276
Chapitre 9. Configuration du réseau
Les protocoles de haut niveau transmettent, en général, toutes leurs données en clair sur le réseau. Cela
comprend non seulement les données applicatives, mais également les noms d’utilisateurs et les mots de
passe. Toute personne ayant physiquement accès au réseau ou à une machine par laquelle les paquets
passent peut donc, s’il le désire, récupérer tous les mots de passe avec une simplicité extrême (il existe
même des programmes spécialisés pour cela). Il est donc inconcevable d’utiliser tous ces protocoles sans
prendre de précautions particulières. Heureusement, il est possible d’encapsuler les protocoles dans un
réseau virtuel qui, lui, transmet les données sous forme chiffrée. L’outil le plus utilisé de nos jours est ssh
(abréviation de l’anglais « Secure SHell »), qui permet de se connecter sur une machine et de travailler à
distance en toute sécurité. Il en existe plusieurs implémentations, dont au moins une libre : OpenSSH.
Nous verrons comment configurer et utiliser OpenSSH pour améliorer la sécurité du réseau dans la la
section intitulée Utilisation de SSH.
• l’interface loopback, qui représente le réseau virtuel de la machine, et qui permet aux applications
réseau d’une même machine de communiquer entre elles même si l’on ne dispose pas de carte réseau ;
• les interfaces des cartes réseau (que ce soient des cartes Ethernet, TokenRing ou autres) ;
• les interfaces ppp, plip ou slip, qui sont des interfaces permettant d’utiliser les connexions sérielles,
parallèles ou téléphoniques comme des réseaux.
277
Chapitre 9. Configuration du réseau
La configuration d’une interface comprend l’initialisation des pilotes nécessaires à son fonctionnement et
l’affectation d’une adresse IP à cette interface. La syntaxe générale que vous devrez utiliser est la
suivante :
où interface est le nom de l’interface réseau que vous voulez configurer, adresse est l’adresse IP que
cette interface gérera, et masque est le masque de sous-réseau que vous utilisez. Les interfaces que vous
aurez à configurer seront certainement des interfaces Ethernet, auquel cas vous devrez utiliser les noms
eth0, eth1, etc. dans la commande ifconfig. Si vous désirez configurer l’interface loopback, vous
devrez utiliser le nom d’interface lo.
Le paramètre up donné à ifconfig lui indique que l’interface doit être activée. Cela signifie que dès que la
commande ifconfig s’achèvera, votre interface réseau sera active et fonctionnelle. On ne peut faire plus
simple... Bien entendu, il existe le paramètre inverse : down. Ce paramètre s’utilise tout simplement dans
la commande ifconfig avec la syntaxe suivante :
Note : Prenez bien garde, lorsque vous écrivez vos adresses IP, à ne pas rajouter de 0
supplémentaire devant les nombres qui la constituent. En effet, il existe une convention en
informatique qui dit que les nombres préfixés d’un 0 sont codés en octal, c’est-à-dire en base 8. Il va
de soi qu’une adresse IP codée en octal n’utilise pas les mêmes nombres que lorsqu’elle est
exprimée en décimal, aussi éprouveriez-vous quelques difficultés pour diagnostiquer le non
fonctionnement de votre réseau si vous faisiez cette erreur !
Le noyau utilisera par défaut le nombre 255 pour les adresses de broadcast dans les composantes de
l’adresse IP qui ne fait pas partie de l’adresse de sous-réseau. Si vous désirez utiliser une autre adresse
(en général, l’alternative est de prendre l’adresse du sous-réseau), vous devrez utiliser l’option
broadcast adresse dans la commande ifconfig. Cependant, le comportement par défaut convient à la
plupart des réseaux. La commande de configuration donnée en exemple ci-dessus sera alors :
Enfin, il est possible d’affecter plusieurs adresses IP à certaines interfaces réseau. C’est en particulier le
cas pour toutes les interfaces réseau classiques, mais bien entendu cela n’est pas réalisable avec les
interfaces de type point à point comme les interfaces des connexions ppp. Lorsqu’une interface dispose
de plusieurs adresses, la première est considérée comme l’adresse principale de l’interface, et les
suivantes comme des alias. Ces alias utilisent comme nom le nom de l’interface réseau principale et le
numéro de l’alias, séparés par deux points (caractère ’:’). Par exemple, si l’interface eth0 dispose d’un
278
Chapitre 9. Configuration du réseau
alias, celui-ci sera nommé eth0:0. Ainsi, pour fixer l’adresse d’un alias d’une interface réseau, on
utilisera la syntaxe suivante :
où interface est toujours le nom de l’interface, numéro est le numéro de l’alias, adresse est
l’adresse IP à attribuer à cet alias, et masque est le masque de sous-réseau de cette adresse.
La commande ifconfig est en général appelée dans les scripts d’initialisation du système, qui ont été
générés par l’utilitaire de configuration réseau de votre distribution. Si vous effectuez un grep sur
« ifconfig » dans le répertoire /etc/rc.d/ (ou /sbin/init.d/, selon votre distribution), vous
trouverez la commande de démarrage du réseau. Il se peut qu’une variable d’environnement soit utilisée
à la place de l’adresse IP que vous avez choisie. Quoi qu’il en soit, vous devez sans aucun doute avoir les
lignes suivantes, qui permettent l’initialisation de l’interface loopback :
où opération est l’opération à effectuer sur la table de routage. L’opération la plus courante est
simplement l’ajout d’une règle de routage, auquel cas add doit être utilisé. L’option suivante permet
d’indiquer si le critère de sélection des paquets se fait sur l’adresse du réseau destination ou plus
restrictivement sur l’adresse de la machine destination. En général, il est courant d’utiliser la sélection de
toutes les adresses d’un même réseau et de les router vers une même interface. Dans tous les cas,
adresse est l’adresse IP de la destination, que celle-ci soit un réseau ou une machine. Si la destination
est un réseau, il faut indiquer le masque de sous-réseau masque à l’aide de l’option netmask. Enfin,
interface est l’interface réseau vers laquelle doivent être envoyés les paquets qui vérifient les critères
de sélection de cette règle.
Par exemple, la règle de routage à utiliser pour l’interface loopback est la suivante :
Cette règle signifie que tous les paquets dont l’adresse de destination appartient au sous-réseau de classe
A [Link] doivent être transférés vers l’interface loopback. Cela implique en particulier que les paquets
279
Chapitre 9. Configuration du réseau
à destination de la machine d’adresse IP [Link] (c’est-à-dire la machine locale) seront envoyés vers
l’interface loopback (ils reviendront donc sur la machine locale).
Une autre règle de routage classique est la suivante :
Elle permet d’envoyer tous les paquets à destination du réseau de classe C [Link] vers la première
interface Ethernet. C’est typiquement ce genre de règle qu’il faut utiliser pour faire fonctionner un réseau
local.
Il n’est normalement pas nécessaire d’ajouter les règles de routage pour les réseaux auxquel la machine
est connectée. En effet, la configuration d’une carte réseau à l’aide de la commande ifconfig ajoute
automatiquement à la table de routage une règle pour envoyer les paquets à destination de ce réseau par
l’interface réseau qui y est connectée. Cependant, la commande route devient réellement nécessaire
lorsqu’il faut définir les passerelles à utiliser pour l’envoi des paquets destinés à une machine à laquelle
la machine locale ne peut accéder directement. Les règles de routage faisant intervenir une passerelle
sont semblables aux règles de routage vues ci-dessus, à ceci près que l’adresse IP de la passerelle à
utiliser doit être fournie. Pour cela, on utilise l’option gw (abréviation de l’anglais « Gateway »). La
syntaxe utilisée est donc la suivante :
où passerelle est l’adresse IP de la passerelle à utiliser pour router les paquets qui vérifient les critères
de cette règle. Les autres paramètres sont les mêmes que pour les règles de routage classique.
Par exemple, supposons qu’une machine soit connectée à un réseau d’adresse [Link], et que sur ce
réseau se trouve une passerelle d’adresse [Link] permettant d’atteindre un autre réseau, dont
l’adresse est [Link]. Une machine du réseau [Link] aura typiquement les règles de routage
suivantes :
La première règle permet, comme on l’a déjà vu, de communiquer avec toutes les machines du réseau
local. La deuxième règle permet d’envoyer à la passerelle [Link] tous les paquets à destination du
réseau [Link].
Inversement, si la passerelle utilise l’adresse [Link] sur le réseau [Link], les machines de ce
réseau qui voudront accéder au réseau [Link] devront spécifier la règle de routage suivante :
Bien entendu, il est nécessaire que toutes les machines des deux réseaux utilisent ces règles de routage
pour que la communication entre les deux réseaux se fasse dans les deux sens.
Le problème de ces règles de routage est qu’elles spécifient l’adresse du réseau destination. Il est
évidement hors de question d’utiliser une règle de routage différente pour toutes les adresses de réseaux
280
Chapitre 9. Configuration du réseau
possibles. Il est donc possible de définir ce qu’on appelle une passerelle par défaut, qui n’est rien d’autre
que la passerelle vers laquelle doivent être envoyés tous les paquets qui n’ont pas vérifié les critères des
autres règle de routage. La syntaxe à utiliser pour définir la passerelle par défaut est plus simple,
puisqu’il n’est plus nécessaire de préciser les critères de sélection :
hostname
Cette commande permet également de modifier ce nom, simplement avec la syntaxe suivante :
hostname nom
où nom est le nom à utiliser. Il est d’usage de n’utiliser que le nom de la machine, sans son domaine. Le
nom de domaine est déterminé automatiquement par le système à partir des informations issues de la
configuration de la résolution des noms de domaine. Nous verrons cela dans le paragraphe suivant.
Cette commande est donc très simple à utiliser, et elle est en général appelée dans les scripts de
démarrage du système. La plupart des distributions utilisent le fichier /etc/HOSTNAME pour stocker le
nom de la machine. Vous êtes bien entendu libre de choisir le nom que vous voulez pour votre ordinateur,
mais vous devez vous assurer que ce nom est unique dans votre domaine !
281
Chapitre 9. Configuration du réseau
partir de son nom : la consultation d’une liste de noms stockée en local, soit l’interrogation d’un serveur
de noms de domaine.
Le fichier /etc/[Link] permet de définir le comportement du système lors de la résolution d’un
nom. Sa structure est très simple, puisqu’il y a une option de recherche par ligne. Dans la plupart des cas,
les lignes suivantes sont suffisantes :
order hosts,bind
multi on
Elles permettent d’indiquer que la recherche des noms pour leur résolution doit se faire d’abord
localement, puis par appel aux DNS si la recherche précédente a échoué. C’est en général le
comportement désiré. La deuxième ligne permet de faire en sorte que toutes les adresses correspondant à
une machine soient renvoyées. Si l’on avait utilisé l’option multi off, seule la première adresse IP
trouvée aurait été renvoyée.
La liste de noms locale est stockée dans le fichier /etc/hosts (cela explique le nom hosts utilisé pour
l’option order dans le fichier /etc/[Link]). Votre ordinateur connaîtra directement l’adresse IP
de toutes les machines référencées dans ce fichier. Il est bon de placer ici une entrée pour les ordinateurs
les plus couramment utilisés sur le réseau. Chaque entrée commence par une adresse IP, et est suivie de
la liste des noms de la machine possédant cette adresse, séparés par des espaces. Pour ceux qui ne
disposent pas de réseau local, ce fichier doit être relativement simple : seule la ligne affectant l’adresse
[Link] à la machine locale (appelée « localhost ») doit s’y trouver.
[Link] localhost
De la même manière, le fichier /etc/networks contient les adresses des réseaux. Ce fichier est utilisé
par la commande route pour donner un nom aux différents réseaux. Chaque entrée est constituée du nom
du réseau, suivi de son adresse IP. Encore une fois, ce fichier se réduit à sa plus simple expression pour
ceux qui n’ont pas de réseau local, puisqu’il ne contiendra tout au plus qu’une entrée pour le réseau
« loopback », sur lequel se trouve l’adresse de retour [Link]. Cette entrée aura donc la forme
suivante :
loopback [Link]
La configuration des serveurs de noms est en revanche une opération nécessaire si l’on désire accéder à
des machines dont on ne connaît que le nom. Le fichier de configuration utilisé est cette fois le fichier
/etc/[Link]. Sa structure est encore une fois très simple, avec une option par ligne, chaque
option étant introduite par un mot clé.
Le mot clé domain permet d’indiquer le nom du domaine dont fait partie votre machine. Par exemple, si
votre nom de domaine est « [Link] », vous devrez utiliser la ligne suivante :
domain [Link]
282
Chapitre 9. Configuration du réseau
Le mot clé search permet quant à lui de spécifier une liste de noms de domaines à ajouter par défaut
aux noms de machines non complètement qualifiés. Les éléments de cette liste doivent être séparés par
des espaces. La recherche d’une machine dont le nom ne comprend pas la partie de nom de domaine
s’effectue en ajoutant au nom de la machine les noms des domaines indiqués ici, jusqu’à ce que la
résolution du nom en adresse IP réussisse. Cette recherche commence bien entendu par le nom de
domaine local, s’il a été défini. Il est donc recommandé d’indiquer votre nom de domaine dans cette liste
de noms de domaines. Par exemple, si votre machine fait partie du domaine « [Link] », vous
devrez utiliser la ligne suivante :
search [Link]
Ainsi, si vous recherchez l’adresse de la machine « krypton », la requête au DNS se fera avec le nom
complètement qualifié « [Link] ». Vous êtes bien entendu libre d’ajouter d’autres
noms de domaines pour le cas où la résolution de nom échouerait sur ce domaine.
Enfin, l’option nameserver est essentielle, puisqu’elle permet de donner les adresses IP des serveurs de
DNS auxquels doivent être adressées les requêtes de résolution de noms. Par exemple, si vous disposez
de deux serveurs DNS, un primaire, d’adresse [Link], et un secondaire, d’adresse [Link],
vous utiliserez la ligne suivante :
Cette ligne est évidemment obligatoire, faute de quoi la résolution des noms de machines en adresse IP
échouera pour toute machine qui ne se trouve pas dans votre fichier /etc/hosts.
283
Chapitre 9. Configuration du réseau
montés les systèmes de fichiers. Ce protocole est donc particulièrement utile pour faire démarrer des
machines sans disque, pour lesquelles le système de fichiers racine est monté en NFS.
La manière la plus simple de configurer les protocoles DHCP et BOOTP sur un poste client est d’utiliser
les fonctionnalités d’auto-configuration du noyau. Cependant, il est également possible d’effectuer cette
configuration au niveau utilisateur à l’aide de programmes complémentaires. Les deux sections suivantes
décrivent ces deux techniques.
Note : Vous remarquerez qu’il existe également un autre protocole d’auto-configuration du réseau
au démarrage : le protocole RARP. Ce protocole fournit les mêmes services que le protocole
BOOTP, mais est plus ancien. Il n’est donc plus conseillé de l’utiliser, sauf vous vous trouvez sur un
réseau pour lequel seul le protocole RARP est disponible.
Une fois ces options sélectionnées, vous pourrez recompiler votre noyau, l’installer et redémarrer la
machine. Lors du démarrage, le noyau doit chercher un serveur DHCP ou un serveur BOOTP sur le
réseau local pour effectuer la configuration réseau de votre carte réseau.
Note : Vous devrez peut-être également activer les options « NFS file system support » et
« Root file system on NFS » du menu « Network File Systems » si vous désirez faire démarrer
votre machine sur un système de fichiers racine monté en NFS lors du démarrage.
284
Chapitre 9. Configuration du réseau
Les informations envoyées par les serveurs DHCP peuvent être plus ou moins complètes, la base étant
bien sûr l’adresse IP de la machine et son masque de sous-réseau. Il est toutefois possible de donner plus
d’informations, comme par exemple les adresses des serveurs de noms, des routes par défaut et des
passerelles à utiliser.
Les adresses IP attribuées aux clients ne sont pas permanentes, car le protocole DHCP est avant tout
destiné à la configuration automatique des postes itinérants ou susceptibles de redémarrer souvent. Par
conséquent, ces adresses sont fournies dans le cadre d’un bail, dont la durée maximum est fixée par le
serveur. Dès que le bail obtenu par un client expire, celui-ci doit chercher à le renouveler. C’est encore le
programme dhclient qui s’en charge. C’est la raison pour laquelle celui-ci passe en arrière-plan après
avoir configuré l’interface pour la première fois : il attend la fin des baux de la machine sur laquelle il
tourne et cherche à les renouveler. Si un client ne renouvelle pas ce bail (parce qu’il est arrêté par
exemple), le serveur DHCP peut réutiliser son adresse IP et l’affecter à une autre machine. Bien que les
serveurs DHCP s’efforcent généralement de conserver les adresses IP des clients à chaque bail, un client
configuré par DHCP ne peut donc pas considérer que son adresse IP restera toujours la même. C’est la
contrepartie de la flexibilité.
Si aucun serveur DHCP ne peut être contacté lors du démarrage, dhclient abandonne temporairement et
réessaie au bout d’un temps aléatoire. Au bout d’un certain nombre d’essais non fructueux, il peut
décider de configurer les interfaces réseau avec les adresses IP des anciens baux obtenus par la machine.
Pour cela, il mémorise dans le fichier de configuration /var/db/[Link] les adresses IP de
ces anciens baux. Ce fichier est périodiquement réécrit avec la liste des adresses des baux valides afin
d’éviter qu’il ne se remplisse ad vitam eternam.
Bien entendu, les postes clients ne peuvent pas choisir leurs adresses IP sans vérification d’unicité. Dans
le cas de l’absence de serveur DHCP (et donc d’autorité centrale), les clients qui démarrent interrogent
les machines déjà présentes sur le réseau pour déterminer si l’adresse qu’ils envisagent de prendre est
bien libre. Dans le cas contraire, une autre adresse est essayée, et ainsi de suite. Ainsi, même en cas de
panne de tous les serveurs DHCP d’un réseau, les postes clients peuvent toujours travailler ensemble
sans conflit d’adresses IP.
Comme vous pouvez le constater, le comportement de dhclient est relativement complexe et dépend de
nombre de paramètres. Tous ces paramètres peuvent être définis dans le fichier de configuration
/etc/[Link]. Ce fichier contient en particulier les différentes durées intervenant dans le
choix des adresses IP, comme par exemple la durée minimale d’un bail, les durées entre chaque tentatives
de configuration, les informations qui doivent être récupérées des serveurs DHCP, ainsi que les valeurs
par défaut pour ces informations lorsque les serveurs ne les fournissent pas. Le fichier de configuration
[Link] est donc relativement complexe. Heureusement, dhclient utilise des options par défaut
qui conviennent dans la plupart des cas, aussi est-il fortement probable que votre fichier
[Link] soit vide. Si toutefois vous désirez en savoir plus, vous pouvez consulter la page de
manuel [Link].
La configuration DHCP pour les postes clients se réduit donc à l’essentiel : le lancement de dhclient.
Celui-ci s’utilise avec la syntaxe suivante :
où interface0, interface1, etc., sont les interfaces réseau qui doivent être configurées par DHCP.
On ne peut donc pas faire plus simple...
285
Chapitre 9. Configuration du réseau
Note : Sous Linux, le programme dhclient utilise les fonctionnalité d’accès direct aux cartes réseau
et de filtrage des paquets. Ces deux fonctionnalités peuvent être activées dans la configuration du
noyau à l’aide des options « Packet socket », « Packet socket: mmapped IO » et « Socket
Filtering » du menu « Networking options ». L’option « IP: multicasting » de la liste des options
du protocole IP devra également être activée. Le détail de la configuration et de la compilation du
noyau a été vu dans la la section intitulée Compilation du noyau Linux dans Chapitre 7.
Le programme dhclient est assez facétieux depuis quelques versions. S’il refuse obstinément de
fonctionner, vous devrez sans doute vous rabattre vers le programme dhcpcd, beaucoup plus
simple, mais également beaucoup plus fiable. La plupart des distributions utilisent de dernier en lieu
et place de dhclient. Consultez la documentation de votre distribution pour déterminer la solution
qu’elle utilise.
Comme on le voit, le protocole IP dispose lui-même d’un identificateur de protocole (qui vaut 0 en
l’occurrence). Cet identificateur est un identificateur de « pseudo protocole », parce qu’IP est en fait le
protocole de base. ICMP est identifié par le numéro 1, TCP par le numéro 6 et UDP par le numéro 27. Il
existe beaucoup d’autres protocoles, qui ne seront pas décrits ici. Bien entendu, le fichier
286
Chapitre 9. Configuration du réseau
/etc/protocols fourni avec votre distribution doit déjà contenir la définition de la plupart des
protocoles.
De la même manière, la plupart des ports TCP et UDP sont affectés à des services bien définis, et certains
programmes réseau peuvent chercher à faire la correspondance entre les noms de ces services et les
numéros de ports. Cette correspondance est stockée dans le fichier de configuration /etc/services.
Les informations concernant les services sont données à raison d’une ligne par service. Chaque ligne suit
la syntaxe suivante :
où nom est le nom du service décrit par cette ligne, port est le numéro du port utilisé par ce service,
protocole est le nom du protocole utilisé par ce service (ce peut être « tcp » ou « udp »), et alias la
liste des autres noms sous lesquels ce service est également connu.
Vous trouverez les principaux services dans l’extrait donné ci-dessous :
Service Port/Protocole
ftp 21/tcp
telnet 23/tcp
smtp 25/tcp
pop3 110/tcp
irc 194/tcp
irc 194/udp
Comme vous pouvez le constater, ces services n’ont pas d’alias. Ces informations sont données
uniquement à titre d’exemple. Il va de soi que le fichier /etc/services fourni avec votre distribution
contient la définition d’un grand nombre de services, et vous n’aurez en général pas à y toucher.
287
Chapitre 9. Configuration du réseau
Le super-démon xinetd est appelé à remplacer inetd, qui lui est beaucoup plus ancien et nettement
moins souple. En pratique, un seul de ces super-démons doit être démarré sur une machine (il est inutile
de les lancer tous les deux, car les clients ne peuvent se connecter qu’à un seul d’entre-eux de toutes
manières). Les deux sections suivantes décrivent la configuration de ces super-démons.
Le super-démon inetd
Le super-démon inetd laisse de plus en plus la main au nouveau super-démon xinetd qui est beaucoup
plus puissant, mais reste toutefois très utilisé sur de nombreuses machines. Sa description n’est donc pas
inutile, car toutes les distributions n’utilisent pas encore xinetd.
Le super-démon inetd utilise le fichier de configuration /etc/[Link] pour déterminer les ports
sur lesquels il doit attendre des connexions de la part des clients, et pour trouver le service réseau qu’il
doit lancer lorsqu’une telle connexion arrive. Ce fichier est structuré en lignes, dont chacune décrit un
des services que le démon inetd prend en charge. Les informations données sur ces lignes sont les
suivantes :
• le nom du service (tel qu’il est défini dans la première colonne du fichier /etc/services) dont inetd
doit surveiller les requêtes ;
• le type de canal de communication réseau utilisé, en général « stream » (pour les communications en
mode connecté, donc en général celles qui utilisent le protocole TCP) ou « dgram » (pour les
communications basées sur les datagrammes, donc typiquement les communications utilisant le
protocole UDP) ;
• le protocole réseau utilisé (« tcp » ou «udp ») par ce service ;
• l’un des mots clés wait ou nowait, qui permettent d’indiquer si inetd doit attendre la fin de
l’exécution du démon gérant le service ou s’il peut attendre de nouvelles requêtes de la part des
clients ;
• le nom de l’utilisateur au nom duquel le démon gérant ce service doit fonctionner (en général, c’est
l’utilisateur root) ;
• le chemin sur le fichier exécutable de ce démon ;
• les éventuels paramètres en ligne de commande pour ce démon, en commençant par l’argument 0, qui
doit toujours être le nom du fichier exécutable du programme lui-même.
Par exemple, la ligne suivante permet de lancer le démon telnetd sur toute requête via le protocole TCP
pour le service telnet :
Il est supposé ici que le démon en charge de ce service peut être lancé avec le programme
/usr/sbin/[Link].
Le démon inetd est capable de fournir lui-même un certain nombre de services de base, et il n’est pas
nécessaire de fournir un démon pour ces services. Dans ce cas, il faut utiliser le mot clé internal à la
288
Chapitre 9. Configuration du réseau
place du nom du fichier exécutable du démon de ce service. Les paramètres doivent également être
remplacés par le mot clé internal.
En fait, il est fort peu probable que votre fichier de configuration /etc/[Link] définisse les
services comme indiqué dans cette section. En effet, un programme intermédiaire en charge d’assurer
des contrôles de sécurité est souvent intercalé entre inetd et les démons gérant les services. Nous verrons
ce que fait exactement ce programme dans une prochaine section.
Le super-démon xinetd
Le super-démon xinetd utilise un autre fichier de configuration que celui du super-démon inetd. Pour
xinetd, la définition des services mis à disposition des clients se fait dans le fichier de configuration
/etc/[Link]. Toutefois, contrairement au fichier [Link], le fichier [Link] peut
inclure d’autres fichiers de configuration et référencer des répertoires contenant les fichiers de
configuration spécifiques aux services. Ainsi, la configuration des services est beaucoup plus modulaire
et se fait plus facilement.
En pratique, il est d’usage de définir les options par défaut pour tous les services dans le fichier de
configuration /etc/[Link], et de décrire les différents services dans des fichiers
complémentaires stockés dans le répertoire /etc/xinetd.d/. Ce répertoire est alors inclus directement
dans le fichier [Link] à l’aide de la directive includedir dédiée à cet usage.
Les fichiers de configuration de xinetd sont constitués de sections permettant de décrire les services pris
en charge, ou tout simplement les options par défaut applicables à tous les services. La forme générale de
ces sections est la suivante :
service
{
option opérateur valeur [valeur [...]]
option opérateur valeur [valeur [...]]
...
}
où service est le nom du service (ou defaults pour les options par défaut), option est un mot-clé
identifiant une des options de ce service, et opérateur est l’un des opérateurs ’=’ (pour la définition de
la valeur d’une option ou l’écrasement de sa valeur précédente), ’+=’ (pour compléter la liste de valeurs
d’une option) ou ’-= (pour supprimer une valeur de la liste de valeurs d’une option). Les valeurs des
options peuvent être multiples, et leur nature dépend des options utilisées.
Les principales options utilisables dans ces sections sont les suivantes :
Option Signification
id Identificateur du service, pour le cas où plusieurs sections devraient être
définies pour un même service. Cette possibilité est utilisée lorsque l’on
désire fournir des options différentes pour un même service. L’entrée
choisie (et donc le jeu d’options choisi) dépend dans ce cas de critères
définis par exemple sur l’interface réseau ou sur les adresses des clients.
289
Chapitre 9. Configuration du réseau
Option Signification
type Permet d’indiquer la nature du service décrit par cette section.
Généralement, cette option n’a pas à être donnée, sauf lorsque l’on veut
forcer la méthode d’implémentation d’un service. Par exemple, il est
possible de donner la valeur INTERNAL à cette option pour utiliser l’un des
services implémentés par xinetd en interne.
server Permet de donner le chemin sur l’exécutable du démon prenant en charge
le service décrit.
server_args Permet de donner les paramètres en ligne de commande du démon prenant
en charge le service. Notez que, contrairement à ce qui se fait avec inetd, il
ne faut généralement pas donner le nom de l’exécutable en premier
argument dans cette option. Cette règle peut toutefois être rendue fausse en
ajoutant la valeur NAMEINARGS dans l’option flags décrite ci-dessous.
socket_type Le type de canal de communication utilisé (« stream » ou « dgram »,
comme pour inetd).
protocol Le protocole réseau utilisé par le service (« tcp » ou « udp », comme pour
inetd).
port Le port sur lequel le service peut être trouvé. Cette option est facultative.
Si elle n’est pas indiquée, le numéro de port utilisé sera celui indiqué dans
le fichier de configuration /etc/services pour le service en cours de
configuration.
wait L’indicateur de capacité du démon à gérer plusieurs connexions
simultanément. Les valeurs que l’on peut donner à cette option sont
« yes » et « no », respectivement pour indiquer que le démon peut gérer
plusieurs connexions simultanément ou non. Dans ce dernier cas, le démon
xinetd lancera plusieurs instances du démon gérant le service si plusieurs
clients cherchent à se connecter simultanément. Le nombre maximum
d’instance peut toutefois être contrôlé à l’aide des options instances et
per_source décrites ci-dessous.
flags Les paramètres permettant de contrôler différents aspects du service. Les
options les plus courantes sont « IDONLY », qui permet de n’autoriser que
les connexions provenant de machines disposant d’un serveur
d’identification des clients, « NORETRY », qui permet d’éviter de réessayer
de lancer le démon du service si le lancement précédent a échoué, et
« NAMEINARGS», qui permet d’indiquer que le nom de l’exécutable doit
être spécifié en premier paramètre dans l’option server_args.
user Le compte utilisateur dans lequel le démon prenant en charge le service
doit être lancé. Cette option ne peut bien entendu pas être utilisée pour les
services gérés en interne par xinetd.
interface L’interface à laquelle le service est attaché. Cette option permet de définir
plusieurs configurations pour un même service et d’affecter ces différentes
configurations à des interfaces réseau distinctes. Pour l’heure, seul
l’adresse IP de l’interface réseau peut être spécifiée grâce à cette option, ce
qui impose d’avoir des adresses IP fixes.
290
Chapitre 9. Configuration du réseau
Option Signification
only_from La liste des adresses des machines autorisées à se connecter. Il est possible
de spécifier les adresses IP explicitement ou à l’aide d’une adresse et d’un
masque de sous-réseau. Les noms de domaines peuvent également être
utilisés. Dans ce cas, le nom n’est pas transformé en adresse IP. Au
contraire, c’est l’adresse du client qui est retransformée en nom de
machine pour vérifier s’il a le droit de se connecter. Notez que l’absence
de ce champ indique que, par défaut, l’accès est accordé à toutes les
machines (sauf celles explicitement interdites de connexion par l’option
no_access décrite ci-dessous). En revanche, la présence de ce champ
mais sans valeur permet d’interdire l’accès à toutes les machines.
no_access La liste des adresses des machines qui n’ont pas le droit de se connecter.
Les adresses peuvent être spécifiées de la même manière que pour l’option
only_from. Si une adresse vérifie les critères des deux options
only_from et no_access, c’est l’option dont le critère est le plus précis
qui est choisie.
access_times La période pendant laquelle le service est accessible. Cette période peut
être exprimée sous la forme d’une liste d’intervalles
« heure:minute-heure:minute ».
instances Permet d’indiquer le nombre maximum d’instances d’un même démon que
xinetd peut lancer. Cette option permet donc de spécifier un nombre de
connexions maximum pour chaque service.
per_source Permet d’indiquer le nombre maximum d’instances d’un même démon que
xinetd peut lancer pour un même client (identifié par son adresse IP).
Cette option permet donc de limiter le nombre de connexions d’un client,
de manière indépendante du nombre de connexions total donné par
l’option instances.
cps Permet de limiter dans le temps le nombre de connexions entrantes pour
un service, afin d’éviter les attaques par déni de service. Cette option prend
deux paramètres, le premier étant le nombre maximum de demandes de
connexion par seconde que xinetd peut accepter. Si ce nombre est dépassé
le service est désactivé pendant le nombre de secondes indiqué par le
deuxième paramètre.
disabled Permet de désactiver globalement des services, en indiquant leurs noms en
paramètre. Par défaut, aucun service n’est désactivé. Cette option ne peut
être utilisée que dans la section defaults, car elle permet de désactiver
globalement et rapidement un ensemble de services.
enabled Permet de donner la liste des services pris en charge. Cette option
fonctionne de manière similaire à l’option disabled, à ceci près qu’elle
fonctionne en logique inverse. L’absence de cette option implique
l’activation de tous les services, sauf ceux qui sont listés dans l’option
disabled. En revanche, dès que cette option est définie, seuls les services
listés sont démarrés. Tout comme l’option disabled, cette option ne peut
être utilisée que dans la section globale defaults.
291
Chapitre 9. Configuration du réseau
Option Signification
disable Permet de désactiver les services de manière unitaire. Cette option est
utilisée dans les sections des services, afin d’indiquer de manière plus fine
qu’avec les options enabled et disabled s’ils doivent être activés ou
non. Cette option peut prendre deux valeurs : « yes » ou « no ». La
première permet de désactiver le service et la deuxième de le garder
fonctionnel. Notez que les options enabled et disabled ont priorité
l’option disable. Ainsi, un service désactivé par l’une de ces options ne
peut pas être réactivé en attribuant la valeur no à l’option disable.
log_type Méthode d’enregistrement des événements du démon xinetd. Il est
possible d’utiliser le démon syslog pour enregistrer les événements de
connexion et de déconnexion des utilisateurs, ou directement un fichier
texte. Dans le premier cas, il faut utiliser la valeur SYSLOG suivie de la
classe d’enregistrement (généralement daemon) et du niveau de trace
(généralement info). Dans le deuxième cas, il faut spécifier la valeur
FILE et indiquer les limites basse et haute de la taille du fichier au delà
desquelles un avertissement est généré, puis les traces sont arrêtées.
log_on_success Informations enregistrées lors de l’acceptation d’une connexion. xinetd
peut enregistrer différentes informations lorsqu’une nouvelle connexion
est acceptée. Ces informations sont indiquées grâce à la liste des mots-clés
spécifiés par cette option. Les mots-clés utilisables sont « PID », pour
enregistrer l’identifiant de processus du démon qui traitera la requête,
« HOST », pour enregistrer le nom de la machine cliente, « USERID », pour
enregistrer le nom de l’utilisateur (si celui-ci peut être obtenu par le
service d’identification de sa machine), « EXIT », pour enregistrer la
terminaison du démon qui traite la requête, et « DURATION », pour
enregistrer la durée de la connexion.
log_on_failure Informations enregistrées lors d’un refus de connexion. Les informations
enregistrées lors d’un refus de connexion peuvent être spécifiées à l’aide
de cette option, de la même manière que les informations de connexion
peuvent être enregistrées à l’aide de l’option log_on_success. Les
mots-clés utilisables avec cette option sont « ATTEMPT », pour signaler
simplement que la tentative a échoué, « HOST », pour enregistrer le nom de
la machine depuis laquelle la tentative a été effectuée, et « USERID », pour
enregistrer le nom de l’utilisateur tel qu’indiqué par le service
d’identification de sa machine.
Toutes les options disponibles ne sont pas décrites dans le tableau précédent. Vous pourrez obtenir de
plus amples renseignements en consultant la page de manuel [Link].
La section « defaults » permet de définir les options par défaut applicables à tous les services. Les
options qui y sont définies peuvent toutefois être redéfinies ou précisées à l’aide des opérateurs =, += et
-= dans les sections des différents services. Les options utilisables dans la section defaults et que l’on
a vu ci-dessus sont les options bind, log_type, log_on_success, log_on_failure, instances,
per_source, only_from, no_access, disabled et enabled.
292
Chapitre 9. Configuration du réseau
d’inclusion du répertoire /etc/xinetd.d/, dans lequel se trouvent les fichiers de configuration des
différents services. L’exemple suivant présente donc un fichier [Link] typique :
L’exemple suivant présente la définition du service telnet située dans le fichier de configuration
/etc/xinetd.d/telnet :
service telnet
{
socket_type = stream
# Le numéro de port et le protocole utilisés peuvent être omis
# car ils sont déjà définis dans /etc/services.
server = /usr/sbin/[Link]
user = root
wait = no
only_from = localhost
disable = no
}
Note : xinetd n’inclue pas les fichiers contenant un point (caractère ’.’) ni ceux finissant par un tilde
(caractère ’~’). En particulier, on évitera de mettre une extension aux fichiers de configuration des
services, puisque dans ce cas ils contiendraient un point et ne seraient pas lus.
293
Chapitre 9. Configuration du réseau
Le protocole PPP
Les connexions à Internet utilisent le protocole PPP (abréviation de l’anglais « Point to Point Protocol »),
qui permet à deux ordinateurs d’échanger des paquets TCP/IP au travers d’un canal de communication
simple (donc, en particulier, au travers d’une ligne téléphonique en utilisant un modem). Ce protocole est
géré par le noyau et par le démon pppd. Il permet d’effectuer la négociation initiale entre les deux
machines, ce qui comprend notamment l’identification, l’authentification et l’attribution des adresses IP.
Le démon pppd ne gère pas le modem directement, car il est supposé être utilisable sur d’autres types de
lignes que les lignes téléphoniques. La gestion du modem est donc relayée à un autre programme, qui se
nomme chat (il tient son nom du fait qu’il permet de dialoguer directement avec le modem). Le
programme chat ne connaît pas les différents types de modems qui existent sur le marché, il se contente
d’exécuter des scripts qui décrivent les informations à envoyer au modem et les réponses attendues en
retour. Cela permet de reporter la configuration spécifique aux modems dans des scripts de connexion.
L’écriture de ces scripts nécessite bien entendu de connaître les commandes que votre modem est
capable de comprendre. Notez également qu’il est indispensable ici que votre modem soit un vrai
modem (qu’il soit interne ou externe), et non pas un modem logiciel (ces modems sont des modèles bas
de gamme qui nécessitent un support logiciel pour interpréter les informations analogiques reçues sur la
ligne téléphonique). Renseignez-vous donc bien sur la nature du modem que vous achetez, si vous
voulez ne pas avoir de problèmes sous Linux...
La séquence des opérations lors d’une connexion est donc l’initialisation du modem et l’établissement de
l’appel téléphonique par le programme chat, puis le démarrage du démon pppd. Celui-ci effectue la
connexion sur le serveur du fournisseur d’accès et détermine l’adresse IP, les adresses des DNS, la
passerelle et la route à utiliser pour cette connexion. Une fois cela réalisé, toutes les fonctionnalités
réseau peuvent être utilisées via Internet, et votre ordinateur fait alors partie du réseau mondial.
L’identification et l’authentification peuvent se faire de différentes manières selon le fournisseur d’accès
à Internet utilisé. Un certain nombre de fournisseurs exige l’authentification lors de l’appel téléphonique,
avec un mécanisme de login classique. Pour ces fournisseurs, l’authentification est faite par le
programme chat, auquel il faut communiquer le nom d’utilisateur et le mot de passe. D’autres
fournisseurs utilisent un protocole d’authentification spécifique. Pour ceux-ci, l’authentification est
réalisée directement par le démon pppd, une fois que la ligne a été établie. Les deux principaux
protocoles d’authentification sont PAP (abréviation de l’anglais « Password Authentification Protocol »)
et CHAP (abréviation de « Challenge Handshake Authentification Protocol »). PAP réalise
l’authentification comme le mécanisme de login classique : le client envoie son nom et le mot de passe
correspondant en clair au serveur. CHAP utilise en revanche la notion de défi. Le serveur envoie une
requête contenant son nom, et le client doit s’identifier et authentifier son identité en lui renvoyant une
294
Chapitre 9. Configuration du réseau
réponse contenant son propre nom et une valeur calculée à partir du mot de passe correspondant. Les
deux méthodes seront présentées ci-dessous. Si vous ne parvenez pas à vous connecter à Internet avec la
première de ces méthodes, tentez votre chance avec PAP ou CHAP. Sachez que pour utiliser ces
protocoles il est nécessaire de connaître, en plus de votre login et de votre mot de passe, le nom du
serveur utilisé. Cette information doit vous être communiquée par votre fournisseur d’accès à Internet. Si
vous avez le choix, utilisez de préférence le protocole CHAP, car il n’envoie jamais de mot de passe en
clair sur la ligne téléphonique.
La configuration de l’accès à Internet pour un fournisseur d’accès requiert donc la configuration du
réseau, la configuration de ppp, la configuration de chat et l’écriture des scripts de connexion. Ces étapes
seront détaillées ci-dessous. Nous supposerons dans la suite que vos paramètres de connexion sont les
suivants :
Paramètre Valeur
Fournisseur d’accès Internet [Link]
Nom de domaine [Link]
Adresse du DNS [Link]
Numéro de téléphone 08 36 76 30 18
Nom de login jdupont
Mot de passe gh25k;f
Nom de serveur (pour PAP et CHAP) serveurfai
Note : Les informations données dans le tableau ci-dessus sont fictives et ne servent qu’à donner un
exemple. Vous devez bien entendu les remplacer par les valeurs vous concernant en chaque endroit
où elles apparaissent dans la suite de ce document. Si par hasard une de ces informations
correspondait à un numéro de téléphone, un nom ou une adresse IP valide, ce serait une pure
coïncidence.
Certains fournisseurs d’accès refuseront de vous donner toutes ces informations, sous prétexte
qu’ils vous fournissent un kit de connexion pour Windows. Ce n’est pas trop grave, car il est possible
de leur extorquer ces informations malgré eux. Les seules informations réellement indispensables
sont le numéro de téléphone, le nom de login, le mot de passe et le nom de domaine. Les adresses
de DNS peuvent être déterminées automatiquement dans le cadre du protocole PPP, et le nom de
serveur est arbitraire et ne sert qu’à identifier la connexion.
295
Chapitre 9. Configuration du réseau
search [Link]
nameserver [Link]
Si vous ne connaissez pas les adresses de DNS de votre fournisseur d’accès, vous pourrez l’obtenir en
regardant dans les traces du noyau lors de l’établissement d’une connexion. Nous verrons cela en détail
plus loin.
La deuxième étape est d’écrire un script de numérotation pour le programme chat. Ce script pourra être
placé dans le répertoire /etc/ppp/peers/, et pourra être nommé [Link] par exemple. Son
contenu sera le suivant :
REPORT CONNECT
ABORT ERROR
ABORT BUSY
ABORT VOICE
ABORT "NO CARRIER"
ABORT "NO DIALTONE"
"" ATZ
OK AT&F1
OK ATM0L0DT0836763018
CONNECT ""
Ce script contient le programme que chat doit exécuter pour appeler le fournisseur d’accès à Internet. Il
indique toutes les erreurs possibles susceptibles de faire échouer l’opération, puis il envoie les
commandes d’initialisation et de numérotation au modem. Vous devrez remplacer le numéro de
téléphone utilisé dans la commande DT<numéro> par le numéro de téléphone de votre fournisseur
d’accès à Internet.
Note : Dans les scripts pour chat, il est possible d’utiliser indifféremment l’apostrophe simple,
l’apostrophe double ou aucune apostrophe si la chaîne attendue de la part du modem ou à lui
envoyer ne contient aucun espace.
Si d’aventure ce script ne fonctionne pas, vous serez sans doute obligé de demander au programme
chat d’afficher tous les messages envoyés et reçus par le modem. Cela se fait normalement avec les
options -v et -s. Vous verrez alors les messages en provenance du modem, ce qui vous permettra
de déterminer comment modifier ce script.
Si votre fournisseur d’accès à Internet utilise un mécanisme de login classique, vous devez faire
l’identification directement dans le script chat. En général, serveur du fournisseur d’accès envoie la
demande de login dès que la connexion a été établie. Pour cela, il utilise une chaîne de caractères telle
que « login: », à laquelle le script chat doit répondre par votre nom d’utilisateur. Le serveur demande
alors le mot de passe avec une chaîne telle que « password: », demande à suite de laquelle le script chat
doit envoyer votre mot de passe. Ce n’est que lorsque ces deux informations auront été fournies que la
connexion sera réellement établie. Vous pouvez compléter le script chat pour répondre à ces deux
questions avec les deux lignes suivantes :
ogin: jdupont
296
Chapitre 9. Configuration du réseau
ssword: gh25k;f
Vous devrez bien entendu remplacer le nom du login et le mot de passe par vos propres données dans ce
script. Notez qu’il n’est pas nécessaire (ni recommandé) de demander la réception de la chaîne complète
« login: », car une erreur de transmission sur la ligne peut encore arriver à ce stade et provoquer la
perte des premiers caractères envoyés par l’ordinateur distant. De plus, il se peut que la première lettre
soit en majuscule ou en minuscule, selon le fournisseur d’accès à Internet que vous utilisez. Il en va de
même pour la demande de mot de passe (« password: »).
Si, en revanche, votre fournisseur d’accès utilise le mécanisme d’authentification PAP ou CHAP, vous ne
devez pas ajouter ces lignes, car le serveur n’enverra pas la chaîne de caractères « login: ». Il tentera de
communiquer directement avec votre démon pppd pour réaliser l’authentification. Bien entendu, les défis
lancés par le serveur sont simplement constitués de la demande du login et de la demande du mot de
passe correspondant à ce login. Le démon pppd utilisera alors les « secrets » stockés dans le fichier
/etc/ppp/pap-secrets ou le fichier /etc/ppp/chap-secrets pour répondre à ces défis, selon que
le protocole utilisé par le serveur du fournisseur d’accès est PAP ou CHAP. C’est donc dans ces fichiers
que vous devrez enregistrer votre login et votre mot de passe. Le format de ces fichiers est très simple.
Les deux fichiers utilisent la même syntaxe pour les secrets. Vous devez simplement y ajouter une ligne
telle que celle-ci :
pour que l’identification et l’authentification se fasse correctement. Comme on le voit, le nom du serveur
est indiqué dans ce fichier : il permet de déterminer quel login et quel mot de passe doivent être utilisés
pour les protocoles PAP et CHAP.
Note : En fait, le protocole PPP ne permet pas d’identifier des utilisateurs, mais des machines.
Cependant, pour votre fournisseur, votre machine est identifiée par votre login, et il faut donc
indiquer ce nom comme nom de machine cliente dans les fichiers pap-secrets et chap-secrets.
Le nom de serveur n’est pas utilisé pour la connexion. Il ne sert qu’à déterminer quel secret doit être
utilisé pour une connexion donnée. Comme la plupart des gens n’ont qu’un seul fournisseur d’accès
à Internet, ce nom est purement et simplement facultatif. Dans ce cas, on peut parfaitement
remplacer le nom du serveur par une étoile. Ce caractère générique indique simplement que le
même secret doit être utilisé pour toutes les connexions.
Pour les connexions à Internet, il est souvent impossible de connaître a priori l’adresse IP que le
serveur donnera au client. On peut donc laisser vide la colonne contenant les adresses IP utilisables
par les clients.
Lorsque vous aurez écrit le script chat et éventuellement complété les fichiers de secrets de PAP ou de
CHAP, vous pourrez écrire le script de connexion à Internet. Ce script est très simple :
#!/bin/sh
# Script de connexion à Internet
297
Chapitre 9. Configuration du réseau
# Effectue le ménage :
rm -f /var/spool/uucp/LCK* /var/lock/LCK* /var/run/ppp*.pid
# Établit la connexion :
/usr/sbin/pppd /dev/modem 115200 connect "/usr/sbin/chat -v \
-f /etc/ppp/peers/[Link]" defaultroute usepeerdns \
ipcp-accept-remote ipcp-accept-local
Prenez garde à écrire la ligne exécutant pppd et la ligne des options en une seule ligne, sans saut de ligne.
Notez que le caractère ’\’ placé en fin de ligne permet d’indiquer que la commande se poursuit sur la
ligne suivante. Ce script commence par faire le ménage sur les fichiers éventuellement laissés par les
anciennes connexions, et appelle pppd en lui demandant d’utiliser la connexion établie par le programme
chat avec la vitesse maximale de connexion indiquée. Lorsque la connexion est établie, le serveur du
fournisseur d’accès est enregistré comme passerelle par défaut dans la table de routage du noyau. L’envoi
et la réception des paquets IP en direction de l’Internet se fera donc en passant par cette passerelle. Les
adresses de DNS du fournisseur d’accès sont également récupérées et ajoutées dans le fichier
/etc/ppp/[Link]. Vous pourrez les déterminer simplement en consultant les fichiers de log de
votre distribution dans le répertoire /var/log/. Les deux dernières options permettent d’autoriser le
serveur du fournisseur d’accès à fixer les adresses IP locales et distantes.
Dans ce script de connexion, le programme chat est appelé avec le script de numérotation pour chat que
l’on a déjà écrit. Si l’on désire voir exactement ce qui se passe, on peut ajouter l’option -s à la
commande d’exécution de chat :
/usr/sbin/chat -v -s -f /etc/ppp/peers/[Link]
dans le script de connexion vu ci-dessus. Cela vous permettra de déboguer votre script de numérotation.
Vous remarquerez que le programme pppd utilise le fichier spécial de périphérique /dev/modem pour la
communication. Il va de soi que si ce fichier spécial n’existe pas, vous devrez le créer. La solution la plus
simple est de faire un lien symbolique vers /dev/ttS0 ou /dev/ttS1, selon que votre modem est
connecté sur le premier ou le deuxième port série de votre ordinateur.
La commande de lancement donnée ci-dessus suppose que le script de connexion
/etc/ppp/peers/[Link] réalise l’identification et l’authentification. Si vous utilisez l’un des
protocoles PAP ou CHAP, il faut demander à pppd d’effectuer ces deux opérations lui-même. Pour cela,
il faut ajouter des options dans la ligne de commande utilisée pour le lancer dans le script de connexion,
afin de préciser le nom du serveur et le nom d’utilisateur pour l’identification. La ligne complète à
utiliser pour PAP ou CHAP doit donc être celle-ci :
# Établit la connexion :
/usr/sbin/pppd /dev/modem 115200 connect "/usr/sbin/chat -v \
-f /etc/ppp/peers/[Link]" defaultroute usepeerdns \
ipcp-accept-remote ipcp-accept-local noauth \
remotename serveurfai user jdupont
Encore une fois, cette commande doit être écrite sur une seule ligne, ou sur plusieurs lignes séparées par
le caractère ’\’. L’option noauth signale qu’il n’est pas nécessaire que le serveur du fournisseur d’accès
298
Chapitre 9. Configuration du réseau
s’authentifie en tant que tel (ce n’est pas nécessaire, car les fournisseurs d’accès ne jouent pas vraiment
aux pirates du web), et les deux options suivantes permettent respectivement d’indiquer le nom de ce
serveur ainsi que le nom d’utilisateur à utiliser pour le login. Lors de l’authentification, le démon pppd
lira le fichier de secret du protocole choisi par le fournisseur d’accès pour trouver le mot de passe à
utiliser. Notez encore une fois qu’il est facultatif de préciser le nom du serveur du fournisseur d’accès si
vous avez utilisé le caractère générique ’*’ dans les fichiers de secrets pour PAP et CHAP.
Il est possible de faire en sorte que la connexion à Internet s’établisse automatiquement dès qu’un
programme cherche à utiliser une adresse devant passer par la route par défaut. Toute demande à
destination d’une machine dont l’adresse est inconnue localement provoque dans ce cas l’établissement
de la connexion à Internet. Pour cela, il suffit simplement :
Si vous désirez utiliser cette fonctionnalité, il est recommandé d’activer également la déconnexion
automatique, faute de quoi vous risqueriez de rester connecté involontairement. Cela se fait simplement
en ajoutant l’option idle n dans la ligne de commande de pppd, où n est le nombre de secondes
pendant lequel le lien PPP doit rester inactif avant que la connexion ne se coupe automatiquement. Un
choix judicieux est par exemple 600 (ce qui correspond à dix minutes).
Note : L’interface réseau est automatiquement créée lorsqu’on lance le démon pppd avec l’option
demand. Par conséquent, le démon pppd définira automatiquement une adresse IP locale pour cette
interface et une adresse IP distante pour la passerelle par défaut. Malheureusement, ces adresses
peuvent changer d’une connexion à une autre. En effet, la plupart des fournisseurs attribuent les
adresses IP en fonction du modem qui répond au client qui appelle et, en général, la connexion ne
se fait pas toujours sur le même modem (il peut y avoir plusieurs modems pour un même numéro de
téléphone). C’est pour cela qu’il faut ajouter les options ipcp-accept-remote et
ipcp-accept-local pour indiquer à pppd de modifier ces adresses lorsqu’il établira la connexion.
Le problème, c’est que les connexions TCP/IP utilisant ces adresses seront systématiquement
cassées à la suite de ce changement. C’est en particulier le cas pour le programme qui a initié
l’établissement de la liaison PPP. C’est pour cette raison qu’il est recommandé de demander une
adresse IP fixe à son fournisseur d’accès lorsqu’on veut utiliser la connexion à la demande. Hélas,
ce service peut faire l’office d’une facturation supplémentaire.
Même si l’on utilise l’option usepeerdns dans la ligne de commande de PPP, il est recommandé de
rajouter les adresses des DNS dans le fichier /etc/[Link]. En effet, en l’absence de DNS,
les noms de domaine ne seront pas résolus et aucune requête vers l’extérieur ne se fera. Par
conséquent, la route par défaut ne sera pas utilisée, et pppd n’établira donc pas la connexion
automatiquement. Notez que si vous définissez les DNS dans le fichier /etc/[Link], vous
pouvez vous passer de l’option usepeerdns dans la ligne de commande de pppd. Si vous désirez
procéder de cette manière, vous devrez vous assurer que l’ordre spécifié pour la résolution des
noms dans le fichier /etc/[Link] est bien le fichier /etc/hosts (option hosts) avant le DNS
(option bind), faute de quoi votre ordinateur se connectera systématiquement à Internet dès que
vous utiliserez un nom de machine local.
La plupart des options passées en ligne de commande peuvent être spécifiées dans le fichier
d’options /etc/ppp/options du démon pppd. Cela peut permettre de simplifier les scripts de
connexion.
299
Chapitre 9. Configuration du réseau
Si l’on n’utilise pas les mécanismes de connexion / déconnexion automatiques, on devra se déconnecter
manuellement. Pour cela, rien de plus simple : il suffit de détruire le démon pppd. Cela peut être réalisé
automatiquement avec le script suivant :
#!/bin/sh
# Script de terminaison de la connexion PPP
#
# Effectue le ménage :
if [ ! "$?" = "0" ]; then
rm -f /var/run/$[Link]
echo "ERREUR: Un fichier de PID résiduel \
a dû être effacé manuellement"
exit 1
fi
rm -f /var/spool/uucp/LCK* /var/lock/LCK*
echo "La connexion PPP sur $DEVICE a été fermée correctement..."
echo
# Termine le script :
exit 0
fi
Connexion à l’ADSL
Les connexions ADSL ne requièrent pas d’appel téléphonique vers un modem du fournisseur d’accès.
Elles s’établissent donc d’une manière différente, généralement bien plus simple. Toutefois, la manière
de procéder dépend des fournisseurs d’accès et de la nature de votre modem ADSL. Il est donc difficile
300
Chapitre 9. Configuration du réseau
de décrire de manière générique la manière dont une connexion ADSL se met en place sous Linux.
Seules les grandes lignes seront donc indiquées dans ce paragraphe.
Sachez pour commencer qu’il existe deux types de modems ADSL : les modems Ethernet et les modems
USB. Les premiers sont connectés à votre ordinateur via une carte Ethernet, alors que les seconds
utilisent un câble USB. Il va de soi que les modems USB requièrent des pilotes de périphériques
spécifiques à chaque type de modem, alors que les modems Ethernet se connectent directement à votre
carte Ethernet par un câble Ethernet (droit ou croisé selon votre modem). Si votre carte réseau est prise
en charge par Linux, vous n’aurez aucun problème pour vous connecter à Internet avec un modem
Ethernet, alors que les pilotes USB pour Linux sont rarement développés avec sérieux par les fabricants
de modem (ayant essuyé les plâtres avec le modem Sagem Fast800 fourni par Free à ses clients et
participé au débogage de celui-ci, je suis bien placé pour le savoir). De plus, les modems USB ne
peuvent pas être utilisés avec un routeur, appareil dont l’achat se justifie pleinement si vous disposez
d’un petit réseau familial et que vous désirez partager la connexion ADSL entre les différentes machines.
Pour terminer, les modems Ethernet sont alimentés, alors que les modems USB utilisent l’alimentation
du port USB, ce qui dans 50% des cas provoque des instabilités de la connexion Internet, si ce n’est de
l’ordinateur lui-même. Il est donc vivement conseillé de choisir un modem Ethernet si vous en achetez
un ou si votre fournisseur d’accès à Internet vous en propose.
Note : Même si, comme nous le verrons plus loin, Linux est parfaitement capable de réaliser un
partage de connexion à Internet, l’achat d’un routeur Ethernet reste intéressant car ces appareils
réalisent ces opérations de manière très simple d’une part, et permettent de ne pas avoir un
ordinateur sous Linux allumé en permanence pour faire office de passerelle d’autre part. L’achat d’un
modem routeur sans fil peut même être une bonne idée au niveau simplicité, même si cela vous
posera quelques problèmes de sécurité majeurs.
Les fournisseurs d’accès à Internet répugnent à fournir des modems Ethernet, car ils coûtent
généralement plus chers que les modems USB, et leur installation sous Windows est considérée
comme hors de portée de l’utilisateur moyen. Ils invoquent donc souvent des pénuries (fictives)
comme excuse pour ne pas en fournir. Ne vous laissez pas démonter et insister lourdement, c’est
votre droit en tant que client.
Même si vous utilisez un modem USB, il apparaîtra généralement comme une interface Ethernet dans le
système. L’installation des pilotes pour les modems USB étant extrêmement spécifique, cette étape ne
sera pas décrite plus en avant ici. La suite du document suppose donc que vous disposiez d’un modem
Ethernet, ou que votre modem soit accessible par l’intermédiaire d’une interface Ethernet simulée par le
pilote du modem.
Lorsque vous aurez branché votre modem et que vous pourrez y accéder via son interface Ethernet, vous
devrez établir la connexion avec votre fournisseur d’accès. Cela dépend encore une fois du fournisseur
d’accès, et parfois même, pour un même fournisseur, de la région dans laquelle vous vous trouvez.
Généralement, deux méthodes sont utilisées pour établir la connexion :
• soit les communications se font de manière totalement transparente via l’interface Ethernet du modem,
auquel cas la connexion s’établit aussi facilement que si vous vous connectiez à un réseau Ethernet
classique ;
• soit les communications sont encapsulées dans le protocole de communication PPP, via un protocole
du type PPPoE (« PPP over Ethernet ») ou PPPoA (« PPP over ATM »), auquel cas vous devrez
utiliser le démon pppd pour établir la connexion.
301
Chapitre 9. Configuration du réseau
Dans le premier cas, la configuration est simpliste. Il suffit d’utiliser l’interface Ethernet du modem
comme interface de sortie dans la route par défaut, et éventuellement de mettre un client DHCP à
l’écoute sur cette interface si le fournisseur d’accès utilise ce protocole pour attribuer les adresses IP de
ses clients. La manière de procéder est décrite dans la section traitant de DHCP. Cette technique est celle
utilisée par le fournisseur d’accès Free en France en zone dégroupée. Pour ce fournisseur, les adresses IP
fournies étant fixes en zone dégroupée, la connexion à Internet se résume donc aux deux commandes
suivantes :
où adresse est l’adresse IP que Free vous a attribuée. La connexion à Internet se fait donc dans ce cas
comme la configuration d’une simple carte réseau.
Dans le deuxième cas, le plus simple est d’utiliser le protocole d’encapsulation PPPoE. Comme con nom
l’indique, ce protocole permet d’encapsuler les paquets de la liaison PPP avec votre fournisseur Ethernet
directement dans des trames Ethernet, qui peuvent ensuite être envoyées via l’interface Ethernet du
modem. Cette solution peut être mise en place avec l’outil rp-pppoe de la société Roaring Penguin
([Link] ou directement avec un gestionnaire PPPoE au niveau du noyau.
La mise en place d’une connexion avec rp-pppoe est réellement très simple. En effet, un fichier d’options
pour PPP nommé [Link] et des scripts de connexion et déconnexion adsl-start et adsl-stop,
permettant de lancer le démon pppd avec les bonnes options et dans le bon contexte pour établir la
connexion, sont fournis. Les seules opérations à faire sont dans ce cas de s’assurer que les identifiants de
connexion (login et mot de passe) fournis par votre fournisseur d’accès sont bien enregistrés dans les
fichiers pap-secrets et chap-secrets, et que le fichier [Link] y fait bien référence (au niveau
de l’option USER). La manière de procéder ayant déjà été décrite ci-dessus, elle ne sera pas détaillée
outre mesure.
L’utilisation du gestionnaire PPPoE du noyau est encore plus directe, car il suffit simplement dans ce cas
de lancer le démon pppd en lui demandant de travailler avec l’interface réseau du modem. Pour utiliser
ce gestionnaire, vous devez activer, outre le support de PPP, l’option « PPP over Ethernet
(EXPERIMENTAL) » dans les options de configuration du noyau. Une fois les identifiants de connexion
écrits dans les fichiers pap-secrets ou chap-secrets, la connexion à Internet se fera simplement
avec la commande suivante :
pppd interface
Note : Il est recommandé de limiter la taille des paquets en réception et en émission à 1492 octets,
afin de prendre en compte les frais dûs à l’encapsulation PPPoE. Pour cela, il suffit de placer les
options suivantes dans le fichier d’options de pppd :
mtu 1492
mru 1492
Il est impératif de mettre en place un pare-feu si vous disposez d’une connexion ADSL. La manière
de procéder est décrite dans la la section intitulée Pare-feu et partages de connexion à Internet>.
302
Chapitre 9. Configuration du réseau
Note : Les « caches » sont des mécanismes permettant de stocker en local une copie de données
relativement difficiles à obtenir et qui varient très peu, afin de pouvoir en disposer plus rapidement.
Les caches sont utilisés très souvent en informatique, aussi bien au niveau des disques durs et des
processeurs qu’au niveau du réseau. Ils permettent d’augmenter considérablement les
performances, au détriment d’un ralentissement des opérations d’écriture des données, puisque
celles-ci invalident les données des caches et doit forcer leur mise à jour.
L’espace de nommage d’Internet est structuré hiérarchiquement en zones. Lors de la résolution d’un nom
de domaine, ce nom est décomposé en noms de zones et de sous-zones, en partant de la fin. À chaque
niveau, le client qui cherche à résoudre le nom interroge un serveur de noms de la zone courante, jusqu’à
ce qu’il obtienne l’adresse du nom de domaine. Lorsqu’il ne connaît aucun serveur de noms pour les
zones de premier niveau, il doit interroger l’un des serveurs de noms racines d’Internet. Ces serveurs sont
gérés par l’Internic et par quelques sociétés commerciales. Le nom de zone qui est associé aux serveurs
racines est le nom « . », qui constitue le nom de la zone racine.
Par exemple, lors de la résolution du nom de domaine « [Link] », les clients interrogent
d’abord les serveurs de noms racines pour obtenir les adresses des serveurs de noms capables de
résoudre les noms de la zone .com. Ensuite, ils interrogent ces serveurs pour obtenir les serveurs de
noms prenant en charge de la zone monrezo. Enfin, ils obtiennent l’adresse IP de la machine cible à
303
Chapitre 9. Configuration du réseau
partir de ces serveurs. Bien entendu, ce processus peut être optimisé si l’on connaît déjà l’un des serveurs
de noms d’une zone. De fait, les serveurs de noms primaires ne sont utilisés que relativement rarement.
La mise en place d’un serveur de nom cache consiste donc à s’assurer que les clients l’interrogent en
premier, et à le configurer de telle sorte qu’il puisse interroger un autre serveur de nom lorsqu’il ne peut
répondre lui-même aux requêtes des clients. L’idéal est dans ce cas simplement de s’adresser aux
serveurs de noms du fournisseur d’accès à Internet, afin de bénéficier de son cache et de sa bande
passante pour les requêtes intermédiaires.
Le serveur de domaine le plus utilisé est sans doute le serveur BIND (« Berkeley Internet Name
Domain »). Il est généralement installé par toutes les distributions, et est souvent préconfiguré pour
réaliser un cache de DNS. Toutefois, les configurations utilisées ne délèquent pas forcément les requêtes
aux serveurs DNS des fournisseurs d’accès, et ne limitent pas toujours les accès aux seuls clients
autorisés. Nous verrons donc comment configurer BIND pour réaliser un cache.
BIND utilise un démon nommé named pour répondre aux requêtes des clients. Celui-ci utilise le fichier
de configuration /etc/[Link], dont vous trouverez un exemple réduit à sa plus simple expression
ci-dessous :
Comme vous pouvez le constater, ce fichier est constitué de deux sections. La première section contient
les options globales de named. Elle permet d’indiquer le répertoire dans lequel celui-ci trouvera les
fichiers de données dont il a besoin, ainsi que les adresses réseau des interfaces réseau sur lesquelles il
devra se mettre à l’écoute pour répondre aux requêtes DNS. Les adresses indiquées dans la directive
listen-on permettent de faire en sorte que votre démon named ne réponde qu’à la machine locale et
aux machines situées sur un réseau local d’adresse [Link]/24. La directive forward permet
quant à elle de demander à named de s’adresser à un autre serveur DNS pour obtenir la réponse aux
requêtes dont il n’a pas encore la réponse. Les adresses de serveurs DNS à interroger dans ce cas sont
spécifiées à l’aide de la directive forwarders. Vous devrez y placer les adresses des serveurs DNS
primaires et secondaires de votre fournisseur d’accès.
304
Chapitre 9. Configuration du réseau
L’option first de la directive forward signifie que les serveurs DNS du fournisseur d’accès doivent
être interrogés en premier, mais que si une requête ne peut être résolue par ces serveurs, bind devra
essayer de résoudre cette requête par ses propres moyens. Pour cela, il cherchera à décomposer le nom de
domaine et à interroger les serveurs de DNS en charge de chaque composante de ce nom, comme
expliqué ci-dessus. Il lui faut donc un point d’entrée, à partir duquel il pourra résoudre n’importe quel
nom de domaine. Ce point d’entrée est donné par la deuxième section du fichier /etc/[Link].
Cette deuxième section est la définition de la zone DNS racine du système DNS. Elle permet de définir le
point d’entrée pour les résolutions de n’importe quel nom, en décrivant la manière dont les noms doivent
être résolus à partir de la racine du système DNS. L’option hint de la directive type indique que les
informations obtenues à ce niveau ne seront que des adresses d’autres serveurs de noms (en l’occurrence
les serveurs de noms racines). La directive file indique que les adresses des serveurs de noms de cette
zone devront être obtenues par consultation du fichier [Link].
Ce fichier doit être situé, conformément à l’option directory de la section globale, dans le répertoire
/var/named/. Il est fourni par l’Internic, et contient la liste des serveurs DNS racines :
. 3600000 IN NS [Link].
[Link]. 3600000 A [Link]
. 3600000 NS [Link].
[Link]. 3600000 A [Link]
. 3600000 NS [Link].
[Link]. 3600000 A [Link]
. 3600000 NS [Link].
[Link]. 3600000 A [Link]
. 3600000 NS [Link].
[Link]. 3600000 A [Link]
. 3600000 NS [Link].
[Link]. 3600000 A [Link]
. 3600000 NS [Link].
[Link]. 3600000 A [Link]
. 3600000 NS [Link].
[Link]. 3600000 A [Link]
. 3600000 NS [Link].
[Link]. 3600000 A [Link]
. 3600000 NS [Link].
[Link]. 3600000 A [Link]
. 3600000 NS [Link].
[Link]. 3600000 A [Link]
. 3600000 NS [Link].
[Link]. 3600000 A [Link]
. 3600000 NS [Link].
[Link]. 3600000 A [Link]
Comme vous pouvez le constater, ce fichier contient les noms des serveurs DNS en charge de la zone
« . » (lignes dont le quatrième champ contient la chaîne de caractère « NS », pour « Named Server »),
ainsi que les adresses IP ce ces serveurs (lignes dont le quatrième champ contient le caractère « A »). Les
adresses des serveurs de noms racines pouvant évoluer dans le temps, il est nécessaire de le mettre à jour
régulièrement.
305
Chapitre 9. Configuration du réseau
Une fois que vous aurez configuré et lancé le démon named, vous devrez encore indiquer au système
qu’il devra interroger ce démon pour effectuer la résolution des noms de domaines. Comme il l’a déjà été
indiqué dans les sections précédentes, cela se fait simplement en ajoutant une ligne nameserver
référençant la machine locale dans le fichier de configuration /etc/[Link] :
nameserver [Link]
Note : Le démon named ne permet de cacher que les résultats des requêtes DNS. Or, de nombreux
fichiers qui ne changent quasiment jamais sont récupérés de multiples fois lorsqu’un internaute
navique sur des pages Web. Il est donc très intéressant de mettre également ces fichiers en cache.
Nous verrons comment réaliser cela dans la section suivante.
Note : Il est également possible d’utiliser les mécanismes de translation d’adresse du noyau pour
rendre l’utilisation du proxy transparente aux clients. La manière de procéder sera décrite dans la
section traitant des mécanismes de filtrage du noyau.
306
Chapitre 9. Configuration du réseau
Il existe plusieurs proxies sur le marché, mais le plus utilisé sous Linux est sans doute squid. C’est un
logiciel performant, puissant et libre, fourni avec la plupart des distributions modernes. Sa configuration
peut être relativement technique, mais nous n’allons pas entrer dans tous les détails. Il s’agit simplement
ici de donner un aperçu des fonctionnalités disponibles.
squid utilise le fichier de configuration /etc/[Link] pour lire ses options de fonctionnement. Ce
fichier contient en particulier les informations concernant le réseau, une liste de règles indiquant qui a le
droit de lui demander des pages Web, et l’emplacement du cache dans lequel les données du cache seront
enregistrées.
L’option la plus importante dans ce fichier de configuration est sans doute cache_dir, qui indique
l’emplacement du cache ainsi que sa taille et sa structure. La syntaxe de cette option est la suivante :
où répertoire est le répertoire dans lequel le cache sera stocké (usuellement /var/squid/cache/),
taille est la taille de ce cache en méga-octets, et n et m deux nombres donnant la structure de
l’arborescence du cache. La signification de ces deux nombres doit être expliquée un peu plus en détail.
Par défaut, squid essaie de répartir tous les objets qu’il place dans le cache de manière uniforme dans
plusieurs répertoires, afin d’accélérer les temps de recherche sur ces objets lorsqu’un client les demande.
Il utilise à cette fin une fonction de répartition (les programmeurs disent souvent une fonction de hash)
qui indique dans quel répertoire se trouve un objet. La recherche dans ce répertoire se fait donc plus
rapidement car, si la fonction de répartition est bien faite (et c’est le cas), les objets sont répartis de
manière équilibrée dans tous les répertoires du cache, qui sont donc tous relativement peu peuplés. En
fait, squid peut stocker tellement d’objets que le nombre de répertoires peut lui-même devenir très grand.
Il utilise donc un découpage à deux niveaux, les répertoires du deuxième niveau étant répartis dans les
répertoires du premier niveau. Le premier nombre spécifié dans l’option cache_dir indique le nombre
de répertoires du premier niveau, et le deuxième nombre indique le nombre de sous-répertoires dans
chacun de ces répertoires. En général, on utilise respectivement les valeurs 16 et 256 :
Cette ligne permet de cacher 100 Mo, en répartissant les objets dans 4096 répertoires répartis en 16
groupes de 256 répertoires.
Les options suivantes spécifient les paramètres réseau du cache :
• l’option http_port indique le port TCP que les clients doivent utiliser pour accéder au proxy ;
• l’option ftp_user permet de donner l’adresse email à utiliser comme mot de passe dans les
connexion FTP anonymes ;
• l’option cache_peer permet d’intégrer le proxy local dans une hiérarchie de proxies.
Les proxies peuvent en effet être organisés dans une structure arborescente. Lorsqu’un proxy d’un
niveau ne dispose pas d’une donnée demandée par un client, il peut contacter ses frères pour le cas où
ceux-ci auraient cette donnée dans leurs caches, ou demander à son proxy père de récupérer cette
donnée pour lui. Les proxies communiquent entre eux en utilisant un protocole dédié, le protocole ICP
(abréviation de l’anglais « Inter Cache Protocol »).
307
Chapitre 9. Configuration du réseau
En général, les petits réseaux ne disposent que d’un seul proxy, l’option cache_peer est donc
souvent utilisée de la manière suivante :
cache_peer père parent port port_icp options
où père est le nom du cache père, port est son port, port_icp est le port à utiliser pour les
communications ICP, et options sont des options complémentaires. Parmi toutes les options
possibles, on utilisera le plus souvent l’option default, qui spécifie les valeurs par défaut des
options, et no-query, qui permet de dire au cache de ne pas utiliser le protocole ICP (dans ce cas, le
paramètre port_icp sera inutilisé) ;
• L’option prefer_direct permet d’indiquer au proxy s’il doit chercher avant tout à récupérer
lui-même les données qui lui manquent (valeur on) ou s’il doit contacter d’abord son proxy père
(valeur off). Si l’on a spécifié un proxy père à l’aide de l’option cache_peer, on aura intérêt à
utiliser la valeur off ;
• L’option dns_children permet de donner le nombre de processus en charge de cacher les requêtes
sur les DNS. squid peut en effet lancer des serveurs de cache de DNS permettant d’optimiser les
temps d’accès aux pages Web. Plus le réseau local est important, plus il faudra de tels processus, afin
que tous les clients puissent obtenir les adresses IP des machines à partir de leur noms. La valeur par
défaut est de 5 processus, ce qui devrait convenir dans la plupart des cas.
Les valeurs données par défaut à toutes ces options conviennent dans la plupart des cas. Elles sont
parfaitement documentées dans le fichier de configuration [Link].
Par défaut, squid n’autorise personne à accéder au cache. Il est donc nécessaire de donner les droits
nécessaires pour permettre aux machines de votre réseau d’accéder au cache. La gestion de la sécurité se
fait par l’intermédiaire de ce que l’on appelle des ACL (abréviation de l’anglais « Access Control List »).
Une ACL est simplement un critère permettant de classifier les requêtes que le proxy reçoit. Ces critères
sont définis à l’aide du mot clé acl, suivi du nom de la liste, suivi lui-même d’un critère que toutes les
requêtes concernées par cette ACL devront vérifier. Les critères sont eux-mêmes exprimés à l’aide d’un
mot clé qui indique sur quoi porte le critère et des options de ce critère. Les principaux mots clés que
vous pourrez utiliser sont les suivants :
• src, qui permet de filtrer les requêtes par les adresses des machines qui les ont émises, en indiquant
l’adresse de leur réseau, donnée sous la forme adresse/masque ;
• dst, qui permet de filtrer les requêtes par leurs adresses destination ;
• port, qui permet de sélectionner les requêtes s’adressant sur les ports fournis en paramètres ;
• proto, qui permet de spécifier la liste des protocoles utilisés par les requêtes ;
• method, qui permet de sélectionner les requêtes HTTP par la méthode utilisée dans la requête.
Ce tableau n’est pas exhaustif, mais il permet d’avoir une idée des capacités de filtrage des requêtes dont
dispose squid. Vous trouverez ci-dessous quelques exemples pratiques de définitions d’ACL :
308
Chapitre 9. Configuration du réseau
La définition des règles de sécurité utilise les ACL de manière séquentielle. Les règles doivent être
données les unes après les autres, suivant le format suivant :
où ressource est un mot clé indiquant la ressource sur laquelle la règle de sécurité porte, politique
est l’action prise pour les requêtes vérifiant cette règle, et ACL une liste d’ACL permettant de spécifier les
requêtes concernées par cette règle. La ressource la plus utilisée est sans doute le protocole HTTP, que
l’on peut spécifier à l’aide du mot clé http_access. Les actions peuvent être l’acceptation (mot clé
allow) ou le refus (mot clé deny) de la requête. Enfin, les requêtes concernées par une règle sont celles
qui appartiennent à toutes les ACL de la liste d’ACL indiquée.
Vous trouverez ci-dessous quelques exemples de règles de sécurité courantes :
# Interdit les accès pour toutes les requêtes provenant de port non autorisés :
http_access deny !safe_ports
http_access deny connect !safe_ports
Notez que si une requête ne correspond à aucune règle, la politique par défaut utilisée par squid est de
prendre l’action opposée à la dernière règle spécifiée. En pratique, il est plus sage de toujours indiquer
309
Chapitre 9. Configuration du réseau
une politique par défaut pour toutes les requêtes restantes, par exemple en utilisant l’ACL all définie
ci-dessus.
L’exemple de jeu de règles de sécurité donné ci-dessous convient pour un réseau local d’adresses
[Link]. Vous pouvez bien entendu modifier les options de sécurité comme bon vous semble. Encore
une fois, rappelons que le fichier de configuration de squid est très bien documentée et que sa lecture est
relativement facile. Je ne saurais que trop vous recommander de le consulter si vous désirez en savoir
plus.
310
Chapitre 9. Configuration du réseau
311
Chapitre 9. Configuration du réseau
Les traitements les plus simples sont bien entendus fournis en standard avec le noyau. En général, on
peut chercher à réaliser les opérations suivantes sur un paquet :
Note : Certains paquets peuvent être découpés en plusieurs paquets plus petits lors de la traversée
d’un réseau. Par exemple, un paquet TCP un peu trop gros et initialement encapsulé dans un seul
paquet IP peut se voir éclaté en plusieurs paquets IP. Cela peut poser quelques problèmes aux
règles de filtrage, puisque dans ce cas les données spécifiques à TCP (par exemple les numéros de
ports) ne sont disponibles que sur le premier paquet IP reçu, pas sur les suivants. C’est pour cette
raison que le noyau peut effectuer une « défragmentation » des paquets lorsque cela est nécessaire,
et que les paquets transmis par la passerelle ne sont pas toujours strictement identitiques aux
paquets qu’elle reçoit.
312
Chapitre 9. Configuration du réseau
intéresser plus particulièrement aux différentes formes de translations d’adresses dans la suite de cette
section.
Une translation d’adresse n’est en fait rien d’autre qu’un remplacement contrôlé des adresses source ou
destination de tous les paquets d’une connexion. En général, cela permet de détourner les connexions
réseau ou de simuler une provenance unique pour plusieurs connexions. Par exemple, les connexions à
Internet peuvent être détournées vers un proxy fonctionnant sur la passerelle de manière transparente, en
modifiant les adresses destination des paquets émis par les clients. De même, il est possible de simuler un
seul serveur en remplaçant à la volée les adresses source des paquets que la passerelle envoie sur Internet.
On distingue donc deux principaux types de translations d’adresses : les translations d’adresse source et
les translations d’adresse destination. Parmi les translations d’adresse source se trouve un cas particulier
particulièrement intéressant : le « masquerading ». Cette technique permet de remplacer toutes les
adresses source des paquets provenant des machines d’un réseau local par l’adresse de l’interface de la
passerelle connectée à Internet, tout en conservant une trace des connexions réseau afin d’acheminer vers
leur véritable destinataire les paquets de réponse. Ainsi, une seule connexion à Internet peut être utilisée
par plusieurs machines distinctes, même si elles ne disposent pas d’adresses IP fournies par l’IANA.
Lorsqu’une machine du réseau local envoie un paquet à destination d’Internet, ce paquet est acheminé
vers la passerelle, qui est la route par défaut. Celle-ci commence par modifier l’adresse source de ce
paquet et mettre sa propre adresse à la place, puis le transfère vers la machine du fournisseur d’accès.
Tous les paquets émis par les machines du réseau local semblent donc provenir de cette passerelle, et
seront acheminés normalement à destination. En fait, la complication provient des paquets de réponse,
puisque les machines situées sur Internet croient que la machine avec laquelle elles communiquent est la
passerelle. Ces paquets sont donc tous envoyés à la passerelle directement, et celle-ci doit retrouver la
machine du réseau local à laquelle ils sont destinés. Cette opération est réalisée de différentes manières
selon les protocoles utilisés, et elle suppose que la passerelle conserve en permanence une trace des
connexions réseau effectuées par les machines du réseau local.
Pour TCP, ce suivi de connexion est réalisé en modifiant également le port source des paquets provenant
des machines locales. La passerelle utilise un port unique pour chaque connexion, qui va lui permettre de
retrouver la machine à laquelle un paquet est destiné lorsqu’elle en reçoit un provenant d’Internet. Par
exemple, si une machine locale fait une connexion à Internet, la passerelle alloue un nouveau numéro de
port pour cette connexion et modifie tous les paquets sortants comme ayant été émis par la passerelle
elle-même, sur ce port. Lorsque l’autre machine prenant part à la connexion, située sur Internet, envoie
un paquet de réponse, celui-ci sera à destination de la passerelle, avec comme port destination le port
alloué à cette connexion. La passerelle peut donc retrouver, à partir de ce port, l’adresse de la machine
destination réelle, ainsi que le port source que cette machine utilisait initialement. La passerelle modifie
donc ces deux champs du paquet, et le renvoie sur le réseau local. Finalement, la machine destination
reçoit le paquet sur son port, et ce paquet semble provenir directement d’Internet, comme si la connexion
avait été directe. Notez bien que la passerelle ne modifie pas les adresses source des paquets provenant
d’Internet, elle ne fait que les réacheminer vers la bonne destination.
313
Chapitre 9. Configuration du réseau
Ainsi, le masquerading est un mécanisme complètement transparent pour les machines du réseau local.
En revanche, pour les machines de l’Internet, il ne semble y avoir qu’un seul interlocuteur : la passerelle.
Celle-ci utilise des numéros de ports variés, mais cela ne les regarde pas. Les machines du réseau local
sont donc complètement « masquées » par la passerelle, d’où le nom de masquerading.
Tout ce travail effectué par la passerelle nécessite un traitement spécifique sur chaque paquet qu’elle
achemine, et consomme bien entendu des ressources système. Cependant, les débits utilisés pour les
connexions à Internet, même les plus rapides, sont très loin de mettre à genoux une passerelle sous
Linux, même sur les plus petites machines (386 et 486). Vous voilà rassurés, et peut-être aurez-vous
trouvé d’ici peu une utilité à l’un de ces dinosaures qui traînent encore dans votre garage...
314
Chapitre 9. Configuration du réseau
modifier l’adresse destination des paquets, si l’on veut faire une translation d’adresse destination. Cette
opération se fait typiquement dans la table nat.
Les paquets qui passent le point d’entrée PREROUTING sont ensuite orientés par le code de routage de
Linux. S’ils sont à destination de la machine locale, ils rencontrent un autre point d’entrée : le point
d’entrée INPUT. Les règles des chaînes INPUT des tables mangle et filter sont exécutées à ce
moment. C’est donc à ce niveau que l’on peut empêcher un paquet d’entrer dans le système, ce qui se fait
naturellement dans la table filter.
Les autres paquets doivent être transférés vers une autre machine, souvent par une autre interface réseau.
Ils atteignent donc le point d’entrée FORWARD. Ce point d’entrée permet de contrôler les paquets qui
transitent au travers d’une passerelle. Les paquets y traversent les chaînes FORWARD des tables mangle et
filter, cette dernière étant justement dédiée au filtrage des paquets qui transitent par la passerelle.
Les paquets qui sont acceptés par les chaînes FORWARD retournent ensuite dans le code de routage du
noyau, afin de déterminer l’interface réseau par laquelle ils doivent être réémis. Une fois cela réalisé, ils
sont prêts à être réémis, mais ils doivent auparavant traverser les chaînes des tables abonnées au point
d’entrée POSTROUTING. Il s’agit bien sûr des chaînes POSTROUTING des tables mangle et nat. C’est
dans cette dernière chaîne que se font les translations d’adresse source.
Enfin, les paquets émis par la machine locale à destination de l’extérieur doivent impérativement passer
par le point d’entrée OUTPUT, qui exécute les chaînes OUTPUT des tables mangle, nat et filter. C’est
donc à ce niveau que l’on pourra modifier les adresses destination des paquets de la machine locale avant
leur routage et effectuer le filtrage des paquets sortants, dans les chaînes OUTPUT des tables nat et
filter. Les paquets qui se révèlent avoir le droit de sortir traversent alors de code de routage, puis, tout
comme les paquets qui ont été transférés, passent par le point d’entrée POSTROUTING.
315
Chapitre 9. Configuration du réseau
• « Network packet filtering debugging », pour obtenir les messages de débogage du noyau.
Ces messages peuvent être très utiles pour mettre au point les règles de filtrage ;
• « Connection tracking (required for masq/NAT) » (menu « IP: Netfilter Configuration »),
pour permettre le suivi des connexions auxquelles appartiennent les paquets IP reçus par la passerelle.
Cette option est nécessaire pour réaliser un partage de connexion à Internet ;
• « FTP protocol support », pour permettre la gestion des connexions FTP, qui exigent un
traitement particulier pour les translations d’adresses ;
• « IP tables support (required for filtering/masq/NAT) », pour permettre la gestion
des tables de Netfilter ;
• « Packet filtering », pour inclure le support de la table « filter ». Cette option est nécessaire pour
réaliser un pare-feu ;
• « REJECT target support », pour permettre le rejet des paquets (par défaut, seul l’abandon des
paquets est fourni dans le code de filtrage) ;
• « Full NAT », pour inclure la table « nat » de Netfilter. Cette option est nécessaire pour réaliser un
partage de connexion à Internet ;
• « MASQUERADE target support », pour permettre le masquerading afin de réaliser un partage de
connexion à Internet.
Vous devrez ensuite compiler le noyau et les modules, et les installer comme indiqué dans la partie
traitant de la compilation du noyau.
Note : Le noyau de Linux dispose d’un paramètre global permettant de contrôler le routage des
paquets IP d’une interface réseau à une autre. Par défaut, ce paramètre est à 0, ce qui implique que
la transmission des paquets ne sera pas autorisée. Il faut donc activer ce paramètre à chaque
démarrage afin de pouvoir utiliser votre passerelle Linux. Cela peut être réalisé en écrivant la valeur
1 dans le fichier /proc/sys/net/ipv4/ip_forward du système de fichiers virtuel /proc/ :
La manipulation des chaînes et la manipulation des règles de Netfilter se fait grâce à l’outil iptables.
Cette commande doit normalement avoir été installée par votre distribution. Toutefois, si ce n’est pas le
cas, vous pouvez la compiler manuellement. Pour cela, il vous faudra récupérer l’archive des sources
d’iptables. Cette archive peut être trouvée sur Internet
([Link] La version courante est la 1.2.9, aussi l’archive se
nomme-t-elle [Link].bz2.
L’installation d’iptables ne pose pas de problème particulier en soi. Vous devrez d’abord décompresser
l’archive avec les deux commandes suivantes :
bunzip2 [Link].bz2
tar xf [Link]
316
Chapitre 9. Configuration du réseau
puis modifier le fichier Makefile pour définir les répertoires d’installation dans les variables LIBDIR,
BINDIR et MANDIR. En général, les répertoires utilisés seront respectivement les répertoires
/usr/lib/, /usr/bin/ et /usr/man/. Une fois cela fait, il ne restera plus qu’à compiler le tout avec
la commande make et à faire l’installation avec la commande make install.
Utilisation d’iptables
Il est possible, grâce à iptables, d’effectuer toutes les opérations d’administration désirées sur les chaînes
des tables de Netfilter. Vous pourrez donc créer des nouvelles chaînes, les détruire, définir les politiques
par défaut, ainsi que manipuler les règles de ces chaînes (en ajouter, en supprimer ou en remplacer une).
En fait, iptables dispose d’un grand nombre d’options, et seules les options les plus importantes seront
présentées ici. Vous pouvez lire la page de manuel iptables si vous désirez plus de renseignements sur
la manipulation des chaînes et des règles de filtrage du noyau.
où chaîne est le nom de la chaîne à créer. Il est interdit d’utiliser un des mots clés réservés par iptables.
En pratique, il est recommandé d’utiliser des noms de chaînes en minuscules, car les chaînes prédéfinies
sont en majuscules.
Une chaîne peut être détruite avec l’option -X :
Une chaîne ne peut être détruite que lorsqu’elle ne contient plus de règle. De plus, il est impossible de
détruire les chaînes prédéfinies d’une table.
Vous pouvez lister l’ensemble des règles d’une chaîne avec l’option -L :
Enfin, il est possible de supprimer toutes les règles d’une chaîne avec l’option -F :
317
Chapitre 9. Configuration du réseau
iptables [-t table] -A chaîne [-s source] [-d destination] [-p protocole]
[-i itfsource] [-o itfdest] [-j cible]
où :
• table est la table dans laquelle se trouve la chaîne manipulée (par défaut, il s’agit de la table
filter) ;
318
Chapitre 9. Configuration du réseau
• REDIRECT, pour rediriger le paquet sur une autre machine, souvent la machine locale. Cette cible n’est
utilisable qu’avec la table nat, car il s’agit d’une translation d’adresse. On ne peut l’utiliser que dans
les chaînes PREROUTING et OUTPUT et les chaînes utilisateur appelées à partir de ces chaînes ;
• SNAT, pour permettre la modification de l’adresse source du paquet. Cette cible n’est bien entendu
accessible qu’au niveau de la table nat. Comme la modification de l’adresse source n’a de
signification que pour les paquets devant sortir de la passerelle, cette cible ne peut être utilisée que
dans la chaîne POSTROUTING et les chaînes utilisateur appelées à partir de cette chaîne ;
• DNAT, pour effectuer la modification de l’adresse destination du paquet, afin par exemple de le
détourner vers une autre machine que celle vers laquelle il devait aller. Cette cible n’est accessible que
dans la table nat, et n’est utilisable que dans les chaînes PREROUTING et OUTPUT ainsi que dans les
chaînes utilisateur appelées à partir de ces chaînes ;
• MASQUERADE, pour effectuer une translation d’adresse sur ce paquet, dans le but de réaliser un partage
de connexion à Internet. Cette cible n’est accessible que dans la chaîne POSTROUTING de la table nat,
ainsi que dans les chaînes utilisateur appelées à partir de cette chaîne.
Toute autre spécification de destination doit être le nom d’une chaîne utilisateur, avec les règles de
laquelle le paquet devra être testé. Si aucune cible n’est spécifiée, aucune action n’est prise et la règle
suivante est traitée. Cependant, les statistiques de la règle sont toujours mises à jour.
La suppression d’une règle d’une chaîne se fait avec la commande suivante :
où chaîne est la chaîne dont on veut supprimer la règle, et numéro est le numéro de la règle à
supprimer dans cette chaîne. Il est également possible d’utiliser l’option -D avec les mêmes options que
celles qui ont été utilisées lors de l’ajout de la règle, si l’on trouve cela plus pratique.
Enfin, la politique d’une chaîne, c’est-à-dire la cible par défaut, peut être fixée avec l’option -P :
où chaîne est l’une des chaînes prédéfinie, et cible est l’une des cibles ACCEPT ou DROP. Remarquez
que l’on ne peut pas définir de politique pour les chaînes créées par l’utilisateur, puisque les paquets sont
vérifiés avec les règles restantes de la chaîne appelante lorsqu’ils sortent de la chaîne appelée.
Exemple de règles
Ce paragraphe a pour but de présenter quelques-unes des règles les plus classiques. Le but est ici de
présenter les principales fonctionnalités d’iptables et de réaliser un pare-feu simpliste.
319
Chapitre 9. Configuration du réseau
défaut des chaînes pour utiliser la cible DROP. Cela peut être réalisé simplement avec les trois
commandes suivantes :
Ces règles commencent par définir les politiques de base pour toutes les tables en blindant la machine
pour qu’elle ne laisse rien entrer, ne rien passer et ne rien sortir. Toutes les règles des tables sont ensuite
détruites. Dans ce cas, on ne craint plus rien, mais on ne peut plus rien faire non plus (pas même en
local). Aussi faut-il redonner les droits nécessaires pour permettre l’utilisation normale de votre système.
Le minimum est d’autoriser la machine à communiquer avec elle-même, ce qui implique d’autoriser les
paquets provenant de l’interface loopback à entrer et à sortir :
# Communications locales :
iptables -A INPUT -d [Link]/8 -i lo -j ACCEPT
iptables -A OUTPUT -s [Link]/8 -o lo -j ACCEPT
Si l’on dispose d’un réseau local, il peut également être utile d’autoriser toutes les connexions avec les
machines de ce réseau :
Comme vous pouvez le constater, ces règles ne permettent l’entrée des paquets prétendant provenir du
réseau local (c’est-à-dire les paquets ayant comme adresse source une adresse de la forme
[Link]/24) que par l’interface réseau connectée au réseau local (dans notre exemple, il s’agit de
l’interface réseau eth0). De même, seule la machine locale (à laquelle l’adresse [Link] est
supposée être affectée) peut émettre des paquets sur le réseau local.
Notez que ces règles sont beaucoup trop restrictives pour permettre un accès à Internet (et, a fortiori une
intrusion provenant d’Internet...). Il est donc nécessaire d’autoriser les connexions vers les principaux
services Internet. Pour cela, il faut ajouter les lignes suivantes :
320
Chapitre 9. Configuration du réseau
Il est supposé ici que la connexion Internet se fait via le démon pppd, et que l’interface réseau que
celui-ci a créé se nomme ppp0.
Vous pouvez constater que les règles présentées jusqu’ici se basaient uniquement sur les adresses source
et destination des paquets, ainsi que sur les interfaces réseau par lesquelles ils entraient et ressortaient.
Vous voyez à présent que l’on peut réaliser des règles beaucoup plus fines, qui se basent également sur
les protocoles réseau utilisés (que l’on peut sélectionner avec l’option -p) et, pour chaque protocole, sur
des critères spécifiques à ces protocoles (comme les ports source et destination, que l’on peut
sélectionner respectivement avec les options --sport et --dport). Vous pouvez consulter la page de
manuel d’iptables pour plus de détails à ce sujet.
Certains protocoles requièrent plusieurs connexions TCP/IP pour fonctionner correctement. La
connexion est amorcée avec une première connexion, puis une deuxième connexion est établie après
négociation. C’est en particulier le cas pour le protocole FTP, qui utilise une connexion de contrôle et
une connexion pour le transfert des données. De plus, le protocole FTP peut fonctionner dans deux
modes distinct (respectivement le mode dit « actif » et le mode dit « passif »), selon que c’est le serveur
contacté qui établit la connexion de données ou que c’est le client qui l’établit vers le serveur. Ces
connexions additionnelles ne doivent bien entendu pas être filtrées, pour autant, on ne sait pas avec
précision le port qui sera choisi pour elles, car ce port fait partie de la négociation lors de l’établissement
de la connexion. Heureusement, Netfilter dispose d’un mécanisme de suivi de connexions capable
d’analyser les données protocolaires (si le protocole n’est pas chiffré, bien entendu). La solution est donc
de lui indiquer qu’il doit laisser les paquets relatifs aux connexions établies au niveau protocolaire. La
règle à utiliser est la suivante :
Vous découvrez ici l’option --match, qui permet de sélectionner des paquets selon certains critères. Le
critère choisi ici est bien entendu l’état des connexions. Des options complémentaires peuvent être
fournis à ce critère à l’aide de l’option --state. Dans le cas présent, nous acceptons tous les paquets
sortants qui appartiennent à une connexion établie (paramètre « :ESTABLISHED ») ou qui a été amorcée à
partir d’une autre connexion déjà établie (paramètre « RELATED »).
Les règles précédentes permettent à la machine locale de se connecter à Internet, mais la connexion ne
s’établira malgré tout pas, car aucun paquet réponse n’a le droit d’entrer. Il est donc nécessaire
d’autoriser l’entrée des paquets réponse provenant des serveurs auxquels on se connecte. Toutefois, il ne
faut pas tout autoriser. Seuls les paquets relatifs aux connexions dont la machine locale est initiatrice
doivent être autorisés. Cela est réalisable encore une fois grâce au mécanisme de suivi de connexions de
Netfilter. Pour notre exemple, la simple règle suivante suffit :
321
Chapitre 9. Configuration du réseau
Elle dit que les paquets entrants des connexions établies et des connexions relatives aux autres
connexions sont autorisés. Tous les autres paquets seront refusés.
Si vous désirez laisser un service ouvert vers Internet, vous devrez ajouter des règles complémentaires
qui autorisent les paquets entrant et sortant à destination du port de ce service. Par exemple, si vous
voulez laisser un accès SSH ouvert, vous devrez ajouter les deux règles suivantes :
Enfin, il peut être utile d’accepter certains paquets du protocole ICMP, qui permet de contrôler l’état des
liaisons. En particulier, il faut pouvoir recevoir les paquets indiquant qu’une machine n’est pas
accessible, faute de quoi certaines connexions impossibles risqueraient d’être très longues à détecter. De
plus, il peut être intéressant de pouvoir envoyer des demandes de réponse aux machines pour vérifier leur
présence. Les règles suivantes pourront donc être ajoutées :
Notez qu’il n’est théoriquement pas nécessaire de répondre aux paquets echo-request. Je vous ai
toutefois laissé les deux règles pour le cas où le fournisseur d’accès utiliserait ces requêtes pour
déterminer si la liaison reste correcte.
Cette règle permet de réaliser la translation des adresses des machines du réseau local et à destination
d’Internet. Remarquez que les paquets provenant de la machine locale ne subissent pas le masquerading,
car c’est complètement inutile.
322
Chapitre 9. Configuration du réseau
Il faut ensuite autoriser les paquets provenant des machines du réseau local à traverser la passerelle. Cela
se fait avec des règles similaires à celles vues dans la section précédente, mais adaptées pour être
utilisées dans la chaîne FORWARD de la table filter :
# Autorise le trafic en retour pour les connexions établies par les clients :
iptables -A FORWARD -i ppp0 -d [Link]/24 --match state \
--state ESTABLISHED,RELATED -j ACCEPT
Enfin, le routage des paquets étant, par défaut, désactivé sous Linux, il faut le réactiver. Si votre
distribution ne le fait pas, vous aurez donc également à ajouter une ligne telle que celle-ci :
# Activation du routage :
echo "1" > /proc/sys/net/ipv4/ip_forward
323
Chapitre 9. Configuration du réseau
déterminée, bien entendu. Il est recommandé d’activer cette fonctionnalité, ce qui se fait à l’aide de la
commande suivante :
Cette règle un peu compliquée permet de modifier le champ MSS (« Maximum Segment Size ») des
paquets d’établissement des connexions TCP (paquets disposant des flags TCP SYN ou RST) qui
traversent la passerelle, et de forcer ce champ à la valeur de la taille maximum des paquets sur le chemin
(« Path Maximum Transmission Unit » dans l’option --clamp-mss-to-pmtu).
Note : Les chaînes et leurs règles ne sont pas enregistrées de manière permanente dans le
système. Elles sont perdues à chaque redémarrage de la machine, aussi faut-il les redéfinir
systématiquement. Cela peut être réalisé dans les scripts de démarrage de votre système. Vous
pouvez également utiliser les commandes iptables-save et iptables-restore pour sauvegarder
toutes les chaînes et leurs règles dans un fichier et les restaurer au démarrage.
N’oubliez pas que votre passerelle doit définir une route par défaut pour que tous les paquets qui ne
sont pas destinés au réseau local soient envoyés par l’interface réseau connectée à Internet. Cette
route par défaut est établie automatiquement lorsque vous vous connectez à Internet à l’aide de
PPP. Dans les autres cas, vous aurez à la définir manuellement.
où passerelle est l’adresse de votre passerelle vers Internet sur le réseau local. Cette commande
suppose que l’adaptateur réseau utilisé est eth0
La deuxième étape est ensuite de donner accès aux postes clients au DNS de votre fournisseur d’accès.
Cela permettra en effet d’utiliser les noms de machines autres que ceux de votre réseau local. Encore une
fois, la manière de procéder dépend du système utilisé. Sous Linux, il suffit d’ajouter les adresses IP des
serveurs de noms de domaine de votre fournisseur d’accès dans le fichier de configuration
/etc/[Link].
Si les clients ont des difficultés à accéder à certaines pages Web, c’est que le MTU (« Maximum
Transmission Unit », taille maximum des paquets réseau) est trop élevé. Ceci se corrige généralement tel
qu’on l’a indiqué dans la définition des règles de la passerelle. Toutefois, si les ordinateurs qui
bénéficient du partage de connexion à Internet continuent d’avoir des problèmes, c’est que le MTU de la
route permettant d’accéder aux sites Web posant problème n’a pas pu être déterminé correctement. Dans
ce cas, il faut le trouver soi-même, et le fixer dans la configuration réseau des clients. Pour cela, le plus
324
Chapitre 9. Configuration du réseau
simple est d’utiliser la commande ping avec son option -s sur les clients, avec plusieurs tailles de
paquets possible. La taille maximum est de 1500 octets sur Ethernet. En général, une taille de 1400
octets convient :
Une fois le MTU correctement déterminé, il suffit de fixer cette valeur lors de la configuration des
interfaces réseau des clients :
interface représente ici l’interface à configurer, et taille la taille maximum trouvée à l’aide de ping.
Note : La taille effective du MTU est en réalité la taille fournie à la commande ping plus vingt-huit
octets, car les paquets utilisés contiennent toujours l’en-tête ICMP en plus des données générées
par ping.
325
Chapitre 9. Configuration du réseau
De plus, il va de soi que lorsqu’il y a un loup dans la bergerie, tout peut aller très mal très vite. La
sécurité doit donc être mise en place en profondeur, c’est-à-dire que l’on ne doit pas négliger la
sécurisation d’un réseau local sous prétexte qu’il est protégé par des dispositifs en amont. En effet, ces
dispositifs peuvent très bien être défaillants, et dans ce cas, l’intrus se retrouve directement en terrain
conquis. C’est pour cela qu’il faut prévoir plusieurs remparts pour se protéger.
En outre, rien n’est jamais figé dans le domaine de la sécurité. De nouvelles attaques sont développées
régulièrement, et de nouvelles failles sont découvertes dans les logiciels quasiment quotidiennement. Il
est donc nécessaire de réaliser un tant soi peu de veille et de mettre à jour les systèmes régulièrement.
Enfin, la sécurité ne peut se concevoir que dans un contexte global, en prenant compte l’environnement
dans lequel on se trouve. Il est tout à fait inutile d’utiliser des systèmes d’authentification par analyse de
code génétique pour protéger des documents ultra sensibles, si ces documents peuvent être sortis
simplement par les poubelles.
En résumé, les principes fondamentaux de la sécurité sont les suivants :
De tous ces points, nous ne traiterons ici que ceux qui concernent un système de particulier. La mise à
jour des logiciels et des antivirus reste bien entendu extrêmement importante (surtout si des machines
Windows sont placées sur le réseau), mais n’appelle pas beaucoup de commentaires. La description de la
réalisation d’un pare-feu a également déjà été faite dans la section précédente. Nous ne présenterons
donc que la manière de limiter les services lancés et l’accès à ces services. Cela n’est toutefois pas
suffisant pour dormir tranquille car, et c’est sans doute là l’un des plus gros problèmes, la plupart des
protocoles réseau ne chiffrent pas leur données et laissent passer toutes les informations en clair sur le
réseau, y compris les mots de passe ! Nous verrons donc également les principales techniques de
cryptographies existantes afin de rendre les communications plus sûres.
326
Chapitre 9. Configuration du réseau
où démons est une liste de noms de démons, séparés par des virgules, et machines est une liste de noms
de machines ou d’adresses IP, également séparés par des virgules. commande est un paramètre optionnel
permettant de faire exécuter une action à tcpd lorsque la règle indiquée par cette ligne est prise en
compte.
Une règle définie par une de ces lignes est utilisée dès qu’une des machines indiquées dans la liste des
machines tente une connexion à l’un des services de la liste des services. Si la règle se trouve dans le
fichier /etc/[Link], la connexion est autorisée et le service est lancé par tcpd. Si elle se trouve
dans le fichier /etc/[Link], la connexion est systématiquement refusée. Si aucune règle n’est
utilisée, la connexion est acceptée par défaut.
Les listes de machines peuvent contenir des noms de machines partiels, et utiliser des caractères
génériques. Il est également possible d’interdire la connexion à toutes les machines d’un domaine en ne
donnant que le nom de domaine (précédé d’un point). Enfin, des mots clés spéciaux permettent de
représenter des ensembles de machines. Par exemple, le mot clé ALL représente toutes les machines et
327
Chapitre 9. Configuration du réseau
LOCAL représente toutes les machines du réseau local. Le mot clé ALL permet également de représenter
l’ensemble des démons dans la liste des démons.
Par exemple, le fichier /etc/[Link] devrait contenir la ligne suivante :
Cela permet de garantir que, par défaut, aucune demande de connexion n’est acceptée, ce qui est un
comportement sain. Les machines ayant le droit de se connecter doivent être spécifiées au cas par cas
dans le fichier /etc/[Link], comme dans l’exemple suivant :
Cela permet d’autoriser les connexions telnet et ftp pour toutes les machines du réseau local uniquement.
Vous trouverez de plus amples renseignements sur le fonctionnement de tcpd dans la page de manuel
hosts_access(5).
Note : Comme vous pouvez le constater si vous comparez les lignes du fichier de configuration
/etc/[Link] utilisant tcpd et celles qui ne l’utilisent pas, la liste des paramètres passés à tcpd
par inetd est différente de celle utilisée pour les démons lancés directement. En effet, elle ne
comprend pas le nom de tcpd lui-même, alors que pour les démons, elle contient le nom du démon
en premier paramètre. Cette différence provient du fait que le premier argument passé en ligne de
commande est le nom du programme lui-même, sauf pour tcpd. En effet, tcpd suppose que ce
paramètre contient le nom du démon dont il contrôle l’accès, et non son propre nom.
La sécurité basée sur tcpd suppose que les adresses IP source des paquets reçus sont
effectivement les adresses IP des machines qui les ont envoyées. Malheureusement, cette
hypothèse ne peut pas être vérifiée pour les adresses autres que les adresses des réseaux
considérés comme sûrs (par exemple le réseau local), car le protocole IP n’inclut aucun mécanisme
d’authentification. Par conséquent, n’importe qui peut tenter de communiquer avec votre machine au
nom d’une autre machine (technique nommée « IP spoofing » en anglais), qu’il aura au préalable
mis hors d’état de se manifester (par exemple par une attaque de type DoS, « Denial of Service » en
anglais). tcpd tente par défaut de contrôler ce genre de pratique en vérifiant que le nom indiqué par
la machine qui se connecte correspond bien à l’adresse IP qu’elle utilise. Ainsi, pour passer cette
protection, il faut d’abord infecter un DNS. Cependant, ce genre d’attaque (dite d’interposition) reste
courant, surtout sur les réseaux dont les DNS sont insuffisamment protégés (une étude récente a
montré que c’était le cas de trois DNS sur quatre en France). Par conséquent, vous ne devez pas
vous reposer uniquement sur tcpd et les techniques de pare-feu si vous devez créer un site
réellement sûr. En particulier, vous devriez vous intéresser aux réseaux virtuels et au chiffrement
des données, choses que l’on décrira dans la la section intitulée Utilisation de SSH. Le protocole
Ipv6 intégrera des mécanismes d’authentification et sera donc nettement plus sûr. Bien entendu,
cela dépasse le cadre de ce document.
Le démon tcpd peut également être utilisé avec le démon xinetd. Toutefois, une telle utilisation est
superflue, étant donné que xinetd permet de définir ses propres règles de contrôle d’accès.
328
Chapitre 9. Configuration du réseau
only_from =
dans la section de définition des options par défaut de xinetd. Avec cette ligne, contrairement à ce qui se
passe si rien n’est spécifié, les accès ne sont autorisés qu’à partir d’aucune machine. Autrement dit, ils
sont toujours interdits.
Il faut ensuite redonner les droits sur les machines autorisées service par service. Ainsi, les connexions
par telnet peuvent être autorisées sur le réseau local (supposé sûr) grâce à la ligne suivante :
329
Chapitre 9. Configuration du réseau
Le format de ce fichier est très simple, puisqu’il est constitué de la liste des terminaux à partir desquels
l’utilisateur root peut se connecter, à raison d’un terminal par ligne. Un fichier de configuration
/etc/securetty typique contient donc la liste des terminaux virtuels de la machine :
Il est fortement déconseillé de placer dans ce fichier les autres terminaux (en particulier, les terminaux
série ttyS0 et suivants).
Un autre service sensible est le service de téléchargement de fichiers. Il est recommandé d’interdire aux
utilisateurs privilégiés les transferts de fichiers par FTP. En effet, si une personne parvient à accéder au
système de fichiers, il peut supprimer tous les mécanismes de sécurité. De la même manière que l’on a
interdit à l’utilisateur root de se connecter sur les terminaux distants, il faut lui interdire (ainsi qu’aux
autres comptes sensibles) les connexions par FTP.
Cette opération peut être réalisée en ajoutant le nom de chaque utilisateur sensible dans le fichier de
configuration /etc/ftpusers. Ce fichier a la même structure que le fichier securetty, puisqu’il faut
donner un nom d’utilisateur par ligne :
Bien entendu, la liste des utilisateurs privilégiés de votre système dépend de la distribution que vous avez
installé. Le fichier /etc/ftpusers fourni avec cette distribution est donc, en général, approprié.
Note : La condidentialité des données est le fait que seules les personnes autorisées peuvent y
accéder. L’intégrité des données est le fait que les données n’ont pas été altérées ou modifiées de
manière non autorisée. Enfin, l’authenticité des données est le fait que les données sont certifiées
comme provenant bien de celui qui prétend en être l’émetteur.
330
Chapitre 9. Configuration du réseau
Généralement, le moyen le plus sûr pour garantir la confidentialité des données est de les chiffrer de telle
sorte que seuls les destinataires autorisés puissent les déchiffrer et donc y accéder. C’est pour cette raison
que la cryptographie, ou science du chiffrement, est souvent utilisée pour résoudre les problèmes de
sécurité informatique. Mais la cryptographie fournit également les techniques nécessaires pour assurer
l’intégrité des données, généralement en calculant une empreinte ou condensé cryptographique des
données. En effet, les algorithmes de calcul des empreintes sont conçus pour fournir des résultats très
différents même si les données ne sont modifiées que très légèrement. Ainsi, si une personne mal
intentionnée modifie un tant soit peu les données, le recalcul de l’empreinte associée indiquera tout de
suite la supercherie. Enfin, l’authenticité des données peut être assurée en faisant en sorte que leur
émetteur puisse prouver son identité. Cela se fait généralement en exigeant qu’il puisse répondre à une
question dont on sait que lui seul connaît la réponse. Toute la difficulté est alors de trouver un système
d’authentification où celui qui pose la question ne doit lui-même pas en connaître la réponse (faute de
quoi celui qui pose la question pourrait se faire passer pour celui qui doit répondre !).
Note : Il est évident que pour garantir la confidentialité et l’authenticité des données, il faut garantir
l’authenticité des interlocuteurs. En effet, sans cela, une tierce personne pourrait s’intercaler entre
deux interlocuteurs et faire croire à chacun qu’il est l’autre. Même dans un canal de communication
chiffré, cette personne serait en mesure de déchiffrer les messages dans les deux sens, voire même
de les modifier et d’en recalculer les empreintes. Cette technique d’interposition s’appelle l’attaque
du « man in the middle » (« l’homme du milieu » en Français)
Il est donc nécessaire, du fait des faiblesses des protocoles réseau standards, de recourir à des solutions
cryptographiques pour fournir les services de confidentialité, d’authenticité et d’intégrité des données.
Parmi ces solutions, les plus utilisées sont sans doute le protocole SSH (abréviation de l’anglais « Secure
SHell ») et l’extension IPSec au protocole IP. Cette extension a initialement été développée pour le
successeur du protocole IP, à savoir le protocole IPv6, mais a également été adaptée pour fonctionner
avec l’implémentation actuelle d’IP.
331
Chapitre 9. Configuration du réseau
chiffrement réversible (ou une une paire d’algorithmes ayant un effet inverse l’un de l’autre) pour
chiffrer une information. Dans ce cas, la sécurité des données est assujettie au maintien au secret de
l’algorithme utilisé. Il est évident que ce type de technique n’est pas utilisable avec les logiciels dont les
sources sont diffusées (comme Linux), puisque l’algorithme est alors connu de tout le monde. C’est
également la technique la moins sûre, parce qu’il est en général très facile de déterminer cet algorithme.
Un exemple d’un tel algorithme est le codage classique qui consiste à décaler toutes les lettres de
l’alphabet (A devient B, B devient C, etc.).
Une autre technique se base sur un algorithme connu de tout le monde, mais dont l’effet est paramétré
par une clef tenue secrète. Le déchiffrement des informations ne peut se faire que si l’on connaît cette
clef. Les algorithmes de ce type sont souvent qualifiés de « symétriques », en raison du fait que la clef
utilisée pour le déchiffrement est la même que celle utilisée pour le chiffrement. Cette technique n’est
satisfaisante que dans la mesure où les personnes qui communiquent peuvent s’échanger cette clef de
manière sûre. La clef utilisée ne devant être connue que des personnes autorisées à participer à la
communication, cet échange doit se faire soit de visu, soit dans un canal déjà chiffré (mais dans ce cas, il
faut échanger la clef de déchiffrement du canal, et on se retrouve devant le problème de l’œuf et de la
poule), soit à l’aide d’un protocole d’échange de clef sûr. Les algorithmes de ce type sont également
connus sous le nom d’algorithmes à clef secrète en raison de cette particularité. Il existe un grand
nombre d’algorithmes à clef secrète, les plus connus étant DES, AES et IDEA.
La technique la plus sûre actuellement, et aussi la plus rusée, est d’utiliser un algorithme de chiffrement
asymétrique. À la différence des algorithmes symétriques, les algorithmes asymétriques utilisent deux
clefs différentes et duales pour le chiffrement et le déchiffrement. Ces algorithmes se basent sur des
fonctions mathématiques dont la fonction inverse est extrêmement difficile à déterminer sans une
information également difficile à calculer. Cette information fait office de clef permettant de retrouver
l’information en clair. Toute la ruse ici est que la clef servant au déchiffrement peut ne plus être échangée
du tout, ce qui supprime la nécessité de réaliser un échange de clefs généralement risqué. En fait, seule la
332
Chapitre 9. Configuration du réseau
clef de chiffrement doit (et peut sans crainte) être publiée. C’est en raison de cette propriété que les
algorithmes asymétriques sont également appelés algorithmes à clef publique.
Le principe des algorithmes asymétriques est le suivant. Une clef publique, utilisée pour chiffrer les
informations, est fournie à tout le monde, et seul celui qui dispose de la clef privée associée à cette clef
publique peut déchiffrer le texte. Toute personne qui désire communiquer avec le propriétaire de la clef
publique utilise celle-ci pour chiffrer les informations qu’il doit lui transférer. Ainsi, du fait que seul le
destinataire dispose de la clef de déchiffrement (sa clef privée), il est le seul à pouvoir récupérer ces
informations. Il est donc possible d’échanger des informations de manière sûre avec tous les intervenants
en utilisant simplement leurs clefs publiques respectives. Aucun échange d’information sensible n’est
effectué en clair. Les algorithmes à clef publique les plus connus sont RSA et DSA.
La gestion des clefs des algorithmes à clef publique est techniquement laborieuse, de même que les
calculs mis en œuvre par les algorithmes utilisés. Il est donc courant d’amorcer une communication avec
un algorithme à clef publique, comme RSA par exemple, puis de l’utiliser pour échanger une clef secrète
permettant de poursuivre la communication avec un algorithme symétrique. Il existe également des
algorithmes spécialisés dans les échanges de clefs dans un canal non sûr, comme par exemple
l’algorithme Diffie Hellman.
Enfin, il existe des algorithmes de chiffrement à sens unique qui ne permettent pas de retrouver
l’information initiale, mais qui sont utilisés pour calculer une empreinte des informations à transférer.
Cela permet d’identifier l’information de manière unique. Ces algorithmes sont donc souvent utilisés
pour garantir l’intégrité des données diffusées dans un environnement peu sûr. Pour cela, celui qui réalise
la diffusion chiffre un condensé des informations diffusées avec sa clef privée. Tout le monde peut donc
déchiffrer ce condensé avec la clef publique de cette personne, et vérifier que le message qu’ils reçoivent
a bien la même empreinte. Chacun a donc la certitude que le message provient bien de son auteur, car
toute modification du message changerait son empreinte d’une part, et il est impossible de chiffrer cette
nouvelle empreinte sans connaître la clef privée de l’expéditeur. Les algorithmes de calcul d’empreinte
333
Chapitre 9. Configuration du réseau
Note : Notez que les algorithmes de chiffrement à clef publique nécessitent toujours que l’on soit sûr
que l’on utilise la bonne clef publique pour s’adresser à une personne. Or, rien ne nous garantit que
la clef publique d’une personne diffusée sur le réseau provienne bien de cette personne ! Il est donc
toujours nécessaire d’échanger les clefs publiques de main à main, avec vérification de l’identité de
la personne avec qui l’échange se fait. Il est également possible de recourir à une tierce personne
digne de confiance et dont on connaît déjà la clef publique pour garantir que la clef que l’on reçoit
est bien celle de la personne qui prétend en être le propriétaire. On peut ainsi construire ce qu’on
appelle un « réseau de confiance », dans lequel chacun sait que quelqu’un en qui il a confiance,
directement ou indirectement, a authentifié ses interlocuteurs.
Bien entendu, tout cela est contraignant. Mais, contrairement aux algorithmes de chiffrement à clef
secrète, il n’est pas grave de perdre les clefs échangées avec les algorithmes asymétriques, puique
ces clefs sont destinées à être publiques...
Utilisation de SSH
SSH est en réalité un protocole de communication réseau chiffré couplé d’une suite d’outils permettant
de l’utiliser. SSH a été initialement développé par une société commerciale, qui diffusait les outils en
Open Source et gratuitement pour les particuliers. Ces outils n’étaient toutefois absolument pas libres.
Une implémentation libre a donc été développée pour le système FreeBSD, puis portée pour les autres
systèmes d’exploitation, dont Linux. Cette implémentation est celle qui est utilisée par la plupart des
distributions actuellement, il s’agit de « OpenSSH ». Nous ne décrirons ici que l’utilisation d’OpenSSH.
Pour garantir la confidentialité des données, SSH utilise des techniques de cryptographie avancées. Ces
techniques permettent de s’assurer que personne ne peut lire les informations qui circulent sur le réseau
d’une part, et de garantir l’authentification des machines auxquelles on se connecte d’autre part. De plus,
SSH permet de rediriger les protocoles réseau non chiffrés dans son propre canal de communication, et
résout donc la plupart des problèmes de sécurité. SSH a donc pour but premier de remplacer les
applications non sûres permettant de se connecter à distance sur une machine ou d’y exécuter des
commandes. Les applications ainsi rendues obsolètes sont, entre autres, telnet, rlogin et rsh. Enfin, SSH
est également utilisable pour chiffrer automatiquement les connexions X11, ce qui permet d’utiliser
l’environnement graphique X Window à distance en toute sécurité.
Note : Officiellement, il est interdit d’utiliser en France des techniques de chiffrement aussi poussées
que celles mises en œuvre par SSH, sauf à demander une dérogation. Il y a de fortes pressions
pour permettre la légalisation de ces techniques, mais elles n’ont pas encore abouti. Plus
précisément, le gouvernement a pris position pour une libéralisation de l’usage de la cryptographie,
mais la loi n’a pas encore été votée. Les sinistres événements du 11 novembre 2001 risquent fort de
retarder encore, si ce n’est de compromettre, cette libéralisation. En effet, l’argument principal des
opposants à cette légalisation est qu’elle permettrait aux truands de chiffrer leurs communications.
L’argument est bien entendu fallacieux : comme s’ils attendaient d’en avoir le droit pour le faire...
En fait, il existe une implémentation gratuite (mais non libre) de SSH qui a été déclarée et qui peut
donc être utilisée en France. Il s’agit de la version de Bernard Perrot, nommée « SSF », que l’on
pourra trouver à l’adresse [Link] Si vous désirez
absolument être sans reproche vis à vis de la loi actuellement en vigueur en France, vous devriez
remplacer la version d’OpenSSH fournie avec votre distribution (dont l’usage est donc illégal) par
SSF. Sachez cependant que SSF restreint la taille des clefs de sessions à 128 bits seulement d’une
334
Chapitre 9. Configuration du réseau
part (condition sine qua non pour qu’on puisse l’utiliser), qu’il n’est pas utilisable commercialement,
et qu’il est susceptible de ne pas être à jour en ce qui concerne les correctifs de bogues et les failles
de sécurité que l’on a pu trouver récemment dans SSH ou OpenSSH. La sécurité apportée par SSF
est donc très relative, mais c’est mieux que rien du tout.
Il existe deux versions du protocole réseau SSH, qui ont tous deux été adoptés en tant que standards. La
première version souffrait d’un trou de sécurité majeur, qui depuis a largement pu être utilisé. Il ne faut
donc surtout pas utiliser cette version et se rabattre systématiquement sur le protocole SSHv2. Ce
protocole permet de garantir l’authentification des machines et des utilisateurs et est nettement plus
fiable. Aucune attaque n’a permis de le casser à ce jour, sachez toutefois qu’il existe encore des points
douteux dans ce protocole qui permettraient, en théorie, de parvenir à s’immiscer dans une
communication ou d’en décrypter une partie.
Sachez également que les différentes implémentations de SSH, aussi bien libres que commerciales, sont
soumises au même régime que les autres programmes : elles peuvent avoir des bogues et des trous de
sécurité qu’un attaquant peut utiliser. De nombreuses attaques ont été découvertes ces derniers temps,
aussi est-il recommandé de s’assurer que l’on dispose de la dernière version d’OpenSSH. La dernière
version stable est la 3.7.1p1 (les versions antérieures doivent être évitées à tout prix). Cela dit, mener une
attaque contre SSH relève le niveau de difficulté nettement au dessus de ce qui est nécessaire pour
pénétrer un système qui ne l’utilise pas.
335
Chapitre 9. Configuration du réseau
cela, les deux plus courantes étant l’authentification par mot de passe et l’authentification par un
algorithme à clef publique.
L’authentification par mot de passe est strictement la même que celle utilisée pour le login Unix
classique, à la différence près que les informations du mot de passe sont transmises dans le canal chiffré,
vers un serveur authentifié. La sécurité de ce mot de passe est donc garantie, et l’attaque de l’homme du
milieu de fonctionne plus. Ce type d’authentification permet donc d’utiliser SSH exactement comme les
commandes classiques rsh ou telnet. L’utilisation de SSH est donc complètement transparente pour les
utilisateurs.
Cela dit, il est possible de faciliter encore plus l’authentification des clients tout en augmentant le niveau
de sécurité, en utilisant également l’authentification par clef publique pour les utilisateurs. Dans ce mode
d’authentification, chaque utilisateur dispose également d’un couple de clefs privée et publique. Les clefs
publiques de ces utilisateurs sont diffusées dans les comptes des utilisateurs au niveau du serveur. Ainsi,
il n’est plus nécessaire de fournir un mot de passe, car le serveur peut authentifier l’utilisateur du seul fait
qu’il est le seul à connaître sa clef privée. La connexion est donc automatique (une fois le serveur
correctement configuré, bien entendu) et aucun échange d’information sensible comme le mot de passe
n’est réalisé (même si le fait que cet échange était réalisé dans un canal chiffré par SSH était déjà une
bonne garantie).
Les clefs privées et publiques sont bien entendu stockées sur disque, dans les fichiers de configuration
des serveurs et des clients. Il va de soi que si les clefs publiques peuvent être lues, il est impératif que les
clefs privées ne soient lisibles que par leurs propriétaires. Les droits d’accès sur les fichiers de
configuration doivent donc être fixées de manière correcte pour garantir la sécurité du système. En fait, le
point faible du mécanisme d’authentification des clients est toujours au niveau des utilisateurs, qui
peuvent perdre leur clef privée ou la communiquer à d’autres sans même savoir qu’ils font une erreur
fondamentale (de la même manière qu’ils peuvent choisir un mot de passe trop facile à trouver ou
simplement le communiquer à une tierce personne). C’est pour cela qu’il est possible de chiffrer les clefs
privées avec un algorithme de chiffrement symétrique. L’utilisateur doit, dans ce cas, fournir une phrase
clef à chaque fois qu’il désire réaliser une connexion SSH.
Cette commande permet de configurer OpenSSH pour qu’il remplace la version existante dans votre
système. Elle indique également que le support du démon tcpd doit être activé, ainsi que celui des
modules d’authentification PAM (options « --with-tcp-wrapppers » et « --with-pam »). Bien
entendu, si votre distribution n’utilise pas ces fonctionnalités, vous devez supprimer ces options.
336
Chapitre 9. Configuration du réseau
La compilation et l’installation en soi ne posent pas de problème particulier. Pour les réaliser, il vous
suffira d’exécuter les deux commandes suivantes :
make
make install
Vous constaterez que le programme d’installation génère automatiquement des fichiers de clefs
publiques et privées pour votre machine. Nous verrons dans les sections suivantes comment ces clefs
peuvent être utilisées.
Note : Vous devrez créer un compte utilisateur « sshd » non privilégié avant d’installer SSH. Ce
compte est en effet utilisé par le démon sshd pour réaliser les communications réseau une fois la
phase d’authentification réalisée. Cela permet de garantir que, même en cas d’exploitation d’une
éventuelle faille de sécurité du démon sshd, l’accès à la machine sera extrêmement limité.
où type est le type de clef à générer pour le protocole de version 2. Les types disponibles sont rsa et
dsa. Pour le protocole de version 1, il ne faut pas utiliser l’option -t, les clefs générées étant forcément
des clefs RSA.
Lorsque l’on invoque la commande ssh-keygen, celui-ci demande le chemin du fichier dans lequel la clef
privée doit être écrite. Le fichier contenant la clef publique aura le même nom, mais portera l’extension
.pub. Vous devez donc saisir le chemin du fichier correspondant au type de clef généré. ssh-keygen
demande ensuite le mot de passe à utiliser pour le chiffrement de la clef privée. Dans le cas d’un serveur,
337
Chapitre 9. Configuration du réseau
il ne faut pas utiliser de mot de passe, car dans ce cas le démon sshd ne pourrait pas accéder à la clef
privée de la machine. Il faut donc, dans ce cas, valider simplement sans rien taper.
Une fois les fichiers de clefs du serveur générés, vous pouvez vous intéresser au fichier de configuration
sshd_config. Ce fichier de configuration contient un certain nombre d’options qui indiquent les
paramètres que le démon doit utiliser. Vous trouverez ci-dessous un exemple de fichier de configuration :
# Paramètres de connexion :
Port 22
ListenAddress [Link]
KeepAlive yes
# Protocoles utilisables :
Protocol 2
IgnoreRhosts yes
RhostsRSAAuthentication no
HostbasedAuthentication no
# Options générales :
338
Chapitre 9. Configuration du réseau
X11DisplayOffset 10
Comme vous pouvez le constater, un grand nombre d’options sont disponibles. Les options Port et
ListenAddress permettent de définir l’adresse IP sur laquelle le démon sshd se mettra en attente de
demandes de connexion, ainsi que le port TCP utilisé pour cela. L’adresse [Link] signifie ici qu’il doit se
mettre en attente sur toutes les adresses de la machine. L’option KeepAlive permet de demander au
démon de vérifier régulièrement que la liaison est toujours valide, afin de fermer les connexions
automatiquement en cas d’arrêt du client. L’option Protocol permet de spécifier les versions utilisables
du protocole SSH. La version 1 étant obsolète, on spécifiera systématiquement la valeur 2 ici. L’option
HostKey permet, comme son nom l’indique, de donner les noms des fichiers contenant les clefs pour les
différents protocoles d’authentification. Les options SyslogFacility et LogLevel permettent
d’indiquer le type et le niveau des messages de traces générés par le démon sshd dans le fichier de traces
du système.
Viennent ensuite les options spécifiques aux différents modes d’authentification. Les options
RSAAuthentication et PubkeyAuthentication permettent d’activer et de désactiver
l’authentification par clef publique des clients, respectivement pour les protocoles SSH de version 1 et 2.
Les options IgnoreRhosts, RhostsRSAAuthentication et HostbasedAuthentication
permettent de contrôler un protocole d’authentification basé sur l’identité des machines. Ce type
d’authentification n’a pas été présenté car il est extrêmement peu sûr, et il faut impérativement désactiver
ces fonctionnalités. Enfin, les options PasswordAuthentication et PermitEmptyPasswords
permettent d’activer ou de désactiver l’authentification par mot de passe. Vous êtes libre d’utiliser ou non
ces fonctionnalités.
Le fichier de configuration peut également contenir des options complémentaires. Les plus importantes
pour la sécurité sont sans doute PermitRootLogin et StrictModes, qui permettent d’interdire la
connexion par le réseau à l’utilisateur root d’une part, et d’interdire la connexion aux utilisateurs qui
n’ont pas bien fixé les droits d’accès sur leurs fichiers de configuration personnels dans leur compte local
(il est donc impossible de garantir que ces fichiers n’ont pas été trafiqués par d’autres utilisateurs pour
accéder à leur compte). L’option UsePrivilegeSeparation permet de demander au démon sshd de
n’effectuer les communications réseau que dans le compte spécial sshd, compte auquel on n’affectera
que le minimum de droits. Cette technique permet de protéger le système contre l’exploitation d’une
éventuelle faille de sécurité dans le démon sshd. L’option X11Forwarding permet d’activer
l’encapsulation automatique du protocole X et peut être relativement pratique. Le numéro de display
auquel les utilisateurs devront connecter leurs applications sera alors décalé du nombre indiqué par
l’option X11DisplayOffset. Cette option est utile pour éviter les conflits avec les serveurs X locaux.
Vous trouverez de plus amples informations sur le protocole X11 et l’environnement graphique dans le
Chapitre 10. Enfin, les options PrintMotd et PrintLastLog permettent de spécifier les informations
affichées par le démon sshd lorsque la connexion des clients est acceptée. Il existe bien d’autres options,
vous pourrez obtenir de plus amples renseignements dans la page de manuel du démon sshd.
339
Chapitre 9. Configuration du réseau
s’utilise exactement de la même manière que les commandes rsh ou rlogin. La syntaxe de la commande
ssh est la suivante :
ou :
où nom est ici le nom d’utilisateur à utiliser pour la connexion, et machine la machine distante. Si aucun
nom d’utilisateur n’est spécifié, le nom de l’utilisateur sur la machine local est pris par défaut. Il est
possible d’exécuter une commande sur la machine distante en la spécifiant après le nom de la machine.
Si aucune commande n’est spécifiée, un shell interactif est lancé.
Selon le mode d’authentification du client choisi par le serveur, il peut être nécessaire ou non de définir
des clefs pour le client. Tout comme pour les clefs publiques et privées d’un serveur, la génération de ces
clefs se fait à l’aide de la commande ssh-keygen. Cependant, contrairement à ce qui se passait pour le
serveur, les chemins par défaut proposés pour stocker les clefs sont ici corrects, et il est vivement
recommandé de saisir un mot de passe pour chiffrer la clef privée. Les fichiers de clefs générés par
ssh-keygen sont les fichiers identity et [Link] pour le protocole d’authentification RSA de
la version 1 du protocole SSH, et les fichiers id_rsa, id_rsa.pub, id_dsa et id_dsa.pub
respectivement pour les protocoles RSA et DSA de la version 2 du protocole SSH. Tous ces fichiers sont
stockés dans le répertoire .ssh/ du répertoire personnel de l’utilisateur qui les génère. Il va de soi que
les fichiers des clefs privées doivent ne doivent pas être lisibles pour les autres utilisateurs, et que les
fichiers des clefs publiques ne doivent pas pouvoir être écrits si l’on veut éviter qu’un usurpateur prenne
notre place sur notre propre machine.
Afin de bénéficier de l’authentification des serveurs auxquels on se connecte, il faut placer les clefs
publiqes de ces derniers dans le fichier .ssh/known_hosts. Si, lors d’une connexion à un serveur, la
clef publique de celui-ci n’est pas connue, ssh vous le signalera. Il indiquera un message d’erreur
indiquant que le serveur auquel on se connecte n’est pas forcément celui qu’il prétend être, et affiche un
condensé de sa clef publique. Vous devrez vous assurer que ce condensé est bien celui de la clef publique
du serveur auquel vous vous connectez, et ce par un moyen sûr (déplacement physique et connection en
local par exemple). Si vous acceptez cette clef, ssh la placera pour vous dans votre fichier
known_hosts, ce qui vous permettra de vous connecter par la suite en toute quiétude. Attention, le
fichier known_hosts ne doit pas être accessible en écriture aux autres utilisateurs, car dans ce cas un
pirate pourrait capter toutes vos communications !
Si le mode d’authentification utilisé est le mot de passe, ssh vous demandera de saisir le mot de passe du
compte distant. Dans ce cas, ssh se comporte exactement comme rsh, à ceci près que votre mot de passe
ne circulera pas en clair sur le réseau (quel progrès !).
Si, en revanche, le mode d’authentification utilisé est une authentification par clef publique, alors vous
devrez avoir défini vos clefs privées et publiques. Pour que le démon sshd de la machine distante accepte
la connexion, vous devrez placer vos clefs publiques dans le fichier authorized_keys du répertoire
./ssh/ du répertoire du compte distant. Cela permettra au démon sshd de s’assurer que c’est bien vous
qui vous connectez. Attention, le fichier authorized_keys ne doit pas être accessible en écriture, faute
de quoi un autre utilisateur de la machine distante pourrait se connecter en votre nom. Il est également
impératif de réaliser l’écriture soi-même dans ce fichier par un moyen sûr (déplacement physique). En
aucun cas la communication de votre clef publique à l’administrateur distant ne pourra être considérée
340
Chapitre 9. Configuration du réseau
comme un moyen sûr pour écrire cette clef : en effet, un pirate pourrait tout aussi bien lui demander
d’écrire sa propre clef dans votre fichier !
Vous constaterez qu’un certain nombre de précautions doivent être prises pour les manipulations de clefs.
Comme il l’a déjà été indiqué plus haut, le point faible est bel et bien l’authentification des clients. Cela
concerne en premier lieu le client bien entendu, dont le compte peut être piraté, mais c’est aussi un trou
de sécurité énorme pour le serveur, car une fois le loup dans la bergerie, il peut faire beaucoup de dégâts
et chercher à accroître ses droits (jusqu’à devenir root) par d’autres techniques.
où local est le port de la machine locale auquel il faudra se connecter pour accéder au service distant,
fonctionnant sur le port port de la machine serveur. Cette commande ouvre une session SSH sur la
machine machine (qui, normalement, est la même que serveur), et réalise la redirection du flux
destiné au port local dans le canal de cette session.
341
Chapitre 9. Configuration du réseau
Il faut bien comprendre que cette redirection se fait en plus de la connexion SSH, et que la syntaxe
donnée ci-dessus ouvre une connexion sur la machine distante (ou exécute la commande spécifiée en
paramètre, s’il en est spécifiée une). Si l’on désire simplement établir un tunnel, on peut refermer la
session juste après avoir lancé le programme qui doit utiliser ce tunnel. En effet, SSH maintient le tunnel
ouvert tant qu’un programme détient une connexion sur le port redirigé. On peut aussi exécuter une
commande sleep sur un délai arbitraire, qui permettra de se connecter sur le port redirigé et qui se
terminera automatiquement.
Du côté serveur, la syntaxe est similaire. Cette fois, la commande permet d’indiquer le port que le client
devra utiliser pour accéder à un service non sécurisé du serveur. La syntaxe à utiliser est la suivante :
où port est le port que le client devra utiliser, client est la machine cliente, et local est le port local
utilisé par le service que l’on veut exposer de manière sécurisée au client. Encore une fois, cette
commande ouvre une connexion SSH, il faut donc spécifier la machine à laquelle on se connecte (en
l’occurrence, le client). Une commande peut être spécifiée de manière optionnelle, s’il n’y en a pas, un
shell sera lancé sur la machine distante.
Note : Prenez bien conscience que SSH ne s’assure du chiffrement que des données transmises
sur le réseau. Si la machine cliente ou la machine serveur ne sont pas correctement configurées, un
pirate peut espionner les communications réseau internes à cette machine. Pour éviter ce type de
risque, il faut utiliser des protocoles réseau eux-mêmes chiffrés. Autrement dit, une fois sorti du
tunnel SSH, vous vous exposez à nouveau aux risques d’intrusion.
Il existe d’autres méthodes de tunneling sous Linux, qui sont sans aucun doute plus ergonomiques
que SSH. En effet, non seulement les tunnels SSH ne peuvent pas être créés automatiquement (ils
nécessitent une connexion), mais en plus les connexions SSH se terminent dès que le dernier client
disparaît. En fait, les fonctionnalités de SSH sont un plus, mais elles ne sont pas destinées à
remplacer des solutions plus adaptées pour réaliser des tunnels. Vous trouverez plus d’informations
sur les réseaux privés virtuels ci-dessous.
Utilisation d’IPSec
Le protocole IPSec est une extension du protocole IP qui permet de répondre aux besoins
d’authentification et de confidentialité, grâce aux techniques de cryptographie. Les principes utilisés sont
les mêmes que pour SSH, mais ils sont mis en pratique au plus bas niveau, ce qui fait que tous les
protocoles de haut niveau en bénéficient automatiquement.
Fonctionnement d’IPSec
IPSec définit des protocoles complémentaires permettant d’encapsuler les données transférées dans les
paquets IP et assurant les services d’authentification et de confidentialité. Le protocole AH (abréviation
de l’anglais « Authentication Header ») permet, comme son nom l’indique, d’assurer que les machines
sont bien celles qu’elles prétendent être. Cela permet de supprimer tous les risques d’attaque de l’homme
du milieu. Le protocole AH permet également d’assurer l’intégrité des données. En revanche, il n’en
assure pas la confidentialité. Le protocole ESP (abréviation de l’anglais « Encapsulating Security
Payload ») permet d’assurer cette confidentialité. En revanche, contrairement à ce que de nombreuses
342
Chapitre 9. Configuration du réseau
documentations affirment, il ne permet pas d’assurer l’authenticité des interlocuteurs, ce qui fait que la
confidentialité peut être brisée par une attaque de l’homme du milieu. Il est donc nécessaire d’utiliser les
deux protocoles si les interlocuteurs ne sont pas authentifiés de manière physique. Ces deux protocoles
permettent également de prévenir les attaques par rejeu au niveau protocolaire, car ils utilisent un numéro
de séquence dont la prédétermination est très difficile pour chaque paquet échangé.
Note : En réalité, le protocole ESP peut également assurer l’authenticité des données, même s’il ne
permet pas d’assurer l’authenticité des interlocuteurs. Cette fonctionnalité peut être utile si
l’authenticité des machines est assurée par un autre mécanisme. Toutefois, cette condition n’est
généralement pas vérifiée et il faut utiliser le protocole AH pour authentifier les machines. De ce fait,
le mécanisme d’authentification d’ESP est rarement utilisé.
AH et ESP peuvent être utilisées dans deux modes différents : le mode transport et le mode tunnel.
Le mode transport est le mode de communication natif, dans lequel les en-têtes des protocoles AH et ESP
sont insérés entre l’en-tête IP et ses données. De ce fait, les protocoles de haut niveau sont simplement
encapsulés dans les protocoles AH et ESP. Le mode tunnel, quant à lui, permet de créer un réseau virtuel
complet, en encapsulant la communication entre les interlocuteurs dans un canal chiffré. Ce sont donc les
paquets IP de la communication qui sont eux-mêmes encapsulés dans les protocoles AH et ESP.
IPSec utilise les algorithmes de cryptographie symétriques pour assurer ces fonctionnalités. Par exemple,
l’authenticité des machines et l’intégrité des données sont garanties par le protocole AH grâce à la
génération de condensés cryptographiques paramétrés par une clef privée. Seule les machines partageant
cette clef peuvent donc communiquer avec ce protocole, et toute modification des données serait détectée
lors de la vérification de la signature. De même, ESP assure la confidentialité des données en les chiffrant
avec un algorithme de chiffrement à clef privée.
Chaque canal de communication IPSec peut utiliser ses propres paramètres. Bien entendu, il est hors de
question de transférer ces paramètres (et encore moins les clefs privées utilisées !) dans chaque paquet
IP ! IPSec identifie donc ces paramètres par un numéro d’identification (appelé «« Security Parameter
Index », « SPI » en abrégé), grâce auquel chaque interlocuteur peut retrouver les paramètres de la
connexion chiffrée. L’association entre le SPI et ces paramètres est appelée une « SA » (abréviation de
l’anglais « Security Association »). Les associations de sécurité sont stockées sur chaque machine dans
une base de données que l’on appelle la SAD (de l’anglais « SA Database »).
Les associations de sécurité ne permettent que de définir la manière dont les communications doivent
être protégées. Cela dit, une machine n’est pas obligée de chiffrer toutes ses connexions, et l’on peut
parfaitement vouloir ne chiffrer les communications qu’entre deux machines seulement, ou que pour
certains protocoles seulement. Il est donc également nécessaire de définir quelles communications
doivent être chiffrées. Cela se fait grâce à une politique de sécurité (« Security Policy » en
anglais, « SP » en abrégé). Les politiques de sécurité sont également stockées dans une base de données
sur chaque machine, base de données que l’on appelle la « SPD » (abréviation de « SP Database »).
Bien entendu, la définition des clefs secrètes, des associations et des politiques de sécurité peut devenir
une opération très lourde sur de grands réseaux. En effet, il est nécessaire de définir des clefs privées
pour chaque couple de machines. Par conséquent, un protocole de gestion des clefs et des associations de
sécurité a été défini pour automatiser l’établissement des connexions. Ce protocole est le protocole
« ISAKMP » (abréviation de l’anglais « Internet Security Association and Key Management Protocol »).
Comme SSH, ce