Installation et configuration de Linux
Installation et configuration de 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 [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 = "1:0:0:0"
Device path = "/sys/devices/pci0000:00/0000:00:02.0/usb2/2-2/2-2:1.0/host1/1:0:0:0"
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 = "2:0:0:0"
Device path = "/sys/devices/pci0000:00/0000:00:02.2/usb1/1-1/1-1:1.0/host2/2:0:0:0"
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 protocole s’appuie sur les algorithmes de cryptographie asymétriques pour échanger les
clefs privées et définir les associations de sécurité de manière sûre avec des machines authentifiées.
343
Chapitre 9. Configuration du réseau
Ainsi, grâce à ce protocole, seules les politiques de sécurité et les couples de clefs publiques / privées des
machines doivent être définis. Les associations de sécurité et les clefs privées n’ont plus à être
manipulées.
#!/usr/sbin/setkey -f
344
Chapitre 9. Configuration du réseau
Ce fichier permet de décrire les associations de sécurité utilisées pour communiquer entre deux machines
d’adresses [Link] et [Link], ainsi que la politique de sécurité de la machine
[Link]. Bien que largement commenté, ce fichier requiert quelques explications
complémentaires.
Tout d’abord, la première ligne permet de considérer ce fichier comme un fichier exécutable, dont
l’interpréteur est la commande setkey elle-même. Les deux lignes suivantes permettent de vider les bases
de données contenant les associations et les politiques de sécurité. Attention, cela a pour conséquence de
désactiver complètement IPSec, les services réseaux qui doivent être protégés ne doivent donc pas être
lancé lorsque ce fichier est interprété.
Viennent ensuite les définitions des associations de sécurité utilisées par les protocoles AH et ESP. Ces
associations doivent être définies strictement de la même manière sur les deux machines pour lesquelles
la liaison est sécurisée. Elles sont simplement ajoutées à la base de données des associations à l’aide de
la commande add de setkey. Cette commande prend en paramètre les adresses IP source et destination
des machines intervenant dans la communication sécurisée, suivies du nom du protocole pour lequel
l’association est définie (à savoir, ah ou esp), suivi de l’identifiant de l’association (le « SPI »), et pour
finir des options relatives au protocole.
Les options des protocoles dépendent évidemment de ceux-ci. Le protocole AH n’accepte que l’option
-A, qui permet de spécifier l’algorithme d’authentification à utiliser (ici, l’algorithme MD5). ESP quant à
lui peut également accepter l’option -E, qui permet de spécifier un algorithme de chiffrement des
données. Il est inutile de spécifier un algorithme d’authentification pour ESP si l’on utilise également le
protocole AH, comme c’est le cas ici. Il est également possible de n’utiliser que le protocole ESP et de
lui demander de réaliser à la fois l’authentification et le chiffrement des communications. Toutefois,
comme on l’a dit plus haut, cela nécessite d’avoir déjà une authentification des machines (ce qui n’est
pas assuré en général, une adresse IP pouvant être vampirisée par un pirate).
Les algorithmes utilisables sont variés et dépendent des options que vous avez spécifiés dans la
configuration du noyau. Ceux utilisés ici sont relativement fréquents, à savoir MD5 pour
l’authentification et le triple DES pour le chiffrement. Vous remarquerez que ces algorithmes ont besoin
d’une clef secrète pour fonctionner. Dans le fichier d’exemple précédent, cette clef est spécifiée en
hexadécimal (c’est-à-dire en base 16). La taille des clefs dépend de l’algorithme utilisé. Pour MD5, il
vous faudra utiliser une clef de 16 octets, et pour le triple DES, une clef de 24 octets. Les clefs de cet
exemple ont été générées par lecture du fichier spécial de périphérique /dev/random, dont le but est de
fournir des données aléatoires, avec la commande suivante :
où n est le nombre d’octets à créer. Bien entendu, ces clefs devant rester secrètes, le fichier de
configuration [Link] ne doit pas être accessible en lecture aux autres utilisateurs que
l’administrateur.
Note : Vous remarquerez que les associations de sécurité utilisent deux clefs privées distinctes pour
les deux directions du flux de données entre les machines qui communiquent par IPSec. Cela n’est
pas une obligation, on peut très bien utiliser la même clef pour les deux directions.
345
Chapitre 9. Configuration du réseau
Comme il l’a déjà été indiqué, définir les associations de sécurité ne suffit pas pour sécuriser les
communications. En effet, il est également nécessaire de définir la politique de sécurité. Cela est réalisé à
l’aide de la commande spdadd. Cette commande prend en paramètre l’adresse source et l’adresse
destination, le protocole ou le port qui doit être sécurisé (any signifiant que toutes les communications
doivent être sécurisées), et la politique de sécurité elle-même. Cette politique permet d’indiquer la
direction du trafic réseau (in signifiant le trafic entrant et out signifiant le trafic sortant), et ce que l’on
doit faire des données. L’option ipsec indique qu’elles doivent être sécurisées par IPSec. L’option
discard permet d’interdire le trafic entre les machines, et l’option none permet d’autoriser ce trafic et
de laisser les communications se faire classiquement.
Si l’on indique qu’IPSec doit être utilisé, il faut indiquer, respectivement pour AH et ESP, le mode de
fonctionnement (ici, transport) et le niveau de sécurité exigé. La valeur utilisée est généralement
require, ce qui permet de n’accepter les communications que si elles se font par IPSec. Vous trouverez
le détail des autres options dans la page de manuel de setkey
Ainsi, la première ligne spdadd du fichier donné en exemple ci-dessus indique que tout le trafic sortant
de [Link] et allant vers [Link] doit être encapsulé en mode transport dans les
protocoles AH et ESP, en utilisant les associations de sécurité définies précédemment. De même, la
deuxième ligne spdadd indique que tout le trafic entrant dans [Link] et en provenance de
[Link] doit être sécurisé par IPSec.
Vous constaterez que les adresses IP sources et destination sont inversées dans les deux commandes,
parce que la direction indiquée est inversée et que l’on ne peut pas définir, sur la machine
[Link], les règles à appliquer sur la machine [Link]. Bien entendu, sur la machine
[Link], ces directions devront être échangées. Ainsi, pour reprendre l’exemple, les lignes
permettant de définir la politique de sécurité sur cette machine doivent être les suivantes :
Note : Pour que les communications se fassent par IPSec, il est nécessaire que vous laissiez passer
le trafic AH ou ESP au travers de votre pare-feu. Le protocole AH utilise le numéro de protocole 51 et
le protocole ESP le numéro 50.
346
Chapitre 9. Configuration du réseau
de tunnel IPSec utilisant les adresses [Link] et [Link], entre deux machines
d’adresses [Link] et [Link] :
#!/usr/sbin/setkey -f
Ce fichier commence par définir les associations de sécurité décrivant comment le trafic réseau doit se
faire entre les machines [Link] et [Link]. La première différence avec le mode
transport est l’utilisation de l’option -m, qui prend en paramètre le mode de communication. Ici, il est
demandé que tout le trafic IP, et non pas les communications elles-mêmes, soit encapsulé dans les
protocoles AH et ESP. Cela a effectivement pour effet de faire un tunnel « IP over IPSec ».
La deuxième différence provient ensuite de la définition des politiques de sécurité. À présent, ces
politiques ne portent plus sur les véritables adresses réseau des machines (à savoir [Link] et
[Link]), mais sur les adresses des interfaces réseau permettant d’accéder au tunnel
(respectivement [Link] et [Link]). De plus, les informations de routage pour le trafic
dans le tunnel sont spécifiées dans les règles de la politique : il doit passer dans le tunnel IPSec établit
entre [Link] et [Link].
347
Chapitre 9. Configuration du réseau
Note : Du fait que les communications doivent être transférées via le tunnel IPSec, il est nécessaire
d’autoriser le routage sur les deux machines du tunnel. Cela se fait en autorisant le routage au
niveau du pare-feu et en exécutant la commande suivante :
Les directions indiquées dans les politiques correspondent à la machine [Link]. Bien
entendu, ces directions devront être inversées sur la machine [Link] pour rendre la
communication symétrique.
Note : Pour ceux qui sont intéressés par les problèmes de sécurité, les autres mécanismes
d’authentification proposés par le protocole ISAKMP sont :
348
Chapitre 9. Configuration du réseau
Ce dernier type d’authentification est très problématique, car il ne résout pas le problème de la
gestion des clefs d’une part, et il requiert de connaître l’identité des machines qui se connectent
d’autre part. Cela implique que les adresses IP des machines qui se connectent doivent être fixes
dans le mode principal, et que les informations d’identité sont transférées sur le réseau pour éviter
d’avoir à connaître ces adresses IP dans le mode agressif. Cela n’est pas le plus grave, le mode
agressif transférant également des données chiffrées dont on connaît le contenu sur le réseau,
permettant ainsi à un attaquant de faire une attaque par dictionnaire et de trouver le secret partagé.
Sous Linux, le protocole ISAKMP est implémenté par le démon racoon. racoon utilise des certificats
x509 pour authentifier les machines, aussi vous faudra-t-il en générer pour chacune de vos machines.
Les certificats x509 sont des fichiers contenant l’identité d’une personne ainsi que sa clef publique, ce
qui permet donc de l’authentifier de manière fiable à condition que l’on soit sûr de le certificat provient
bien d’elle. Pour s’assurer de cela, il est courant de faire signer le certificat par une autorité de
certification en laquelle on a confiance et dont le rôle est de bien s’assurer que la personne qui demande
la signature de son certificat est bien celle qu’elle prétend être (moyennant finances bien entendu). Il est
possible de signer soi-même ses propres certificats, ce qui ne résout bien sûr pas le problème de
l’authenticité du certificat, mais permet au moins de s’assurer qu’il n’a pas été modifié par une tierce
personne. Cela suppose bien entendu que le problème du transfert de l’empreinte du certificat vers le
destinataire est résolu.
Les certificats peuvent être créés et manipulés à l’aide de l’outil OpenSSL, dont la ligne de commande
est malheureusement relativement complexe. La création d’un nouveau certificat se fait typiquement
avec la commande suivante :
Cette commande permet de créer une requête de certification d’une clef publique RSA de 1024 bits avec
l’algorithme de génération de condensé SHA1, et de stocker la clef privée correspondante dans le fichier
[Link]. La requête elle-même est stockée dans le fichier [Link]. Des informations
permettant de vous identifier vous seront demandées, et seront incluses dans la requête de certification.
La création du certificat se fait ensuite simplement, en signant la requête de certification. Nous pouvons
le faire nous-même, en signant la requête avec la clef privée que l’on vient de créer. Pour cela, il faut
utiliser la commande suivante :
Une fois cette opération effectuée, vous pouvez vous débarrasser du fichier de requête de certification
(c’est-à-dire du fichier [Link]). Vous disposerez alors d’un couple de clef privée/publique dans
les fichiers [Link] et [Link].
Une fois que vous aurez créé vos clefs pour toutes vos machines, vous pourrez les distribuer sur vos
différentes machines. Chaque machine doit bien entendu disposer de sa clef privée, ainsi que de
l’ensemble des clefs publiques des autres machines. L’échange des clefs publiques est l’opération
sensible, puisqu’il s’agit de s’assurer que les clefs reçues sont bien celles que l’on a émises. Pour cela, on
pourra utiliser un condensé de la clef et s’assurer que ce condensé est bien le même après échange.
Attention toutefois, il faut être certain que le condensé soit échangé de manière sûre. OpenSSL vous
permet d’obtenir un condensé de vos clefs publiques avec la commande suivante :
349
Chapitre 9. Configuration du réseau
sainfo anonymous
{
pfs_group modp1024;
encryption_algorithm 3des;
authentication_algorithm hmac_md5;
compression_algorithm deflate;
}
La première ligne indique le chemin du répertoire dans lequel les fichiers de clefs publiques des clients
se trouveront, ainsi que les fichiers de clefs publique et privée de la machine locale. La section remote
permet de définir les options d’authentification d’un client pendant la première phase du protocole
ISAKMP. Le mot-clé anonymous indique ici que tous les clients pour lesquels une section remote plus
spécifique n’est pas disponible devront utiliser cette section. C’est donc la section à utiliser pour tous les
clients disposant d’une adresse IP dynamique.
La définition de la première phase du protocole contient les directives suivantes :
• la directive exchange_mode, qui indique le mode de fonctionnement à utiliser pendant cette phase (le
mode principal est choisi ici, parce que c’est le seul qui soit réellement sûr) ;
• la directive certificate_type, qui permet d’indiquer que le mécanisme d’authentification utilise
des certificats X509 (grâce à l’option x509) ;
350
Chapitre 9. Configuration du réseau
• la directive verify_cert, qui permet d’indiquer si les certificats manipulés doivent être vérifiés
auprès d’une autorité de certification ou non (la configuration présentée ici ne le permet pas, car nous
avons signé nous-même nos certificats) ;
• les directives my_identifier et peers_identifier, qui indiquent la manière dont les machines
sont identifiées (leur option asn1dn indique que les informations qui ont été demandées lors de la
création des certificats des machines sont utilisées pour retrouver leurs certificats) ;
• et enfin, la directive proposal, qui permet de fournir les paramètres cryptographiques utilisés pour
l’association de sécurité de contrôle négociée pendant la première phase du protocole ISAKMP.
Les fichiers de configuration [Link] des clients devront avoir des directions de trafic inversées.
Vous noterez que les adresses spécifiées pour les clients utilisent des plages d’adresses dans les
commandes d’ajout de règles de politique de sécurité. En effet, on ne sait a priori pas quelles sont les
adresses de ces clients, car ils auront généralement une adresse IP allouée dynamiquement. La seule
adresse connue est en général celle du serveur, référencée ici par le nom de machine serveur. Si
l’adresse du serveur est elle-aussi dynamique, la configuration est plus contraignante, car il faut que
toutes les communications se fassent par IPSec (et les clients ne peuvent plus se connecter qu’aux
serveurs qu’ils connaissent).
Il est également possible de demander à racoon de définir lui-même la politique de sécurité, lorsque des
tentatives de connexion on lieu. Cela peut être réalisé à l’aide de la directive generate_policy de la
section remote.
351
Chapitre 9. Configuration du réseau
Une fois le fichier de configuration [Link] défini, il ne reste plus qu’à lancer racoon. Ceci peut
se faire avec la commande suivante :
racoon -f /etc/[Link]
L’option -f permet de lui indiquer le fichier de configuration qu’il doit utiliser. Si vous désirez lancer
racoon en avant-plan pour pouvoir déboguer votre configuration, vous pouvez utiliser -F, et augmenter
le niveau de traces avec l’option -d.
352
Chapitre 9. Configuration du réseau
le serveur pour se connecter à l’aide d’un logiciel d’émulation de terminal. Il existe plusieurs logiciels
permettant d’appeler un ordinateur distant et d’émuler un terminal. On citera par exemple le logiciel
HyperTerminal de Windows, et les programmes Telix et Minicom. Ce dernier est couramment fourni
avec les distributions de Linux, car c’est un logiciel libre.
En fait, il existe plusieurs variantes de getty, spécialisées pour des usages spécifiques, et permettant de
faciliter le paramétrage du fichier de configuration /etc/inittab, dans lequel sont définis les
terminaux disponibles. Les distributions de Linux sont souvent fournies avec les versions suivantes :
• mingetty, qui est un getty simplifié, couramment utilisé pour les terminaux virtuels ;
• mgetty, qui est une version spécialement conçue pour être utilisée sur les lignes série connectées à un
modem. mgetty est en particulier capable d’initialiser les modems, de décrocher automatiquement la
ligne lorsqu’il y a un appel, et de gérer les principales commandes des modems compatibles Hayes ;
• agetty, qui est une version complète de getty, utilisable aussi bien sur les lignes série (avec ou sans
modem) que pour les terminaux virtuels. On utilisera de préférence cette version si l’on désire
proposer une connexion par l’intermédiaire d’un câble null-modem.
Note : Les câbles null-modem sont des câbles série symétriques, qui permettent de relier deux
ordinateurs par l’intermédiaire de leurs ports série. Ces câbles peuvent être trouvés chez la plupart
des revendeurs de matériel informatique (vous pouvez également en fabriquer un vous-même si
vous avez du temps à perdre).
Connaissant les diverses possibilités de ces programmes, proposer un service de connexion extérieur est
relativement simple. Il suffit en effet de rajouter dans le fichier de configuration /etc/inittab les
lignes permettant de lancer les programmes getty sur les bonnes lignes. Par exemple, pour offrir une
connexion modem sur le deuxième port série (couramment appelé COM2), on ajoutera la ligne suivante :
Cette commande indique à init que mgetty doit être relancé à chaque fois qu’il se termine dans les
niveaux d’exécution 2 et 3. Il doit prendre le contrôle de la ligne série utilisée par le fichier spécial de
périphérique /dev/ttyS1, utiliser la vitesse de communication de 38400 bauds sur cette ligne (option
-s) et ne décrocher qu’au bout de la troisième sonnerie (option -n). Vous pouvez bien entendu ajuster
ces options en fonction de vos besoins.
En revanche, si l’on désire offrir une possibilité de connexion sur un port série par l’intermédiaire d’un
câble null-modem, on utilisera plutôt le programme agetty. La ligne à ajouter dans le fichier
/etc/inittab sera alors :
Notez que les options sont quelque peu différentes. La vitesse de la ligne est donnée directement, et
l’option -L indique que la ligne série utilisée est locale et ne gère pas le signal de porteuse CD
(abréviation de l’anglais « Carrier Detect ») habituellement utilisée pour détecter les coupures
téléphoniques. Encore une fois, vous pouvez adapter ces commandes selon vos besoins. N’hésitez pas à
consulter les pages de manuel des programmes mgetty et agetty pour obtenir plus de renseignements.
353
Chapitre 9. Configuration du réseau
Note : Vous pouvez tester vos connexions série à l’aide de l’émulateur de terminal minicom. S’il est
installé sur votre distribution, vous pourrez le lancer simplement en tapant la commande minicom. Si
vous l’utilisez sur une connexion directe (c’est-à-dire par un câble null-modem), vous devrez utiliser
l’option -o, afin d’éviter que minicom n’envoie les codes d’initialisation du modem sur la ligne série.
Il se peut que vous ne parveniez pas à vous connecter sur vos ports série. Dans ce cas, la première
des choses à faire est de regarder les paramètres de la ligne série à l’aide de la commande stty.
Vous devriez vous intéresser tout particulièrement à la vitesse utilisée, et éventuellement vous
assurer que les deux ports série des deux ordinateurs utilisent la même vitesse, ou que le modem
est capable de gérer la vitesse utilisée par le port série. Si besoin est, vous pouvez modifier la
vitesse d’un port série à l’aide de la commande stty. Par exemple, pour configurer le port série
COM2 à la vitesse de 115200 bauds, vous devez taper la commande suivante :
• le serveur doit spécifier l’adresse IP qu’il utilisera pour l’interface PPP et l’adresse IP qu’il donnera au
client lors de l’établissement de la liaison ;
354
Chapitre 9. Configuration du réseau
• le script chat utilisé ne doit pas composer un numéro, mais initialiser le modem pour qu’il réponde aux
appels entrants.
locale:distante
où locale est l’adresse IP de l’interface PPP du serveur, et distante est l’adresse IP que le client
recevra lorsqu’il se connectera. Ces deux adresses peuvent appartenir au même réseau (auquel cas le lien
PPP constitue un réseau en soi) ou non (le lien PPP constitue alors pas un pont entre deux réseaux
distincts). Ainsi, l’option suivante :
[Link]:[Link]
indiquera à pppd que l’adresse IP de l’interface PPP locale sera [Link], et que les clients qui se
connecteront sur la ligne correspondante devront recevoir l’adresse [Link].
Notez que les adresses utilisées ici font partie des adresses IP réservées pour les réseaux locaux. Ce n’est
pas ce que font les fournisseurs d’accès à Internet en général, car ils disposent d’un ensemble d’adresses
IP réelles redistribuables, mais les adresses réservées sont parfaitement utilisables. Le seul cas où cela
pourrait être gênant serait si l’on voulait faire passer les adresses des deux passerelles de la liaison PPP
sur Internet, mais les paquets utilisant ces adresses ne circulent justement que sur cette liaison (à moins
que les passerelles ne se trouvent sur des réseaux locaux et utilisent des adresses de ces réseaux pour la
liaison PPP, auquel cas, de toutes manières, il faudrait utiliser la technique du masquerading pour
connecter ces réseaux sur Internet).
Le script d’initialisation du modem, quant à lui, peut être spécifié à l’aide de l’option init de pppd.
Cette option fonctionne exactement comme l’option connect que l’on a utilisée pour établir la liaison
téléphonique dans la la section intitulée Création d’une connexion à Internet. La différence est ici que
l’on ne cherche pas à composer un numéro de téléphone, mais plutôt à initialiser le modem pour qu’il
décroche automatiquement la ligne lorsqu’il reçoit un appel.
Il existe malheureusement plusieurs dialectes de langages de commandes utilisés par les modems. En
général, chaque modem dispose donc de ses propres commandes, et il faut consulter sa documentation
pour savoir leurs syntaxes. Malgré cela, ce n’est pas trop gênant, car la plupart des modems sont
compatibles avec le standard Hayes, dont les commandes sont bien connues. Pour l’initialisation d’un
modem pour un serveur, les commandes d’initialisation suivantes seront très utiles :
Commande Signification
ATS0=n Décrochage automatique si n vaut 1, manuel si n vaut 0.
AT&C1 Activation du contrôle de la ligne CD (« Carrier Detect ») pour signaler les
raccrochages des clients. Cette commande n’est utile que si l’option modem
est passée en paramètre à pppd sur sa ligne de commande.
AT&K3 Activation du contrôle de flux matériel (pour optimiser les échanges de
données entre le modem et l’ordinateur). Cette option nécessite d’utiliser
l’option crtscts dans la ligne de commande de pppd.
355
Chapitre 9. Configuration du réseau
où port est le nom du fichier spécial de périphérique à utiliser pour cette connexion, par exemple
/dev/ttyS0, vitesse est la vitesse de la ligne, par exemple 115200, et /etc/ppp/script est le
nom du fichier du script chat devant servir à l’initialisation du modem. L’option detach permet de
demander à pppd de se détacher du terminal courant, afin que l’on puisse le lancer en arrière plan.
Vous trouverez ci-dessous un script chat d’exemple, permettant de spécifier les options vues ci-dessus :
"" ATZ
OK ATS0=1
OK AT&C1
OK AT&K3
OK ""
Note : Vous remarquerez qu’il n’est pas nécessaire, contrairement à ce que l’on a vu lors de la
configuration d’un client PPP, de spécifier le nom de l’utilisateur et le protocole d’identification et
d’authentification utilisé. Cela est normal, car le serveur n’a pas à s’identifier auprès de la machine
cliente en général (il peut bien entendu le faire s’il le désire, mais dans ce cas seuls les clients
capables de gérer ce type de connexion pourront se connecter).
En revanche, il peut être nécessaire d’exiger que les clients s’identifient et s’authentifient à l’aide de
l’un des protocoles PAP ou CHAP. Pour cela, il suffit simplement d’ajouter les noms des clients et
leurs secrets respectifs dans les fichiers de secrets /etc/ppp/pap-secrets et
/etc/ppp/chap-secrets, et d’ajouter l’une des options require-pap ou require-chap sur la ligne
de commande du démon pppd. Remarquez que le format des fichiers pap-secrets et
chap-secrets est le même aussi bien pour les connexions entrantes que pour les appels vers
l’extérieur. Cela signifie que l’on doit donner d’abord le nom du client, ensuite le nom du serveur, et
ensuite son secret et enfin la liste des adresses IP que les clients peuvent utiliser.
Remarquez également que la colonne spécifiant la liste des adresses IP ne doit pas rester vide
lorsqu’on désire créer un secret pour le serveur. En effet, pppd se base sur l’adresse IP de la
machine distante et sur le nom du client pour déterminer le secret à utiliser lors de l’authentification.
Cependant, si l’on désire utiliser les mêmes secrets pour toutes les lignes (et donc pour toutes les
adresses que le client peut se voir imposer), on pourra utiliser une étoile. Cela signifie que toutes les
adresses correspondront à la ligne, et seul le nom du client sera utilisé pour déterminer le secret à
utiliser. Par exemple, si le serveur se nomme monserveur et le poste client s’appelle jdupont, on
utilisera la ligne suivante :
Lorsque la liaison PPP est établie, le démon pppd configure l’interface réseau correspondante. Le
protocole utilisé par défaut est bien entendu le protocole IP. En général, il est nécessaire de configurer
cette interface afin de spécifier les règles de routage permettant au client d’envoyer et de recevoir des
356
Chapitre 9. Configuration du réseau
paquets. Lors de l’établissement de la liaison, le démon pppd ajoute donc automatiquement une règle de
routage pour indiquer que tous les paquets à destination de l’adresse du client doivent passer par
l’interface ppp de la liaison courante. Cette règle convient dans la majorité des cas, et en tout cas pour les
fournisseurs d’accès à Internet, car le client ne dispose que d’une seule machine. En revanche, si la
liaison PPP est utilisée pour relier deux réseaux, les règles de routages par défaut ne suffiront plus, car
des paquets à destination de toutes les machines du réseau distant doivent être envoyés via l’interface ppp
(et inversement). Pour résoudre ces petits problèmes, on devra compléter ou modifier les scripts
/etc/ppp/ip-up et /etc/ppp/ip-down. Ces deux scripts sont appelés par le démon pppd
respectivement lors de l’établissement de la liaison PPP et lors de sa terminaison. On placera donc les
commandes de routage complémentaires dans le script ip-up, et on fera le ménage correspondant dans
le script ip-down.
Remarquez que ces deux scripts sont communs à toutes les interfaces ppp que les différents démons
pppd peuvent utiliser. Ils sont également utilisés lors de l’établissement d’une connexion en tant que
client. Leur modification devra donc être entourée d’un soin extrême. Afin de distinguer les différents cas
d’utilisation, ces scripts sont appelés avec les paramètres suivants :
Paramètre Signification
$1 Nom de l’interface réseau (par exemple, « ppp0 ».
$2 Nom du fichier spécial de périphérique de la ligne série utilisée (par exemple,
« ttyS0 »).
$3 Vitesse de la ligne série.
$4 Adresse IP locale de l’interface réseau.
$5 Adresse IP du client.
$6 Paramètre complémentaire, que l’on peut passer au script à l’aide de l’option
ipparam de pppd.
Un script classique fait un test sur le nom de l’interface réseau et ajuste les règles de routage en fonction
de cette interface, en se basant sur les adresses IP locales et distantes reçues en paramètre. La plupart des
distributions fournissent un script d’exemple que vous pouvez bien entendu modifier soit directement,
soit à l’aide de leur outil de configuration.
Le démon pppd se termine à chaque fois que la liaison PPP se termine. Ce comportement est normal
pour un client, mais ce n’est pas généralement ce que l’on cherche à faire pour un serveur. Il faut donc
relancer pppd régulièrement à chaque fois qu’il se termine. Cela peut être réalisé en ajoutant sa ligne de
commande dans le fichier de configuration /etc/inittab dans les niveaux d’exécution adéquats.
Comme init impose une taille réduite sur les lignes de commandes des programmes qu’il peut lancer, il
est nécessaire d’utiliser les fichiers d’options de pppd. Par exemple, si l’on veut assurer le service PPP
pour une ligne entrante sur le deuxième port série dans les niveaux d’exécution 2 et 3, on utilisera la
ligne suivante :
# Initialisation du modem :
init "/usr/sbin/chat -v -f /etc/ppp/client.ttyS1
357
Chapitre 9. Configuration du réseau
# Protocole d’authentification :
require-pap
# Contrôle de la ligne téléphonique :
modem
# Contrôle de flux matériel :
crtscts
• les deux ordinateurs sont reliés directement par un câble null-modem, et aucun modem ne s’intercale
pour compliquer les choses. Par conséquent, on peut supprimer les scripts chat d’initialisation et de
connexion ;
• on a le contrôle physique sur les deux ordinateurs, ce qui implique que les mécanismes d’identification
et d’authentification sont superflus. Il est donc inutile de préciser les secrets PAP ou CHAP sur chaque
machine ;
• il n’y a que deux ordinateurs à relier, donc les règles de routages sont élémentaires ;
• enfin, les adresses choisies sont connues d’avance et peuvent être spécifiées de manière symétrique sur
le client et le serveur.
Il découle de ces simplifications que l’établissement d’une liaison PPP au travers d’un câble null-modem
est une opération très facile. Comme vous allez le constater, le protocole PPP est effectivement
symétrique.
Sur le « serveur », il suffit de lancer par exemple la commande suivante :
Cette commande permet de lancer le démon pppd sur le port série COM1 (fichier spécial de périphérique
/dev/ttyS0) en utilisant la vitesse de 115200 bauds (vitesse maximale généralement supportée par les
ports série des ordinateurs), en utilisant l’adresse IP locale [Link] et l’adresse IP distante
[Link]. Le démon pppd doit se détacher du terminal, car il est lancé en arrière plan. Enfin, le
contrôle de flux matériel est utilisé (option crtscts).
La commande sur le « client » est absolument symétrique, puisque seules les adresses locales et distantes
sont interverties :
Bien entendu, le port série utilisé peut être différent de celui du serveur, mais il est impératif que les deux
ports série soient configurés pour utiliser les mêmes paramètres de communication (vitesse, nombre de
358
Chapitre 9. Configuration du réseau
bits de données, bit de parité, bit d’arrêt). Vous aurez donc peut-être à utiliser la commande stty pour
fixer ces paramètres sur le serveur et sur le client.
Une fois ces deux commandes lancées, la connexion PPP est établie. Le démon pppd ajoute alors
automatiquement une règle de routage pour acheminer les paquets d’un ordinateur à l’autre. Vous
n’aurez donc pas à modifier les scripts /etc/ppp/ip-up et /etc/ppp/ip-down. Comme vous pouvez
le constater, l’utilisation de PPP pour relier simplement deux ordinateurs n’est pas une opération très
compliquée...
359
Chapitre 9. Configuration du réseau
étant spécifiée par le mot clé range suivi de l’adresse de début et de l’adresse de fin de la plage. Il est
également possible d’attribuer des adresses fixes à certaines machines, avec la syntaxe suivante :
où les mots clés hardware ethernet introduisent l’adresse Ethernet de l’interface réseau de la
machine cliente, et où fixed-address spécifie l’adresse IP que cette machine doit utiliser pour cette
interface.
Enfin, un grand nombre d’options peuvent également être spécifiées, par exemple pour définir les
adresses de diffusion (mot clé broadcast-address), les adresses des passerelles (mot clé routers),
les noms de domaines (mot clé domain-name) ou encore les durées des bails accordés aux machines
clientes (mots clés default-lease-time et max-lease-time). La liste complète des options
utilisables est donnée dans la page de manuel [Link] et je vous invite à la consulter si vous désirez
en savoir plus.
Lorsque vous aurez rédigé le fichier de configuration adapté à votre installation, il ne vous restera plus
qu’à lancer le démon dhcpd. Celui-ci utilise la syntaxe suivante :
où interface0, interface1, etc., sont les interfaces réseau utilisées pour accéder aux réseaux à
configurer en DHCP. Ces interfaces doivent être configurées avec des adresses de réseau pour lesquelles
il est possible de trouver une section subnet correspondante dans le fichier de configuration
/etc/[Link]. Enfin, la commande de démarrage du démon dhcpd pourra être placée dans les
fichiers d’initialisation du serveur DHCP.
Note : Le démon dhcpd utilise les fonctionnalités d’accès direct aux cartes réseau et de filtrage des
paquets du noyau Linux pour écouter sur le réseau les demandes de configuration par DHCP des
clients. Par conséquent, vous devrez activer ces options dans la configuration du noyau si ce n’est
déjà fait. Pour cela, il vous faudra cocher les options « Packet socket », « Packet socket:
mmapped IO » et « Socket Filtering » du menu « Networking options ». Vous devrez également
activer l’option « IP: multicasting » dans la liste des options pour le protocole IP afin de
permettre au démon d’effectuer des émissions de paquets en mode broadcast. 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.
360
Chapitre 9. Configuration du réseau
« Network File System »), introduit originellement par Sun Microsystems et repris par la suite par les
autres éditeurs de systèmes Unix. Le deuxième protocole est le protocole « SMB » (abréviation de
l’anglais « Server Message Block »), qui a été introduit par Microsoft pour les systèmes DOS et
Windows.
Les deux protocoles sont incompatibles, et si les deux solutions fonctionnent parfaitement en
environnements homogènes, il est assez difficile de faire communiquer les deux types de systèmes. Les
principaux problèmes proviennent de l’impossibilité d’utiliser le protocole réseau NetBIOS d’IBM sur
les machines Unix, et des limitations des systèmes Microsoft en ce qui concerne la gestion des
utilisateurs, les droits d’accès et les liens symboliques. De plus, la différence de gestion des fins de lignes
dans les fichiers textes entre Unix et les systèmes Microsoft pose des problèmes qui peuvent
difficilement être résolus de manière systématique.
Malgré ces limitations, les machines fonctionnant sous DOS ou Windows peuvent accéder aux systèmes
de fichiers NFS des machines Unix grâce à des programmes spéciaux. Ces programmes sont souvent des
extensions propriétaires aux systèmes Microsoft, et peuvent être relativement coûteux sans pour autant
garantir une grande fiabilité et des performances honnêtes. L’utilisation de NFS sur les machines
Windows ne sera donc pas traitée ici. Inversement, les machines Unix peuvent accéder aux partages
Microsoft, mais là encore, il peut se présenter des difficultés. La principale difficulté est ici la nécessité
d’encapsuler NetBIOS dans le protocole TCP/IP. En effet, le protocole SMB utilise les messages
NetBIOS, protocole qui n’est pas géré nativement par les machines Unix. Dans tous les cas, des logiciels
complémentaires sont nécessaires.
361
Chapitre 9. Configuration du réseau
le port sur lequel ils trouveront un serveur donné, à partir du numéro de programme et du numéro de
version de celui-ci.
Il existe donc un service RPC particulier, nommé « portmapper », qui fournit aux clients qui le
demandent les numéros de port des autres serveurs. Bien entendu, le portmapper doit être toujours
contactable, ce qui implique qu’il utilise systématiquement le même numéro de port. Par convention, le
portmapper est identifié par le numéro de programme 100000, et il écoute les requêtes des clients sur les
ports 111 des protocoles TCP et UDP.
La mise en place des serveurs de fichiers passent donc par le lancement de ces trois démons : le démon
portmapper, le démon mountd et le démon nfsd. Les fichiers exécutables de ces démons sont
respectivement portmap, [Link] et [Link]. Ils sont normalement placés dans le répertoire
/sbin/ ou /usr/sbin/. Vous devrez donc lancer ces trois démons sur la machine serveur de fichiers, il
est probable que votre distribution fasse le nécessaire dans ses scripts de démarrage.
Note : Il est prévu d’intégrer les fonctionnalités de serveur NFS dans le noyau de Linux. Cependant,
le serveur de fichiers du noyau n’est pas encore finalisé, et ne sera donc pas décrit ici.
Une fois les démons lancés, vous pourrez configurer les systèmes de fichiers exportés par votre serveur.
Ces systèmes de fichiers sont en fait de simples répertoires que vous mettez à disposition de certaines
machines. La liste de ces répertoires est placée dans le fichier de configuration /etc/exports. Chaque
ligne de ce fichier caractérise un répertoire accessible par les autres machines du réseau. Ces lignes
utilisent le format suivant :
répertoire machines
où répertoire est le chemin sur le répertoire à exporter, et machines est une liste de machines
pouvant accéder à ce répertoire. Cette liste contient des noms de machines, des adresses IP ou des noms
de réseaux, séparés par des espaces. Il est également possible d’utiliser les caractères génériques ’?’ et
’*’ afin de spécifier des groupes de machines.
Des options peuvent être utilisées pour chaque machine, à l’aide de la syntaxe suivante :
machine(options)
où machine est l’une des entrées de la liste de machines d’une ligne du fichier exports, et options est
la liste des options pour cette entrée, séparées par des virgules. Les options les plus utilisées sont bien
entendu ro et rw, qui permettent de fournir à cette machine ou à ce groupe de machine respectivement
un accès en lecture seule et en lecture et écriture sur le répertoire.
Le problème fondamental de NFS est la sécurité. En effet, les fichiers sont exportés par défaut avec un
identificateur d’utilisateur qui est celui qui possède le fichier sur la machine serveur. Or il est tout à fait
possible que cet identificateur ne correspondent pas au même utilisateur sur tous les clients. Cela signifie
que les utilisateurs des machines clientes peuvent parfaitement avoir accès à des fichiers qui ne leur
appartient pas sur le serveur. Ce problème est fondamental, aussi faut-il le prendre en considération
sérieusement.
NFS fourni plusieurs solutions pour assurer la sécurité sur les systèmes de fichiers exportés. La première,
qui est aussi la plus restrictive, est d’attribuer les fichiers exportés à un utilisateur ne disposant de
quasiment aucun droit (opération que l’on nomme souvent « squashing de l’utilisateur »). Cet utilisateur
spécial est l’utilisateur « nobody », dont l’identificateur est 65534 par défaut. Ainsi, tous les clients
362
Chapitre 9. Configuration du réseau
accèdent à ces fichiers au nom de l’utilisateur nobody, et ne peuvent donc pas modifier les fichiers du
serveur. Le squashing de l’utilisateur root est toujours réalisé par défaut, pour des raisons de sécurité
évidentes.
La deuxième solution est nettement moins sûre. Elle nécessite de lancer le démon « ugidd » sur chaque
machine client. Ce démon est appelé par le serveur NFS pour déterminer l’identificateur des utilisateurs
du client à partir de leur nom. Ainsi, chaque fichier est exporté avec l’identificateur de l’utilisateur qui
porte le même nom que celui qui possède le fichier accédé sur le serveur. Les problèmes de sécurité
posés par cette solution sont énormes : rien ne garantit que deux utilisateurs distincts sur deux machines
différentes ne puissent pas avoir le même nom d’une part, et un attaquant potentiel peut utiliser le démon
ugidd pour obtenir la liste des utilisateurs de la machine cliente d’autre part (ce qui constitue déjà la
moitié du travail pour s’introduire dans le système de la machine cliente). Cependant, cette solution est
très pratique pour les réseaux dont on contrôle chaque machine, à condition de restreindre l’accès au
démon ugidd au serveur uniquement, par exemple en ayant recours à tcpd.
La troisième solution est de définir sur le serveur l’association entre les identificateurs des utilisateurs du
serveur et les identificateurs du client, ce pour chaque machine cliente. Cette technique est sûre, mais
nettement plus compliquée à mettre en œuvre.
Enfin, la dernière solution est d’utiliser les services d’information du réseau NIS (abréviation de l’anglais
« Network Information Service »), qui permettent de définir un certain nombre d’informations de
manière globale sur un réseau. En particulier, il est possible de centraliser la définition des utilisateurs et
des mots de passe. Cette solution est très lourde à mettre en œuvre, puisqu’elle nécessite de configurer
NIS au préalable. Elle n’est donc mise en place que sur les grands réseaux, et un particulier n’a pas de
raisons d’y recourir (à moins de vouloir explorer ces mécanismes bien entendu). Nous n’en parlerons
donc pas.
Toutes ces techniques peuvent être activées à l’aide d’options fournies dans la liste des options pour
chaque machine déclarées dans le fichier de configuration /etc/exports. Les options utilisées sont
décrites ci-dessous :
• l’option all_squash permet d’exporter tous les fichiers comme appartenant à l’utilisateur nobody.
C’est l’option la plus sûre, mais aussi la plus restrictive ;
• l’option map_daemon permet d’utiliser le démon ugidd, qui doit être lancé sur les machines clientes et
accessibles du serveur. L’accès aux répertoires exportés sera refusé si ce démon ne peut être contacté
par le serveur NFS. C’est certainement la solution la plus pratique pour un particulier ;
• l’option map_static=fichier permet d’utiliser un fichier de correspondance des identificateurs des
utilisateurs du serveur NFS sur les identificateurs des utilisateurs de la machine cliente.
Comme on peut le voir, cette dernière option permet de définir spécifiquement, pour chaque machine, la
correspondance des identificateurs d’utilisateurs. Le fichier fourni en paramètre à l’option map_static
contient un certain nombre de lignes, chacune définissant l’association entre les identificateurs
d’utilisateurs de la machine distante et les identificateurs de ces utilisateurs sur le serveur. Ces lignes sont
introduites à l’aide du mot clé uid. Il est également possible de donner les correspondances sur les
groupes des utilisateurs avec le mot clé gid :
363
Chapitre 9. Configuration du réseau
Dans l’exemple donné ci-dessus, les utilisateurs ayant un identificateur compris entre 0 et 99 inclus
seront associés à l’utilisateur nobody (ils subissent le « squashing »). Il en est de même pour les groupes
allant de 0 à 49. En revanche, les utilisateurs dont les identificateurs vont de 500 à 1000 sur la machine
cliente se voient respectivement considérés comme les utilisateurs d’identificateur 1000 à 1500 par le
serveur NFS. De même, les groupes d’identificateurs 50 à 100 sont considérés comme les groupes
d’identificateurs 1000 à 1050.
L’exemple qui suit va permettre d’éclaircir un peu ces notions. Il montre comment les trois types de
contrôle des identificateurs peuvent être mis en place, pour trois types de clients différents :
Les informations stockées dans le fichiers /etc/exports sont prises en compte lors de l’exécution de la
commande exportfs. Cette commande est généralement exécutée à chaque démarrage de la machine
dans les scripts de démarrage du système, avec l’option -a. Cette option permet d’exporter tous les
systèmes de fichiers référencés dans /etc/exports, tout comme la commande mount utilise cette
option pour monter tous les systèmes de fichiers au démarrage.
À chaque modification du fichier /etc/exports, il est nécessaire de signaler cette modification au
démon mountd. Cela peut être fait simplement à l’aide de la commande suivante :
364
Chapitre 9. Configuration du réseau
exportfs -a
machine:répertoire
où machine est le nom du serveur NFS, et répertoire est le chemin absolu sur le répertoire exporté
par cette machine et auquel on désire accéder. Ainsi, si la machine « [Link] » exporte le
répertoire « /mon/répertoire/exporté », la commande suivante permettra de monter ce système de
fichiers NFS dans le répertoire /mnt :
mount -t nfs \
[Link]:/mon/répertoire/exporté /mnt
Le système de fichiers NFS accepte des options permettant d’optimiser les transferts d’informations. Ces
options peuvent être fournies en ligne de commande à mount à l’aide de l’option -o. Les plus utiles sont
sans doute rsize, qui permet de fixer la taille des blocs de données transférés pour la lecture des
fichiers, et wsize, qui permet de fixer cette taille pour l’écriture des fichiers. Il est recommandé d’utiliser
des paramètres raisonnables afin d’éviter des erreurs de transfert et des pertes de données. La valeur par
défaut est 1024, mais il est recommandé d’utiliser des blocs de taille 8192 pour obtenir de meilleures
performances. Ainsi, la commande suivante pourra être optimisée comme suit :
365
Chapitre 9. Configuration du réseau
Bien entendu, ces valeurs dépendent de la bande passante de votre réseau, et vous aurez sans doute à
effectuer des tests de transferts de fichiers pour trouver les valeurs optimales.
366
Chapitre 9. Configuration du réseau
permet d’utiliser des adresses de diffusion. Dans le monde Windows, ces groupes de machines sont plus
couramment dénommés des « workgroup », et il n’y a en fait aucune différence technique. Pour le
protocole SMB, chaque ordinateur du réseau doit faire partie d’un groupe bien défini, bien que ce ne soit
pas une nécessité au niveau de NetBIOS.
Lorsqu’un groupe de travail possède une base de données centrale permettant de réaliser
l’authentification des utilisateurs lors des accès aux machines par le réseau, on dit qu’il s’agit d’un
domaine. En pratique, un domaine n’est donc rien d’autre qu’un groupe de travail dont fait partie un ou
plusieurs serveurs d’authentification. Il existe plusieurs types de serveurs de domaine. Un serveur
primaire est un serveur central, sur lequel se fait la gestion globale des utilisateurs. Outre un serveur
primaire, un domaine peut également contenir un ou plusieurs serveurs de sauvegarde si nécessaire.
Comme leur appelation l’indique, ces serveurs sont capables de remplacer le serveur primaire en cas de
défaillance de celui-ci. Ils maintiennent donc une copie des tables d’utilisateurs, et la synchronisent
régulièrement avec celle du serveur primaire. Enfin, un domaine peut contenir des serveurs membres, qui
sont comme des serveurs de sauvegarde, à ceci près qu’ils ne peuvent pas remplacer le serveur de
domaine primaire. Bien entendu, le domaine contient également les stations de travail classiques, qui
effectuent des requêtes sur le serveur primaire.
Afin de gérer la liste des noms NetBIOS du réseau, Samba fournit le démon « nmbd ». Ce démon est
essentiel au fonctionnement correct de Samba et doit donc toujours être lancé. Il peut également être
configuré en tant que serveur WINS (abréviation de l’anglais « Windows Internet Name Server »), afin
de pouvoir fournir les noms NetBIOS sur Internet. WINS est une technique développée par Microsoft
pour résoudre le problème du nommage des postes de travail sur Internet. Un serveur WINS est donc à
NetBIOS un peu ce qu’un serveur DNS est à TCP/IP. Le démon nmbd est installé classiquement dans le
répertoire /usr/bin/ ou dans le répertoire /usr/sbin/. Vous devrez le lancer avec l’option -D, faute
de quoi il ne démarrera pas en tant que démon :
/usr/sbin/nmbd -D
Le deuxième démon fourni par Samba est « smbd ». Celui-ci gère effectivement le protocole SMB, et est
donc en charge d’effectuer la gestion des utilisateurs et des partages. Il doit être lancé également avec
l’option -D si l’on veut qu’il démarre en tant que démon. Ce démon est normalement installé au même
endroit que nmbd :
/usr/sbin/smbd -D
Vous pourrez éventuellement faire en sorte que ces démons soient lancés automatiquement en modifiant
les scripts de démarrage de votre système. Une fois ces deux démons lancés, votre machine Linux se
comportera exactement comme une machine Windows serveur classique. Ainsi, les ressources partagées
par ce serveur seront accessibles par les clients SMB, comme les postes Windows par exemple.
Malheureusement, la plupart des clients SMB ne gèrent pas les notions avancées des systèmes de fichiers
Unix. Le protocole SMB ne supporte d’ailleurs qu’une partie infime de ces fonctionnalités. De plus, la
gestion des droits sur les fichiers exportés par un serveur de fichiers Windows se base généralement sur
le modèle de sécurité des d’ACLs (« Access Control List »), plutôt que sur le modèle de sécurité Unix
classique. Samba peut donc être configuré pour utiliser le support des ACLs natif des systèmes de fichiers
Linux, ainsi que pour utiliser les modèles de sécurité primitifs des anciennes versions de Windows.
367
Chapitre 9. Configuration du réseau
La première difficulté à résoudre concerne la gestion des droits d’accès aux fichiers des partages. Sous
Unix, chaque fichier et chaque répertoire dispose de droits d’accès, et seuls les utilisateurs autorisés
peuvent les manipuler. Dans le monde Windows, il n’y a quasiment pas de notion d’utilisateur, et en
général pas de gestion de la sécurité. Seuls Windows NT/2000/XP disposent de ces fonctionnalités, à
condition qu’ils utilisent des systèmes de fichiers NTFS et que le type de partage utilisé le permette.
En fait, la gestion de la sécurité se fait de manière globale, pour tous les fichiers d’un partage. Il existe
principalement deux modes de contrôle d’accès aux partages SMB :
• le contrôle d’accès au niveau ressource, qui se fait à partir d’un mot de passe unique pour la ressource,
sans tenir compte de l’utilisateur qui cherche à y accéder ;
• le contrôle d’accès au niveau utilisateur, qui nécessite de fournir un nom d’utilisateur et un mot de
passe.
Le contrôle d’accès au niveau utilisateur nécessite de se trouver dans un domaine, et non dans un simple
Workgroup. Il faut donc disposer d’un serveur de domaine afin de réaliser l’authentification des
utilisateurs qui cherchent à accéder à ces ressources. Pour des raisons commerciales, Microsoft s’est
arrangé pour que seuls Windows NT, Windows 2000 et Windows XP serveur puissent servir de
contrôleurs de domaine, ce qui fait qu’il est impossible d’utiliser le contrôle d’accès au niveau utilisateur
sur un réseau ne disposant que de machines sous Windows 95, 98, ou NT/2000/XP client (heureusement,
Samba est capable de servir de contrôleur de domaine, cependant, nous ne verrons pas ce type de
configuration). Il va de soi que le contrôle d’accès au niveau utilisateur est la seule solution réellement
sûre du point de vue de la sécurité.
Pour couronner le tout, les partages ne permettent que de fixer les droits de lecture et d’écriture pour
celui qui accède aux fichiers du partage. Les droits d’exécution n’ont pas de signification sous Windows
puisque, contrairement aux fichiers Unix, le type des fichiers est déterminé par leur extension. Les
notions de sécurité des partages sont donc profondément différentes de celles utilisées par Unix, surtout
pour le contrôle d’accès au niveau ressource, puisqu’aucun nom d’utilisateur n’est requis lors de
l’authentification ! Mais ce n’est pas tout. Les fichiers Unix appartiennent tous à un utilisateur et à un
groupe d’utilisateurs, chose qui n’a pas de signification pour Windows. De plus, les systèmes de fichiers
Unix font la distinction entre les majuscules et les minuscules dans les noms de fichiers, ce que ne fait
pas Windows. Et ils disposent de la notion de liens physiques et symboliques. Autant de problèmes qui
doivent être gérés par Samba.
Note : Le fait de ne pas disposer des informations concernant les droits des utilisateurs sur les
fichiers accédés par SMB n’empêche pas le serveur de fichiers de contrôler les accès effectués par
le client. Si par exemple, un fichier est marqué comme étant en lecture seule, aucun client ne peut y
écrire, même par l’intermédiaire d’un partage accédé en lecture et écriture.
Pour résoudre tous ces problèmes, Samba dispose d’un grand nombre d’options, qui peuvent être
utilisées dans le fichier de configuration /etc/samba/[Link]. Ces options permettent d’indiquer la
manière dont l’authentification doit être faite, les droits avec lesquels les fichiers sont accédés ou créés,
les utilisateurs au nom desquels les fichiers sont créés, et le comportement à suivre lorsqu’un client
essaie de suivre un lien symbolique. Seules les principales options gérées par Samba seront décrites ici.
Les options avancées seront laissées de côté, car Samba propose un nombre incroyable de fonctionnalités
et les traiter toutes dépasserait le cadre de ce document. Vous pourrez trouver des informations
complémentaires en cas de nécessité dans la documentation de Samba, ou bien dans l’excellent livre
368
Chapitre 9. Configuration du réseau
« Using Samba » de Robert Eckstein, publié aux éditions O’Reilly. Une version en ligne de ce livre est
fournie avec les sources de Samba et complète ainsi la documentation officielle de ce programme.
La plupart des distributions fournissent un fichier de configuration /etc/samba/[Link] contenant la
plupart des options par défaut, plus quelques exemples de configuration. Par exemple, les répertoires des
utilisateurs sont souvent exportés par défaut. Vous pourrez bien entendu modifier ce fichier de
configuration. Il est donc peut-être nécessaire de donner quelques précisions.
Le fichier [Link] est structuré en sections permettant de fixer les paramètres de différentes
fonctionnalités du logiciel. Chaque section est introduite par son nom, donné entre crochets. Certaines
sections sont spécifiques à Samba et d’autres permettent de définir les partages que vous désirez créer.
Les paramètres définis dans les sections se présentent sous la forme de couple « paramètre = valeur », où
paramètre est le nom d’un des paramètres possibles dans cette section, et valeur est la valeur que ce
paramètre peut prendre.
Parmi les sections propres à Samba, on compte la section « [global] ». Cette section est particulièrement
importante, car elle fixe les paramètres globaux de Samba, ainsi que les valeurs par défaut des paramètres
des autres sections. La section [global] suivante peut servir d’exemple :
[global]
# Définit le nom NetBIOS du serveur :
netbios name = Linux
server string = Linux fait la Samba (version %v)
Cette section commence par définir le nom NetBIOS du serveur et sa description. Par défaut, le nom
utilisé par Samba est le nom de domaine Unix de la machine, mais vous pouvez changer ce nom comme
bon vous semble. Vous avez dû remarquer que dans la description de la machine (mot clé server
string), la version de Samba est récupérée avec %v. En fait, Samba défini un certain nombre de
variables qui sont remplacées dynamiquement lors de la connexion à un partage. Ainsi, %v représente la
369
Chapitre 9. Configuration du réseau
version de Samba utilisée, %u représente le nom de l’utilisateur qui se connecte, etc. Toutes ces variables
sont décrites dans la page de man du fichier [Link].
Le nom du groupe de travail dont fait partie la machine est ensuite introduit avec le mot clé workgroup.
Dans le cas présent, il s’agit du groupe de travail « monrezo ».
Viennent ensuite les options de sécurité. Le mot clé security permet de définir le mode de contrôle
d’accès aux partages mis à disposition des clients par le serveur Samba. La valeur user indique que ce
contrôle d’accès se fait au niveau utilisateur, ce qui est le plus cohérent sous Unix. Chaque utilisateur
doit donc fournir son nom et son mot de passe pour accéder à ces partages. Samba peut également gérer
le contrôle d’accès au niveau ressource, si l’on utilise la valeur share. Dans ce cas, Samba essaiera de
retrouver l’utilisateur qui cherche à se connecter à partir de son mot de passe. Il faut donc ajouter dans ce
cas une ligne telle que celle-ci dans la section globale ou dans l’une des sections définissant un partage :
username = utilisateurs
où utilisateurs représente la liste des utilisateurs que Samba utilisera pour tester le mot de passe
fourni. Bien entendu, si un nom d’utilisateur est fourni par le client pour accéder à cette ressource, ce
nom est utilisé directement. Samba mémorisera également ce nom pour les demandes d’accès ultérieures
à la ressource partagée. Cet algorithme n’est pas très sûr, car un utilisateur peut se connecter par hasard
au nom d’un autre. Aussi n’est-il pas recommandé d’utiliser le contrôle d’accès au niveau ressources.
Jusqu’à Windows 95 et Windows NT4 Service Pack 2 compris, les mots de passe fournis par les clients
étaient transférés en clair sur le réseau. Cela n’étant pas sûr, Microsoft a décidé d’adopter une nouvelle
technique, dans laquelle les mots de passe à transférer sont chiffrés par une clef fournie par le serveur.
Ainsi, une personne mal intentionnée écoutant les paquets transférés sur le réseau ne pourrait pas capter
ces mots de passe. Samba est capable de gérer les deux cas de configuration, à l’aide de l’option
encrypt password. Cependant, si vous décidez d’activer le chiffrement des mots de passe, vous
devrez également créer un fichier de mots de passe pour les clients SMB. L’emplacement de ce fichier est
indiqué avec l’option smb passwd file.
Le format du fichier de mot de passe de Samba ressemble fortement à celui du fichier de mot de passe
Unix /etc/passwd. Vous pourrez trouver dans la documentation de Samba une description détaillée de
ce fichier. Cependant, la chose la plus importante, c’est bien sûr de pouvoir ajouter des entrées pour
chaque utilisateur dans ce fichier. Cette opération se fait avec l’utilitaire smbpasswd. Exécutée sous le
compte root, la commande suivante permet d’ajouter un utilisateur et de définir son mot de passe :
smbpasswd -a utilisateur
où utilisateur est le nom de l’utilisateur dont on veut créer un nouveau mot de passe. L’utilisateur
peut bien entendu changer son mot de passe avec smbpasswd.
Il est possible que les noms des utilisateurs Windows ne soient pas identiques à leurs logins sur la
machine serveur de fichiers. En fait, il est même possible que plusieurs utilisateurs utilisent un même
compte, créé uniquement pour les partages SMB. Samba fournit donc la possibilité d’utiliser un fichier
de correspondance entre les noms des utilisateurs avec l’option username map. Le format du fichier de
correspondance est très simple, puisqu’il est constitué de lignes définissant chacune une association entre
un nom de login Unix et un nom d’utilisateur Windows. Ces lignes utilisent la syntaxe suivante :
login = utilisateur
370
Chapitre 9. Configuration du réseau
où login est le nom de login de l’utilisateur sur la machine Unix, et utilisateur est le nom qu’il
utilisera pour accéder aux partages.
L’option guest ok permet d’autoriser les connexions sans mot de passe sous un compte spécial, que
l’on nomme le compte invité. Pour cela, il suffit de lui affecter la valeur yes. Cette option peut être fixée
à no dans la section de configuration globale, et redéfinie dans les sections spécifiques de certains
partages. Dans tous les cas, les connexions qui s’effectuent en tant qu’invité doivent utiliser un compte
utilisateur Unix classique. Ce compte peut être défini à l’aide de l’option guest account, en général,
l’utilisateur nobody utilisé par NFS est le plus approprié.
Enfin, il est possible de définir des paramètres réseau dans la section de configuration globale. Ces
paramètres réseau permettent de fixer des options de sécurité complémentaires et des options
d’optimisation. L’option interfaces donne la liste des interfaces à partir desquelles les demandes de
connexion des clients seront acceptées. Ce type de contrôle est activé lorsque le paramètre bind
interfaces only prend la valeur yes. Ces options conviennent parfaitement pour un réseau local de
particulier. L’option socket options quant à elle permet de définir les paramètres de fonctionnement
des communications TCP. L’option TCP_NODELAY indique au système d’envoyer les paquets TCP dès
que Samba le demande, sans chercher à en regrouper plusieurs pour optimiser la taille des paquets. Cette
option accélère significativement le fonctionnement des programmes tels que Samba, qui utilisent
beaucoup de petits paquets pour envoyer des requêtes ou des réponses. Sans cette option, le système
chercherait à regrouper ces paquets, même si Samba n’en a pas d’autres à envoyer, et ralentirait ainsi
inutilement les transferts de données.
Chaque partage fourni par le serveur SMB dispose également d’une section, dont le nom est le nom
utilisé pour ce partage. Ces sections sont beaucoup plus simples que la section global, comme le montre
l’exemple suivant :
[Données]
# Donne le chemin sur le répertoire utilisé par ce partage :
path = /usr/share/samba/données
# Description du partage :
comment = Disque de données
# Options d’accès :
writeable = yes
guest ok = yes
Comme vous pouvez le constater, l’option path permet de définir le répertoire utilisé pour stocker les
fichiers du partage. Ce répertoire est un répertoire du serveur, et le chemin doit donc obligatoirement être
un chemin Unix valide. En particulier, il faut tenir compte ici de la casse des noms de fichiers. L’option
comment donne la description du partage, telle qu’elle apparaîtrait dans le voisinage réseau de Windows.
Le nom de volume quant à lui est celui qui sera donné si un client Windows attache une lettre de lecteur à
ce partage. Il est spécifié à l’aide de l’option volume. Enfin, les options d’accès utilisées dans cet
exemple permettent d’autoriser l’écriture dans les fichiers de ce partage, et d’autoriser les accès en tant
qu’invité (c’est-à-dire sans mot de passe).
371
Chapitre 9. Configuration du réseau
Samba dispose d’une fonctionnalité intéressante afin de définir automatiquement un partage pour chacun
des répertoires personnels des utilisateurs déclarés dans le serveur. Lorsqu’un client cherche à accéder à
un partage qui n’est pas défini par une section qui lui est propre, Samba tente de le localiser un répertoire
personnel d’utilisateur portant ce nom. S’il le trouve, il utilisera ce répertoire pour effectuer le partage
automatiquement. Les paramètres de ce partage automatique sont définis dans la section [homes], dont
vous trouverez un exemple ci-dessous :
[homes]
comment = Répertoires personnels
browsable = no
writable = yes
L’utilisation de l’option browsable = no ici sert simplement à indiquer qu’il ne doit pas apparaître de
partage nommé homes. En effet, ce qui est désiré ici, c’est d’exposer les noms des répertoires personnels
des utilisateurs, pas le partage homes lui-même. Les autres options sont les mêmes que pour les partages
normaux.
La section [homes] peut poser quelques problèmes, puisqu’elle partage également le compte root. Cela
n’est certainement pas le comportement désiré. Il est même fortement recommandé d’interdire les
connexions pour les utilisateurs privilégiés du système. Cela peut être réalisé en utilisant l’option
invalid users :
En fait, il est conseillé de placer cette option dans la section [global], afin d’interdire les connexions
de ces utilisateurs sur tous les partages.
Enfin, Samba fournit une fonctionnalité comparable à la section [homes] pour les imprimantes
partagées. Il est en effet capable d’analyser le fichier de configuration /etc/printcap pour déterminer
la liste des imprimantes installées, et les partager pour les clients Windows. Ces imprimantes
apparaîtront donc comme des imprimantes partagées classiques. Pour cela, il suffit d’ajouter les lignes
suivantes dans la section [global] du fichier [Link] :
[global]
# Définit le type d’impression utilisé (bsd ou cups) :
printing = bsd
La première ligne indique à Samba le type de commande à utiliser pour réaliser une impression. Si vous
utilisez le système d’impression BSD, vous devez fixer l’option printing à bsd. Si vous utilisez CUPS,
la valeur à utiliser est cups.
372
Chapitre 9. Configuration du réseau
Les options concernant toutes les imprimantes que Samba trouvera peuvent être précisées dans la section
[printers]. Cette section joue donc le même rôle pour les imprimantes partagées que la section
[homes] joue pour les répertoires personnels des utilisateurs. La section donnée ci-dessous pourra vous
servir d’exemple :
[printers]
comment = Imprimantes
browseable = no
printable = yes
writeable = no
guest ok = no
path = /tmp
create mode = 0700
L’option browseable a ici la même signification que dans la section [homes]. On ne désire en effet pas
qu’un partage portant le nom printers apparaisse dans les voisinages réseau des machines Windows !
En revanche, l’option printable permet d’indiquer clairement que ces partages sont des imprimantes.
Il est évident que l’on ne peut pas écrire sur une imprimante, l’option writeable est donc fixée à no.
Enfin, les impressions ne sont autorisées que pour les utilisateurs identifiés, et l’utilisateur invité n’a pas
le droit de soumettre un travail d’impression.
Le mécanisme utilisé par Samba pour imprimer un document est le suivant. Lorsqu’un client demande
une impression sur une des imprimantes partagées, Samba copie le fichier que le client lui envoie en
local. Ce fichier est ensuite communiqué au gestionnaire d’impression Unix, en l’occurrence lpr sous
Linux. Celui-ci imprime le fichier et le supprime du disque. Dans la section [printers], l’option path
permet d’indiquer dans quel répertoire les fichiers temporaires envoyés par les clients doivent être
stockés. Il est tout à fait cohérent de les placer dans le répertoire /tmp comme dans l’exemple donné
ci-dessus. Enfin, il est logique de protéger ces fichiers contre les autres utilisateurs. Cela est réalisé à
l’aide de l’option create mode, qui fixe les droits de ces fichiers à 0 pour tout le monde, sauf pour le
compte root, à leur création. Ainsi, seul les programmes fonctionnant sous le compte root (donc Samba
et la commande lpr) peuvent lire, écrire et effacer ces fichiers.
Il est bien entendu possible de définir les imprimantes manuellement, à raison d’une section par
imprimante. Ce type de configuration ne sera toutefois pas décrit ici.
Toute modification du fichier de configuration de Samba implique de la signaler aux démons smbd et
nmbd. Cela peut être réalisé en leur envoyant un signal SIGHUP. Vous devrez donc taper les commande
suivantes :
Comme on peut le voir, le fichier de configuration [Link] n’est pas très compliqué, mais utilise un
grand nombre d’options. Heureusement Samba fournit l’outil de configuration « SWAT » (abréviation de
l’anglais « Samba Web Administration Tool »), qui permet d’effectuer la configuration de Samba
graphiquement. Comme son nom l’indique, SWAT joue le rôle de serveur Web, et peut être utilisé avec
n’importe quel navigateur en se connectant sur le port 901 de la machine sur laquelle il tourne.
373
Chapitre 9. Configuration du réseau
Pour que cela puisse fonctionner, il faut ajouter le service réseau « swat » dans votre fichier de
configuration /etc/services :
swat 901/tcp
Vous devrez également ajouter une ligne dans votre fichier /etc/[Link], afin que le démon inetd
puisse lancer SWAT automatiquement lorsqu’un client cherche à l’utiliser sur le réseau. Vous devrez
donc ajouter la ligne suivante :
Vous pourrez alors accéder à la configuration graphique de SWAT à l’aide d’un navigateur Web, en
utilisant simplement l’URL suivante :
[Link]
SWAT demandera bien entendu le nom de l’utilisateur root et son mot de passe pour permettre la
modification du fichier [Link]. Notez qu’il est fortement déconseillé de laisser la possibilité de
réaliser un connexion Web sur le compte root, et que vous ne devriez pas autoriser les connexions non
locales sur le port TCP 901. L’utilisation de SWAT ne pose pas vraiment de problèmes et ne sera donc
pas décrite plus en détail ici.
374
Chapitre 9. Configuration du réseau
système ne supporte pas encore complètement le système de fichiers SMB. Elle utilise donc un
programme complémentaire nommé smbmount, fourni avec la distribution de Samba. Notez bien que ce
programme ne fait pas officiellement partie de Samba, il est seulement fourni en tant qu’utilitaire
complémentaire pour Linux. Bien qu’il fasse également partie d’un paquetage indépendant, il est
recommandé d’utiliser la version fournie avec Samba. Cela signifie que vous devrez installer Samba sur
les postes clients, même si vous ne lancez pas les démons smbd et nmbd. La commande standard mount
du système sera peut-être modifiée un jour pour intégrer toutes les fonctionnalités de la commande
smbmount, ce qui rendra inutile l’installation de Samba sur les postes clients.
Quoi qu’il en soit, la syntaxe de la commande smbmount est très simple :
où partage est le nom de partage du volume à monter, et répertoire est son point de montage (par
exemple, /mnt/). Le nom de partage utilisé est exactement le même nom que celui utilisé par Windows,
à ceci près que les antislashs (’\’) sont remplacés par des slashs (’/’). Ainsi, pour monter dans /mnt/ le
partage Données du serveur de fichiers SMBSERVER, vous devrez utiliser la commande suivante :
Remarquez que le protocole SMB ne fait pas la distinction entre les majuscules et les minuscules (tout
comme Windows d’une manière générale), et que vous pouvez utiliser indifféremment les majuscules ou
les minuscules.
L’utilisation des slashs à la place des antislashs dans le nom du partage est due au fait que l’antislash est
un caractère spécial que shell interprète comme étant la poursuite de la commande courante sur la ligne
suivante. Vous pouvez utiliser des antislashs si vous le désirez, mais dans ce cas, vous devrez mettre le
nom de partage entre guillemets, pour empêcher le shell de les interpréter. Malheureusement, l’antislash
est également un caractère d’échappement dans les chaînes de caractères, et est utilisé pour introduire
des caractères spéciaux. Étant lui-même un caractère spécial, il doit lui aussi être précédé d’un antislash
d’échappement ! Il faut donc doubler tous les antislashs, et la commande précédente devient
particulièrement longue et peu pratique avec cette syntaxe :
Il est très facile de faire des erreurs avec de telles commandes, aussi je ne vous la conseille pas.
En fait, il est possible de faire en sorte que la commande mount classique du système puisse être utilisée
pour réaliser les montages de partages SMB à partir de la version 2.0.6. ou plus de Samba. Pour cela, il
suffit de créer dans le répertoire /sbin/ un lien symbolique [Link] vers la commande
smbmount. Lorsqu’on utilisera la commande mount avec le type de système de fichiers smbfs, celle-ci
utilisera ce lien et appellera ainsi automatiquement smbmount. Les paramètres fournis à mount seront
transmis tels quels à smbmount. En particulier, vous pourrez utiliser une commande de ce type :
375
Chapitre 9. Configuration du réseau
où partage et répertoire sont toujours les noms de partage et de répertoire devant servir de point de
montage.
Une fois le partage monté, vous pouvez l’utiliser comme un système de fichiers classique. Lorsque vous
aurez fini de l’utiliser, vous pourrez simplement le démonter, avec la commande smbumount :
smbumount /mnt
Il est également possible d’utiliser la commande système classique umount, mais cela nécessite de
repasser sous le compte root, ou de fixer le bit setuid sur l’exécutable de umount, ce qui est un énorme
trou de sécurité. La commande smbumount en revanche peut être setuid, car elle vérifie que l’utilisateur
ne cherche à démonter que les partages qu’il a lui-même monté.
Les partages au niveau ressource ne prennent pas en compte la notion d’utilisateur et de groupe
d’utilisateurs des systèmes de fichiers Unix classiques. Par conséquent, le propriétaire et le groupe des
fichiers accédés par un partage de ressources sont fixés par défaut à l’utilisateur qui a effectué le montage
et à son groupe. Cela est naturel et ne pose pas de problèmes pour la plupart des utilisateurs, mais peut
être gênant lorsqu’on monte un partage en tant que root pour le compte d’un autre utilisateur. Pour
résoudre ce problème, il est possible de préciser le nom de l’utilisateur et son groupe à l’aide des options
uid et gid de la commande smbmount :
où utilisateur et groupe sont respectivement les noms ou les numéros de l’utilisateur et du groupe
auquel les fichiers devront être attribués. Les paramètres uid et gid peuvent également être utilisés avec
la commande mount. Dans ce cas, ils sont passés tels quels à smbmount.
Vous l’aurez sans doute remarqué, la commande smbmount vous demande de taper un mot de passe
pour accéder au partage. Ce mot de passe est le mot de passe attendu par le serveur de fichiers SMB.
Pour Windows, il s’agit du mot de passe attribué au partage. Pour les serveurs de fichiers Samba, il s’agit
du mot de passe de l’utilisateur au nom duquel se fait le partage, ou du mot de passe SMB enregistré
dans le fichier de mots de passe smbpasswd de Samba. Dans tous les cas, ce mot de passe est demandé,
même s’il est vide. La commande smbmount peut accepter une option password, qui permet de
préciser ce mot de passe. Cependant, il est fortement déconseillé de l’utiliser, et ce pour deux raisons.
Premièrement, le mot de passe apparaît en clair lorsqu’il est saisi, et la ligne de commande peut être vue
par n’importe quel utilisateur avec la commande ps. Cela pose donc un problème de sécurité évident.
Deuxièmement, l’option password n’est pas reconnue par la commande mount, et ne peut donc être
utilisée qu’avec smbmount. C’est pour cela qu’une autre solution a été proposée, bien qu’encore
imparfaite : définir le nom d’utilisateur et le mot de passe dans la variable d’environnement USER. Pour
cela, il suffit d’utiliser l’une des commandes suivantes :
export USER=utilisateur%secret
export USER=utilisateur/workgroup%secret
où utilisateur est le nom d’utilisateur classique, workgroup est le groupe de travail et secret le
mot de passe sur le partage à monter. Cette technique n’est pas non plus très sûre, et n’est en aucun cas
pratique.
376
Chapitre 9. Configuration du réseau
Une autre solution, plus sûre, est de définir les paramètres d’identification et d’authentification de
l’utilisateur dans un fichier et de fournir ce fichier en paramètre à la commande smbmount à l’aide de
l’option credentials :
où fichier est le fichier contenant l’identification de l’utilisateur. Ce fichier utilise la syntaxe suivante :
username = utilisateur
password = secret
où utilisateur est le nom de l’utilisateur et secret son mot de passe. Cette technique est la
technique recommandée pour réaliser le montage de partages SMB directement dans le fichier de
configuration /etc/fstab, car c’est la seule qui permette de ne pas avoir à saisir le mot de passe ni
d’avoir à le définir en clair dans une ligne de commande.
377
Chapitre 10. Installation de XWindow
L’installation de XWindow a été pendant longtemps une tâche ardue et risquée. À présent, il est possible
d’installer cet environnement relativement facilement, et en prenant beaucoup moins de risques que par
le passé. En fait, les seules difficultés dans l’installation de XWindow résident en deux points
stratégiques :
• il faut impérativement connaître les caractéristiques de son matériel (carte graphique et surtout
moniteur) ;
• il faut disposer d’un pilote adapté à sa carte graphique pour le serveur X.
Le premier point n’est pas réellement trop difficile à résoudre, puisqu’il suffit souvent de regarder les
fiches techniques du matériel installé. Bien entendu, cela suppose de les avoir conservées. Si ce n’est pas
le cas, il faut espérer que les programmes d’installation connaissent la marque et le modèle du matériel.
Il reste toujours la possibilité de demander des renseignements à des personnes qui ont également ce type
de matériel (c’est là qu’Internet peut être utile). Les informations les plus importantes sont les plages de
fréquences horizontales et verticales du moniteur, ainsi que les durées des signaux de synchronisation
horizontale et verticale. Sans ces informations, vous ne parviendrez pas à installer XWindow.
Rassurez-vous cependant, les programmes de configuration de XWindow connaissent la plupart des
moniteurs à présent, ce qui fait qu’ils sont capables d’écrire les fichiers de configuration correctement
sans que vous ayez à spécifier les paramètres du moniteur.
Le deuxième point en revanche est plus délicat. Bon nombre de fabricants de matériel tiennent secrètes
les informations techniques permettant de programmer un pilote, parce qu’ils considèrent que ce sont des
informations stratégiques. Il est évident que dans ce cas, aucun pilote libre ne peut être écrit. Depuis
quelques temps, ce problème ne se pose plus réellement en ce qui concerne l’affichage 2D, car le champ
de bataille des constructeurs de cartes graphiques s’est déplacé vers le monde de la 3D. Dans le pire des
cas, la carte graphique ne sera reconnue que par le pilote générique VESA, et l’affichage se fera
correctement mais avec des performances bien en deçà de ce qu’elles auraient été si un pilote approprié
avait existé. Il est donc recommandé de se renseigner dans les groupes de discussion sur Internet avant
d’acheter une carte graphique, ou d’acheter une bonne carte graphique mais un peu obsolète. Il faut
savoir que de toutes façons, les dernières fonctionnalités sont toujours intégrées avec un train de retard
sous Linux, car il faut au moins le temps d’écrire les pilotes et de les tester. Dans peu de temps, Linux
sera sans aucun doute reconnu comme un système à part entière par les fabricants, et il est probable
qu’ils fourniront des pilotes comme pour les autres systèmes. En attendant, assurez-vous bien que ce que
vous achetez fonctionne sous Linux.
Il n’y a que trois solutions si aucun serveur X adapté à votre matériel n’est fourni avec votre distribution :
• soit le fabricant de la carte graphique fournit un serveur X pour Linux (ce qui est très rare, mais
commence à arriver) ;
• soit on utilise un pilote VESA, qui fonctionne avec toutes les cartes graphiques compatibles avec le
standard VESA
378
Chapitre 10. Installation de XWindow
• soit une société tierce vend un serveur X pour ce type de matériel (ce qui est moins rare, mais a
l’immense inconvénient qu’il faut acheter ses pilotes) ;
Ce chapitre décrit la manière de procéder pour installer et configurer [Link], une implémentation libre de
XWindow dérivée du projet XFree86. Il indique également comment installer le serveur X pour le pilote
de frame buffer du noyau. L’installation des polices Truetype, qui sont si chères aux utilisateurs de
Windows et des Macintosh, est également traitée. En revanche, il ne décrira pas comment configurer les
gestionnaires de fenêtres ni les gestionnaires de bureau, car ces opérations sont spécifiques à celui que
vous choisirez d’une part, et spécifiques à vos desiderata d’autre part. Pour cela, vous devrez commencer
à vous débrouiller tout seul, à lire les pages de manuel et à poser les questions qu’il faut aux personnes
qu’il faut. Mais ne paniquez pas, si vous êtes arrivé jusqu’ici, c’est que vous commencez à savoir vous
débrouiller. Vous ne devriez plus trop avoir de problèmes pour tirer de Linux tout ce dont vous avez
besoin...
379
Chapitre 10. Installation de XWindow
classiques comme Windows, OS/2 ou Macintosh, et ces différences se traduisent dans la manière de
l’utiliser.
La principale différence entre XWindow et les autres environnement graphiques est qu’il s’agit d’un
environnement graphique distribué sur un réseau. La notion de base de XWindow est que l’application
qui effectue le traitement ne réalise pas elle-même la gestion de l’environnement graphique. Comme on
l’a déjà vu, cette tâche est prise en charge par le serveur X, qui est un processus indépendant.
L’application est donc cliente du serveur X, qui lui fournit les services graphiques dont elle a besoin.
Cette séparation a plusieurs conséquences :
• premièrement, l’environnement graphique est isolé des fautes des applications qui l’utilisent. Ainsi, ce
n’est pas parce qu’une application a planté en plein écran qu’on ne peut pas réduire sa fenêtre et
accéder à nouveau au bureau sous-jacent. Inversement, une application est isolée des erreurs
potentielles du serveur X, et peut poursuivre son traitement même si celui-ci s’est terminé. Par
exemple, un processus de gravage de CD peut terminer le CD en cours même s’il a perdu son interface
graphique ;
• deuxièmement, les clients doivent établir une connexion avec le serveur. Cette connexion est réalisée
par l’intermédiaire du réseau. Cela implique naturellement que les mécanismes de sécurité liés au
réseau sont applicables pour toutes les applications désirant se connecter au serveur X. XWindow
fournit par ailleurs des mécanismes de sécurité complémentaires, et les ressources graphiques ne
peuvent être utilisées que par les processus qui y sont autorisées ;
• enfin, comme le client et le serveur X sont deux processus distincts et qu’ils communiquent par
l’intermédiaire d’une connexion réseau, rien n’interdit de lancer le client et le serveur X sur deux
machines distinctes. Ainsi, tout processus déporté peut afficher ses données en local (et inversement).
Chaque client doit donc se connecter au serveur X avec lequel il désire travailler. En pratique, il n’existe
souvent qu’un seul serveur X sur une machine, mais cela n’est pas une obligation. Par exemple, une
même machine peut disposer de deux cartes graphiques et de deux écrans, et faire tourner deux serveurs
X distincts. Une autre possibilité est d’utiliser les deux écrans avec un seul serveur X pour faire un écran
virtuel beaucoup plus grand. Enfin, il est tout à fait concevable de lancer plusieurs fois un même serveur
X, même si l’on ne dispose que d’une seule carte graphique et d’un seul écran, afin de pouvoir utiliser
plusieurs terminaux X virtuels. Comme on le voit, l’architecture client/serveur de XWindow lui apporte
une très grande flexibilité.
Les serveurs X utilisent la notion de display pour gérer l’affichage. En fait, un display est constitué d’un
clavier, d’une souris et d’un ou plusieurs écrans. Le display est donc l’extension de la notion de terminal
pour XWindow. Notez bien qu’il est possible d’utiliser plusieurs écrans sur le même terminal X.
Cependant, un serveur X ne peut prendre en charge qu’un seul terminal X sur une machine, et chaque
display est géré par un serveur X qui lui est propre. Si l’on veut utiliser plusieurs terminaux X sur une
même machine, il est nécessaire de lancer plusieurs serveurs X, à raison d’un par terminal.
Les clients qui désirent se connecter à un serveur X doivent donc indiquer le display avec lequel ils
désirent travailler. Le système XWindow se chargera d’établir la connexion avec le serveur X en charge
de ce display. Les displays sont spécifiés avec la syntaxe suivante :
machine:display
380
Chapitre 10. Installation de XWindow
Comme on le voit, la présence du champ machine confirme que XWindow est bien un système
graphique réseau. Il peut contenir directement le nom de la machine ou son adresse IP. Si ce champ est
absent, le serveur contacté sera l’un des serveurs X de la machine locale, avec un protocole de
communication optimisé. Le champ display quant à lui est un numéro permettant d’identifier le display
de la machine en question qui doit être utilisé. C’est ce champ qui déterminera le serveur X qui sera
utilisé, dans le cas où plusieurs serveurs X fonctionnent sur la même machine.
Un display pouvant avoir plusieurs écrans, il est possible de spécifier l’écran sur lequel l’affichage doit
être réalisé. Pour cela, il suffit de suffixer le nom du display par un point suivi du numéro de l’écran :
machine:display.écran
où le champ écran spécifie le numéro de l’écran de ce display sur lequel l’affichage doit avoir lieu. Ce
champ sera rarement utilisé en pratique, car il est assez rare de disposer de plusieurs écrans. Il peut donc
être omis, la valeur par défaut utilisée est dans ce cas 0 (pour le premier et unique écran du display).
Une fois la connexion établie, les programmes clients continuent d’indiquer à XWindow le display qui
doit être utilisé pour chaque opération graphique à effectuer. Il est donc possible pour un programme de
répartir son affichage sur plusieurs écrans, voire de communiquer avec plusieurs serveurs X et donc de
gérer plusieurs displays simultanément, éventuellement sur des machines différentes. Ce genre de
programme est cependant assez rare, et ne se trouve en pratique que dans le monde de la conception
assistée par ordinateur, la visualisation d’images médicales et l’architecture. Les programmes classiques
se contentent d’un seul display et effectuent toutes leurs opérations sur un même écran. En revanche, il
est possible de configurer les serveurs X pour utiliser automatiquement plusieurs écrans pour un même
display, afin de réaliser un écran virtuel gigantesque.
Le display utilisé pour un programme doit donc souvent être fixé par un paramètre de sa ligne de
commande. L’option utilisée est -display, avec la syntaxe suivante :
381
Chapitre 10. Installation de XWindow
où programme est le programme à exécuter, et nom est le nom du display tel qu’il a été décrit ci-dessus.
Par exemple, la commande suivante :
xterm -display :0
permet de lancer le programme xterm et de réaliser l’affichage sur le display :0 (sur l’écran par défaut)
de la machine locale.
Vous pouvez cependant vous passer de l’option -display, à condition de définir la variable
d’environnement DISPLAY pour fixer le display par défaut. Vous pouvez fixer la valeur de cette variable
à l’aide d’une commande telle que celle-ci :
export DISPLAY=:0.0
(si vous utilisez bash). Dans cet exemple, le serveur X à utiliser se trouve sur la machine locale, le display
porte le numéro 0, et l’écran à utiliser est le numéro 0. En général, cette variable d’environnement est
fixée à la valeur du display courant lorsqu’on est connecté sous XWindow. Par conséquent, vous pouvez
lancer vos programmes sans avoir à vous préoccuper du display qu’ils doivent utiliser.
En revanche, vous serez obligé de préciser le display à utiliser lorsque vous lancerez une application à
distance en voulant avoir l’affichage en local. Bien entendu, vous devrez au préalable donner les droits à
l’utilisateur distant sur votre display local, faute de quoi les mécanismes de sécurité de XWindow lui
interdiront de se connecter (message d’erreur « Can’t open display »). Nous verrons plus loin la
manière dont XWindow gère la sécurité.
Configuration de [Link]
La configuration de [Link] commence avant tout par l’installation du serveur X. Un même serveur X peut
prendre en charge plusieurs cartes graphiques sur une même machine, pourvu qu’il dispose des pilotes
adéquats. Inversement, il est possible de lancer plusieurs serveurs X, chacun utilisant sa propre carte
graphique, ou partageant la même carte si la machine n’a qu’un seul terminal X.
[Link] fournit un unique serveur X, qui prend en charge tous les types de cartes graphiques à l’aide de
pilotes spécifiques. Dans une installation normale, ces pilotes sont fournis sous forme de modules de ce
serveur. Les pilotes peuvent ainsi être chargés dynamiquement par le serveur X, selon la configuration du
système. Cette architecture permet à un même serveur X de charger plusieurs pilotes pour plusieurs
cartes graphiques, afin de gérer les configurations disposant de plusieurs écrans connectés à des cartes
graphiques de différents types. Il est donc nécessaire que les modules prenant en charge vos cartes
graphiques soient installés, ce qui est normalement toujours le cas.
Par convention, le nom du serveur X est toujours X. Comme le nom du fichier programme du serveur X
de [Link] est Xorg (on s’en serait douté...), il doit exister un lien symbolique /usr/X11/bin/X qui
pointe vers le fichier /usr/X11R6/bin/Xorg. Ce lien est, encore une fois, normalement toujours
présent sur les systèmes correctement configurés.
Une fois XWindow installé, la suite de la configuration de [Link] se fait uniquement dans le fichier de
configuration [Link]. Ce fichier est classiquement stocké dans le répertoire /etc/X11/.
Normalement, vous ne devez pas créer ce fichier vous-même. Votre distribution doit au moins vous en
fournir un par défaut et, souvent, elle dispose d’un outil de configuration de [Link] convivial qui fera
382
Chapitre 10. Installation de XWindow
quasiment tout le travail pour vous. Ce genre d’outil est de plus capable de configurer [Link] pour les
pilotes spécifiques fournis avec les distributions (il n’est pas rare que les sociétés éditrices de
distributions développent des serveurs X pour les nouvelles cartes graphiques). Lisez donc votre
documentation pour plus de détails à ce sujet.
Vous pouvez également utiliser les programmes de configuration fournis avec [Link], qui vous
permettront de générer ce fichier. Il existe trois possibilités pour générer un fichier de configuration
[Link]. La première méthode est de demander directement au serveur X de détecter le matériel
présent sur votre machine et de générer le fichier [Link] correspondant. La deuxième méthode, qui
est aussi la plus sûre, est d’utiliser le programme xorgconfig. Il s’agit d’un outil fonctionnant en mode
texte, qui est effroyablement peu pratique à utiliser. Enfin, un autre outil, beaucoup plus convivial, est en
cours de développement. Il s’agit de xorgcfg. Cet outil permet de générer et de modifier les fichiers
[Link] de manière conviviale, soit en mode texte avec des menus, soit en mode graphique. Lorsque
cet outil sera terminé, la configuration de [Link] sera beaucoup plus aisée. Encore une fois, je ne saurai
que vous recommander d’utiliser l’outil de configuration fourni avec votre distribution.
Xorg -configure
À l’issue de cette commande, le serveur X écrira un fichier [Link] dans le répertoire personnel
de l’utilisateur root.
Cependant, le fichier de configuration ainsi généré n’utilisera que les options de configuration les plus
sûres et devra souvent être révisé complètement. En pratique, seuls les paramètres de la carte graphique
et de la souris seront correctement détectés. Il ne faut donc utiliser cette fonctionnalité que dans le but
d’obtenir un squelette de fichier [Link], que l’on personnalisera ensuite. Ce fichier pourra être
copié dans le répertoire /etc/X11/ sous le nom [Link] une fois qu’il aura été corrigé.
Utilisation de xorgconfig
Comme il l’a été indiqué plus haut, xorgconfig est un programme fonctionnant en mode texte
exclusivement. Son principe de fonctionnement est très simple : il pose une série de questions sur votre
matériel, puis il génère un fichier [Link] générique pour votre matériel. Vous pourrez ensuite partir
de ce modèle pour personnaliser votre configuration et pour préciser les paramètres que xorgconfig ne
prend pas en charge.
Le principal problème de xorgconfig est qu’il ne laisse pas droit à l’erreur. La moindre faute de frappe ou
la moindre hésitation est prise comme une réponse valide, et il est impossible de revenir en arrière. Cela
est d’autant plus énervant que dans ce cas, il ne reste plus qu’une solution, qui est de tout recommencer à
partir du début. Après trois ou quatre erreurs, on finit par faire extrêmement attention à ce que l’on tape.
Lorsqu’on lance xorgconfig, il commence par afficher un message indiquant qu’il va créer un nouveau
fichier de configuration [Link] que l’on pourra utiliser par la suite comme point de départ pour
383
Chapitre 10. Installation de XWindow
paramétrer son système XWindow. Il faut valider pour passer ce message et commencer la configuration
proprement dite.
La première question que xorgconfig pose est le type de la souris que vous voulez utiliser. Il existe un
grand nombre de types de souris sur le marché, cependant seuls deux types sont réellement courants.
Initialement, les souris se connectaient sur le port série des ordinateurs. Ces souris, dites souris sérielles,
étaient relativement répandues et sont généralement référencées sous le terme de « compatible
Microsoft ». Il faut donc utiliser l’option « Microsoft compatible (2-button protocol) » pour
ces souris. Notez que certaines souris sérielles utilisent un protocole différent pour gérer un troisième
bouton. Si vous disposez d’une telle souris, il faut choisir l’option « Mouse Systems (3-button
protocol) ».
Plus récemment, le port PS/2 est apparu pour les claviers et les souris. Ce port permet de gérer
directement la plupart des souris actuelles, et il est probable que votre souris soit une souris PS/2.
L’option à utiliser est cette fois l’option « PS/2 Mouse ». Il faut surtout ne pas confondre les souris PS/2
avec les souris bus (que l’on peut utiliser avec l’option « Bus Mouse »), qui sont des souris relativement
peu répandues et qui utilisaient des bus spéciaux. Les autres options sont réservées à des souris peu
répandues. Si vous en utiliser une, vous devez choisir l’option correspondante.
Notez que les souris à molette connectées sur le port PS/2 utilisent un protocole de communication
légèrement différent de celui que les autres souris PS/2 utilisent. Malheureusement, xorgconfig ne
propose pas d’option pour ces souris, et une intervention manuelle dans le fichier de configuration
[Link] est nécessaire pour les configurer. La manière de procéder sera détaillée dans la la section
intitulée Description du fichier [Link] .
La question suivante demande si vous désirez activer la fonctionnalité d’émulation d’un troisième bouton
pour les souris à deux boutons. Cette émulation permet d’utiliser les nombreux programmes pour
XWindow qui nécessitent d’utiliser une souris à trois boutons. Le clic sur le troisième bouton est alors
simulé en appuyant sur les deux boutons de la souris simultanément. Il est très vivement recommandé de
répondre par ’y’ à cette question si votre souris ne dispose que de deux boutons. En revanche, si elle
dispose de plus de trois boutons, ou si elle dispose d’une roulette, il faut répondre par la négative.
xorgconfig demande ensuite le port sur lequel votre souris est connectée. Ce port est généralement le
port /dev/ttyS0 pour les souris sérielles et /dev/psaux pour les souris PS/2. Les distributions créent
souvent un lien symbolique /dev/mouse sur le port effectivement utilisé par la souris, si bien que la
réponse par défaut utilise ce port. C’est la réponse recommandée, validez donc pour passer à la question
suivante.
Vient ensuite la sélection du type de clavier. Encore une fois, un certain nombre de modèles de claviers
ont été vendus sur le marché. Cependant, seuls quelques-uns sont réellement répandus. En France, on
trouve essentiellement les claviers internationaux 102 touches et 105 touches, auxquels correspondent les
réponses « Generic 102-key (Intl) PC » et « Generic 105-key (Intl) PC ». Si vous utilisez
un clavier Microsoft Natural Keyboard, choisissez l’option « Microsoft Natural ».
Vous devrez ensuite indiquer la disposition de ce clavier. Il faut évidemment choisir l’option « French ».
xorgconfig demande alors de saisir un nom de variante pour le clavier choisi. Comme le clavier français
n’est décliné que sous une seule variante, vous pouvez simplement valider pour passer à la suite de la
configuration du clavier.
xorgconfig vous propose alors de modifier des paramètres additionnels du clavier (emplacement des
touches modificatrices telles que les touches de majuscule, de contrôle et de jeu de caractères alternatif,
état des diodes, etc.). En général, cela n’est pas nécessaire et vous pouvez répondre ’n’ à cette question.
384
Chapitre 10. Installation de XWindow
La partie difficile vient ensuite. xorgconfig vous le signale avec un message indiquant que les
informations de synchronisation horizontale et verticale sont extrêmement importantes pour configurer
correctement les modes vidéo. La signification de ces valeurs vous sera décrite plus loin en détail, pour
l’instant, contentez-vous de récupérer le manuel de votre moniteur et recherchez ses caractéristiques
précises. Validez ensuite pour passer à la question suivante.
xorgconfig vous demande alors la plage de fréquences horizontales que votre moniteur est en mesure
d’accepter. Il propose un certain nombre de choix standards, qui correspondent aux différents types de
moniteurs existant sur le marché. Cependant, ces valeurs sont les plus mauvaises, car il est fort probable
que votre moniteur sache faire mieux que ce que les standards imposent. Vous devez donc soit accepter
une des plages de valeurs proposées, soit saisir la plage correspondant exactement à votre moniteur à
l’aide de l’option « Enter your own horizontal sync range ». Si vous choisissez cette dernière
option, vous devrez ensuite saisir la plage de valeurs des fréquences horizontales de votre moniteur. Ne
les inventez pas, cela ne marchera pas. Saisissez les vraies valeurs.
La même question est alors posée pour la plage de fréquences verticales. Encore une fois, vous pouvez
choisir l’une des plages proposées selon le type de votre moniteur, ou saisir vous-même la plage de
fréquences citée dans ses caractéristiques techniques à l’aide de l’option « Enter your own
vertical sync range ». À l’issue de cette question, xorgconfig vous demande de saisir le nom du
moniteur que vous venez ainsi de configurer. Ce nom est arbitraire, il ne sert que pour l’identifier de
manière lisible par la suite. Entrez, par exemple, le nom du modèle de l’écran dont vous disposez.
La question suivante vous demande simplement si vous désirez choisir votre carte graphique dans la liste
des cartes graphiques supportées par [Link]. Il est recommandé de répondre par l’affirmative en tapant
’y’. xorgconfig affiche alors la liste des cartes gérées, qui est assez longue. En fait, elle se présente sur
plusieurs pages, et il faut appuyer sur la touche Entrée pour passer d’une page à la suivante. Si vous
avez passé une page de trop, vous êtes bon pour passer toutes les pages pour revenir à la première, avant
d’aller sur la page contenant votre carte graphique. Lorsque vous aurez trouvé votre carte, choisissez
l’option correspondante et validez.
Si votre carte n’est pas présente dans la liste, cela ne signifie pas qu’elle n’est pas supportée par [Link].
En effet, chaque pilote est capable de prendre en charge un type de puce électronique, et il arrive que
plusieurs cartes graphiques soient basées sur une électronique provenant d’un même fabricant. C’est la
raison pour laquelle les pilotes de [Link] portent généralement le nom des puces utilisées par les cartes.
Par conséquent, si vous ne trouvez pas votre carte dans la liste, vous pouvez essayer de spécifier le pilote
correspondant à l’électronique de votre carte. Dans le pire des cas, vous pourrez quasiment toujours
utiliser le pilote générique VESA, qui permet de piloter toutes les cartes graphiques compatibles avec les
standards VESA 2.0. Cependant, vous ne bénéficierez d’aucune accélération matérielle avec ce pilote.
Les questions qui suivent dépendent fortement de la carte sélectionnée. En effet, chaque carte peut avoir
besoin d’un certain nombre de paramètres complémentaires pour fonctionner. Encore une fois, ces
paramètres sont, normalement, indiqués dans le mode d’emploi de votre carte graphique ou, au pire, sur
les composants de la carte eux-mêmes. Une des questions courantes concerne la quantité de mémoire
vidéo dont cette carte dispose. Pour cette question, les choix les plus courants sont proposés, mais vous
pouvez également spécifier vous-même cette quantité à l’aide de l’option « Other ». L’unité est ici le
kilo-octet, pensez donc bien à multiplier par 1024 le nombre de méga-octet de mémoire vidéo de votre
carte graphique avant de saisir la valeur. Lorque la configuration de la carte graphique sera terminée,
xorgconfig vous demandera de saisir le nom de cette carte. Encore une fois, ce nom est arbitraire, mais
vous devriez saisir un nom cohérent avec votre modèle.
xorgconfig vous propose alors de modifier l’ordre d’utilisation des modes graphiques pour chaque
385
Chapitre 10. Installation de XWindow
profondeur de couleur. Cet ordre doit être spécifié en donnant les numéros des différents modes, les uns
après les autres, et en ne les séparant pas par des espaces. Par exemple, le nombre 432 sélectionnera les
modes 4, 3 et 2, soit les modes 1024x768, 800x600 et 640x480. Notez que l’ordre des numéros est
important, c’est l’ordre dans lequel ces modes seront choisi lorsqu’on basculera de l’un à l’autre.
Lorsque vous aurez saisi les modes graphiques à utiliser et leur ordre d’apparition, xorgconfig vous
proposera d’utiliser un écran virtuel de taille supérieure à la résolution physique du plus grand des modes
graphiques choisi. Cela signifie que la résolution de l’affichage sera supérieure à celle de votre écran, et
que XWindow fera défiler automatiquement l’image affichée lorsque la souris sortira de la portion
d’image visible. Il est en général conseillé de répondre par la négative à cette question, car cela peut être
facilement déroutant. Cependant, c’est une affaire de goût, et vous êtes libre d’accepter ce
comportement. Notez que quelle que soit la réponse que vous donnerez, XWindow utilisera comme
résolution logique la résolution du plus grand mode que vous avez sélectionné. Par conséquent, ce
mécanisme de défilement sera encore utilisé pour les modes graphiques de résolution inférieure, avec
comme taille d’écran virtuel la taille du mode ayant la résolution la plus grande. Lorsque vous aurez
configuré tous vos modes graphiques, vous pourrez passer à la suite en choisissant l’option « The modes
are OK, continue. ».
xorgconfig vous demande alors le nombre de couleurs à utiliser par défaut lorsque vous démarrez en
mode graphique. Choisissez bien, car il ne sera pas possible de changer cette valeur une fois que
l’environnement graphique sera lancé. Vous pourrez bien entendu la modifier manuellement, mais il vous
faudra relancer le serveur X après cela. La plupart des cartes graphiques modernes supportent les modes
graphiques à 16 millions de couleurs, la réponse recommandée est donc « 24 bits (16 million
colors) ».
Enfin, la dernière question est tout simplement si vous désirez enregistrer le fichier [Link]
correspondant aux options que vous avez choisies. Il faut bien entendu répondre par ’y’, ou sinon vous
devriez vous demander pourquoi vous êtes en train de lire ceci...
Le fichier [Link] généré est généralement fonctionnel, mais parfaitement améliorable. Le format de
ce fichier sera décrit en détail dans la la section intitulée Description du fichier [Link] . Si vous
l’ouvrez, vous constaterez que xorgconfig a ajouté un nombre impressionnant de commentaires pour
vous aider dans vos expérimentations. Bien entendu, vous trouverez également des informations
complémentaires dans la page de manuel [Link].
Utilisation de xorgcfg
La manière la plus agréable d’effectuer la configuration de [Link] est sans nul doute d’utiliser l’utilitaire
xorgcfg. Ce programme permet aussi bien de créer un fichier de configuration [Link] initial que de
modifier une configuration existante de manière graphique. Il dispose également d’un mode texte, qui
reprend les mêmes questions que xorgconfig, mais d’une manière plus conviviale, à l’aide d’un système
de menus.
386
Chapitre 10. Installation de XWindow
fichier [Link] utilisé par le serveur X auquel il se connecte si celui-ci utilise un autre fichier que le
fichier du système : le serveur X n’est utilisé par xorgcfg que pour son affichage.
Si, en revanche, la variable d’environnement DISPLAY n’est pas définie, xorgcfg considère que
XWindow n’est pas installé sur la machine locale et appelle le serveur X avec l’option -configure afin
de générer un nouveau fichier [Link]. Il lance ensuite le serveur X détecté et utilise ce serveur pour
permettre la modification du fichier [Link] ainsi créé.
À son démarrage, il vérifie que la souris est correctement configurée. Si tel n’est pas le cas, il propose
d’utiliser les touches du curseur du pavé numérique pour déplacer le pointeur de la souris, ainsi que les
touches /, * et - respectivement pour le premier, le deuxième et le troisième bouton de la souris. Je
déconseille fortement d’essayer d’effectuer la configuration dans ces conditions, car ce n’est réellement
pas utilisable. Dans ce cas de figure, on cherchera plutôt à utiliser l’interface en mode texte de xorgcfg,
que nous présenterons dans la section suivante.
L’interface de xorgcfg en mode graphique est très simple. La partie supérieure de la fenêtre comprend un
menu avec deux entrées. La première entrée permet de choisir les différentes parties intervenant dans la
configuration. La deuxième entrée (intitulée « Expert Mode ») donne accès quant à elle à un mode de
paramétrage permettant d’éditer directement les propriétés du fichier [Link]. Ce mode de
fonctionnement est réservé aux utilisateurs avertis et ne sera pas décrit ici.
La première entrée de menu comprend plusieurs options. L’option « Configure Layout » permet
d’effectuer la configuration générale du display. L’option « Configure Screen » permet de configurer
la disposition des différents écrans d’un même display les uns par rapport aux autres. Elle n’est
réellement utile que dans le cas des configurations à plusieurs écrans. L’option « Configure
Modeline » donne la possibilité de configurer les différents modes graphiques de chaque configuration.
Enfin, l’option « Configure AccessX » permet de spécifier les options des différents périphériques
d’entrée. Ces deux options de menus sont réservées aux utilisateurs expérimentés et ne seront pas
décrites dans ce document.
L’essentiel de la configuration se fait dans l’écran affiché lorsque l’option « Configure Layout » est
choisie. Cet écran est constitué d’une barre d’icônes permettant d’ajouter les différents périphériques à la
configuration courante : souris, claviers, cartes graphiques et moniteurs. Il n’est possible d’éditer qu’une
387
Chapitre 10. Installation de XWindow
seule configuration à la fois, la configuration courante peut être sélectionnée à l’aide du bouton situé dans
la partie inférieure gauche de la fenêtre. Le corps de la fenêtre elle-même contient une représentation de
cette configuration, avec les différents périphériques utilisés et les relations qui existent entre eux.
En cliquant avec le bouton droit de la souris sur ces éléments, vous pouvez faire apparaître un menu
contextuel concernant cet élément. Ce menu peut contenir l’option « configure », qui donne accès à
une boîte de dialogue permettant d’éditer les propriétés de l’élément, l’option « option », qui permet
d’ajouter des options générales à cet élément, les options « enable » et « disable », qui permettent
d’activer ou de désactiver l’élément en question dans la configuration, et l’option « remove », dont le but
est de supprimer l’élément concerné.
Une configuration typique comprend au moins une souris, un clavier, une carte graphique et un moniteur.
Il est recommandé d’ajouter les éléments de la configuration dans cet ordre, afin d’éviter d’avoir à
revenir plusieurs fois sur certains de ces éléments.
La boîte de dialogue ouverte par l’option « configure » sur une souris comprend un champ contenant
l’identificateur de cette souris, la liste des fichiers spéciaux de périphériques pour la sélection du fichier
spécial de périphérique auquel la souris est connectée, la liste des protocoles gérés par [Link] et un
bouton permettant d’activer l’émulation du troisième bouton pour les souris à deux boutons.
Généralement, les souris sont connectées soit sur le port série (fichier spécial de périphérique
/dev/ttyS0 ou /dev/ttyS1), soit sur le port PS/2 (fichier spécial de périphérique /dev/psaux). Les
principaux protocoles gérés par [Link] sont les suivants :
Microsoft
C’est le protocole utilisé par la plupart des souris connectées sur le port série. Ce type de souris est
de plus en plus rare actuellement, ne choisissez cette option que si vous disposez de ce type de
souris ;
IntelliMouse
C’est le protocole utilisé par les souris à molette connectées sur le port série. N’utilisez pas ce
protocole pour les souris à molette connectées sur le port PS/2, la souris ne fonctionnerait pas.
PS/2
C’est le protocole qui convient pour la majorité des souris connectées sur un port PS/2. Notez
toutefois que ce n’est pas le cas des souris à molette Logitech et Microsoft ;
IMPS/2
C’est le protocole des souris à molette connectées sur port PS/2. Malheureusement, ce protocole
n’est pas proposé par xorgcfg. Il est donc impossible de configurer une souris de ce type avec cet
utilitaire, sauf à passer dans le mode expert. La configuration à utiliser pour ce type de souris sera
décrite dans la la section intitulée Description du fichier [Link] .
Lorsque vous aurez configuré votre souris, vous pourrez utiliser le bouton « Apply changes » pour
prendre en compte les changements si vous avez modifié les paramètres de la souris courante. Dès lors,
vous devriez avoir une souris fonctionnelle, et vous pouvez l’activer avec l’option « enable » du menu
contextuel. Lorsque la souris est activée, un lien apparaît entre l’unité centrale de l’ordinateur et cette
souris dans la fenêtre de xorgcfg.
388
Chapitre 10. Installation de XWindow
La boîte de dialogue ouverte par l’option « configure » du menu contextuel des claviers comprend,
comme la boîte de dialogue des propriétés des souris, un champ permettant de saisir le nom de ce clavier
dans la configuration. Vous pouvez également choisir le modèle de clavier et sa disposition en fonction
de sa langue. Pour les claviers français, le modèle à utiliser est généralement celui des claviers
internationaux 102 ou 105 touches, et la disposition à utiliser est la disposition « French ». Lorsque
vous aurez configuré le clavier correctement, vous pourrez appliquer les changements avec le bouton
« Apply changes ». Vous pourrez également activer le clavier dans la configuration courante à l’aide
de l’option « enable » du menu contextuel du clavier. Un lien entre ce clavier et l’unité centrale doit
alors apparaître dans la fenêtre principale de xorgcfg.
La boîte de configuration des cartes graphiques contient le champ habituel pour donner un nom à la carte
et la liste des cartes graphiques reconnues automatiquement par [Link]. Si votre carte ne se trouve pas
dans cette liste, vous devrez choisir le pilote à utiliser. En général, les pilotes portent le nom de la puce
électronique sur laquelle la carte graphique est basée. Si aucun pilote n’est adapté pour votre carte, vous
pourrez malgré tout utiliser un des pilotes génériques vga ou vesa. Enfin, dans le cas où plusieurs cartes
graphiques sont installées dans l’ordinateur, vous devrez spécifier l’adresse de la carte sur le bus
PCI/AGP. N’oubliez pas d’activer la carte graphique à l’aide de l’option « enable » du menu contextuel
lorsque vous aurez fini la configuration.
La boîte de dialogue des moniteurs permet de spécifier un nom pour le moniteur ainsi que ses plages de
fréquences horizontales et verticales. Vous pouvez aussi sélectionner la carte graphique à laquelle ce
moniteur est connectée. La liste ne propose que les cartes graphiques que vous avez configuré
précédemment. Les moniteurs n’ont pas besoin d’être activés, car il sont liés aux cartes graphiques.
Une fois la configuration générale définie, vous pouvez, si elle contient plusieurs écrans, spécifier la
disposition relative de ces écrans à l’aide de l’option « Configure Screen » du menu principal de
xorgcfg. Cette option affiche les différents écrans dans la fenêtre de xorgcfg, et vous pouvez les faire
glisser pour les disposer comme vous le désirez.
Enfin, l’option de menu principal « Configure Modeline » vous permettra de définir de nouveaux
modes graphiques et de les ajuster. Cet écran fournit les mêmes fonctionnalités que l’utilitaire xvidtune,
que l’on décrira en détail dans la la section intitulée Utilisation de xvidtune. Cet écran ne sera donc pas
traité plus en détail ici.
Lorsque vous quittez xorgcfg, il vous propose d’enregistrer le fichier de configuration
/etc/X11/[Link] correspondant à la configuration que vous venez de définir. Vous pouvez
spécifier un autre nom si vous le désirer, afin d’enregistrer ces paramètres dans un autre fichier. xorgcfg
demande également si vous désirez sauvegarder la configuration du clavier, pour le cas où vous auriez
modifié les paramètres des périphériques d’entrée.
xorgcfg -textmode
389
Chapitre 10. Installation de XWindow
Lors de son démarrage, xorgcfg affiche un écran d’accueil que vous pouvez passer en validant l’option
« Ok ».
xorgcfg affiche ensuite son menu principal, qui comprend des entrées pour ajouter des souris, claviers,
moniteurs et cartes graphiques. Ce menu contient également une entrée « Configure screen », qui
permet d’associer les cartes graphiques aux moniteurs, et une entrée « Configure layout », qui
permet de configurer le display en spécifiant le clavier, la souris et les différents écrans à utiliser.
Le menu de configuration de la souris permet d’ajouter, de supprimer et de modifier des souris. L’ajout
d’une souris nécessite de saisir un identificateur pour la souris, le protocole que cette souris utilise et si le
troisième bouton doit être simulé ou non. xorgcfg demande également le fichier spécial de périphérique à
utiliser pour accéder à cette souris. Notez que xorgcfg ne permet pas de choisir le protocole IMPS/2
utilisé par les souris à molette connectées sur le port PS/2, ce type de souris ne peut donc pas être
configuré avec cet outil.
De la même manière, le menu de configuration du clavier demande de saisir un identificateur lorsqu’on
ajoute un nouveau clavier. Le type de clavier est également demandé, ainsi que sa disposition. Pour les
claviers français, il faut utiliser les claviers internationaux 102 ou 105 touches.
La configuration des moniteurs permet de spécifier un identificateur pour le moniteur, ainsi que les
plages de fréquences horizontales et verticales. La configuration des cartes graphiques quant à elle
permet également de spécifier un identificateur pour la carte, et de choisir le type de carte dans la liste
des cartes prises en charge par [Link]. Si votre carte n’est pas listée, vous devrez choisir l’option « **
Unlisted card ** » et indiquer le pilote à utiliser pour cette carte. Ce pilote porte généralement le
nom de la puce électronique sur laquelle cette carte est conçue, mais vous pouvez également utiliser les
pilotes génériques vga et vesa pour les cartes graphiques compatibles avec ces standards. Enfin,
xorgcfg vous propose de spécifier l’adresse de la carte sur le bus PCI/AGP, pour le cas où vous auriez
plusieurs cartes installées sur la même machine.
Les identifiants donnés aux moniteurs et aux cartes sont utilisés dans le menu de configuration des
écrans, qui demande quelle carte et quel moniteur sont utilisés pour chaque écran. La profondeur de
couleur par défaut est également demandée, ainsi que la liste des modes graphiques gérés par cet écran.
Notez que l’interface en mode texte de xorgcfg ne permet pas de définir de nouveaux modes graphiques,
pour cela, il faut recourir à l’interface en mode graphique ou éditer manuellement le fichier de
390
Chapitre 10. Installation de XWindow
configuration [Link].
Enfin, le menu de configuration général permet de définir, de modifier et de supprimer les displays.
Chaque display doit contenir une référence à une souris, un clavier et un ou plusieurs écrans. Remarquez
encore une fois que l’interface en mode texte de xorgcfg ne permet pas de préciser la disposition relative
des écrans les uns par rapport aux autres. Pour cela, vous devrez utiliser l’interface en mode graphique
ou éditer manuellement le fichier de configuration de [Link].
Lorsque vous aurez fini la configuration de [Link], vous pourrez l’enregistrer à l’aide du menu « Write
[Link] and quit ». Ce menu vous demande le chemin complet sur le fichier de configuration à
écrire. Vous pouvez spécifier un autre fichier que le fichier de configuration du système si vous désirez
l’éditer et le modifier manuellement de manière indépendante.
391
Chapitre 10. Installation de XWindow
La troisième section globale est la section « Module ». Cette section contient les commandes de
chargement des différents modules du serveur X, lorsque ce serveur est compilé sous forme modulaire.
Chaque module gère une certaine partie des fonctionnalités, et celles-ci peuvent donc être activées ou
désactivées au niveau de cette section.
Viennent ensuite les sections de configuration des displays. Ces sections décrivent chacune un des
aspects du display, et peuvent apparaître en de multiples exemplaires.
Le premier type de section de configuration des displays regroupe toutes les sections qui définissent les
périphériques d’entrée de données (clavier, souris, table de digitalisation, etc.). Ces sections sont toutes
nommées « InputDevice ».
Le deuxième type de section de configuration contient la définition des adaptateurs graphiques. Ces
sections permettent de donner les renseignements nécessaires pour la configuration des différentes cartes
graphiques installées sur le système. Elles sont toutes nommées « Device ».
Viennent ensuite les sections « Monitor » qui, comme leur nom l’indique, permettent de définir les
caractéristiques physiques des différents moniteurs utilisables. Encore une fois, il peut exister plusieurs
sections de ce type, pour définir plusieurs moniteurs dans les configurations multi-têtes.
Normalement, chaque moniteur est, en fonction de ses capacités, capable de gérer différents modes
graphiques. Les sections « Monitor » peuvent donc contenir des définition de modes graphiques, mais
ce n’est pas la technique recommandée. En effet, il est possible d’utiliser plusieurs moniteurs avec des
modes graphiques identiques, aussi [Link] donne-t-il la possibilité de définir les modes graphiques en
dehors des sections « Monitor » (ce n’est toutefois pas une obligation). Dans ce cas, les modes
graphiques seront définis dans des sections nommées « Modes », et celles-ci seront référencées par les
sections des moniteurs qui les utilisent.
Les moniteurs sont faits pour être branchés sur des cartes graphiques. Comme on l’a vu ci-dessus, il est
possible de définir plusieurs sections « Device » et plusieurs sections « Monitor », afin de décrire
plusieurs cartes graphiques et plusieurs moniteurs. Il faut donc spécifier quels moniteurs sont connectés à
quelles cartes graphiques. C’est exactement le rôle des sections « Screen ». Pour [Link], un écran n’est
donc rien d’autre qu’un couple fonctionnel moniteur / carte graphique. Notez que certaines cartes
graphiques haut de gamme peuvent prendre en charge plusieurs écrans. Dans ce cas, il faudra définir
plusieurs sections « Device » pour la même carte graphique, et spécifier les ports de sortie dans les
options de ces sections.
Enfin, il ne reste plus qu’à définir le display lui-même. Nous avons déjà défini la notion de display
ci-dessus comme étant le regroupement d’un clavier, d’une souris et d’un ou plusieurs écrans. Ces
associations sont donc définies dans des sections nommées « ServerLayout ». Une section de ce type
contient donc nécessairement une référence à une section « InputDevice » pour le clavier et une
section « InputDevice » pour le périphérique de pointage, et une ou plusieurs sections « Screen »
pour les écrans utilisés par le serveur X. Dautre part, comme leur nom l’indique, les sections
« ServerLayout » permettent également de spécifier la disposition relative des écrans les uns par
rapport aux autres, dans le cas des configurations multi-têtes.
392
Chapitre 10. Installation de XWindow
Nous allons à présent décrire un peu plus en détail les différentes sections qui ont été présentées ici.
Toutes ces sections sont introduites par le mot clé « Section » suivi du type de la section, indiqué entre
guillemets, et se terminent toutes par le mot clé « EndSection ». Entre ces deux balises, un certain
nombre d’informations peuvent être spécifiées, et peuvent même être regroupées en sous-sections. Étant
donné le grand nombre d’options qui peuvent être indiquées dans les sections du fichier [Link],
seules les plus classiques seront décrites ci-dessous.
Section « Files »
La section « Files », contient les chemins vers les ressources utilisés par [Link]. Ce peut être les
répertoires de polices de caractères, les répertoires d’installation des modules du serveur X, ou encore
des chemins indiquant l’adresse et le port de serveurs de polices sur un réseau. Cette section est donc
relativement riche de renseignements pour le serveur X. Un exemple typique de section « Files » est
donné ci-dessous :
Section "Files"
RgbPath "/usr/X11R6/lib/X11/rgb"
FontPath "/usr/X11R6/lib/X11/fonts/local"
FontPath "/usr/X11R6/lib/X11/fonts/misc"
FontPath "/usr/X11R6/lib/X11/fonts/75dpi"
FontPath "/usr/X11R6/lib/X11/fonts/100dpi"
ModulePath "/usr/X11R6/lib/modules"
393
Chapitre 10. Installation de XWindow
EndSection
Les chemins indiqués sont des chemins Unix classiques, et sont introduits par les mots clés
« FontPath », « RgbPath » et « ModulePath » respectivement pour les chemins sur les répertoires de
polices, les répertoires de fichiers de définition de couleurs et les répertoires d’installation des modules.
Cependant, comme on le verra plus loin, l’accès aux serveurs de polices se fait à l’aide d’une syntaxe de
chemin particulière.
Section « ServerFlags »
Cette section regroupe les principales options globales de tous les serveurs X. Ces options sont
généralement introduites à l’aide du mot clé « Option », suivi du nom de l’option entre guillemets,
lui-même suivi d’une éventuelle valeur pour cette option, elle aussi entre guillemets. Par exemple,
l’option :
Option "DontZap"
Section « Module »
Cette section contient la liste des modules que les serveurs X doivent charger lorsqu’ils démarrent. Ces
modules peuvent être spécifiés de deux manières différentes, une abrégée et une plus complète. La forme
abrégée utilise le mot clé « Load », suivi du nom du module entre guillemets. Par exemple, la ligne
suivante permet de demander le chargement du module de gestion des polices TrueType :
Load "freetype"
La forme complète utilise une sous-section, introduite par le mot clé « SubSection » suivi du nom du
module entre guillemets, et se terminant par le mot clé « EndSubSection ». Ces sous-sections ont la
394
Chapitre 10. Installation de XWindow
même structure que les sections normales, et permettent de spécifier des options pour le module à l’aide
du mot clé « Option ». Par exemple, les extensions du serveur X peuvent être chargées à l’exception de
l’extension DGA à l’aide de la sous-section suivante :
SubSection "extmod"
Option "omit [Link]-DGA"
EndSubSection
Note : L’extension DGA permet aux applications d’accéder directement à la mémoire vidéo de la
carte graphique. La désactiver accroît donc la sécurité du système, mais peut empêcher certaines
applications de fonctionner correctement. C’est le cas des jeux, et surtout des programmes de
télévision sous XWindow. Par conséquent, il est probable que vous vouliez laisser ces extensions
activées. Dans ce cas, il suffit simplement de ne pas spécifier l’option omit de l’exemple précédent.
Outre les modules freetype et extmod donnés dans les exemples précédents, vous pourrez peut-être
utiliser les modules dri et glx. Ces modules permettent respectivement d’activer les fonctionnalités
DRI (abréviation de l’anglais « Direct Rendering Infrastructure ») du noyau et le support de la 3D par
OpenGL. Les différentes cartes capables de gérer les fonctionnalités DRI sont celles listées dans la
configuration du noyau, que l’on a déjà vue dans la la section intitulée Compilation du noyau Linux dans
Chapitre 7. Notez toutefois que ces fonctionnalités ne sont indispensables pour utiliser le module glx
que pour ces cartes. En particulier, les cartes graphiques basées sur les puces NVidia peuvent utiliser le
module glx sans charger le module dri, car le pilote fourni par NVidia utilise un autre mécanisme.
Section « InputDevice »
Les sections « InputDevice » permettent de décrire tous les types de périphériques d’entrée. En
pratique, il s’agira souvent de claviers et de souris, mais il est également possible de connecter des
périphériques plus exotiques tels que les joysticks et les tablettes de dessin.
Les sections « InputDevice » doivent être nommées avec un identificateur unique, introduit par le mot
clé « Identifier ». Ce mot clé doit être suivi du nom de la section, donné entre guillemets. C’est ce
nom qui sera utilisé pour référencer la section dans les sections « ServerLayout » pour définir les
différents displays.
La nature du périphérique d’entrée est ensuite spécifiée par la valeur de l’option « Driver ». En
pratique, on utilisera quasiment toujours Keyboard ou Mouse, qui correspondent bien évidemment aux
pilotes pour les claviers et les souris.
La suite des options de la section « InputDevice » est fonction de la nature du pilote utilisé. Les
options les plus courantes pour un clavier sont données dans l’exemple suivant :
Section "InputDevice"
Identifier "Clavier 1"
Driver "Keyboard"
395
Chapitre 10. Installation de XWindow
EndSection
De même, vous trouverez ci-dessous un exemple typique de section « InputDevice » pour une souris :
Section "InputDevice"
Identifier "Souris 1"
Driver "Mouse"
EndSection
Note : Pour les souris à molette connectées sur port PS/2, vous devrez choisir le protocole
« IMPS/2 » au lieu du protocole « PS/2 » et indiquer que la souris a 5 boutons. De plus, vous devrez
ajouter l’option « ZAxisMapping » dans la section « InputDevice » de votre souris, et lui donner la
valeur « 4 5 ». Cette option permet de rediriger la rotation de la molette sur les événements des
boutons 4 et 5 de la souris. De cette manière, vous pourrez utiliser votre molette dans toutes les
applications qui gèrent ces deux boutons.
396
Chapitre 10. Installation de XWindow
Sections « Device »
Les sections « Device » contiennent les descriptions des cartes graphiques utilisées. Ces descriptions
n’indiquent absolument pas quel est le serveur X utilisé : elles ne contiennent qu’une description du
matériel. Notez, encore une fois, qu’il est possible de définir plusieurs sections « Device », qui pourront
être utilisées dans les sections « Screen » associant les cartes graphiques aux moniteurs.
Tout comme les sections « InputDevice », les sections « Device » doivent disposer d’un identificateur
unique, afin de pouvoir les référencer dans les sections « Screen » qui les utilisent. Cet identificateur est
introduit par le mot clé « Identifier » et suivi d’un nom indiqué entre guillemets.
Les sections « Device » peuvent contenir un certain nombre d’options permettant de caractériser la carte
graphique et de préciser ses capacités (mémoire, rapidité, adresse sur le bus PCI, etc.). Toutes ces options
sont bien entendu spécifiques aux différentes cartes graphiques, et ne seront pas décrites en détail ici.
L’option la plus importante est sans doute l’option « Driver », qui permet d’indiquer le pilote que le
serveur X devra charger pour piloter cette carte graphique. C’est à ce niveau qu’il faut surtout ne pas se
tromper, puisque la moindre erreur ferait échouer le démarrage du serveur X. En général, les pilotes
portent le nom du chipset utilisé par la carte graphique, si bien qu’il n’est pas difficile de déterminer la
valeur exacte à utiliser. [Link] fournit également deux pilotes génériques vga et vesa, permettant
respectivement de prendre en charge les cartes graphiques compatibles avec le standard VGA ou
compatibles avec le standard VESA 2.0. Sachez cependant que ces pilotes ne disposent d’aucune
accélération matérielle, et que leurs performances sont donc bien inférieures aux pilotes spécialisés pour
chaque carte graphique.
Vous trouverez ci-dessous un exemple de section « Device » typique :
Section "Device"
Identifier "Carte 1"
VendorName "CHAINTECH"
BoardName "TORNADO I7000"
Note : Les options des sections « Device » ne sont pas très compliquées à utiliser. Cependant,
quelques-unes peuvent poser des problèmes lorsqu’on réalise des configurations multi-têtes
(c’est-à-dire des configurations disposant de plusieurs écrans). Dans la majorité des cas, il faut
installer plusieurs cartes graphiques dans le PC pour pouvoir utiliser plusieurs écrans. En général,
on utilise une carte AGP et une ou plusieurs cartes PCI. Il va de soi qu’il faut que chaque pilote
397
Chapitre 10. Installation de XWindow
utilise la bonne carte, aussi faut-il indiquer, dans chaque section « Device », l’adresse de la carte
décrite par la section. Cette adresse est définie à l’aide de l’option « BusID ». Cette option permet de
retrouver la carte graphique sur les différents bus systèmes. Les cartes AGP utilisant le même
mécanisme d’adressage que les cartes PCI, on utilisera la syntaxe suivante :
"PCI:bus:périphérique:fonction"
où bus est le numéro du bus PCI sur lequel se trouve la carte graphique, périphérique est le
numéro du périphérique sur ce bus, et fonction est le numéro de la fonction à utiliser pour accéder
à ce périphérique. Vous pouvez utiliser la commande lspci pour afficher les caractéristiques des
différents bus PCI de votre machine et déterminer les valeurs utilisées par vos cartes graphiques.
Certaines cartes graphiques haut de gamme disposent de plusieurs contrôleurs vidéo et sont donc
capables de gérer plusieurs écrans. Pour ces cartes graphiques, le principe de fonctionnement est le
même : il faut écrire une section « Device » pour chaque contrôleur vidéo existant. Cependant, étant
donné que toutes ces sections s’adressent à la même carte graphique, il est impossible de les
distinguer par l’intermédiaire de l’option « BusID ». Dans ce cas, on utilise alors l’option « Screen »,
suivie du numéro du contrôleur vidéo que la section décrit. Ce numéro doit être donné juste après
l’option « Screen », sans guillemets. La numérotation des contrôleurs vidéo commence à 0. C’est
cette valeur qui est utilisée pour toutes les cartes graphiques ne disposant que d’un seul contrôleur
vidéo.
Sections « Monitor »
Les sections « Monitor » contiennent les informations descriptives des écrans. Notez qu’il est possible
de définir plusieurs sections « Monitor », pour plusieurs écrans potentiels. Cependant, chaque section
« Screen » devra utiliser un moniteur et un seul.
Les sections « Monitor » sont certainement les sections les plus importantes du fichier [Link].
Elles contiennent en effet toutes les informations concernant les moniteurs et tous les paramètres des
modes graphiques utilisés par ces moniteurs. Ces informations sont utilisées par le serveur X pour
programmer les signaux vidéo que la carte graphique envoie au moniteur. Il est donc évident que chaque
section « Monitor » est spécifique à un modèle de moniteur donné, et que la détermination des valeurs
qui doivent y être écrites requiert une bonne connaissance du fonctionnement de ce moniteur et de ses
caractéristiques physiques. Vous trouverez une description générale du fonctionnement des moniteurs
dans les paragraphes qui suivent. Il est impératif de bien les assimiler si vous désirez créer ou modifier
une section « Monitor », car si les informations qui y sont stockées sont erronées, le moniteur
correspondant risque d’être gravement endommagé.
Le principe de fonctionnement des tubes cathodiques utilisés dans les moniteurs est très simple : à
chaque instant, un faisceau d’électrons généré par un canon à électrons vient frapper un point d’une
plaque phosphorescente située juste derrière la vitre du moniteur. L’énergie cinétique des électrons du
faisceau est transformée en lumière par le phosphore en ce point, qui reste ainsi lumineux tant que le
faisceau frappe ce point. Comme un seul faisceau est utilisé pour tous les points de la plaque
phosphorescente, il faut déplacer le faisceau de point en point pour pouvoir tous les éclairer. Cela a bien
entendu pour conséquence que les points ne restent lumineux que pendant un temps très court.
Cependant, nous percevons la luminosité de ce point pendant un temps beaucoup plus long, en raison de
la rémanence des cellules de l’œil. Les points de l’écran semblent donc être tous allumés en même
398
Chapitre 10. Installation de XWindow
temps, bien qu’à chaque instant un seul d’entre eux est atteint par le faisceau d’électrons. Nous voyons
ainsi l’image complète du moniteur.
Le déplacement du faisceau d’électrons est assuré par un champ magnétique généré par des bobinages
magnétiques à l’arrière du tube cathodique. Le faisceau balaye l’écran ligne par ligne, de gauche à droite
(en regardant le moniteur de face). À chaque fois qu’il atteint le bord gauche, il retourne rapidement vers
le début de la ligne suivante, sur le bord droit du moniteur. Ce retour se fait simplement en modifiant
brusquement le champ magnétique qui dirige le faisceau. Il va de soi que le faisceau d’électrons est
coupé pendant ce retour de balayage, car s’il ne l’était pas, on le verrait traverser l’écran de droite à
gauche et perturber ainsi l’image. De plus, le champ magnétique n’est pas facilement contrôlable lorsque
le retour du faisceau commence. Par conséquent, il est nécessaire que ce retour se fasse un certain temps
après que le bord droit ait été éteint. Si ce n’était pas le cas, l’image serait déformée près des bords du
moniteur. Le faisceau électronique continue donc de balayer l’écran sur une petite zone après le bord de
l’image, sans émettre de lumière. Cette zone s’appelle le « blanking » horizontal.
De même, le faisceau électronique retourne rapidement en haut de l’écran dès qu’il en atteint le bas. Pour
les mêmes raisons que pour les retours de balayage horizontal, le faisceau doit être éteint un peu avant et
pendant la modification du champ magnétique lors des retours de balayage vertical. La zone ainsi
parcourue par le faisceau après le bord de l’image s’appelle le « blanking » vertical.
Note : Il est possible d’utiliser d’autres méthodes de balayage que celle décrite ci-dessus. En
particulier, les modes graphiques entrelacés ne suivent pas ce principe. Dans ces modes, seulement
une ligne sur deux est balayée à chaque génération d’image. Les lignes paires sont d’abord
affichées pour une première image, puis les lignes impaires sont affichées pour l’image suivante.
Ces modes graphiques étaient utilisés lorsque les moniteurs n’étaient pas suffisamment rapides
pour afficher une image complète sans que l’on puisse voir le balayage du faisceau d’électrons. De
nos jours, il est déconseillé d’utiliser ces modes, car l’image a tendance à trembler du fait de l’écart
de luminosité alternatif entre les lignes paires et impaires de l’écran.
Les limitations techniques de la technologie des tubes cathodiques imposent une limite supérieure pour
la vitesse de balayage, et une limite inférieure pour la durée des retours de balayage horizontal et
vertical, ainsi que pour la durée minimale du blanking. Les caractéristiques techniques des tubes sont
donc souvent spécifiés en terme de fréquences de balayage et de durées des signaux de synchronisation.
Les vieux moniteurs ne pouvaient supporter qu’un nombre limité de fréquences de balayage, que l’on
qualifiaient alors de « fixes ». De nos jours, les écrans multisynchrones acceptent toutes les fréquences
comprises dans une plage de valeur, et s’adaptent donc aux fréquences des signaux émis par les cartes
graphiques.
La fréquence de balayage vertical utilisée dans un mode graphique donné constitue le taux de
rafraîchissement de l’écran, c’est-à-dire le nombre de fois que l’image de l’écran est affichée par
seconde. Il est évident qu’un taux de rafraîchissement trop faible ne permet pas d’avoir une image
agréable à regarder, car elle semble trembler ou clignoter. Un tube cathodique de bonne qualité est donc
un tube qui permet d’utiliser de hautes fréquences verticales. Comme il est nécessaire d’afficher toutes
les lignes pour afficher une image complète, il va de soi qu’un bon tube doit également être capable
d’afficher les lignes rapidement, et donc accepter des fréquences de balayage horizontal élevées.
Typiquement, les fréquences de balayage horizontal sont environ mille fois plus élevées que les
fréquences de balayage vertical, puisque chaque ligne peut contenir environ mille pixels.
La sensibilité au taux de rafraîchissement dépend des personnes et de l’emploi que l’on fait du tube. Les
tubes destinés à être regardés de loin peuvent utiliser des fréquences beaucoup plus faibles que les tubes
399
Chapitre 10. Installation de XWindow
de proximité. Ainsi, les télévisions affichent 25 images par seconde (en fait, elles affichent 50
demi-images par seconde, car elles utilisent l’entrelacement). En revanche, ce taux de rafraîchissement
est très insuffisant pour les moniteurs d’ordinateurs, où la limite inférieure est de 60 Hz. Le standard
VESA exige des taux de 72 Hz ou plus pour que l’image soit agréable à regarder, mais de nombreux
écrans supportent facilement 85 Hz ou plus de nos jours. Certaines personnes ne sont cependant pas
dérangées par des taux aussi faibles que 60 Hz. Il est bon de savoir quel taux de rafraîchissement vous
convient, car un balayage insuffisant peut fatiguer vos yeux, même sans que vous en soyez conscient. Et
cette fatigue se traduit toujours un jour ou un autre par des maux de tête inexpliqués... Ne vous vantez
donc pas de voir le balayage, c’est un grave handicap par rapport à ceux qui ne le voient pas et qui donc
ont moins de maux de tête que vous !
Vous pouvez utiliser la méthode suivante pour déterminer si le taux de rafraîchissement est suffisant pour
vous. Commencez par afficher une image blanche sur la totalité de la surface visible de votre moniteur.
Puis réglez la luminosité du moniteur à son maximum. Placez-vous ensuite de biais par rapport à votre
moniteur, et regardez en face de vous. Concentrez ensuite votre attention sur l’image de l’écran, sans le
regarder directement (regardez-le « en coin »). Normalement, vous devez percevoir l’image avec les
cellules latérales de la rétine, qui donnent une image moins précise que les cellules centrales, mais qui
sont plus sensibles aux mouvements (ces cellules nous servent en quelque sorte d’antennes). Ces cellules
sont donc plus aptes à percevoir les variations rapides de luminosité de l’image dues au balayage du
faisceau électronique. Si l’image semble clignoter, c’est que le taux de rafraîchissement de l’écran est
insuffisant. Sinon, vous tenez le bon taux, ne le lâchez pas.
Certaines caractéristiques techniques des tubes cathodiques influent sur les autres et permettent donc de
modifier le taux de rafraîchissement. Il est évident que si la durée du retour du faisceau est importante,
l’écran ne peut pas générer beaucoup d’images par seconde. Par conséquent, plus la durée du retour de
balayage est longue, moins bon peut être le taux de rafraîchissement. Il en va de même pour la durée du
blanking. Les bons écrans disposent donc souvent de retours de balayage rapides et de courtes durées de
blanking. Mais diminuer ces durées nécessite une électronique plus précise au niveau du contrôle des
champs magnétiques dirigeant le faisceau d’électrons. Il est également évident que la résolution du mode
graphique influe sur le taux de rafraîchissement. Si la résolution est élevée, il y a plus de pixels à afficher
au total sur chaque ligne de l’écran. À vitesse de balayage des pixels fixée, le temps nécessaire pour
balayer une ligne est donc plus grand. Et comme il y a plus de lignes à afficher, le temps nécessaire pour
générer une image complète est plus grand, et le taux de rafraîchissement est plus faible. Donc, si le test
décrit dans le paragraphe précédent vous indique que votre taux de rafraîchissement est trop faible, vous
pouvez tenter de baisser la résolution.
Note : Notez que la profondeur de couleur utilisée n’intervient absolument pas dans le taux de
rafraîchissement. Cette profondeur n’est un facteur limitant qu’au niveau de la carte graphique, qui
peut ne pas avoir assez de mémoire pour afficher un mode de grande résolution avec toutes les
couleurs désirées ou ne pas avoir une électronique assez rapide pour traiter toutes les données à
une vitesse raisonnable.
Le signal vidéo émis par la carte graphique contient toutes les informations dont le moniteur a besoin
pour générer l’image. Ces informations spécifient bien entendu l’intensité du faisceau d’électrons, mais
aussi les signaux de synchronisation qui contrôlent les retours de balayage horizontal et vertical. Ce sont
les informations de synchronisation que les sections « Monitor » du fichier [Link] contiennent. On
comprend donc l’importance de ces informations pour la qualité de l’image, aussi bien en terme de
stabilité qu’en termes de taux de rafraîchissement.
400
Chapitre 10. Installation de XWindow
Les sections « Monitor » sont constituées grosso modo de deux parties. La première partie contient les
caractéristiques générales de l’écran, telles que son nom, son modèle et le nom de son fabricant. Elle
contient également les plages de fréquences de balayage horizontal et vertical. La deuxième partie
contient les définitions des modes graphiques, à raison d’une ligne par mode graphique utilisable. La
documentation de [Link] appelle ces lignes des « lignes de mode » (« modelines » en anglais). Il est
évident que les informations fournies dans les lignes de mode sont très sensibles, et déterminent tous les
paramètres du mode graphique : résolution, position et taille de l’image sur l’écran, taux de
rafraîchissement.
La première partie d’une section « Monitor » ressemble à ceci :
Section "Monitor"
Identifier "Moniteur 1"
# Marque et modèle du moniteur (informations facultatives) :
VendorName "SONY"
ModelName "MULTISCAN 100ES"
# Plage de fréquence horizontale (information capitale) :
HorizSync 30-70
# Plage de fréquence verticale (information capitale) :
VertRefresh 50-120
Le mot clé « Identifier » permet de donner un nom à la section « Monitor ». Ce sera ce nom que
l’on utilisera plus loin dans la section « Screen » pour indiquer que l’on désire utiliser ce moniteur. Les
mots clés « VendorName » et « ModelName » permettent de donner la description du moniteur. Les
informations stockées ici n’ont aucun effet sur la configuration du moniteur et sont simplement
indicatives. En revanche, les plages de fréquences horizontales et verticales indiquées respectivement
après les mots clés « HorizSync » et « VertRefresh » sont d’une importance capitale. Elles donnent
les plages de fréquences auxquelles le moniteur peut travailler, et servent à contrôler la validité des lignes
de mode données dans la deuxième partie de la section « Monitor ». Il est donc important de donner ici
les valeurs exactes, que vous trouverez normalement dans la fiche technique de votre moniteur (cette
fiche est souvent imprimée à la fin du mode d’emploi). Pour les moniteurs multisynchrones, les plages de
fréquences utilisables peuvent être données par leurs fréquences minimale et maximale, séparées d’un
tiret. Les fréquences fixes peuvent être spécifiées simplement avec une seule valeur. Il est possible de
spécifier plusieurs fréquences fixes et plusieurs plages de fréquences en les séparant par des virgules.
L’unité utilisée pour les fréquences horizontales est le kilohertz, et celle utilisée pour les fréquences
verticales est le Hertz.
La deuxième partie de la section « Monitor » contient les lignes de mode, à raison d’une ligne de mode
par mode graphique que le moniteur est capable d’afficher. En général, une ligne de mode ressemble à
ceci :
Modeline "1024x768" 92.96 1024 1064 1240 1352 768 768 778 802
mais il existe cette une autre syntaxe, beaucoup plus claire car elle différencie les différentes valeurs
données dans la ligne précédente :
Mode "1024x768"
DotClock 92.96
401
Chapitre 10. Installation de XWindow
La première valeur indiquée entre guillemets dans les lignes de mode est le nom du mode graphique.
Comme on le verra plus tard, c’est ce nom qui est utilisé pour spécifier les modes graphiques utilisables
dans la section « Screen ». La deuxième valeur est la fréquence de base des signaux émis par la carte
graphique. Cette vitesse est exprimée en MHz et représente le nombre de pixels par seconde que le
faisceau électronique du moniteur balaye. Les quatre valeurs suivantes fixent les paramètres horizontaux
du mode graphique : résolution horizontale, pixel à partir duquel le signal de synchronisation pour le
retour de balayage horizontal commence, pixel auquel ce signal s’arrête et longueur totale de la ligne en
pixel, blanking compris. De même, les quatre dernières valeurs fixent les paramètres verticaux du mode
graphique, à savoir résolution verticale, ligne de début et ligne de fin du signal de synchronisation pour le
retour de balayage vertical, et nombre de lignes total du mode graphique. On notera que les informations
concernant le signal de synchronisation du balayage horizontal sont toutes multiples de 8. Cette
contrainte est imposée par le matériel de la plupart des cartes graphiques. D’autre part, l’unité utilisée
pour ces valeurs est le pixel. Il faut donc se baser sur la fréquence de base indiquée au début de la ligne
de mode pour les convertir en temps. Les informations concernant le signal de synchronisation vertical,
quant à elles, sont exprimées en nombre de lignes. Elles peuvent ne pas être multiples de 8. La
conversion en temps se calcule cette fois à partir de la fréquence de base et de la longueur totale d’une
ligne horizontale pour ce mode graphique. Enfin, il est possible de rajouter des options complémentaires
à la fin des lignes de mode pour préciser le fonctionnement du mode graphique, à l’aide du mot-clef
« Flags ». L’option la plus courante étant sans aucun doute « Interlace », qui permet de créer des
modes entrelacés. L’option « Doublescan » quant à elle permet de faire en sorte que chaque ligne est
affichée deux fois de suite. Elle permet de créer des modes graphiques de faible résolution, qui utilisent
des fréquences de balayage trop faibles pour les moniteurs actuels. Vous pourrez trouver les autres
options dans la page de manuel [Link].
La section « Monitor » se termine, comme toute section du fichier [Link], par une ligne de fin de
section :
EndSection
Comme vous vous en êtes aperçu, les données stockées dans les lignes de mode sont assez techniques.
Quelques explications complémentaires ne seront donc pas de trop pour comprendre l’influence de ces
paramètres et pour créer de nouvelles lignes de mode.
Pour commencer, la fréquence de base de la ligne de mode doit évidemment être gérée par la carte
graphique. Vous pouvez déterminer la fréquence de base maximale en regardant les informations
affichées par le serveur X adapté à cette carte lorsqu’il démarre. Cette information est toujours juste,
même si les lignes de mode écrites dans votre fichier [Link] ne conviennent pas et que le serveur X
ne démarre pas correctement. La ligne contenant cette fréquence maximale est semblable à celle-ci :
402
Chapitre 10. Installation de XWindow
Cette fréquence de base peut être générée par la carte graphique, mais il n’est pas certain qu’elle soit
supportée par le moniteur. En effet, les moniteurs ne sont pas capables de gérer les fréquences de base au
delà d’une certaine limite. La gamme de fréquences qu’ils acceptent est ce que l’on appelle leur bande
passante. La fréquence de base doit donc être dans cette bande passante, c’est-à-dire qu’elle doit être
inférieure à la fréquence maximale que le moniteur peut gérer. La bande passante de votre moniteur est
normalement indiquée dans sa fiche de spécifications techniques. Si toutefois ce n’est pas le cas, vous
pouvez vous faire une idée de la fréquence la plus élevée de cette bande passante en regardant la
résolution maximale qu’il peut afficher et en consultant ce tableau :
Les valeurs des fréquences indiquées dans ce tableau sont les plus petites valeurs constatées pour
l’ensemble des moniteurs gérés par [Link]. On peut donc supposer que votre moniteur gère ces
fréquences, et certainement même de plus hautes.
La résolution du mode graphique est donnée par la première des quatre valeurs des paramètres
horizontaux et verticaux dans la ligne de mode. Ainsi, dans la ligne de mode exemple donnée ci-dessus,
la résolution horizontale est de 1024 et la résolution verticale est de 768. Sachez que vous êtes
parfaitement libre d’utiliser des résolutions non standards, en écrivant les lignes de mode
correspondantes. Dans l’exemple donné ci-dessus, il s’agit simplement du mode graphique 1024x768.
Notez, encore une fois, que la profondeur de couleur n’intervient absolument pas dans les paramètres du
moniteur. Ils n’interviennent que dans les composants de la carte graphique qui sont chargés de générer
les signaux vidéos pour le moniteur.
La quatrième valeur des paramètres horizontaux donne la longueur totale des lignes physiques dans ce
mode. Cette longueur comprend bien entendu la partie visible de l’image, mais également la partie due
au blanking horizontal. Rappelons que le blanking est la partie balayée par le faisceau alors qu’il est
éteint, ce qui comprend la partie balayée pendant la durée du signal de synchronisation horizontal. Dans
l’exemple donné ci-dessus, le blanking a une longueur égale à 1352-1024 pixels, soit 328 pixels. La
quatrième valeur des paramètres verticaux fixe de même le nombre de lignes total du mode, en tenant
compte des lignes du blanking vertical.
Comme vous pouvez le constater dans la ligne de mode exemple, le pixel auquel le signal de
synchronisation commence n’est pas le dernier pixel visible. En effet, il y a 40 pixels d’écart entre le
dernier pixel visible (en l’occurrence, le pixel 1024) et le pixel auquel le signal de synchronisation
horizontal commence (le pixel 1064). Cet espace fait partie du blanking, il sert de marge pour éviter les
perturbations dues au retour de balayage et pour positionner l’image sur l’écran. Cette zone noire se
trouve au delà du bord droit de l’image affichée. Elle est suivie par la zone qui serait balayée pendant la
durée du retour de balayage si le faisceau poursuivait sa route au lieu de revenir sur le bord gauche. Cette
zone se termine au pixel indiqué par la troisième valeur (1240 dans notre exemple). Ce pixel est donc
403
Chapitre 10. Installation de XWindow
toujours positionné sur le point le plus à droite que le moniteur peut afficher. Par conséquent, la taille de
la partie du blanking situé à la droite de l’image est égale au numéro du pixel où le signal de
synchronisation horizontal se termine moins le nombre de pixels affichés. Dans notre exemple, cette
partie de blanking a une taille de 1240-1024 pixels, soit 216 pixels. La taille de la partie du blanking
horizontal situé à la gauche de l’écran est donc logiquement égale à la longueur totale de la ligne (1352)
moins le pixel où le signal de synchronisation se termine (1240), ce qui donne 112 pixels. Vous voyez
ainsi que l’on peut décaler l’image vers la gauche en augmentant les valeurs de départ et de fin du signal
de synchronisation. Inversement, on peut décaler l’image vers la droite en diminuant ces valeurs.
Le même raisonnement peut être appliqué aux paramètres verticaux du mode graphique. Le blanking
vertical comprend les lignes balayées avant et après le signal de synchronisation, ainsi que les lignes
balayées pendant le temps où ce signal est généré. La dernière ligne de ce signal est, encore une fois, la
ligne la plus basse que le moniteur peut afficher. On peut donc déplacer l’image vers le haut ou vers le
bas en jouant sur les valeurs de départ et de fin du signal de synchronisation vertical dans les paramètres
verticaux du mode graphique.
En augmentant le nombre de pixels physiques pour chaque ligne et en conservant la même résolution, la
largeur de l’image visible est réduite. En effet, la proportion de la partie visible de l’image sur la largeur
totale de l’écran est d’autant plus faible que le nombre de pixels physiques des lignes est grand. Le même
raisonnement peut être appliqué sur les paramètres verticaux. L’image peut donc être agrandie ou réduite
horizontalement et verticalement en jouant sur la longueur totale des lignes et sur la hauteur totale de
l’image. Si l’on veut que l’image reste centrée, il faut également décaler les points de début et de fin des
signaux de synchronisation, pour que la proportion du blanking placée de part et d’autre de l’image reste
constante.
Il faut bien comprendre que la modification des paramètres de synchronisation et de la longueur totale de
404
Chapitre 10. Installation de XWindow
la ligne est soumise à de fortes contraintes. Il faut s’assurer que les durées des signaux de synchronisation
et du blanking restent dans les limites de ce que peut accepter le moniteur. De plus, le nombre de points
balayés au total est évidemment le produit de la longueur totale des lignes et du nombre de lignes total du
mode. À fréquence de base fixe, cela revient à définir le taux de rafraîchissement, puisque plus il y a de
pixels à balayer dans chaque image, moins il est possible d’afficher d’images par seconde. Cela n’est pas
gênant si vous pouvez augmenter la fréquence de base. Par contre, si vous avez atteint la limite de votre
carte graphique, ou la limite de bande passante de votre moniteur, vous serez limité dans le taux de
rafraîchissement si vous devez réduire les dimensions de l’image affichée.
Vous devez vous en doutez à présent : l’écriture d’une ligne de mode est un sport très difficile. La
technique à utiliser est itérative. Vous pouvez tourner en rond pendant un certain temps, si vous ne savez
pas vous y prendre. La première des choses à faire est de choisir la dimension de l’image que vous
désirez obtenir. Cette dimension va fixer la largeur totale et le nombre de lignes total qui seront utilisés
pour ce mode graphique. Vous pouvez toujours partir des lignes de mode utilisées pour les modes
graphiques VESA pour un moniteur semblable au vôtre. Une fois que vous aurez ces valeurs, vous
pourrez essayer de faire monter le taux de rafraîchissement en augmentant la fréquence de base. Vous
aurez peut-être à redimensionner et à recentrer l’image sur le moniteur. Les quatre contraintes à respecter
lorsque vous augmentez la fréquence de base sont bien entendu la durée du blanking horizontal et
vertical, la durée des signaux de synchronisation et les plages de fréquences horizontales et verticales
acceptées par votre moniteur. Il est probable que vous aurez à accroître l’écart entre les valeurs de début
et de fin des signaux de synchronisation, car leur durée peut baisser dangereusement lorsque la fréquence
de base augmente. Malheureusement, cela peut vous limiter dans la possibilité de centrer l’image sur
votre moniteur. Une image dont les bords ne sont pas rectilignes ou pas nets est un signe indiquant que le
signal de synchronisation n’est pas suffisamment long. Si vous ne vous en sortez pas, c’est que vous
essayez d’atteindre un taux de rafraîchissement trop élevé.
Si vous désirez fabriquer un mode graphique de résolution non standard, vous ne trouverez pas
forcément une ligne de mode pouvant servir de point de départ. Dans ce cas, il va vous falloir créer cette
ligne de mode ex-nihilo. Vous trouverez dans le fichier de documentation [Link] de [Link]
les explications permettant de créer une ligne de mode correcte à partir des caractéristiques de votre
moniteur. Pour les moniteurs multisynchrones, la technique suivante peut être utilisée.
La première étape est de trouver la bande passante de votre moniteur et les plages de fréquences
horizontales et verticales utilisables par votre moniteur. Ces données sont très souvent fournies dans la
documentation du moniteur. Par exemple, pour un moniteur Sony Multiscan 100ES, ces plages de
fréquences sont les suivantes :
La deuxième étape est de choisir la résolution que l’on désire utiliser. Supposons que l’on veuille utiliser
une résolution intermédiaire entre 1024x768 et 800x600 sur ce type d’écran 15 pouces. Prenons par
exemple 904x678. Notez que la résolution horizontale est divisible par 8, et que la résolution verticale est
égale aux trois quarts de cette dernière. Ce rapport permet simplement de conserver la proportion de 4/3
des écrans d’ordinateurs. Pour pouvez cependant choisir un autre rapport si vous le désirez.
Vous devez ensuite déterminer les longueurs totales des lignes en pixels et le nombre total de lignes,
405
Chapitre 10. Installation de XWindow
blanking compris. C’est cette partie qui est la plus difficile, elle nécessite de connaître les durées
minimales des signaux de synchronisation horizontaux et verticaux. Ces données sont hélas rarement
fournies par les fabricants. Heureusement, on peut s’en passer en pratique, car tous les écrans
cathodiques utilisent la même technologie. En général, la longueur totale d’une ligne est égale à la
résolution horizontale divisée par 0,8, et le nombre total de lignes est égal à la résolution verticale
augmentée de 5%. Pour notre mode graphique, le calcul est donc le suivant :
La longueur totale des lignes n’est pas multiple de 8, nous devons donc l’arrondir à 1136. De même, la
hauteur totale de l’image doit être arrondie à 712 lignes.
Nous disposons à présent des premières et dernières valeurs des paramètres horizontaux et verticaux de
la ligne de mode. Les paramètres intermédiaires, qui fixent le début et la fin des signaux de retour de
balayage, doivent être choisis de telle sorte que ces signaux commencent un peu après le début du
blanking et se terminent un peu avant le début de la génération de l’image suivante. En pratique, on peut
couramment considérer qu’une marge de 32 à 40 pixels est suffisante pour les signaux de
synchronisation horizontaux, et qu’il faut 0 à 10 lignes pour les signaux de synchronisation verticaux.
L’écart entre le début et la fin de ces signaux doit être suffisamment grand pour garantir leurs durées
minimales exigées (mais a priori inconnues) par votre moniteur. Dans notre exemple, nous pouvons donc
choisir les paramètres suivants :
Il reste à déterminer la fréquence de base à utiliser. Le but est bien entendu d’obtenir le taux de
rafraîchissement le plus élevé possible, donc la fréquence de base la plus élevée, tout en restant dans les
limites de la carte graphique et du moniteur. La contrainte la plus forte en générale est la fréquence
maximale de balayage horizontal.
Dans notre cas, l’écran est capable de travailler à 70 kHz au plus, c’est-à-dire d’afficher 70000 lignes par
seconde. Comme notre mode graphique utilise 712 lignes physiques au total, cela nous donne un taux de
rafraîchissement de 70000/712, soit environ 98 images par seconde. Bien entendu, il faut contrôler que
cette fréquence est bien dans la plage de fréquences verticales du moniteur. C’est bien le cas ici, puisqu’il
peut supporter des fréquences allant jusqu’à 120 Hz. En général, il faut prendre la plus petite de ces
valeurs comme taux de rafraîchissement initial.
Une fois le taux de rafraîchissement déterminé, nous devons calculer la fréquence de base à utiliser. Pour
afficher 98 images de 710 lignes de 1125 pixels par seconde, nous calculons cette fréquence de la
manière suivante :
406
Chapitre 10. Installation de XWindow
Encore une fois, il faut contrôler que la carte graphique peut générer un signal de cette fréquence et que
celle-ci est bien inférieure à la bande passante du moniteur. Dans le cas contraire, il faudrait encore une
fois se limiter à la plus petite de ces valeurs. La plupart des cartes graphiques récentes peuvent monter au
moins jusqu’à 150MHz, et l’écran Sony Multiscan 100ES a une bande passante bien supérieure à cette
valeur. Nous pouvons donc conserver cette fréquence de base, et obtenons donc la ligne de mode
suivante :
Mode "904x678"
DotClock 79.26
HTimings 904 944 1096 1136
VTimings 678 683 707 712
EndMode
Cette ligne de mode a peu de chances d’être satisfaisante sans retouches, mais elle peut servir de point de
départ pour la recherche de la ligne de mode idéale. En général, les paramètres étant choisis proches de
l’optimum, l’image sera bien trop grande ou déformée sur les bords. Vous devrez donc faire des
ajustements manuels pour vous rapprocher, petit à petit, d’une ligne de mode utilisable. Vous pourrez
utiliser l’utilitaire xvidtune pour cela. Cet utilitaire est un utilitaire fourni avec [Link], qui permet de
modifier les dimensions et la position de l’image interactivement. Cet utilitaire fonctionne directement
sous XWindow, et permet donc d’avoir un aperçu de l’image avec les paramètres modifiés. Vous
trouverez une description plus détaillée de la manière d’utiliser xvidtune dans la la section intitulée
Utilisation de xvidtune.
Seul le redimensionnement de l’image modifie le nombre total de lignes et leur longueur totale. En
particulier, la réduction de la taille de l’image accroît la taille totale des lignes et leur nombre, ce qui
entraîne la baisse du taux de rafraîchissement. À chaque fois que vous réduisez l’image, vous pourrez
recalculer le taux de rafraîchissement et la fréquence de base nécessaire pour atteindre ce taux, tout en
veillant à ne dépasser ni les limites de votre carte graphique, ni celles de votre moniteur.
Ainsi, après quelques modifications de la ligne de mode dans xvidtune et réajustements de la fréquence
de base, la ligne de mode suivante peut être obtenue :
Mode "904x678"
DotClock 79.82
HTimings 904 920 1104 1144
VTimings 678 679 710 712
EndMode
Cette ligne de mode permet d’obtenir un affichage correct en 904 par 678, avec un taux de
rafraîchissement de 97.99 Hz, ce qui est plus qu’honorable. On constate que la première ligne de mode
utilisait une durée de balayage vertical trop petite, ce qui provoquait des déformations sur les bords de
l’image.
Si vous voulez approfondir le sujet, vous pouvez lire les formules mathématiques donnant les relations
entre les différents paramètres techniques influant sur la génération des images dans l’Annexe C. Ces
formules sont données à titre indicatif, elles ne vous donneront pas les caractéristiques techniques de
votre écran. Encore une fois, je ne saurais trop vous recommander d’utiliser les outils fournis avec votre
distribution...
407
Chapitre 10. Installation de XWindow
Sections « Modes »
Généralement, les lignes de mode sont définies pour un moniteur donné, car l’apparence de l’image
dépend des caractéristiques physiques de chaque moniteur. Par conséquent, ces lignes sont définies la
plupart du temps dans les sections « Monitor ». Cependant, il peut être utile de regrouper toutes les
lignes de mode d’un type de moniteur donné dans une section à part, afin de structurer et d’organiser le
fichier [Link].
Pour cela, on écrira des sections « Modes », qui n’auront donc pas d’autre rôle que de contenir une ou
plusieurs lignes de mode, et qui seront référencées dans les sections « Monitor » des moniteurs qui
désirent utiliser ces lignes de mode. L’intérêt de regrouper toutes les lignes de mode dans une section
« Modes » apparaît clairement dès que plusieurs sections « Monitor » utilisent les mêmes lignes de
mode. Ce peut être le cas pour des moniteurs d’un même fabricant ou possédant des caractéristiques
techniques similaires.
Le format des sections « Monitor » est très simple, puisqu’elles ne contiennent qu’un identificateur,
introduit comme à l’accoutumée par le mot-clef « Identifier » suivi du nom de la section entre
guillemets, et les lignes de mode elles-mêmes. La syntaxe de ces lignes est exactement la même que celle
qui est utilisée dans la section « Monitor » et ne sera donc pas décrite plus en détail ici. Vous trouverez
ci-dessous un exemple de section « Modes » :
Sections « Screen »
Les sections « Screen » permettent de regrouper les moniteurs et les cartes graphiques pour effectuer
l’affichage des écrans d’un display, et d’indiquer les modes graphiques que l’on désire utiliser parmi tous
les modes que le moniteur indiqué sait gérer, pour chaque profondeur de couleur.
Les sections « Screen » sont, comme les sections « Monitor », constituées de deux parties. La
première partie spécifie les informations générales de l’écran, à savoir essentiellement la carte graphique
et le moniteur à utiliser. La deuxième partie quant à elle permet de préciser, pour chaque profondeur de
couleur utilisable avec cet écran, les résolutions des modes graphiques utilisables ainsi que les
paramètres des résolutions virtuelles. Voici trouverez ci-dessous un exemple de section « Screen » :
Section "Screen"
Identifier "Ecran 1"
Device "Carte 1"
Monitor "Moniteur 1"
DefaultDepth 24
SubSection "Display"
Depth 24
Modes "1024x768" "800x600" "640x480"
408
Chapitre 10. Installation de XWindow
EndSubSection
SubSection "Display"
Depth 16
Modes "1024x768" "800x600" "640x480"
EndSubSection
SubSection "Display"
Depth 8
Modes "1024x768" "800x600" "640x480"
EndSubSection
EndSection
• la profondeur de couleur considérée, exprimée en bits par pixels après le mot-clef « Depth » ;
• la liste des modes graphiques utilisables avec cette profondeur de couleur, référencés par le nom de
leur ligne de mode, après le mot-clef « Modes ». Plusieurs modes peuvent être spécifiés, en donnant
leurs noms respectifs, séparés par des espaces.
• des informations complémentaires concernant les résolutions virtuelles pour les modes dans lesquels
la résolution logique de l’écran est supérieure à la résolution réellement utilisée. Ces paramètres
indiquent la résolution logique de l’écran virtuel, ainsi que le positionnement de l’image affichée par
l’écran physique dans cet écran virtuel. Vous trouverez de plus amples informations sur ces options
dans la page de manuel [Link].
Sections « ServerLayout »
Le dernier type de section, qui regroupe toutes les informations des sections vues précédemment, est le
type des sections « ServerLayout ». Comme leur nom l’indique, les sections de ce type fournissent les
informations concernant la disposition des écrans d’un display. Cependant, dans la plupart des cas, les
displays n’ont qu’un seul écran, et il est évident que la disposition de cet écran est triviale dans ce cas.
Il peut exister plusieurs sections « ServerLayout » dans le fichier [Link]. En effet, ce fichier peut
être utilisé par plusieurs serveurs X qui peuvent tourner simultanément sur la même machine (que l’on
ait plusieurs cartes graphiques ou non). Chaque serveur X peut donc utiliser une section
409
Chapitre 10. Installation de XWindow
« ServerLayout ». La section utilisée par défaut est la première que le serveur X trouvera dans le
fichier [Link], mais il est possible de lui demander d’en utiliser une autre à l’aide d’une option en
ligne de commande. Toutefois, encore une fois, la plupart des machines ne disposent que d’un seul écran,
et même si l’on lance plusieurs serveurs X, il n’y a ici besoin que d’une seule section
« ServerLayout ».
Les sections « ServerLayout » indiquent surtout au serveurs X quels sont les périphériques d’entrée à
utiliser (au moins un clavier et une souris) en plus de l’écran ou les écrans du display. Ce sont donc ces
sections qui définissent complètement un display donné. L’exemple donné ci-dessous présente une
section « ServerLayout » simple :
Section "ServerLayout"
Identifier "Serveur 1"
Screen "Ecran 1"
InputDevice "Clavier 1" "CoreKeyboard"
InputDevice "Souris 1" "CorePointer"
Option "BlankTime" "5"
EndSection
Les sections « ServerLayout » disposent d’un nom qui permet de les identifier. Ce nom est le nom qui
sera utilisé dans la ligne de commande du serveur X si plusieurs sections « ServerLayout » sont
définies. Il doit être indiqué, comme d’habitude, à la suite du mot-clef « Identifier », entre guillemets.
Les sections « ServerLayout » doivent ensuite indiquer au moins un écran pour le display qu’elles
décrivent. Les écrans sont introduits à l’aide du mot-clef « Screen », suivi de l’identificateur de la
section « Screen » à utiliser. Si plusieurs écrans doivent être utilisés, il est possible de spécifier la
position des écrans les uns par rapport aux autres à l’aide d’options complémentaires, qui sont spécifiées
à la suite de l’identificateur de l’écran. Ces options permettent de positionner les écrans relativement les
uns aux autres, ou de manière absolue en précisant leurs coordonnées dans le système de coordonnées de
l’écran virtuel. Les options les plus simples à utiliser sont les options RightOf, LeftOf, Above et
Below, qui permettent d’indiquer respectivement que l’écran courant est situé à droite, à gauche, au
dessus ou en dessous de l’écran dont l’identificateur est spécifié juste après. Par exemple, si l’on veut
rajouter un deuxième écran à la section précédente, et que cet écran doit être situé à droite du premier
écran, on ajoutera simplement la ligne suivante :
La section « ServerLayout » doit ensuite contenir au moins une référence à un clavier et une référence
à un périphérique de pointage. Ces références sont introduites à l’aide du mot-clef « InputDevice »,
suivie de l’identificateur de la section « InputDevice » à utiliser. Le serveur X doit interpréter les
événements provenant des différents périphériques d’entrée correctement. Il faut en particulier lui
indiquer quels sont les périphériques principaux à l’aide de l’option CorePointer pour la souris
principale et l’option CoreKeyboard pour le clavier principal. Seuls les périphériques d’entrée
principaux seront utilisés en tant que clavier et en tant que souris.
Enfin, comme vous pouvez le voir dans l’exemple donné ci-dessus, il est possible d’utiliser des options
spécifiques pour chaque section « ServerLayout ». Ces options sont les mêmes que celles utilisées
dans la section « ServerFlags ». Vous pouvez donc ici spécifier une autre valeur que celles indiquées
410
Chapitre 10. Installation de XWindow
dans cette section, afin de préciser le comportement d’un serveur spécifique. Dans l’exemple donné
ci-dessus, l’économiseur d’écran a été réglé pour s’activer au bout de 5 minutes.
Note : La résolution virtuelle de l’écran n’est pas modifiée lorsqu’on change de résolution physique.
Elle est toujours égale à la plus grande des résolutions disponibles dans la section « Display »
utilisée. Seule la résolution physique de l’affichage est modifiée. Vous pourrez déplacer la zone
d’affichage en déplaçant la souris, et faire défiler ainsi tout l’écran.
Il est impossible de changer la profondeur de couleur utilisée sans redémarrer le serveur X. Les
seuls changements acceptés sont ceux concernant les résolutions graphiques listées dans la
sous-section « Display » pour la profondeur de couleur courante.
Utilisation de xvidtune
xvidtune est un petit utilitaire permettant de régler les paramètres d’affichage de chaque mode graphique.
Grâce à lui, vous pourrez ajuster la taille de l’image horizontalement et verticalement, ainsi que sa
411
Chapitre 10. Installation de XWindow
position par rapport aux bords du moniteur. xvidtune se lance simplement, en tapant son nom en ligne de
commande :
xvidtune
Dès qu’il démarre, il commence par afficher une fenêtre d’avertissement, pour vous prévenir qu’un usage
par une personne non avertie peut provoquer de sérieux dommages au moniteur. En effet, il permet de
modifier les paramètres de synchronisation horizontale et verticale du moniteur pour ajuster l’image. Si
vous choisissez de mauvais paramètres, vous pouvez sortir des spécifications techniques de votre
moniteur, ce qui pourrait fort bien l’endommager. Fort heureusement, la plupart des moniteurs modernes
disposent de mécanismes de sécurité qui les empêchent de générer l’image lorsque ces paramètres sont
incorrects. Par conséquent, il est assez rare d’avoir des problèmes avec cet utilitaire, d’autant plus qu’il
effectue des contrôles avant toute tentative douteuse. Vous pouvez donc valider en toute confiance, mais
soyez malgré tout averti des risques potentiels. Rappelons que le serveur X peut être arrêté à n’importe
quel moment à l’aide de la séquence de touches CTRL+ALT+BACKSPACE.
L’écran de xvidtune se compose de quatre parties. La partie supérieure gauche permet de régler les
paramètres horizontaux du mode graphique, à savoir la largeur de l’image et sa position par rapport aux
bords verticaux du moniteur. La partie supérieure droite permet de régler les paramètres verticaux, à
savoir la hauteur et la position par rapport aux bords horizontaux du moniteur. La partie inférieure droite
contient les informations essentielles sur le mode vidéo courant. Enfin, la partie inférieure gauche
contient les boutons permettant de choisir les actions à effectuer.
Les paramétrages horizontaux et verticaux du mode graphique peuvent être modifiés très simplement.
Les boutons « Left » et « Right » permettent de centrer l’image horizontalement, et les boutons
« Wider » et « Narrower » permettent d’ajuster sa largeur. De même, les boutons « Up » et « Down »
influent sur le centrage vertical, et les boutons « Shorter » et « Taller » ajustent sa hauteur.
Vous pouvez tester les modifications apportées à tout instant à l’aide du bouton « Test ». Il est même
recommandé d’essayer régulièrement les paramètres choisis et de procéder pas à pas. Lorsque les
paramètres conviennent, ils peuvent être appliqués immédiatement à l’aide du bouton « Apply ». Si vous
désirez générer une ligne mode valide pour la configuration courante, par exemple afin de modifier votre
fichier de configuration [Link], vous pouvez cliquer sur le bouton « Show ». La ligne de mode sera
affichée sur le terminal à partir duquel vous avez lancé xvidtune. Vous pourrez alors la recopier dans le
fichier [Link] à la place de la ligne de mode du mode graphique en cours d’utilisation.
Il est possible de changer le mode graphique courant en cliquant sur les boutons « Next » et « Prev ».
Ils permettent de passer en revue tous les modes graphiques qui ont été enregistrés dans le fichier
[Link] par xorgconfig ou xorgcfg. Une fois que vous aurez ajusté tous les modes graphiques et que
vous les aurez enregistrés à l’aide du bouton « Apply », vous pourrez quitter xvidtune en cliquant sur le
bouton « Quit ». Notez que le bouton « Apply » valide les choix en cours, mais ne les enregistre pas
dans le fichier [Link]. Vous devez reporter manuellement dans le fichier [Link] les paramètres
du mode courant, tels qu’ils sont présentés par la commande « Show ».
412
Chapitre 10. Installation de XWindow
exceptionnel), vous serez sans doute obligé d’utiliser le pilote vesa. Ce pilote permet d’utiliser toutes les
cartes compatibles avec le standard VESA 2.0 (c’est-à-dire la plupart des cartes graphiques, mais il
existe des exceptions notables).
Il existe une alternative à ce pilote, qui se base sur les fonctionnalités « frame buffer » du noyau de
Linux. Cette fonctionnalité permet d’utiliser Linux complètement en mode graphique, en fournissant un
accès linéaire direct à la mémoire vidéo de la carte graphique grâce au fichier spécial de périphérique
/dev/fb0. Il existe un pilote [Link] pour le frame buffer du noyau, qui permet donc de démarrer le
serveur X en s’appuyant complètement sur le noyau. L’avantage du frame buffer du noyau est que même
les consoles en mode texte feront leur affichage en mode graphique (cela est aussi un inconvénient du
point de vue des performances). En revanche, vous ne pourrez pas changer de résolution une fois que le
système aura démarré.
Pour accéder à la mémoire vidéo, le noyau se base également sur l’interface de programmation du
standard VESA 2.0, qui est gérée par le BIOS de la plupart des cartes graphiques récentes. Cela signifie
également que vous ne disposerez pas d’accélération matérielle en général, sauf pour quelques cartes
graphiques courantes reconnues par le noyau.
• « VESA VGA graphics console » (cette option permet d’utiliser un mode graphique VESA
indiqué au démarrage pour l’affichage de la console) ;
• « Advanced low level driver options (NEW) » (cette option vous permet de préciser la
structure de la mémoire vidéo dans les différents modes graphiques utilisés avec le frame buffer) ;
• « 8 bpp packed pixels support », « 16 bpp packed pixels support », « 24 bpp
packed pixels support » et « 32 bpp packed pixels support » (ces options correspondent
aux différentes structures de la mémoire vidéo qui sont utilisées par les modes graphiques VESA) ;
• « Select compiled-in fonts (NEW) » (cette option vous permet de choisir les polices de
caractères qui seront utilisées par la console) ;
• « VGA 8x8 font » et « VGA 8x16 font » (ces deux polices sont les polices standards utilisées par
la console).
Il faut ensuite vérifier que le fichier spécial de périphérique /dev/fb0 a été créé par le programme
d’installation de votre distribution. Si ce n’est pas le cas, vous devez le créer à l’aide de la commande
mknod. Le numéro de périphérique majeur de ce fichier est 29. Le numéro mineur à utiliser est le
numéro du périphérique. Par exemple, le fichier spécial de périphérique /dev/fb0 porte les numéros 29
413
Chapitre 10. Installation de XWindow
et 0, le fichier /dev/fb1 porte les numéros 29 et 1, etc. Ces fichiers sont tous de type caractère, la ligne
de commande pour créer un de ces fichiers est donc la suivante :
mknod fbn c 29 n
vga=mode
où mode est le numéro du mode graphique désiré. Les numéros valides sont indiqués dans le tableau
donné ci-dessous :
Couleurs Résolution
640x480 800x600 1024x768 1280x1024 1600x1200
256 769 771 773 775 796
32768 784 787 790 793 797
65536 785 788 791 794 798
16,8M 786 789 792 795 799
Si tout se passe correctement, votre système devrait démarrer dans le mode graphique indiqué et afficher
le logo de Linux (un pingouin nommé « Tux », pour ceux qui ne le sauraient pas encore). Lorsque vous
aurez déterminé le mode graphique qui vous convient, vous pourrez modifier le fichier de configuration
de Lilo et spécifier le numéro de ce mode dans la ligne « vga=... ». De cette manière, votre système
redémarrera automatiquement dans ce mode graphique.
Configuration du serveur X
Les manipulations précédentes n’ont pas grand intérêt si vous ne désirez travailler qu’avec la console. En
effet, l’affichage en mode graphique est beaucoup plus lent que l’affichage en mode texte, et l’affichage
du pingouin Tux au démarrage ne vous apportera pas grand chose. C’est pour cela que l’étape suivante
est normalement de configurer le serveur X de [Link] pour le pilote frame buffer, afin d’utiliser
l’environnement graphique XWindow et son système de fenêtrage.
La configuration du serveur X est élémentaire. Il faut avant tout s’assurer que l’on dispose bien du pilote
permettant au serveur X d’utiliser l’interface /dev/fb0. Ce pilote se nomme fbdev, et utilise un autre
module spécifique au système d’exploitation nommé fbdevhw. Il faut ensuite modifier ou créer le fichier
414
Chapitre 10. Installation de XWindow
[Link] pour utiliser ce pilote. Les seules sections à modifier pour utiliser le pilote frame buffer sont
la section « Device » et la section « Screen ».
La section « Device » est réduite à sa plus simple expression, puisque tous les paramètres sont fixés par
le mode VESA choisi au démarrage d’une part, et parce que le serveur X ne saurait pas les exploiter
d’autre part. Il suffit donc simplement d’indiquer que le pilote à utiliser est le pilote fbdev, et de donner
l’adresse de la carte vidéo sur le bus à l’aide du mot-clef « BusID » :
Section "Device"
Identifier "Carte 1"
Driver "fbdev"
BusID "PCI:1:5:0"
EndSection
Vous pourrez déterminer l’adresse de votre carte graphique à l’aide de la commande lspci, ou en
demandant au serveur X de scanner les bus PCI en lui passant l’option -scanpci en paramètre :
[Link] -scanpci
La section « Screen » est elle aussi très simplifiée, puisque le seul mode graphique utilisable est le
mode choisi au démarrage de la machine. La liste des modes utilisables peut donc être franchement
omise, ou se réduire à la valeur spéciale « default » :
Section "Screen"
Device "Carte 1"
Monitor "Moniteur 1"
DefaultDepth 16
SubSection "Display"
Depth 16
Modes "default"
EndSubSection
EndSection
Notez qu’il est impératif que la profondeur de couleur de la sous-section « Display » soit la même que
celle du mode VESA indiqué au démarrage. Prenez garde à ne pas utiliser une profondeur de couleur
trop élevée, car cela dégraderait encore un peu plus les performances. Par ailleurs, comme aucun mode
n’est spécifié dans la section « Screen », les lignes de mode des sections « Monitor » sont à présent
facultatives. Ces sections peuvent donc être simplifiées également.
Une fois ces modifications réalisées, vous devrez pouvoir démarrer XWindow simplement avec la
commande startx. Vous disposerez alors de toutes les fonctionnalités de XWindow, avec des
performances quelques peu inférieures à celles que vous auriez avec un serveur X adapté à votre carte
graphique. Il est conseillé de suivre l’actualité de [Link] afin de savoir si un tel serveur est en cours de
développement et, si oui, d’en récupérer une version finale dès que possible.
415
Chapitre 10. Installation de XWindow
Note : Pratiquement, le processus xdm se duplique pour chaque terminal X dont il gère la
connexion. Ainsi, chaque processus xdm propose la connexion et surveille la déconnexion de
l’utilisateur sur un terminal X donné. Tous les processus xdm sont lancés par le processus xdm initial
qui a été lancé par les scripts de changement de niveau d’exécution. Ce mécanisme est donc
complètement transparent pour l’utilisateur.
La plupart des environnement graphiques modernes (comme KDE et GNOME) fournissent leur
propre gestionnaire de display. Ces gestionnaires sont toutefois compatibles avec xdm, et leur
configuration se fait de la même manière.
Configuration de xdm
Le comportement de xdm est complètement défini dans ses fichiers de configuration, qui sont en général
placés dans le répertoire /etc/X11/xdm/. Ces fichiers de configuration décrivent chacun un des aspects
416
Chapitre 10. Installation de XWindow
du comportement de xdm. Le fichier de configuration principal est le fichier xdm-config, qui contient
les références sur les autres fichiers de configuration. Notez que si vous utilisez l’environnement de
bureau KDE et son gestionnaire de connexion kdm, les fichiers de configuration à utiliser sont ceux de
kdm. Bien qu’ils soient strictement compatibles avec ceux de xdm, ces fichers se situent dans le
répertoire de configuration de kdm. Ce répertoire est généralement le sous-répertoire
share/config/kdm/ du répertoire d’installation de KDE.
Serveurs X locaux
La définition des serveurs X qui n’utilisent pas le protocole XDMCP et que xdm doit prendre en charge
directement est réalisée dans le fichier de configuration référencé par la ligne
« [Link] » du fichier xdm-config. Par défaut, ce fichier est le fichier
/etc/X11/xdm/Xservers. Il contient une ligne par serveur, chaque ligne ayant la syntaxe suivante :
où display est le nom du display à utiliser, type est le type de serveur X (serveur local ou distant), et
commande est la commande à exécuter pour lancer le serveur s’il est local. Le display indiqué sera celui
qui sera utilisé pour définir la variable d’environnement DISPLAY, et doit donc utiliser la syntaxe
normale des displays. Les deux types de serveurs disponibles sont « local », pour les serveurs de la
machine locale que xdm doit lancer lui-même, et « foreign », pour les serveurs distants sur lesquels
xdm doit afficher la fenêtre de demande de connexion (ils doivent donc être déjà lancés). La ligne de
commande à utiliser pour le lancement du serveur ne doit être spécifiée que pour les serveurs de type
« local ».
Les serveurs X peuvent prendre un certain nombres de paramètres en ligne de commande pour leur
démarrage. Vous en trouverez la liste complète dans la page de manuel Xserver et dans la page de
manuel [Link]. Les options les plus intéressantes dans le cadre du lancement du serveur X par xdm sont
celles permettant de définir le display que le serveur aura en charge et le terminal virtuel qu’il devra
utiliser pour effectuer son affichage. Notez bien que le display doit être le même que celui donné à xdm.
Ces deux options sont passées directement à la suite du nom de l’exécutable du serveur X à lancer :
où vtNN est le nom du terminal virtuel à utiliser (vt01 pour /dev/tty01, vt02 pour /dev/tty02,
etc.).
Ainsi, si l’on veut faire en sorte que xdm lance automatiquement deux sessions X sur les terminaux
virtuels 11 et 12, en leur affectant respectivement les displays :0.0 et :1.0, on devra placer ces deux lignes
dans son fichier de configuration Xservers :
Note : La spécification du terminal virtuel à utiliser est facultative. Si aucun terminal n’est indiqué, le
serveur X utilisera le premier terminal qu’il trouvera. Cependant, il est plus sûr de toujours indiquer le
terminal à utiliser, car le noyau ne crée les terminaux qu’à la demande, lorsqu’un processus désire y
accéder. Or les serveurs X ne cherchent pas à en créer de nouveau. Si tous les terminaux virtuels
existants sont déjà utilisés, le serveur X tentera donc de s’en approprier un, sans se préoccuper du
417
Chapitre 10. Installation de XWindow
programme qui l’utilise à ce moment. Le fait d’indiquer manuellement le terminal à utiliser vous
évitera donc des problèmes assez curieux, tels que ceux qui peuvent survenir si les terminaux
utilisés par les serveurs X le sont pas déjà par un getty par exemple. De plus, cela permet également
d’éviter, si on lance plusieurs serveurs X sur la même machine, qu’ils n’accèdent ensemble au
même terminal virtuel lors de leur initialisation.
Il est recommandé par ailleurs de basculer sur chaque terminal virtuel sur lequel un serveur X est
lancé avant de se connecter afin de les forcer à créer leur terminal. En effet, si vous ne procédez pas
ainsi, il est possible que vous ayez le temps de vous connecter dans une session X avant que les
autres terminaux X n’aient fini de s’initialiser. Lorsque ceux-ci démarreront, ils changeront le terminal
virtuel courant et l’affichage de votre bureau risque d’être corrompu. Si cela se produit, ne vous
inquiétez pas : votre session X n’a pas planté. Assurez-vous seulement que vous vous trouvez bien
sur le bon terminal virtuel, et faites en sorte que l’écran soit rafraîchi (par exemple, changez de
bureau virtuel ou déplacez une fenêtre sur l’écran).
Remarquez également que les fichiers de configuration fournis avec [Link] ne prévoient pas
l’utilisation de plus de deux sessions X par défaut. Si d’aventure vous désirez en utiliser plus, vous
devrez compléter le fichier de configuration xdm-config avec les lignes suivantes :
DisplayManager._2.authorize: true
DisplayManager._3.authorize: true
etc.
418
Chapitre 10. Installation de XWindow
xdm est capable de répondre aux demandes de connexion directes des serveurs X distants (remarquez
que dans ce cas, xdm est serveur de connexions pour les serveurs X des postes clients. Faites bien
attention à la terminologie client/serveur ici !). Cela suppose que chaque poste client connaisse l’adresse
des machines qui utilisent xdm. Cette information peut faire partie de la configuration du poste client,
mais elle peut également être déterminée dynamiquement. Pour cela, le serveur X du poste client émet
une requête XDMCP en mode broadcast sur le réseau (c’est-à-dire à destination de tout le monde).
Chaque machine sur laquelle xdm fonctionne répondra à ce client, et le serveur X proposera ainsi la liste
des machines sur lesquelles une connexion est réalisable via xdm. Ainsi, l’utilisateur du poste client
pourra choisir le serveur sur lequel il désire se connecter, et le processus xdm de ce serveur lui enverra la
fenêtre de login.
En réalité, tous les serveurs X ne sont pas capables de gérer les réponses reçues de plusieurs processus
xdm provenant de plusieurs machines à la suite de l’envoi d’une requête en mode broadcast. Par ailleurs,
il n’est pas toujours possible d’utiliser le mode broadcast, car les paquets de ce type peuvent très bien ne
pas être routés lors de la traversée d’un passerelle. Par conséquent, xdm offre également la possibilité
d’interroger les machines du réseau local en réponse à une requête de connexion indirecte. Le serveur X
reçoit en réponse le résultat de la requête effectuée par broadcast, et l’utilisateur peut choisir la machine
à laquelle il désire accéder.
La configuration de xdm pour le protocole XDMCP se fait dans le fichier identifié par la ligne
« [Link] » du fichier xdm-config. Par défaut, le fichier ainsi référencé est le
fichier Xaccess du répertoire /etc/X11/xdm/. La syntaxe de ce fichier est très simple. Il contient des
règles indiquant le comportement de xdm lorsqu’il reçoit une requête de connexion de la part d’un
serveur X. Ces règles sont définies pour des groupes de machines. Les machines sont identifiées par leur
nom ou leur adresse IP, plusieurs machines pouvant être spécifiées par une même règle grâce aux
caractères génériques classiques ’*’ et ’?’. Il est également possible d’exclure une machine ou un groupe
de machines en préfixant le nom du caractère de négation ’!’.
Il existe quatre types de lignes dans le fichier Xaccess. Le premier type permet simplement d’indiquer
que les connexions directes ou en mode broadcast provenant d’une machine sont toutes acceptées. Ce
sont les lignes les plus simples, puisqu’il suffit simplement d’indiquer la machine ou le groupe de
machines. Par exemple, la ligne suivante :
*.[Link]
indique que les demandes de connexion provenant de toutes les machines du domaine
« [Link] » sont acceptées. Il est possible de faire en sorte que xdm ne réponde qu’aux
demandes de connexion directes simplement en ajoutant le mot clé « NOBROADCAST » à la suite de la
ligne. Ainsi, si la machine « [Link] » doit pouvoir se connecter directement, mais ne
doit pas recevoir de réponse de notre machine, on ajoutera la ligne suivante dans le fichier Xaccess :
[Link] NOBROADCAST
Le deuxième type de ligne permet de spécifier le comportement de xdm pour les demandes de connexion
indirectes. Ces lignes contiennent toujours le nom de la machine ou du groupe de machines, mais ce nom
est suivi de la liste des machines auxquelles xdm doit faire suivre la demande de connexion du serveur X.
Par exemple, supposons que la machine « [Link] » ne soit pas capable d’effectuer des
requêtes en mode broadcast, et que l’on veuille qu’elle puisse se connecter sur les serveurs
419
Chapitre 10. Installation de XWindow
Le troisième type de ligne permet de lancer un programme nommé « chooser » et qui va proposer la liste
des serveurs à l’utilisateur du serveur X qui demande à se connecter. Ce programme est très utile pour les
serveurs X qui ne sont pas capables de proposer ce choix à l’utilisateur. La syntaxe de ces lignes est très
simple, puisqu’il suffit de faire précéder les noms des serveurs par le mot clé CHOOSER. Si l’on reprend
l’exemple précédent, la ligne de configuration pour le terminal X « termX2 » deviendrait :
La liste des serveurs qui suit peut être assez longue, et il peut être utile de faire en sorte que le
programme chooser effectue une requête en mode broadcast pour le compte du serveur X qui n’en n’est
pas capable. Il suffit pour cela de remplacer la liste des serveurs par le mot clé « BROADCAST ». Ainsi, la
ligne suivante :
%nom liste
où nom est le nom de la macro à définir, et liste est la liste des machines qu’elle représente. Il est
possible d’utiliser des macros dans les définitions de macros.
Note : Le protocole XDMCP utilise le port 117 du protocole UDP. Vous pourrez donc ajouter la ligne
suivante dans votre fichier /etc/services, si elle ne s’y trouve pas déjà :
xdmcp 117/udp
Notez également que vous ne pourrez pas tester votre configuration en utilisant l’interface réseau
loopback. En effet, xdm vérifie la validité des adresses sources des paquets qu’il reçoit, et il refuse
par défaut tout paquet provenant de l’adresse [Link]. Si vous désirez malgré tout utiliser XDMCP
sans réseau réel, vous pourrez utiliser l’interface réseau dummy. Cette interface peut être créée en
activant l’option « Dummy net driver support » du menu « Network device support ».
420
Chapitre 10. Installation de XWindow
• -query permet de demander une connexion directe sur une machine donnée. Le nom de la machine
doit être spécifié à la suite de l’option ;
• -indirect permet de demander une connexion indirecte sur une machine donnée. Le nom de cette
machine doit être spécifié à la suite de l’option. La liste des machines qui a été indiquée dans le fichier
Xaccess sera retournée, ou bien le programme chooser sera lancé ;
• -broadcast permet de demander au serveur X d’effectuer une requête de connexion en broadcast sur
le réseau.
Les serveurs de [Link] ne sont pas capables de proposer une liste de machines à l’utilisateur. Ils prennent
systématiquement la première machine qu’ils trouvent. Vous ne contrôlerez donc pas la machine sur
laquelle la connexion sera faite si vous utilisez l’option -broadcast. C’est pour cela qu’il est
recommandé d’utiliser le programme chooser dans le fichier de configuration Xaccess et de configurer
les serveurs pour faire des demandes de connexion indirectes.
421
Chapitre 10. Installation de XWindow
dans le fichier Xstartup, afin d’enregistrer les utilisateurs qui commencent une session XWindow, et
une autre ligne telle que celle-ci :
dans le fichier Xreset, afin de les supprimer lorsqu’ils terminent cette session.
422
Chapitre 10. Installation de XWindow
La commande xset
Ces paramètres peuvent souvent être fixés lors du démarrage du serveur X, ou dynamiquement avec la
commande xset. Les paramètres que l’on peut fixer avec xset sont très nombreux, et seuls les plus utiles
seront décrits ici. Veuillez consulter la page de manuel xset pour plus de détails.
L’option dpms permet de fixer les temps d’attente avant la mise en veille du moniteur. Sachez que la mise
en veille constitue de loin le meilleur économiseur d’écran, et que les économiseurs logiciels du type
ballet de lignes sont très jolis mais ne servent à rien. Pire, ils peuvent ralentir la machine, ce qui est
inadmissible si vous l’utilisez en tant que serveur (heureusement, les économiseurs d’écran logiciels se
lancent généralement avec des priorités très faibles, afin de ne pas perturber les autres processus).
Cette option prend de un à trois paramètres, qui représentent respectivement le temps avant le passage en
mode économie d’énergie du moniteur, le temps avant le passage en mode veille, et le temps avant
l’extinction complète du moniteur. Ces temps sont exprimés en secondes, la valeur nulle permettant de
désactiver cette fonctionnalité. Ainsi, la commande suivante :
Note : Les valeurs des temps d’attente que vous pouvez fixer dans le fichier de configuration
[Link] peuvent être écrasées par les valeurs définies dans la configuration de votre gestionnaire
de bureau. Vous devrez donc vérifier ces paramètres si les modifications que vous faites dans le
fichier [Link] ne sont pas prises en compte ou si l’économie d’énergie reste désactivée malgré
la présence de l’option DPMS dans la section « Monitor » de votre moniteur.
Une autre option importante de la commande xset est l’option fp, qui permet d’ajouter et de supprimer
des chemins de répertoires de polices de caractères. Pour ajouter un répertoire, il suffit d’utiliser l’option
423
Chapitre 10. Installation de XWindow
+fp et de faire suivre le chemin de ce répertoire. La suppression d’un répertoire se fait de la même
manière, avec l’option -fp. Par exemple, pour ajouter le répertoire de polices
/usr/X11R6/lib/X11/fonts/100dpi/ à la liste des répertoires de polices du serveur, il suffit de
taper la commande suivante :
De plus, comme nous l’avons déjà vu plus haut, les chemins des répertoires de polices de caractères
peuvent être fixés statiquement à l’aide du mot clé « FontPath » de la section « Files » du fichier de
configuration [Link].
Enfin, l’option q de xset vous permettra de visualiser l’ensemble des paramètres en cours d’utilisation.
Nom du Fonction
répertoire
geometry/ Contient les fichiers de description de la géométrie des claviers. Ces fichiers
peuvent être utilisés par les applications pour obtenir une représentation graphique
du clavier.
424
Chapitre 10. Installation de XWindow
Nom du Fonction
répertoire
keycodes/ Contient les fichiers de définitions des « keycodes » X du clavier. Les keycodes X
ont la même fonction que les keycodes de Linux : donner un nom unique à chaque
touche. Cependant, ils diffèrent des keycodes de Linux en ce sens qu’ils ne sont
pas définis à partir des scancodes du clavier, mais à partir de codes numériques
générés par le serveur X. Ce mécanisme suppose que le serveur X connaisse tous
les scancodes envoyés par les claviers. Comme il est impossible de déclarer de
nouvelles séquences de scancodes au niveau du serveur X, on ne peut pas
compléter les définitions de clavier existantes pour prendre en charge
d’éventuelles nouvelles touches.
symbols/ Contient les définitions des plans de clavier ou, autrement dit, les associations
entre les keycodes X et les symboles obtenus lors de l’appui sur les touches.
rules/ Contient les définitions des modèles de clavier de [Link]. Ces modèles de clavier
sont utilisés pour simplifier la définition des claviers dans le fichier de
configuration [Link].
keymaps/ Contient les définitions des principaux claviers connus. Une définition de clavier
comprend entre autres la définition des keycodes, des touches modificatrices et des
symboles affectés aux keycodes.
Il est probable que vous n’ayez pas à modifier un seul des fichiers de ces répertoires, car ils sont
correctement définis par défaut. Le seul fichier qui peut être intéressant est le fichier fr du
sous-répertoire symbols/. En effet, c’est dans ce fichier que vous trouverez la définition des symboles
affectés à chaque touche pour un clavier français, en fonction des modificateurs (ALT, CTRL, etc.) actifs
lors de l’appui sur la touche. Le principe de fonctionnement de ce fichier est semblable aux plans de
claviers de Linux : pour chaque keycode, un ensemble de symboles peuvent être définis. Ces symboles
sont indiqués entre accolades (caractères ’{’ et ’}’), en deux jeux de symboles entourés de crochets
(caractères ’[’ et ’]’). Le premier jeu de symboles indique les symboles accessibles directement et en
utilisant la touche majuscule, et le deuxième jeux définit les symboles accessibles avec la combinaison
de la touche AltGr.
Par exemple, la touche du chiffre ’3’ au dessus des lettres ’Z’ et ’E’ est définie comme suit dans le fichier
de définition du clavier français (fichier fr) :
Cela signifie que la touche dont le keycode est « <AE03> » (c’est-à-dire celle la quatrième de la
deuxième rangée de touches du clavier) génère les symboles « " » et « 3 » selon que la touche majuscule
est utilisée ou non, et les symboles « # » et « £ » respectivement en minuscule ou en majuscule et avec la
touche AltGr enfoncée.
Si vous regardez le fichier du clavier français, vous constaterez que toutes les touches ne sont pas
définies. La raison de cela est que ces fichiers utilisent par défaut les affectations de touches du clavier
américain standard. Par conséquent, seules les différences ont été redéfinies dans ce fichier.
425
Chapitre 10. Installation de XWindow
Vous pourrez éventuellement modifier certaines affectations de touches si vous le désirez. Ce peut être
nécessaire si vous désirez homogénéiser les combinaisons de touches entre la console Linux et
XWindow. Par exemple, il peut être utile de redéfinie le comportement de la touche ’E’ pour qu’elle
renvoie le symbole Euro (caractère ’¤’) en combinaison avec la touche AltGr. Pour cela, vous pourrez
utiliser la configuration suivante dans le fichier de clavier utilisé :
key <AD03> { [ e, E ],
[ currency, E ] };
Note : Notez que la touche Euro est déjà accessible par défaut sur les claviers français avec la
touche des monnaies (Livre Sterling, Dollar).
Une autre touche qui peut être redéfinie pour un clavier français est la touche ’O’, afin de lui faire
générer les symboles e dans l’o français (’œ’ et ’OElig;’) au lieu des symboles o barrés (’ø’ et ’Ø’)
norvégiens, qui ne sont pas très utiles en français. Notez que les noms de symboles utilisés dans les
tables d’encodage correspondent aux symboles de l’encodage ISO 8859-1, et que par conséquent,
vous devrez utiliser les noms de symboles « onehalf » et « onequarter » pour représenter les
caractères ’œ’ et ’Œ’. En effet, ces symboles sont les symboles de l’encodage ISO 8859-1 qui ont le
même code que les symboles ’œ’ et ’Œ’ dans l’encodage ISO 8859-15.
Sachez enfin que l’obtention de ces symboles est bien entendue assujettie à l’utilisation d’une police
de caractères utilisant l’encodage ISO 8859-15.
Comme vous avez dû le constater, un certain nombre de plans de clavier sont définis en standard dans
[Link]. De même, plusieurs géométries et définitions de keycodes sont fournies dans les sous-répertoires
geometry/ et keycodes/ du répertoire /usr/X11R6/lib/X11/xkb/. Le serveur X utilise les fichiers
qui sont référencés dans la section « Keyboard » du fichier de configuration [Link]. Comme on l’a
déjà vu plus haut dans ce chapitre, le mot clé « XkbLayout » permet de définir le plan de clavier à
utiliser. Ainsi, si vous spécifiez le plan de clavier « fr » à la suite de ce mot clé, le fichier de définition
des associations keycodes-symboles utilisé sera le fichier fr du répertoire
/usr/X11R6/lib/X11/xkb/symbols/. Les autres options sont fixées par les mots clés « XkbRules »
et « XkbModel ». Le premier mot clé indique quel est le fichier à utiliser pour définir les modèles de
claviers de [Link]. Ce fichier est localisé dans le sous-répertoire rules/, et fournit les valeurs par défaut
à utiliser pour chaque modèle de clavier. Le deuxième mot clé indique le modèle de clavier à utiliser.
Ainsi, il n’est nécessaire de spécifier que trois paramètres pour définir le clavier sous [Link] : le fichier
contenant la définition des modèles de clavier, le modèle lui-même et le fichier définissant la disposition
des touches.
Note : Vous pouvez également définir tous les paramètres du clavier dans le fichier [Link].
Cette technique est plus compliquée et n’est pas nécessaire pour définir un clavier français, elle ne
sera donc pas décrite ici. Vous trouverez plus de renseignements à ce sujet dans la page de manuel
[Link].
426
Chapitre 10. Installation de XWindow
ressource : valeur
427
Chapitre 10. Installation de XWindow
l’application elle-même, et porte son nom. Il est d’usage de mettre la première lettre de ce nom en
majuscule, et si cette lettre est un ’X’, de mettre également la deuxième lettre du nom en majuscule
(beaucoup d’applications X ont en effet un nom commençant par un ’X’). Les composantes suivantes
définissent un sous-ensemble de paramètres apparentés dans l’ensemble des paramètres déterminé par les
composantes précédentes. Enfin, la dernière composante du nom de ressource constitue le nom du
paramètre lui-même.
Par exemple, le nom de ressource suivant :
[Link]
Note : Les fichiers de ressources utilisent des noms de couleurs prédéfinies pour définir les couleurs
des différentes parties des applications. Vous pourrez trouver la liste de ces noms de couleurs ainsi
que leurs définitions dans le fichier /usr/X11R6/lib/X11/[Link]. Vous pouvez également définir
vos propres couleurs avec la syntaxe « rgb:R/V/B », où « R » représente la portion de rouge de la
couleur, « V » représente la portion de vert, et « B » la portion de bleu.
Ainsi, l’ensemble des paramètres des applications X est organisé un peu comme sont organisés les
fichiers dans une arborescence de répertoires. L’analogie ne s’arrête pas là : il est possible de caractériser
un ensemble de ressources grâce à des caractères génériques. Par exemple, en utilisant une étoile
(caractère ’*’) comme séparateur à la place du point dans un nom de ressource, toutes les ressources dont
le nom comprend les deux composantes seront sélectionnées, que ces deux composantes soient
adjacentes ou séparées d’autres composantes intermédiaires. Par exemple, le nom de ressource suivant :
XApplication*background
XApplication.?.background
428
Chapitre 10. Installation de XWindow
appres branche
où fichier est le nom du fichier contenant la définition des ressources (généralement, il s’agit de votre
fichier .Xresources).
L’option -load permet d’effectuer le même travail, mais la base de données est vidée au préalable. Cette
option permet donc de réinitialiser complètement le contenu de la base de données avec le contenu du
fichier passé en paramètre. Sa syntaxe est la même que celle de l’option -merge.
L’option -remove permet de vider la base de données et de supprimer toutes les ressources que vous
auriez pu définir au préalable. Elle s’utilise selon la syntaxe suivante :
xrdb -remove
429
Chapitre 10. Installation de XWindow
XWindow fournit donc les outils nécessaires pour contrôler le niveau de sécurité en cours.
Classiquement, le serveur X utilise deux techniques pour contrôler la validité des demandes de
connexion des clients. Le premier mécanisme de contrôle d’accès est relativement grossier, puisqu’il se
base simplement sur les adresses des machines. Le deuxième mécanisme a été introduit ultérieurement
afin de permettre des contrôles plus fins. Les contrôles se font alors à l’aide d’un mécanisme de clés
privées, que seuls les clients autorisés connaissent.
La commande xhost
La commande xhost permet de fixer le niveau des contrôles d’accès basés sur les adresses de machines.
Comme on l’a vu, le serveur X n’accepte les connexions que de la machine locale. Vous pouvez
cependant lui indiquer d’accepter toutes les connexions provenant d’une autre machine avec une
commande telle que celle-ci :
xhost +machine
où machine est le nom de la machine en qui l’on a confiance. Si aucun nom de machine n’est spécifié,
tous les mécanismes de contrôle d’accès sont désactivés.
Inversement, la suppression d’une machine de la liste des machines autorisées est réalisée par la
commande suivante :
xhost -machine
La commande xhost - (sans nom de machine) permet de réactiver les mécanismes de contrôle d’accès
s’ils ont été désactivés par un xhost +.
Notez bien que donner le droit de connexion à une machine suppose que l’on fasse confiance à tous les
utilisateurs de cette machine, car alors ils pourront tous se connecter sur votre serveur X local. De plus,
rien ne vous garantit que la machine à qui vous donnez ces droits n’a pas été usurpée par celle d’un pirate
(technique dite de l’« IP spoofing »). Ce n’est donc évidemment pas la solution recommandée, surtout si
vous êtes connecté à Internet.
La commande xauth
Le deuxième mécanisme de sécurité utilise une clé privée. Tous les clients qui désirent se connecter au
serveur local doivent connaître cette clé, faute de quoi leur requête sera refusée. Ainsi, vous pouvez très
simplement permettre l’utilisation de votre display à une personne donnée sur une machine donnée,
simplement en lui communiquant la clé utilisée par le serveur X gérant votre display. Bien entendu, cette
communication doit se faire de manière sûre.
Par défaut, les clés privées utilisées par les clients sont enregistrées dans le fichier .Xauthority de
votre répertoire personnel. Ce fichier contient une clé privée pour chaque display auquel vous avez le
droit de vous connecter. Les clients que vous lancez consultent donc ce fichier afin de déterminer la clé à
utiliser, en fonction du display auquel ils désirent accéder. Une fois cette clé connue, ils peuvent
s’authentifier auprès du serveur X gérant ce display, et ainsi obtenir une connexion. Notez bien que le
fichier .Xauthority ne doit être accessible que par vous.
430
Chapitre 10. Installation de XWindow
Si vous utilisez xdm, une nouvelle clé est automatiquement générée à chaque fois que vous vous
connectez à un terminal X. xdm enregistre cette clé dans un fichier temporaire du répertoire référencé par
le lien symbolique /etc/X11/xdm/authdir (qui référence généralement le répertoire
/var/lib/xdm/authdir/), que seul l’utilisateur root peut accéder. Il communique ensuite ce fichier
au serveur X local à l’aide de l’option -auth du serveur X pour que celui-ci puisse lire la clé à utiliser.
Enfin, xdm enregistre cette clé dans votre fichier .Xauthority, pour que vous puissiez lancer des
clients dans cette session X.
Comme vous pouvez le constater, ce mécanisme de sécurité est totalement transparent pour l’utilisateur.
Cependant, il peut être nécessaire de manipuler le fichier .Xauthority pour lire les clés privées et les
communiquer aux personnes de confiance qui doivent avoir accès à votre display. Ces manipulations
peuvent être effectuées à l’aide de la commande xauth.
La clé associée à un display peut être obtenue avec la commande suivante :
où display est le nom du display auquel la clé donne accès. xauth affiche alors le display, le type
d’authentification utilisé (MIT-MAGIC-COOKIE-1) et la clé privée.
Vous pouvez communiquer cette clé par les moyens que vous voulez à la personne devant accéder à votre
display. Celle-ci pourra alors utiliser la commande suivante pour ajouter la clé à son fichier
.Xauthority :
où display est le display utilisant la clé clé. Le caractère ’.’ est une abréviation pour le type
d’authentification « MIT-MAGIC-COOKIE-1 » (type d’authentification par défaut). Dès que la clé aura
été ajoutée dans son fichier .Xauthority, cette personne aura accès à votre display.
Enfin, la commande suivante :
Note : Il est nécessaire d’utiliser une technique de communication sûre pour transmettre la clef,
faute de quoi le mécanisme de sécurité de XWindow ne servirait à rien. L’utilisation d’OpenSSH est
vivement recommandée.
431
Chapitre 10. Installation de XWindow
Chaque programme doit donc prendre en compte lui-même les problèmes d’impression, ce qui implique,
en général, que les programmes soient capables d’imprimer sur des imprimantes PostScript. Par
conséquent, la configuration des polices de caractères doit non seulement se faire pour XWindow, mais
également pour chacun des programmes (ou, au moins, pour l’interpréteur GhostScript, utilisé pour
l’impression avec des imprimantes non PostScript).
432
Chapitre 10. Installation de XWindow
Vous pouvez consulter la documentation de XWindow pour une description plus détaillée de ces champs.
Ces informations ne sont pas toutes supportées par les polices de caractères. Inversement, certaines
polices peuvent correspondre à plusieurs descriptions (ne serait-ce que parce qu’elles disposent de
plusieurs tailles).
Parmi les informations décrivant les polices se trouvent le jeu de caractères de la police et sa page de
codes (rappelons que ces informations constituent ce que l’on appelle l’encodage de la police). Il peut y
avoir plusieurs pages de codes pour un jeu de caractères, chacune représentant une manière de numéroter
les différents caractères du jeu. Une police peut disposer de plusieurs jeux de caractères, mais en pratique
ce n’est que rarement le cas. En revanche, la manière de numéroter les caractères (c’est-à-dire la page de
codes) peut avoir une influence certaine.
Comme on le verra plus tard, le jeu de caractères le plus pratique pour les pays d’Europe de l’Ouest est le
jeu ISO 8859 (jeu de caractères dit « latin »). Ce jeu de caractères dispose de la plupart des caractères
utilisés en Europe. Pour les alphabets occidentaux, la page de codes la plus utilisée est la page de codes
1, ce qui fait que l’encodage des polices occidentales est ISO 8859-1. Cependant, quelques caractères ont
été oubliés dans cette page de codes (notamment le o e dans l’o français (’œ’)). Ces caractères sont
pourtant disponibles dans certaines polices (en particulier, les polices Truetype provenant de Windows),
mais ne sont malheureusement pas disponibles avec l’encodage ISO 8859-1. Pour y accéder, on est
obligé d’utiliser un autre encodage, comme par exemple l’encodage ISO 8859-15. Cet encodage est
quasiment identique à l’encodage ISO 8859-1, aux caractères additionnels près, qui ont été ajoutés pour
les pays européens. Il est également possible d’utiliser la page de codes 1252 des polices de caractères de
Windows. Cette page de codes correspond à l’encodage « windows-1252 », parfois également nommé
« microsoft-ansi » ou encore « microsoft-cp1252 ». En résumé, le jeu de caractères et la page de codes
permettent d’indiquer pour quel pays (ou quel alphabet) une police est destinée.
Note : Le problème des encodages est que seul l’encodage ISO 8859-1 est vraiment utilisé par la
majorité des gens. Cela implique que les autres encodages risques de ne pas être reconnus par
tous les programmes. En particulier, il est assez difficile d’imprimer des textes encodés avec des
encodages non standards.
La description logique des polices de caractères est très précise, puisqu’elle permet de spécifier l’origine
de la police, son nom, les informations la concernant, les caractères qu’elle comprend et comment ils
sont numérotés. Lorsqu’on choisit une police de caractères, on peut parfaitement ne préciser que certains
critères (comme par exemple, l’encodage de la police). Dans ce cas, les champs constituant le nom de la
police non spécifiés pourront être remplacés par des caractères génériques. Le caractère ’*’ permet ainsi
de spécifier n’importe quelle valeur pour ce champ, et le caractère ’?’ permet de spécifier n’importe quel
caractère dans un champ.
Le programme xfontsel permet de sélectionner les polices de caractères installées sur un système. Il peut
être utile pour comprendre la signification des différents champs de la description logique des polices.
Des exemples de descriptions logiques de polices sont donnés ci-dessous :
-adobe-helvetica-medium-r-*-*-12-*-*-*-*-*-iso8859-1
-*-courier-bold-*-normal-*-10-*-*-*-*-*-iso8859-15
433
Chapitre 10. Installation de XWindow
-winfonts-arial-*-i-normal-*-16-*-*-*-*-*-microsoft-cp1252
Les polices de caractères sont souvent regroupées dans des répertoires. Il peut exister plusieurs
répertoires de polices sur un système, si bien qu’il est nécessaire d’indiquer à [Link] dans quels
répertoires ils doit rechercher les polices de caractères utilisables. Les répertoires des polices utilisées par
le serveur X sont indiqués dans le fichier [Link], dans la section « Files ». Comme on le verra
plus tard, cette section peut également contenir des références sur des serveurs de polices de caractères.
Les serveurs de polices de caractères peuvent rechercher les polices dans des répertoires indiqués de
différentes manières selon le serveur. Pour certains serveurs, les répertoires de polices sont indiqués dans
un fichier de configuration, pour d’autres, ils sont indiqués en ligne de commande.
Dans le protocole X, les répertoires de polices doivent contenir un fichier [Link] donnant la liste
des polices de ce répertoire. Ce fichier indique, sur sa première ligne, le nombre de polices installées
dans ce répertoire, et, sur les lignes suivantes, l’association entre les fichiers de polices et leur description
logique. Ce fichier est créé normalement par le programme mkfontdir. Ce programme génère le fichier
[Link] à partir des informations contenues dans les fichiers des polices ou à partir du nom des
fichiers des polices eux-mêmes. En général, les polices à taille variable ne contiennent pas ces
informations dans le format standard des polices X11 classiques, et mkfontdir ne peut donc pas créer le
fichier [Link] automatiquement. Pour ces polices, il faut créer un fichier [Link] contenant
les mêmes informations que le fichier [Link], et que mkfontdir utilisera pour créer ce dernier. La
méthode pour créer le fichier [Link] dépend du type de police utilisée. Celle utilisée pour les
polices Truetype sera décrite dans la la section intitulée Installation des polices Truetype.
En général, les encodages les plus standards sont gérés directement par le serveur X ou par le serveur de
polices. En particulier, l’encodage ISO 8859-1 est géré nativement. Il est toutefois possible de définir de
nouveaux encodages dans des fichiers d’encodages. Pour que le serveur X ou le serveur de polices puisse
utiliser les polices définies avec ces encodages, il faut que le répertoire d’installation des polices
contiennent un fichier [Link]. Ce fichier a la même structure que le fichier [Link],
c’est-à-dire qu’il contient le nombre des encodages sur la première ligne et, sur chaque ligne suivante, le
nom de l’encodage et le nom d’un fichier contenant la définition d’un encodage, séparés par un espace.
De cette manière, le serveur X et le serveur de polices sont capables de réaliser l’association entre le nom
de l’encodage utilisé dans la description logique de polices et le fichier de définition de cet encodage. La
méthode permettant de créer le fichier [Link] sera décrite plus loin dans la section traitant de
l’installation des polices Truetype.
L’écriture des fichiers de définition d’encodages de polices est une tâche assez compliquée, qui nécessite
de bien connaître la numérotation des caractères de chaque type de fichier de police. De manière très
simplifiée, on peut dire que les fichiers de définition d’encodage font l’association entre le numéro de
chaque caractère dans la police et une numérotation standardisée des caractères (XWindow utilise
l’encodage Unicode) de cette police. Cela permet de manipuler les textes avec la numérotation standard,
et d’utiliser des polices qui ne définissent pas tous les caractères de cette numérotation ou qui ne les
numérotent pas de la même manière. Heureusement, les encodages les plus courants ont déjà été écrits et
il est fort peu probable que vous ayiez à vous intéresser à ce problème. La structure des fichiers
d’encodages ne sera donc pas décrite plus en détail dans ce document.
434
Chapitre 10. Installation de XWindow
Configuration du serveur X
Pour permettre au serveur X d’utiliser les polices TrueType, il faut simplement écrire le fichier
[Link] de chaque répertoire de polices. Rappelons que ce fichier contient la liste des polices du
répertoire dans lequel il se trouve, et est utilisé à la fois par le serveur X et par les serveurs de polices de
caractères. La notion de serveur de polices sera vue en détail dans la la section intitulée Configuration
d’un serveur de polices.
Normalement, le fichier [Link] est généré par le programme mkfontdir. Ce programme utilise les
informations contenues dans les fichiers de polices ou dans le nom de ces fichiers pour le générer.
Malheureusement, les polices Truetype, comme la plupart des polices à taille variable, ne contiennent
pas ces informations dans un format compréhensible par mkfontdir, ni dans leurs fichier, ni dans leurs
nom. Celui-ci ne peut donc pas créer le fichier [Link] directement. Dans ce cas, mkfontdir utilise
le fichier de définition des polices à taille variable [Link]. Ce fichier doit être créé soit
manuellement, soit à l’aide de l’utilitaire mkfontscale. Celui-ci doit être appelé dans le répertoire
contenant les polices de caractères, et génère un fichier [Link] directement utilisable par
mkfontdir.
Une fois le fichier [Link] créé, il ne reste plus qu’à appeler mkfontdir avec la ligne de
commande suivante :
mkfontdir
Cette commande aura pour effet de créer le fichier [Link] à partir du fichier [Link] (en fait,
il s’agit d’une simple recopie).
Les encodages utilisés par le serveur X pour les polices Truetype sont tous définis dans le fichier
[Link], qui donne la correspondance entre les descriptions logiques de polices et les fichiers de
polices Truetype. Par conséquent, vous pourrez aisément modifier ou ajouter des encodages différents
pour ces polices de la manière suivante :
• éditez le fichier [Link] contenant la liste des noms de polices et des descriptions logiques de
polices ;
• modifiez la description logique de chaque police ;
• relancez mkfontdir.
435
Chapitre 10. Installation de XWindow
Vous pouvez également utiliser des encodages additionnels, à condition d’utiliser l’option -e de
mkfontdir lors de la génération du fichier [Link]. Cette option permet d’indiquer le répertoire
contenant les fichiers de définition des encodages à utiliser :
mkfontdir -e répertoire
où répertoire est le répertoire contenant les fichiers de définition d’encodages. Cette commande a
pour conséquence de créer un fichier [Link] en plus du fichier [Link].
XWindow est fourni avec un certain nombre de fichiers de définition d’encodages standards, tous situés
dans le répertoire /usr/X11R6/lib/X11/fonts/encodings/. L’un des plus intéressants est sans
doute microsoft-cp1252, qui permet de disposer des caractères additionnels ajoutés par Microsoft
dans ses polices, tout en conservant un encodage compatible avec les documents Windows.
Note : Si vous voulez rester compatible avec les normes ISO, vous pouvez utiliser l’encodage ISO
8859-15 au lieu de microsoft-cp1252. Vous accéderez ainsi à tous les caractères utilisés en
Europe, mais vous ne pourrez plus utiliser les caractères additionnels définis par Microsoft.
Il faut noter que la plupart des polices sont défectueuses et indiquent une page de codes erronée
dans leur fichier. Cela explique pourquoi quelques descriptions logiques de polices dans le fichier
[Link] généré automatiquement par mkfontscale peuvent être fausses. Pour ces polices, il
faudra corriger l’encodage manuellement en suivant la méthode décrite ci-dessus.
436
Chapitre 10. Installation de XWindow
• soit on dispose d’une imprimante PostScript, auquel cas il faut convertir les polices Truetype en
polices Adobe Type 42, qui constituent une encapsulation des polices Truetype en PostScript. Cette
conversion a l’avantage de ne pas provoquer de perte de qualité, puisque la police Truetype est utilisée
telle quelle ;
• soit on ne dispose pas d’imprimante PostScript, auquel cas on utilise nécessairement un interpréteur
PostScript. Cet interpréteur est souvent GhostScript, car il s’agit encore une fois d’un logiciel libre.
Quel que soit l’interpréteur PostScript utilisé, il faut soit le configurer pour qu’il puisse utiliser les
polices Truetype, soit que les applications fournissent la définition des polices TrueType qu’elles
utilisent dans les fichiers PostScript qu’elles génèrent lors de l’impression. Cette dernière solution est
celle utilisée par les logiciels récents (comme les applications de KDE ou OpenOffice), ce qui fait
qu’en général, les polices TrueType sont prises en charge sans configuration additionnelle. Nous
verrons plus loin comment configurer les versions de GhostScript ultérieures à la 7.00 pour qu’elles
puissent prendre en compte les polices TrueType pour les autres applications.
Dans les deux cas, il se peut qu’il faille configurer le logiciel utilisé pour qu’il puisse utiliser les polices
Truetype de concert avec le sous-système d’impression.
Les paragraphes suivants décrivent les procédures à suivre pour imprimer les polices Truetype en
général. La configuration des logiciels ne sera pas abordée, consultez leur aide ou recherchez des
renseignements sur Internet quant à la procédure à suivre.
• définir la variable d’environnement CC avec pour valeur le nom du compilateur que vous utilisez (en
l’occurence, gcc) :
CC=gcc
• choisir entre les deux jeux d’options de compilation CFLAGS. Vous ne devez en choisir qu’un seul, il
faut obligatoirement commenter l’autre avec un caractère dièse (’#’). Le choix dépend de
l’architecture de votre machine. Si vous utilisez un PC, vous devrez choisir l’option contenant l’option
-DSMALLENDIAN.
437
Chapitre 10. Installation de XWindow
Une fois ces modifications faites, vous pourrez compiler ttsps avec la simple commande suivante :
make
L’utilisation de ttfps est très simple. Pour convertir une police Truetype en police Adobe de Type 42, il
suffit d’utiliser la ligne de commande suivante :
(nom) (fichier) ;
où nom est le nom de la police d’imprimante que les programmes utilisent dans les fichiers PostScript
qu’ils génèrent, et fichier est le chemin absolu du fichier de la police Truetype.
En pratique, le nom de la police d’imprimante peut être choisi librement. On veillera toutefois à ne pas
utiliser des noms de polices contenant des espaces, car certains programmes peuvent avoir du mal à
manipuler de tels noms. Il faudra bien utiliser ce nom lors de la déclaration des polices d’imprimante
dans les logiciels capables d’imprimer en PostScript. Si l’on ne peut pas définir ce nom au niveau des
logiciels, il faudra ajouter un alias dans le fichier Fontmap de GhostScript pour chaque nom de police
utilisé par les logiciels. Il n’existe pas de règle général permettant de déterminer les noms de polices
utilisés par les programmes. Le plus simple est peut-être dans ce cas de déterminer les noms utilisés en
imprimant un document dans un fichier PostScript et en regardant dans le fichier les instructions de
changement de police de caractères.
438
Chapitre 10. Installation de XWindow
Le serveur de police fourni par XWindow se nomme « xfs » (abréviation de l’anglais « X Font
Server »). Ce serveur utilise un fichier de configuration qui permet de lui spécifier les options avec
lesquelles il doit démarrer. Dans la suite de ce document, le nom supposé de ce fichier est
/etc/[Link]. Un fichier de configuration typique est donné ci-dessous :
Lorsque vous aurez créé votre fichier de configuration, il ne vous restera plus qu’à tester si tout
fonctionne bien. Il vous faut pour cela lancer le serveur de polices avec la ligne de commande suivante :
Si cette dernière commande échoue, il se peut que le chemin indiqué pour les répertoires de polices dans
le fichier /etc/[Link] ne soit pas correct, ou que le fichier [Link] n’existe pas ou ne soit pas
correct dans un des répertoires de polices.
Si vous le désirez, vous pouvez faire en sorte que le serveur de polices soit démarré automatiquement au
lancement de X. Vous pourrez pour cela créer un script de lancement du serveur de polices, que vous
placerez dans le répertoire /etc/rc.d/ (ou le répertoire /sbin/init.d/, selon votre distribution)
pour lancer et arrêter le serveur de polices en suivant le mécanisme des niveaux d’exécution. Vous
trouverez ci-dessous un exemple de script de lancement du serveur de polices permettant d’utiliser le
fichier de configuration précédent :
439
Chapitre 10. Installation de XWindow
#!/bin/bash
#
# /etc/rc.d/xfs
#
# Fichier de lancement du serveur de polices.
#
PORT=7100
FILE=/etc/[Link]
PRGM=/usr/X11/bin/xfs
[ -f $PRGM ] || exit 0
Comme X11 est démarré classiquement dans le niveau d’exécution 3 ou 4, vous devrez créer les liens
symboliques vers ce fichier pour le lancement et l’arrêt du serveur de polices dans le répertoire rc3.d/
ou rc4.d/. Attention, rappelez-vous que les noms de ces liens indiquent le moment où le script est
exécuté, aussi bien pour l’entrée que pour la sortie du niveau d’exécution. Vous devrez impérativement
440
Chapitre 10. Installation de XWindow
faire en sorte que ce script soit appelé avant que XWindow ne démarre si vous désirez utiliser le serveur
de polices dans les sessions X locales.
L’utilisation du serveur de polices est très simple. Il suffit d’y accéder comme à un répertoire de polices
de caractères normal, en utilisant la syntaxe suivante :
tcp/machine:port
où machine est la machine sur laquelle le serveur de polices à accéder est lancé, et port est le port que
ce serveur écoute. Par exemple, pour ajouter les polices d’un serveur de polices locales à la liste des
polices du serveur X, il suffit de taper la commande suivante :
Vous pourrez alors vérifier que ces polices sont bien disponibles avec le programme xfontsel.
Si vous le désirez, vous pouvez ajouter automatiquement les polices d’un serveur de polices en ajoutant
la ligne suivante dans la section « Files » dans le fichier de configuration [Link] du serveur :
FontPath "tcp/[Link]:7100"
Cette ligne permet d’indiquer au serveur X qu’il trouvera des polices de caractères au niveau du serveur
de polices de la machine locale. Bien entendu, le serveur de polices doit impérativement être lancé avant
le serveur X si une telle ligne est placée dans le fichier de configuration [Link].
441
Chapitre 10. Installation de XWindow
display n’a pas pu être contactée, et l’erreur 111, qui signale que cette machine est bien accessible par le
réseau, mais que le serveur X ne s’y trouve pas.
En général, vous devrez vérifier toute votre configuration réseau si vous rencontrez des erreurs 101, et le
problème n’est certainement pas spécifique à XWindow. Vous pouvez également vérifier la validité de
votre display, car il se peut qu’il désigne une machine inaccessible sur votre réseau (ou que la résolution
de nom ait échoué pour cette machine).
Pour ce qui est de l’erreur 111, c’est beaucoup plus simple. Dans la grande majorité des cas, le serveur X
désigné n’existe tout simplement pas. Il faut donc s’assurer que le serveur X en charge de gérer le display
indiqué dans la variable d’environnement DISPLAY est bien lancé sur la machine désignée.
Enfin, lorsqu’une application cliente refuse de démarrer en affichant un message d’erreur « Can’t open
display: », c’est tout simplement que la variable d’environnement DISPLAY n’a pas été précisée, et
que l’option en ligne de commande -display n’a pas été utilisée non plus. L’application ne sait donc
tout simplement pas à quel display se connecter. Si le display a bien été défini, mais que le message
« Can’t open display:xxx » est complété du message « Connection to "xxx" refused by
server » ou « Client is not authorized to connect to Server », c’est que le client a été
lancé dans un autre compte utilisateur que le compte que vous utilisez couramment, et que ce compte ne
dispose pas des droits nécessaires pour accéder à ce display. Vous devez dans ce cas donner l’accès à
votre display au compte utilisateur sous lequel vous lancez le client.
442
Chapitre 11. Conclusion
Vous avez pu voir dans ce document les différentes procédures à mettre en œuvre pour installer Linux.
Ces procédures peuvent paraître compliquées, et en fait elles le sont effectivement. Cependant, il faut
faire un choix entre fonctionnalité et simplicité. Linux choisit la voie la plus difficile : celle sur laquelle il
faut être performant et fournir le plus de possibilités. La complexité qui en découle se voit
immédiatement lors de son installation, mais elle se comprend car chaque étape permet de le rendre à
chaque fois plus puissant, en lui ajoutant une fonctionnalité de plus. Finalement, ce qui vous a motivé
pendant toutes ces étapes, c’est sans aucun doute le désir de bénéficier de la stabilité et de la puissance de
Linux. Vous ne serez pas déçu, et vous rendrez vite compte que Linux dépasse de loin les systèmes
soi-disant plus ergonomiques sur ces deux points, dans une telle proportion que vous finirez par ne plus
pouvoir les utiliser. Et si vous y êtes contraint, vous ne louerez plus leur facilité d’emploi, mais vous
pestiférerez bel et bien contre leur comportement aléatoire, leurs incohérences ou leurs plantages à
répétition. En réalité, comme vous allez bientôt le découvrir, Linux est simple à utiliser pour les travaux
du quotidien. De plus, comme il l’a déjà été dit au début de ce document, ce qui paraît compliqué au
premier abord est souvent tout simplement inhabituel. C’est à l’usage que vous vous familiariserez avec
les concepts Unix, et plus vous les utiliserez, plus vous les apprécierez. Aussi ne puis-je que vous
souhaiter bonne continuation !
443
Annexe A. Options de configuration du noyau
Les questions posées par le programme de configuration du noyau sont récapitulées ci-dessous. Les
réponses recommandées ont été choisies pour correspondre à la plupart des cas courants. Il ne s’agit pas
des options recommandées pour installer un serveur ou pour un machine contenant des périphériques
exotiques (carte vidéo, port infrarouge, etc.). Avec ce jeu d’options, un PC standard est supposé démarrer
sans poser de problèmes. Vous devrez cependant certainement les adapter selon vos besoins. La plupart
de ces options sont décrites plus en détail dans le chapitre traitant de la configuration du matériel.
Je tiens à préciser que certaines de ces options m’ont laissé dubitatif, étant dans l’incapacité absolue de
les comprendre et de les tester. Ces options sont en général les options concernant des fonctionnalités
avancées ou des périphériques rarement utilisés.
444
Annexe A. Options de configuration du noyau
fonctionnalité standard qu’il est recommandé d’activer sur tous les systèmes Unix, il faut donc répondre
par ’Y’.
L’option « BSD Process Accounting » permet d’activer le monitoring des applications utilisé sur les
système BSD. Ce monitoring peut être utilisé par quelques applications, aussi est-il recommandé de
répondre par ’Y’.
L’option « BSD Process Accounting version 3 file format (NEW) » permet d’utiliser le
format de fichier version 3 des fichiers de traces pour le monitoring des applications. La version
recommandée est ’N’.
L’option « Sysctl support » permet de modifier dynamiquement certains paramètres du noyau sans
recompilation ni redémarrage par l’intermédiaire du système de fichiers virtuels /proc/. Il est
recommandé de répondre par ’Y’ à cette question.
L’option « Auditing support » permet de prendre en charge les fonctionnalités d’audit pour les autres
sous-système de sécurité de Linux tels que SELinux. Cette fonctionnalité est encore peu utilisée et la
réponse recommandée est ’N’.
L’option « Enable system-call auditing support (NEW) » permet d’activer les fonctionnalités
d’audit des appels systèmes conjointement avec d’autres sous-système de sécurité de Linux tels que
SELinux. Cette fonctionnalité est encore peu utilisée et la réponse recommandée est ’N’.
L’option « Support for hot-pluggable devices » permet d’activer la gestion des périphériques
connectables à chaud (c’est-à-dire pendant que le système fonctionne). Parmi ces périphériques, on
rencontre couramment les cartes PCMCIA des portables, mais également les périphériques USB et
FireWire, ainsi que les cartes PCI connectables à chaud. Cette option est en particulier nécessaire pour
l’utilisation des cartes PCMCIA sur les portables. Elle vous donnera l’accès au menu « PCCARD
(PCMCIA/CardBus) support », qui permet d’activer la gestion des cartes PCMCIA 32 bits (cela n’est
pas nécessaire pour utiliser les cartes PCMCIA 16 bits), au menu « PCI Hotplug Support », qui
permet de prendre en charge la gestion des cartes PCI connectables à chaud, et à l’option « Hotplug
firmware loading support », qui permet le chargement des firmwares via une interface standard du
noyau par les gestionnaires de périphériques. Cette option est facultative, mais fortement conseillée, pour
l’utilisation des périphériques USB. Ces périphériques ne seront parfois pas configurés automatiquement
lorsque vous les connecterez à chaud si vous ne l’activez pas. En fait, pour que la configuration des
périphériques USB connectés à chaud fonctionne, vous devez également activer la gestion des modules
du noyau, ainsi que les options « Kernel module loader » et « Hotplug firmware loading
support ». Si cette option est activée, le noyau appellera alors le programme de configuration
/sbin/hotplug pour charger le gestionnaire de périphériques approprié lorsqu’un périphérique sera
connecté et pour les configurer. La réponse recommandée est ’Y’.
L’option « Kernel Userspace Events » permet d’exposer aux programmes de l’espace utilisateur les
évènements relatifs aux objets systèmes du noyau via un canal de communication spécial. Les
événements des périphériques connectables à chaud sont également exposés au travers de ce canal. La
réponse recommandée est ’Y’.
L’option « Kernel .config support » permet d’inclure les options de configuration ainsi que la
description complète de l’environnement de compilation du noyau dans le noyau lui-même. Cela permet
de retrouver la configuration utilisée pour compiler le noyau, soit pour en regénérer un, soit pour mieux
pouvoir déboguer le noyau. Cette option vous donnera accès à l’option « Enable access to
.config through /proc/[Link] », qui permet de créer une entrée dans le système de fichiers
virtuel /proc/ afin de récupérer ces informations. Ces options étant plus réservées aux développeurs du
noyau qu’aux utilisateurs normaux, la réponse recommandée est ’N’.
445
Annexe A. Options de configuration du noyau
446
Annexe A. Options de configuration du noyau
mémoire plus léger, ce qui peut être utile pour des configurations sans swap. La réponse recommandée
est ’Y’.
Les options « Function alignement (NEW) », « Label alignement (NEW) », « Loop
alignement (NEW) » et « Jump alignement (NEW) » permettent de spécifier l’alignement en
mémoire des adresses des fonctions, des destination de sauts et des débuts de boucle. Elles peuvent être
utilisées afin d’optimiser le noyau soit en termes de performances, soit en termes de taille. La réponse
recommandée pour ces options est ’0’.
447
Annexe A. Options de configuration du noyau
est destinée aux noyaux de distributions, qui doivent être génériques mais qui peuvent chercher à
bénéficier de certaines fonctionnalités des processeurs récents. Il est donc recommandé de répondre ’N’ à
cette option et de choisir le type processeur adéquat dans l’option « Processor family ».
L’option « HPET Timer Support » permet d’activer la prise en charge des horloges temps-réel de
nouvelle génération sur les systèmes les plus récent. En l’absence d’une telle horloge, l’horloge standard
sera utilisée. Vous pouvez répondre ’Y’ à cette question si vous disposez d’un ordinateur récent,
autrement répondez ’N’. L’option « Provide RTC interrupt » n’est pas documentée et ne sera pas
décrite ici.
L’option « Symmetric multi-processing support » permet d’activer le support des cartes mères
multi-processeurs. L’option suivante permet de sélectionner le nombre maximum de processeurs
disponibles sur la machine. La plupart des gens n’en disposant pas, vous pouvez répondre ’N’ à cette
question. Toutefois, si vous disposez d’un processeur Pentium IV hyperthreadé et que vous désirez
activer cette fonctionnalité, vous devrez répondre ’Y’ ici ainsi qu’à l’option « SMT (Hyperthreading)
scheduler support ».
L’option « Preemption Model » permet de spécifier si le noyau lui-même peut être préempté pendant
les appels systèmes ou non. La préemption des appels systèmes rend le noyau lui-même multitâche, et
permet donc d’augmenter la réactivité du système. Dans certaines circonstances, cela peut aussi accroître
le taux d’utilisation du processeur. Toutefois, cela peut aussi diminuer légèrement la bande passante dans
les opérations d’entrée / sortie. L’activation de cette option est recommandée pour les noyaux destinés à
des applications temps-réel ou multimédia, et déconseillée pour les noyaux destinés aux serveurs. Si
vous décidez d’autoriser la préemption des appels systèmes, vous pourrez faire en sorte que celle-ci soit
coopérative (le noyau lui-même vérifiera si d’autres tâches n’ont pas besoin d’être exécutées) ou forcée
(le noyau pourra être interrompu à n’importe quel moment), ce qui aura un impact sur la réactivité du
système. Le choix recommandée est « Preemptible Kernel (Low-Latency Desktop) », sauf si
vous envisager d’installer un serveur qui sera utilisé intensivement.
L’option « Preempt The Big Kernel Lock » permet d’autoriser les mécanismes de préemption
même au sein de la section critique globale du noyau. Cette option permet d’améliorer encore plus la
réactivité du système, et est recommandée pour les noyaux destinés à des machines de bureau. La
réponse recommandée est ’Y’.
L’option « Local APIC support on uniprocessors (NEW) » permet d’activer les contrôleurs
d’interruptions programmables intégrés dans certains processeurs. Certaines machines disposent d’un tel
processeur, si c’est votre cas, vous pouvez répondre par ’Y’ à cette question. Cette option n’est disponible
que si vous avez répondu ’N’ à la question « Symetric multi-processing support ».
L’option « IO-APIC support on uniprocessors » permet d’activer la gestion des contrôleurs
d’interruption programmables avancés. Ces contrôleurs sont utilisés sur les machines multi-processeurs,
mais certaines cartes mères monoprocesseurs les utilisent. Si c’est le cas de votre carte mère, vous
pouvez répondre par ’Y’ à cette question.
L’option « Machine Check Exception » permet d’activer la surveillance de l’état de l’ordinateur
(élévation anormale de température, pannes, etc.) afin de contourner les problèmes matériels ou d’arrêter
le système avant une destruction de composants ou des pertes de données irrémédiables. L’option
« Check for non-fatal errors on AMD Athlon/Duron / Intel Pentium 4 » permet
d’activer la surveillance des problèmes mineurs, qui ne nécessitent pas un arrêt de la machine, mais pour
lesquels on désire malgré tout avoir une trace dans les traces du noyau. L’option « check for P4
thermal throttling interrupt. » permet de générer une trace sur les systèmes à base de Pentium
IV lorsque ceux-ci surchauffent. La réponse recommandée est ’Y’ pour ces options si votre système
448
Annexe A. Options de configuration du noyau
449
Annexe A. Options de configuration du noyau
plages mémoires des périphériques, en particulier pour les cartes graphiques. Cette fonctionnalité n’est
disponible que pour les processeurs de type Pentium Pro et postérieurs. Si vous avez un ordinateur
récent, choisissez ’Y’.
L’option « Boot from EFI support (EXPERIMENTAL) » permet de prendre en charge les services
systèmes EFI disponibles sur certaines machines lors du démarrage. L’option recommandée est ’N’.
L’option « Enable kernel irq balancing » permet de répartir le traitement des interruptions
matérielles sur les différents processeurs dont la machine dispose. Cette option n’est disponible que si
l’option « Symmetric multi-processing support » a été activée. La réponse recommandée est
’Y’.
L’option « Use register arguments (EXPERIMENTAL) » permet d’optimiser les appels de
procédures en passant les premiers paramètres des fonctions dans les registres du processeur au lieu de
les passer par la pile. Elle permet donc de réduire les accès mémoire du noyau et de le rendre ainsi plus
rapide. En revanche, elle peut provoquer des erreurs de chargement de modules binaires qui n’ont pas été
pour un noyau qui n’avait pas cette option. La réponse recommandée est donc ’N’.
L’option « Enable seccomp to safely compute untrusted bytecode » permet d’activer le
support de « bacs à sable » pour isoler des applications désirant utiliser du code non authentifié dans un
système sécurisé. Cette option permet aux applications de restreindre les appels systèmes qu’elles
peuvent réaliser, et empêcher ainsi qu’elles soient détournées de leur fonctionnalité initiale. La réponse
recommandée est ’N’.
L’option « Timer frequency » permet de sélectionner la fréquence d’interruptions de l’horloge du
noyau. Les commutations de tâche étant réalisées lors de ces interruptions, une fréquence élevée permet
d’obtenir une forte réactivité du système. Toutefois, cette fréquence ne doit pas être trop élevée, afin
d’éviter de passer trop de temps à exécuter l’ordonnanceur du système. La fréquence de 1000 Hz est
donc la fréquence recommandée pour une machine de bureau, alors que les fréquences inférieures sont
recommandées sur les machines disposant d’un grand nombre de processeurs ou devant être utilisées en
tant que serveur. La réponse recommandée est « 1000 Hz ».
L’option « kexec system call (EXPERIMENTAL) » permet d’activer le support du redémarrage du
système directement dans un nouveau noyau, sans avoir à redémarrer complètement la machine. La
réponse recommandée est ’N’.
L’option « kernel crash dumps (EXPERIMENTAL) » permet d’activer la génération automatique
d’un rapport de plantage après chaque redémarrage par l’intermédiaire de l’appel système kexec. Cela
permet d’obtenir des informations même après un plantage du noyau sévère. La réponse recommandée
est ’N’.
450
Annexe A. Options de configuration du noyau
451
Annexe A. Options de configuration du noyau
matériel actuel. Il est recommandé de répondre par ’Y’ à cette question si vous ne pouvez pas utiliser
l’ACPI. Notez toutefois que la possibilité d’éteindre l’ordinateur via les fonctionnalités APM n’est
disponible que pour les ordinateurs disposant d’un boîtier au format ATX. De plus, ce n’est pas la
gestion d’énergie APM qui gère l’arrêt des disques durs et la veille des moniteurs « Green », et il est
possible d’avoir ces fonctionnalités même si l’on n’a pas activé la gestion d’énergie APM. Les options
suivantes dépendent fortement de la configuration APM des machines. Les options de ce menu ne seront
pas décrites plus en détails ici, car elles sont trop spécifiques à chaque modèle de machine. Pour la
plupart des gens, il faut répondre ’N’ à toutes ces questions.
L’option « CPU Frequency scaling » du menu du même nom permet d’activer la gestion des
processeurs à fréquence variable. Ces processeurs se rencontrent généralement dans les portables, à
cause du gain d’énergie obtenu en abaissant la fréquence du processeur lorsqu’il est peu utilisé. Les
options qui suivent permettent de spécifier l’interface logicielle fournie par le noyau pour contrôler la
fréquence du processeur, ainsi que d’indiquer la nature du processeur utilisé. La réponse recommandée
est ’N’, sauf si vous utilisez un portable.
452
Annexe A. Options de configuration du noyau
est donc recommandé d’activer cette fonctionnalité, à moins que vous ne cherchiez à faire un système
embarqué ou une disquette d’amorçage. La réponse recommandée est donc ’Y’.
L’option « PCI Debugging » permet d’activer les traces de débogage du sous-système PCI. Elles
peuvent être utiles en cas de problème, mais ne sont normalement pas nécessaires. La réponse
recommandée est ’N’.
L’option « ISA support » permet la prise en charge des bus ISA. Le bus ISA est un bus en voie de
désuétude, mais la plupart des anciennes cartes mères en disposent encore. Vous devez activer cette
option si votre ordinateur dispose encore d’un bus ISA. La réponse recommandée est ’Y’.
L’option « EISA support » permet d’activer la gestion des bus EISA. L’activation de cette
fonctionnalité donnera l’accès à des options spécifiques au matériel, ainsi qu’à l’option « EISA device
name database », qui permet d’obtenir des noms humainement lisibles des périphériques EISA
pendant leur configuration, et que l’on activera si l’on dispose de tels périphériques. Ce bus a désormais
complètement été remplacé par le bus PCI, aussi devriez-vous répondre par ’N’, à moins que vous ne
disposiez d’une machine très ancienne.
L’option « MCA support » permet d’activer la gestion des bus MCA (pour les PS/2 d’IBM). Si vous
activez cette option, vous accéderez à l’option « Legacy MCA API Support », qui permet de prendre
en charge l’API des anciens noyaux pour les périphériques MCA. Cette option n’est utile que pour
charger des gestionnaires de périphériques MCA fournis sous forme de module et qui n’ont pas été porté
pour le noyau 2.6. Si vous l’activez, cette option vous donnera accès à l’option « Support for the
mca entry in /proc », qui vous permettra d’accéder au fichier de gestion du bus MCA /proc/mca.
Les bus MCA étant en voie de désuétude, la réponse recommandée est ’N’.
L’option « NatSemi SCx200 support » permet de prendre en charge le processeur SCx200 de
National Semiconductor. La réponse recommandée est ’N’.
L’option « Support for hot-pluggable CPUs (EXPERIMENTAL) » permet de prendre en charge la
fonctionnalité de détection de processeurs connectés à chaud dont certains systèmes multiprocesseurs
disposent. La réponse recommandée est ’N’.
453
Annexe A. Options de configuration du noyau
Menu « Networking »
L’option « Networking support » permet d’activer la prise en charge des fonctionnalités réseau dans
le noyau. Étant donné que les systèmes Unix sont profondément orientés réseau, il faut impérativement
répondre ’Y’ à cette question. Cela vous donnera accès à des options complémentaires permettant de
configurer les fonctionnalités réseau prise en charge par le noyau, ainsi qu’au menu de sélection des
différents gestionnaires de périphériques réseau.
454
Annexe A. Options de configuration du noyau
L’option « IP: multicasting » permet d’autoriser l’envoi des données à plusieurs ordinateurs en
mode multicast (un paquet pour plusieurs destinations). Cette fonctionnalité permet de réduire le trafic
réseau dans certaines applications, mais elle est très peu utilisée. La réponse recommandée est donc ’N’.
L’option « IP: advanced router » permet de configurer le système pour être un routeur (ordinateur
qui transfère des informations d’un réseau à un autre). La réponse recommandée est ’N’.
L’option « Choose IP: FIB lookup algorithm (choose FIB_HASH if unsure) » permet de
sélectionner un algorithme de recherche dans les tables de routage. L’algorithme FIB_HASH convient
pour la majorité des utilisateurs, aussi est-il recommandé de le choisir.
L’option « IP: policy routing » permet d’activer le routage des paquets en fonction des adresses
source en plus des adresses destination des paquets. La réponse recommandée est ’N’.
L’option « IP: use netfilter MARK value as routing key » permet d’activer le routage en
fonction du champ MARK des paquets en plus des adresses destination. Le champ MARK est utilisé par
les fonctionnalités de filtrage du noyau, et permet d’identifier certains paquets pour leur faire subir des
traitements ultérieurs. Parmi ces traitements, on peut utiliser un routage spécifique, ce que cette option
permet de réaliser. Cette option n’est disponible que si l’option « Network packet filtering
(replaces ipchains) » est elle-même activée. La réponse recommandée est ’N’.
L’option « IP: equal cost multipath » permet de choisir une route possible parmi plusieurs routes
pour chaque paquet transmis. Cette option vous donnera accès à l’option « IP: equal cost
multipath with caching support (EXPERIMENTAL) », qui permet de mémoriser les routes dans
des caches du système. Les algorithmes de sélection des routes multiples peuvent être choisis avec les
sous-options suivantes. La réponse recommandée est ’N’ pour ces deux options.
L’option « IP: verbose route monitoring » permet d’activer les traces du sous-système de
routage. La réponse recommandée est ’N’.
L’option « IP: kernel level autoconfiguration » permet de réaliser la configuration du
protocole réseau IP au niveau du noyau, lors de la phase de démarrage. Cette option est utilisée
notamment lorsqu’on désire monter le système de fichiers racine par NFS. La réponse recommandée est
’N’.
L’option « IP: DHCP support » permet de demander au noyau de déterminer automatiquement
l’adresse IP lors du démarrage grâce au protocole « DHCP ». Cette option n’est valide que lorsque
l’option « IP: kernel level autoconfiguration » a été activée. La réponse recommandée est
’N’.
L’option « IP: BOOTP support » permet de demander au noyau de déterminer automatiquement
l’adresse IP lors du démarrage grâce au protocole « BOOTP ». Cette option n’est valide que lorsque
l’option « IP: kernel level autoconfiguration » a été activée. La réponse recommandée est
’N’.
L’option « IP: RARP support » permet de demander au noyau de déterminer automatiquement
l’adresse IP lors du démarrage grâce au protocole « RARP ». Ce protocole est un protocole plus ancien
que le protocole BOOTP, il est en passe de devenir obsolète. Cette option n’est valide que lorsque
l’option « IP: kernel level configuration » a été activée. La réponse recommandée est ’N’.
L’option « IP: tunneling » permet d’activer l’encapsulation des paquets d’un protocole dans les
paquets d’un autre protocole. La réponse recommandée est ’N’.
L’option « IP: GRE tunnels over IP » permet d’autoriser l’encapsulation des protocoles IPv4 et
IPv6 avec la méthode « GRE » abréviation de l’anglais « Generic Routing Encapsulation »). Cette
455
Annexe A. Options de configuration du noyau
méthode d’encapsulation est destinée aux routeurs Cisco. La réponse recommandée est ’N’.
L’option « IP: broadcast GRE over IP » permet de créer un réseau Ethernet virtuel sur IP par
l’intermédiaire de la méthode d’encapsulation GRE, qui permet d’effectuer des broadcasts d’IP dans le
réseau virtuel. La réponse recommandée est ’N’.
L’option « IP: multicast routing » permet de configurer le système pour le routage des paquets
ayant plusieurs destinations (c’est-à-dire les paquets IP envoyés en multicast). La réponse recommandée
est ’N’.
L’option « IP: PIM-SM version 1 support » permet d’activer la gestion du protocole de routage
« PIM » des paquets envoyés en multicast. Ce protocole est géré par Cisco. La réponse recommandée est
’N’.
L’option « IP: PIM-SM version 2 support » permet d’activer la gestion de la version 2 du
protocole de routage PIM. La réponse recommandée est ’N’.
L’option « IP: ARP daemon support EXPERIMENTAL) » permet de limiter à 256 la table d’adresses
physiques utilisées pour les requêtes ARP. Cette option est utile pour limiter la consommation mémoire
du noyau dans les grands réseaux. Les requêtes ne pouvant être satisfaites directement sont transférées à
un démon, repoussant ainsi le reste de la table hors de la mémoire du noyau. La réponse recommandée
est ’N’.
L’option « IP: TCP syncookie support (disabled per default) » permet de protéger la
machine d’une certaine forme d’attaque du protocole réseau TCP/IP visant à provoquer un déni de
service. Le fait de répondre par ’Y’ à cette question inclut le support de cette protection, mais ne l’active
pas par défaut. L’activation doit se faire par configuration dynamique du noyau via /proc/. La réponse
recommandée est ’N’.
L’option « IP: AH transformation » permet de prendre en charge l’extension AH pour le protocole
IPv4. Cette extension permet de s’assurer que les en-têtes IP sont authentiques, c’est-à-dire que la
machine qui prétend les avoir envoyés est bien la machine qui les a effectivement envoyés. Cette option
nécessite les fonctionnalités de cryptographie du menu « Cryptographic options ». La réponse
recommandée est ’Y’.
L’option « IP: ESP transformation » permet de prendre en charge l’extension ESP pour le
protocole IPv4. Cette extension permet de s’assurer de la confidentialité des données transférées sur le
réseau, en chiffrant les données transmises. Cette option va de pair avec l’option « IP: AH
transformation » et ne sert à rien sans elle (communiquer de manière chiffrée avec un pirate au lieu
du bon destinataire ne dérange pas vraiment celui-ci). Cette option nécessite les fonctionnalités de
cryptographie du menu « Cryptographic options ». La réponse recommandée est ’Y’.
L’option « IP: IPComp transformation » permet de prendre en charge l’extension de compression
de données du protocole IPv4. Cette option permet de compresser les données avant chiffrement, dans le
cas où l’on utiliserait également l’extension ESP. En effet, les données chiffrées apparaissent
généralement comme des données parfaitement aléatoires et ne peuvent donc pas être compressées, il est
donc nécessaire d’effectuer cette compression avant chiffrement, ce que fait cette extension. La réponse
recommandée est ’Y’.
L’option « IP: tunnel transformation » permet d’activer les fonctionnalités de base de
transformation des paquets IP pour leur encapsulation. Cette option est nécessaire pour la compression
de paquets IP et les fonctions de créations de tunnels IP. La réponse recommandée est ’Y’.
L’option « IP: TCP socket monitoring interface » permet d’activer la prise en charge de
l’interface de surveillance des sockets TCP, qui est utilisée par certains outils réseau. La réponse
456
Annexe A. Options de configuration du noyau
457
Annexe A. Options de configuration du noyau
458
Annexe A. Options de configuration du noyau
459
Annexe A. Options de configuration du noyau
L’option « Connection tracking flow accounting » permet d’activer la prise en charge des
statistiques des partages de connexion pour chaque flux réseau. Ces statistiques peuvent ensuite être
utilisées pour définir des quotas dans iptables via le critère de sélection connbytes. La réponse
recommandée est ’N
L’option « Connection mark tracking support » permet d’activer le critère de sélection
connmark et la cible CONNMARK d’iptables. Cette fonctionnalité permet d’identifier tous les paquets
d’une même connexion. La réponse recommandée est ’N’.
L’option « SCTP protocol connection tracking support (EXPERIMENTAL) » active la gestion
du suivi des connexions SCTP utilisé pour la diffusion des flux multimedia sur Internet. Ces connexions
nécessitent en effet un traitement particulier, et vous devrez activer cette option si vous voulez utiliser des
connexions SCTP avec un partage de connexion à Internet. La réponse recommandée est ’N’.
L’option « FTP protocol support » active la gestion du suivi des connexions FTP. Ces connexions
nécessitent en effet un traitement particulier, et vous devrez activer cette option si vous voulez utiliser des
connexions FTP avec un partage de connexion à Internet. La réponse recommandée est ’Y’.
L’option « IRC protocol support » active la prise en charge des commandes de transfert de fichiers
DDC du protocole IRC. Si vous utiliser IRC couramment, il est expressément recommandé de répondre
’Y’ à cette question, faute de quoi vous ne pourrez pas échanger de fichiers avec vos interlocuteurs.
L’option « TFTP protocol support » active la gestion du suivi des connexions TFTP. Si vous utilisez
des clients TFTP au travers de votre partage de connexion à Internet, vous devez activer cette option. La
réponse recommandée est ’Y’.
L’option « Amanda protocol support » active la gestion des connexions utilisant le protocole réseau
du logiciel de sauvegarde Amanda. La réponse recommandée est ’N’, sauf si bien sûr vous utilisez ce
logiciel.
L’option « Userspace queueing via NETLINK (EXPERIMENTAL) » permet de mettre à disposition
de programmes clients les paquets traités par le code de filtrage, par l’intermédiaire de l’interface
Netlink. La réponse recommandée est ’N’.
L’option « IP tables support (required for filtering/masq/NAT) » permet d’activer la
gestion des tables au sein du code de filtrage du noyau. Une table est en réalité un ensemble cohérent de
fonctionnalités permettant d’appliquer des traitements aux paquets selon des règles organisées en
groupes. Ces traitements peuvent intervenir à différents endroits dans la gestion des paquets par le code
réseau du noyau. Les deux tables les plus importantes sont celles qui permettent de réaliser le filtrage des
paquets et les translations d’adresses. Vous devez donc activer cette fonctionnalité si vous désirez réaliser
un Firewall ou un partage de connexion à Internet. La réponse recommandée est ’Y’.
L’option « limit match support » active la gestion de la limitation du nombre de fois par seconde
qu’une règle peut être vérifiée par un paquet. Cette limitation est utile lorsqu’on enregistre des messages
pour tous les paquets qui vérifient certaines règles, afin d’éviter l’engorgement des fichiers de traces du
système. La réponse recommandée est ’Y’.
L’option « IP range match support » permet de prendre en charge les règles de sélection de
paquets définies sur des plages d’adresses IP. La réponse recommandée est ’Y’.
L’option « MAC address match support » active la gestion du critère de sélection des paquets basé
sur leur adresse Ethernet source. Cette règle n’est utilisable que pour les paquets provenant d’une
interface réseau de type Ethernet. La réponse recommandée est ’N’.
460
Annexe A. Options de configuration du noyau
L’option « Packet type match support » vous permet de sélectionner les paquets en fonction de
leur nature (broadcast, multicast, etc...). La réponse recommandée est ’N’.
L’option « netfilter MARK match support » active la gestion du critère de sélection des paquets
basé sur le champ MARK de leur en-tête. Ce champ peut être modifié par certaines règles des chaînes
précédemment traversées par les paquets, afin de les marquer pour un traitement ultérieur. Cette option
doit donc obligatoirement être activée si l’on désire détecter ces paquets pour effectuer ce traitement. La
réponse recommandée est ’N’.
L’option « Multiple port match support » permet d’utiliser des plages de valeurs pour les ports
TCP et UDP dans les critères de sélection des règles pour ces deux protocoles. Sans cette option, les
ports doivent être spécifiés un à un, ce qui peut rendre relativement peu pratique la définition de certaines
règles. La réponse recommandée est ’Y’.
L’option « TOS match support » active la gestion du critère de sélection des paquets basé sur le
champ TOS de leur en-tête. Ce champ permet de définir le type de service des paquets, principalement
afin de distinguer les paquets prioritaires des paquets normaux. La réponse recommandée est ’Y’.
L’option « recent match support » permet un critère de sélection basé sur des listes d’adresses IP
avec lesquelles des communications se sont faites récemment. La réponse recommandée est ’N’.
L’option « ECN match support » active la gestion du critère de sélection des paquets basé sur le
champ ECN de leur en-tête. La réponse recommandée est ’N’.
L’option « DSCP match support » active la gestion du critère de sélection des paquets basé sur le
champ DSCP de leur en-tête. La réponse recommandée est ’N’.
L’option « AH/ESP match support » active la gestion des critères de sélection basés sur les
informations utilisées par les protocoles de sécurisation AH et ESP de l’extension IPSec du protocole IP.
La réponse recommandée est ’N’.
L’option « LENGTH match support » active la gestion du critère de sélection basé sur la longueur des
paquets. La réponse recommandée est ’N’.
L’option « TTL match support » permet d’utiliser le champ TTL des paquets comme critère de
sélection. Ce champ permet de définir la durée de vie des paquets au travers des différents routeurs, et
permet de limiter la propagation des paquets sur Internet à un certain nombre d’interconnexions
seulement. La réponse recommandée est ’N’.
L’option « tcpmss match support » permet de prendre en compte le champ MSS des paquets de
demande de connexion dans les critères de sélection. Ce champ indique la taille maximale que les
paquets de cette connexion devront utiliser pas la suite. La réponse recommandée est ’N’.
L’option « Helper match support » active la gestion du critère de sélection des paquets participant à
une connexion établie et suivie par l’une des fonctionnalités activées par l’option « Connection
tracking (required for masq/NAT) » . La réponse recommandée est ’Y’.
L’option « Connection state match support » permet de sélectionner les paquets selon leur rôle
dans la gestion des connexions réseau. Par exemple, cette option permet de distinguer les paquets qui
établissent une connexion réseau des autres paquets. La réponse recommandée est ’Y’.
L’option « Connection tracking match support » permet de sélectionner les paquets selon les
connexions réseau auxquels ils appartiennent. Par exemple, cette option permet de distinguer les paquets
de différentes connexions virtuelles dans le cas du tunneling. La réponse recommandée est ’Y’.
461
Annexe A. Options de configuration du noyau
L’option « Owner match support (EXPERIMENTAL) » permet de sélectionner les paquets créés par
les processus locaux en utilisant comme critère les identifiants de groupe, de processus et d’utilisateur de
celui qui les a créés. Ces critères de sélection ne sont pas utilisables sur les paquets provenant de
l’extérieur. La réponse recommandée est ’N’.
L’option « Physdev match support » permet de sélectionner les paquets en fonction du port
physique sur lequel ils arrivent ou doivent repartir dans le cas d’une configuration de la machine en tant
que pont. Cette option n’est disponible que si la machine a été configurée pour faire office de pont entre
deux réseaux. La réponse recommandée est ’N’.
L’option « address type match support » permet de sélectionner les paquets en fonction de ce que
le code de routage du noyau pense de la nature d’une adresse (diffusion, point à point, etc.). Cette option
est très spécifique, aussi la réponse recommandée est-elle ’N’.
L’option « realm match support » permet de sélectionner les paquets en fonction de la clef realm
du code de routage du noyau. Cette option est très spécifique, aussi la réponse recommandée est-elle ’N’.
L’option « SCTP protocol match support » permet de sélectionner les paquets qui utilisent le
protocole SCTP. La réponse recommandée est ’N’.
L’option « comment match support » permet de prendre en charge un mode de sélection virtuel des
paquets, qui permet d’ajouter des commentaires dans les jeux de règles de filtrage du noyau. La réponse
recommandée est ’N’.
L’option « Connection mark match support (NEW) » permet de sélectionner les paquets selon le
numéro de la connexion à laquelle ils appartiennent et qui leur est attribué par la fonctionnalité de suivi
des connexions. La réponse recommandée est ’N’.
L’option « hashlimit match support (NEW) » permet de sélectionner les paquets selon des limites
statistiques calculées à l’aide d’une table de hachage sur leurs adresses. La réponse recommandée est ’N’.
L’option « Packet filtering » active la gestion de la table filter, couramment utilisée pour filtrer
les paquets autorisés et réaliser un Firewall. La réponse recommandée est ’Y’.
L’option « REJECT target support » active la gestion de la cible REJECT dans les règles des chaînes
de la table filter. Cette cible se distingue de la cible DROP, gérée nativement par la table filter, par
le fait qu’un message d’erreur est renvoyé à la machine source du paquet. La réponse recommandée est
’Y’.
L’option « LOG target support » active la gestion de la cible LOG. Cette cible permet d’enregistrer
des messages de débogage dans les fichiers de traces du système. On veillera à activer également la
gestion des limites sur les règles de filtrage afin d’éviter d’engorger les fichiers de traces si l’on désire
utiliser cette option. La réponse recommandée est ’Y’.
L’option « ULOG target support » active la gestion de la cible ULOG. Cette cible permet d’enregistrer
des messages de débogage au niveau d’un processus de gestion de traces fonctionnant dans l’espace
utilisateur. La réponse recommandée est ’Y’.
L’option « TCPMSS target support » active la gestion de la cible TCPMSS, qui permet de modifier
le champ MSS des paquets TCP. Cette cible est utilisée généralement pour réduire cette taille à la valeur
fixée par le champ MTU des interfaces réseau, afin de prévenir la perte de paquets quand cette taille n’est
pas correctement définie. Cela peut se produire avec certains fournisseurs d’accès à Internet, dont les
passerelles sont mal configurées. Il est recommandé de répondre ’Y’ à cette question.
L’option « Full NAT » active les fonctionnalités de translation d’adresses, au travers de la table nat.
Cette option doit être activée si vous désirez réaliser un partage de connexion à Internet. Dans le cas
462
Annexe A. Options de configuration du noyau
463
Annexe A. Options de configuration du noyau
permettra d’activer la prise en charge de la cible NOTRACK (option « NOTRACK target support »),
qui permet de marquer les paquets comme ne devant pas être pris en compte par les mécanismes de suivi
de connexion. La réponse recommandée pour ces deux options est ’N’.
L’option « ARP tables support » permet de permettre la prise en charge des paquets ARP au niveau
du code de filtrage du noyau. La réponse recommandée est ’N’.
L’option « ARP packet filtering (NEW) » permet de filtrer et sélectionner les paquets ARP au
niveau du noyau, éventuellement pour les modifier. La réponse recommandée est ’N’.
L’option « ARP payload mangling (NEW) » permet de modifier à la volée les informations circulant
dans les paquets ARP, comme l’adresse source et l’adresse destination, ainsi que les adresses MAC. La
réponse recommandée est ’N’.
464
Annexe A. Options de configuration du noyau
465
Annexe A. Options de configuration du noyau
Les options qui suivent permettent de choisir les algorithmes à utiliser pour la détermination des priorités
d’émission. Parmi ces algorithmes, on retrouve les algorithmes basés sur la notion de qualité de service,
qui peuvent être activés grâce à l’option « QoS support ». Les options suivantes permettent de
paramétrer les notions attachées à la qualité de service.
466
Annexe A. Options de configuration du noyau
Il faut choisir le protocole de communication que vous désirez dans les options qui suivent. Les dernière
options permettent de choisir les options de ces protocoles.
467
Annexe A. Options de configuration du noyau
Device Drivers
Ce menu contient l’ensemble des options relatives aux gestionnaires de péripériques pris en charge par
Linux.
468
Annexe A. Options de configuration du noyau
le noyau ne le nécessiterait. Cela permet de disposer de cette fonctionnalité pour les gestionnaires de
périphériques externes fournis sous forme de module. La réponse recommandée est ’Y’.
L’option « Driver Core verbose debug messages » permet d’activer les messages de trace du
système de base des gestionnaires de périphériques. La réponse recommandée est ’N’.
469
Annexe A. Options de configuration du noyau
imprimante capable d’indiquer son état à l’ordinateur. Notez que pour que cette fonctionnalité soit
disponible, vous devez également paramétrer votre BIOS pour que le port parallèle soit en mode EPP ou
ECP. La réponse recommandée est ’Y’.
470
Annexe A. Options de configuration du noyau
choisissez le protocole de communication sur port parallèle correspondant dans l’une des options
suivantes. La réponse recommandée est ’N’.
L’option « Parallel port ATAPI CD-ROMs (NEW) » permet d’activer la gestion des CD-ROM
ATAPI connectés sur port parallèle. Si vous disposez d’un tel lecteur, répondez par ’M’ à cette question,
et choisissez le protocole de communication sur port parallèle correspondant dans l’une des options
suivantes. La réponse recommandée est ’N’.
L’option « Parallel port ATAPI disks (NEW) » permet d’activer la gestion des disques ATAPI
connectés sur port parallèle. Si vous disposez d’un tel disque, répondez par ’M’ à cette question, et
choisissez le protocole de communication sur port parallèle correspondant dans l’une des options
suivantes. La réponse recommandée est ’N’.
L’option « Parallel port ATAPI tapes (NEW) » permet d’activer la gestion des lecteurs de bandes
connectés sur port parallèle. Si vous disposez d’un tel lecteur, répondez par ’M’ à cette question, et
choisissez le protocole de communication sur port parallèle correspondant dans l’une des options
suivantes. La réponse recommandée est ’N’.
L’option « Parallel port generic ATAPI devices (NEW) » permet la gestion de périphériques
ATAPI non standards connectés au port parallèle. Les logiciels utilisateur peuvent envoyer des
commandes ATAPI spécifiques à ces périphériques par l’intermédiaire de ce gestionnaire. En particulier,
les graveurs de CD connectés sur port parallèle utilisent cette fonctionnalité. Si vous disposez d’un
graveur de CD sur port parallèle, répondez par ’M’ à cette question, et choisissez le protocole de
communication sur port parallèle correspondant dans l’une des options suivantes. La réponse
recommandée est ’N’.
Les options qui suivent permettent de choisir les protocoles de communication sur port parallèle adaptés
à votre matériel. Vous devez en choisir au moins un si vous comptez utiliser un périphérique IDE
connecté sur le port parallèle. Les réponses recommandées sont ’N’ pour les protocoles que votre
matériel ne comprend pas.
L’option « Compaq SMART2 support » permet d’activer la gestion des cartes contrôleurs Smart Array
de Compaq. À moins que vous ne disposiez d’une telle carte, la réponse recommandée est ’N’.
L’option « Compaq Smart Array 5xxx support » permet d’activer la gestion des cartes contrôleurs
Smart Array 5xxx de Compaq. À moins que vous ne disposiez d’une telle carte, la réponse recommandée
est ’N’. Si vous activez cette fonctionnalité, vous pourrez également activer l’option « SCSI tape
drive support for Smart Array 5xxx », qui permet d’utiliser des périphériques SCSI connectés
sur les contrôleurs Smart Array 5xxx. La réponse recommandée pour cette option est également ’N’.
L’option « Mylex DAC960/DAC1100 PCI RAID Controler support » permet d’activer la gestion
des contrôleurs RAID Mylex. La réponse recommandée est ’N’.
L’option « Micro Memory MM5415 Battery Backed RAM support (EXPERIMENTAL) » permet
d’activer la gestion des cartes mémoires alimentées par batterie MM5415. La réponse recommandée est
’N’.
L’option « Loopback device support » permet d’utiliser des fichiers classiques pour y placer un
système de fichiers. Cela est essentiellement utilisé pour créer des images de CD et les tester avant de les
graver. Si vous disposez d’un graveur de CD-ROM, il est recommandé de répondre ’Y’ à cette question.
Sinon, répondez ’M’, pour vous réserver la possibilité d’utiliser des systèmes de fichiers stockés dans des
fichiers classiques.
L’option « Cryptoloop Support » permet d’activer le chiffrement des disques durs par les
algorithmes de chiffrement de Linux, en passant par l’intermédiaire d’un système de fichiers loopback.
471
Annexe A. Options de configuration du noyau
Cette option nécessite d’inclure le support des algorithmes de chiffrement, accessibles dans le menu
« Cryptographic options ». Cette option n’est pas cryptographiquement sûre, et ne permet pas de stocker
des systèmes de fichiers journalisés de manière fiable. Aussi n’est-elle pas recommandée, et on lui
préférera les fonctionnalités de gestion des volumes disponibles dans le menu « Multi-device support
(RAID and LVM) ». La réponse recommandée pour cette option est donc ’N’.
L’option « Network block device support » permet d’accéder aux fichiers spéciaux de
périphériques de type bloc d’un ordinateur distant par l’intermédiaire du réseau. Cette fonctionnalité est
peu utilisée, la réponse recommandée est donc ’N’.
L’option « Promise SATA SX8 support » permet d’activer la gestion des contrôleurs Serial ATA
SX8. Vous devez l’activer si vous en disposez d’un. La réponse recommandée est ’N’.
L’option « Low Performance USB Block driver » permet de prendre en charge certains
périphériques de masse USB très lents. La réponse recommandée est ’N’.
L’option « RAM disk support » permet d’activer la gestion des disques virtuels (chargés en mémoire).
Notez que cette option n’est pas nécessaire pour activer les système de fichiers en mémoire (ramfs), car
ceux-ci sont intégrés d’office dans le noyau. Elle ne sert qu’à créer des périphériques de type bloc afin de
fixer la taille des disques virtuels (le système de fichiers ramfs ne nécessite pas ces périphériques et
adapte dynamiquement sa taille en fonction des besoins). Ces disques virtuels sont généralement utilisés
pour créer des disquettes de réparation, qui chargent les utilitaires systèmes sur un disque en mémoire.
La réponse recommandée est donc ’N’ pour un système normal, et ’Y’ pour un système destiné à être
placé sur une disquette de réparation.
L’option « Default number of RAM disks » permet de fixer le nombre de disques virtuels par
défaut. La valeur recommandée est ’16’.
L’option « Default RAM disk size » permet de fixer la taille par défaut des disques virtuels. La
taille recommandée est de 4096 Ko.
L’option « Initial RAM disk (initrd) support » permet de créer un système de fichiers en
mémoire au démarrage de l’ordinateur, afin d’y placer le système de fichiers racine. Cette option est utile
pour créer des disquettes de démarrage. La réponse recommandée est ’N’.
L’option « Initramfs source file(s) » permet de spécifier les fichiers du système de fichiers
racine que le noyau doit placer dans un disque virtuel RAMFS au démarrage. Cette option n’est utilisée
que pour les disquettes d’amorçage et n’est pas nécessaire en temps normal. La réponse recommandée
est donc ’N’. Si vous l’activez, cette option vous donnera accès aux options « User ID to map to 0
(user root) (NEW) » et « Group ID to map to 0 (group root) (NEW) » , qui permettent
d’indiquer respectivement un identifiant d’utilisateur et un identifiant de groupe pour les fichiers qui
devront être affectés au superutilisateur dans le système de fichiers racine du disque virtuel.
L’option « Support for Large Block Devices » permet de prendre en charge les périphériques de
type bloc de grande dimensions (c’est-à-dire plus de 2 téra octets). La réponse recommandé est ’N’.
L’option « Packet writing on CD/DVD media » permet d’activer l’écriture par paquet sur les
supports CD et DVD réinscriptibles. Cette fonctionnalité permet d’utiliser ces supports directement
comme des lecteurs amovibles classiques, sans avoir à utiliser de logiciel de gravage spécifique. La
réponse recommandé est ’Y’. Les sous options « Free buffers for data gathering » et
« Enable write caching » de cette option permettent de spécifier le nombre de tampons
d’entrée/sortie utilisés simultanément pour les écritures et si les écritures doivent être effectuées de
manière asynchrone afin d’optimiser les performances. Dans ce dernier cas, les erreurs d’écritures ne
sont pas encore gérées, aussi est-il préférable de répondre par ’N’ à cette dernière question.
472
Annexe A. Options de configuration du noyau
L’option « ATA over Ethernet support » permet de prendre en charge les périphériques de
stockage ATA connectables via un port Ethernet. La réponse recommandé est ’N’.
Menu « IO Schedulers »
L’option « No-op I/O scheduler (NEW) » permet de choisir un ordonnanceur des opérations
d’entrées/sorties minimal. Cet ordonnanceur n’est pas performant sur les périphériques classiques, mais
peut économiser du temps et de la place sur les périphériques à accès aléatoire, comme les disques
virtuels souvent utilisés dans les systèmes embarqués par exemple. Les systèmes classiques n’utiliseront
certainement pas cet ordonnanceur, et la réponse recommandée est ’N/’.
L’option « Anticipatory I/O scheduler (NEW) » active l’ordonnanceur d’entrées/sorties par
défaut de Linux. Cet ordonnanceur peut effectuer les opérations de manière anticipée lorsqu’il en a la
possibilité, afin d’avoir éviter de les faire de manière bloquante lorsque le système sera peut-être plus
occupé à des opérations plus importantes que les entrées/sorties. Cette politique permet donc
d’augmenter les performances de manière générale, sauf dans de rares cas d’utilisation, essentiellement
lors de l’utilisation de certaines bases de données. La réponse recommandée est ’Y’. Cet ordonnanceur
est l’ordonnanceur par défaut de Linux.
L’option « Deadline I/O scheduler (NEW) » active un ordonnanceur plus simplifié et plus
compact, relativement correct et parfois plus rapide que l’ordonnaceur de l’option « Anticipatory
I/O scheduler (NEW) », en particulier avec certaines bases de données. Cette option peut donc être
utile dans certaines applications serveur. La réponse recommandée est ’Y’. Il peut être sélectionné
comme ordonnanceur par défaut du système au démarrage avec la ligne de commande
« elevator=deadline » du noyau.
L’option « CFQ I/O scheduler (NEW) » active un ordonnanceur qui répartit les requêtes
d’entrée/sortie de manière équitable entre tous les processus du système. Cet ordonnanceur garantit donc
une meilleure répartition des accès aux périphériques que les autres, ce qui le rend très adapté pour les
systèmes où la réactivité des processus doit être maximale. C’est l’ordonnanceur de prédilection pour les
ordinateurs personnels, la réponse recommandée est donc ’Y’. Il peut être sélectionné comme
ordonnanceur par défaut du système au démarrage avec la ligne de commande « elevator=cfq » du
noyau.
473
Annexe A. Options de configuration du noyau
L’option « Use old disk-only driver on primary interface » permet d’utiliser un vieux
pilote pour les disques IDE connectés à la première interface IDE et qui poseraient quelques problèmes
avec le pilote général. Seule la première interface sera concernée par cette option, les autres interfaces
utiliseront le nouveau pilote. En général, la réponse à cette question est ’N’.
L’option « Include IDE/ATA-2 DISK support » permet d’utiliser les disques durs IDE et ATAPI. Si
l’ordinateur possède un disque IDE, il est fortement recommandé de répondre ’Y’ à cette question. On ne
doit répondre ’N’ que si l’ordinateur est complètement SCSI. De plus, on prendra garde au fait que l’on
ne peut pas mettre les fonctionnalités nécessaires au démarrage de l’ordinateur dans des modules. Cela
signifie que si le disque de démarrage est un disque IDE, il ne faut pas mettre cette fonctionnalité dans un
module. Donc, pour la plupart des gens, il faut répondre ’Y’ à cette question.
L’option « Use multi-mode by default » permet d’activer le mode multimode par défaut sur les
disques IDE. Cette option n’est normalement pas nécessaire, ce mode étant automatiquement choisi par
le noyau. Toutefois, elle peut être nécessaire dans de rares cas. La réponse recommandée est ’N’.
L’option « PCMCIA IDE support » permet d’activer la gestion des périphériques IDE connectés par un
port PCMCIA sur les portables. Cette option n’est accessible que si vous avez activé la gestion des cartes
PCMCIA avec l’option « CardBus support » du menu « PCMCIA/CardBus support ». La réponse
recommandée est ’N’.
L’option « Include IDE/ATAPI CDROM support » permet d’utiliser les CD-ROM IDE et ATAPI. La
plupart des ordinateurs possèdent un lecteur de CD-ROM ATAPI actuellement, il est donc recommandé
d’activer cette fonctionnalité. La réponse recommandée est ’Y’.
L’option « Include IDE/ATAPI TAPE support (EXPERIMENTAL) » permet d’inclure la gestion des
lecteurs de bandes magnétiques IDE et ATAPI. Comme les lecteurs de disques amovibles IDE sont assez
rares, la réponse recommandée est ’N’.
L’option « Include IDE/ATAPI FLOPPY support » permet d’inclure la gestion des lecteurs de
disques amovibles IDE et ATAPI. C’est en particulier le cas pour les lecteurs LS120 et ZIP. Comme les
lecteurs de disques amovibles IDE sont assez rares, la réponse recommandée est ’N’.
L’option « SCSI emulation support » permet d’émuler la présence d’un périphérique IDE par un
périphérique SCSI en convertissant les requêtes SCSI en requêtes ATAPI. Cette fonctionnalité n’est utile
que lorsqu’on doit utiliser des logiciels bas niveau qui ne peuvent travailler qu’avec des périphériques
SCSI. Cette option était nécessaire pour utiliser les graveurs de CD IDE avec les anciennes versions du
noyau, mais ce n’est plus le cas à présent. Cette option n’est donc plus utile de nos jours et la réponse
recommandée est ’N’.
L’option « IDE Taskfile Access » permet d’activer l’envoi de commandes directement au niveau du
contrôleur IDE. La réponse recommandée est ’N’.
L’option « generic/default IDE chipset support » permet d’activer la prise en charge
générique des périphériques ATAPI en cas d’absence d’un gestionnaire plus spécialisé. La réponse
recommandée est ’N’.
L’option « CMD640 chipset bugfix/support » permet de contourner un bogue des chipsets IDE
CMD640. Vous devez activer cette option si vous disposez d’un tel chipset. La réponse recommandée est
’Y’ si vous avez un tel chipset, et ’N’ sinon.
L’option « CMD640 enhanced support (NEW) » permet l’auto-détection des paramètres idéaux pour
les chipsets IDE CMD640. Cette option n’est disponible que si vous avez activé le support des chipsets
CMD640 dans la question précédente. La réponse recommandée est ’Y’ si vous avez un tel chipset, et ’N’
sinon.
474
Annexe A. Options de configuration du noyau
L’option « PNP EIDE support » permet de prendre en charge la gestion des cartes ISA Plug and Play
permettant d’utiliser des disques EIDE additionnels. Cette option peut être nécessaire si ces cartes
doivent être initialisées avant de chercher à utiliser les disques qui y sont connectés. La réponse
recommandée est ’N’.
L’option « PCI IDE chipset support » permet d’activer la gestion des périphériques IDE sur bus
PCI. Vous devez répondre par ’Y’ à cette question si vous disposez d’une carte mère PCI et de
contrôleurs IDE, ce qui est normalement le cas pour tous les ordinateurs récents.
L’option « Sharing PCI IDE interrupts support » permet d’activer le partage des lignes
d’interruptions utilisées par les contrôleurs IDE avec les cartes présentes sur le bus PCI. Cette
fonctionnalité nécessite un support matériel particulier de la part du contrôleur IDE, support qui n’est
présent que sur certaines cartes mères. En général, l’activation de cette option ne perturbe pas le
fonctionnement du système sur les ordinateurs incapables d’effectuer le partage des lignes
d’interruptions des contrôleurs IDE, mais la réponse recommandée reste ’N’.
L’option « Boot off-board chipsets first support » permet d’inverser la numérotation des
disques IDE connectés aux contrôleurs de la carte mère et des disques IDE connectés aux contrôleurs
additionnels que l’on peut avoir sur une carte fille. Il faut répondre par ’N’ à cette question.
L’option « Generic PCI IDE Chipset support » permet d’activer la gestion des périphériques IDE
génériques. La réponse recommandée à cette question est ’Y’.
L’option « OPTi 82C621 chipset enhanced support (EXPERIMENTAL) » permet de prendre en
charge les chipsets OPTi 82C621. La réponse recommandée est ’N’.
L’option « RZ1000 chipset bugfix/support » permet de prendre en charge les chipsets RZ1000 et
de corriger un de leur bogue. La réponse recommandée est ’Y si vous disposez d’un tel chipset, et de ’N’
sinon.
L’option « Generic PCI bus-master DMA support » permet d’activer la gestion des disques Ultra
DMA. La réponse recommandée est ’Y’ si vous disposez d’une carte mère PCI gérant l’Ultra DMA et de
disques IDE.
L’option « Force enable legacy 2.0.X HOSTS to use DMA » permet d’activer une vieille
fonctionnalité non documentée et ne sera pas décrite ici. L’option recommandée ’N’.
L’option « Use PCI DMA by default when available » permet d’activer la gestion de l’Ultra
DMA au démarrage. La réponse recommandée est ’Y’, sauf si l’on veut désactiver le support de l’Ultra
DMA.
L’option « Enable DMA only for disks » permet de désactiver les transferts DMA pour les
périphériques IDE qui ne sont pas des disques durs. Cette option peut être activée si des périphériques
connectés ne gèrent pas correctement les transferts DMA. La réponse recommandée est ’Y’.
Il suit un certain nombre d’options qui permettent d’activer un support étendu pour différents chipsets. Il
est recommandé de répondre par ’N’ à ces questions, sauf à celles correspondant aux chipsets
effectivement présents sur votre carte mère.
L’option « IGNORE word93 Validation BITS » permet d’éviter une inconsistance dans les
spécifications du protocole matériel ATAPI. Ces spécifications n’ont pas été claires à un endroit, et il
existe maintenant des différences mineures entre les différents chipsets présents sur le marché. Cette
option permet de désactiver cette fonctionnalité ambiguë. Bien qu’il ne soit pas dangereux de répondre
par l’affirmative à cette question, la réponse recommandée reste ’N’.
475
Annexe A. Options de configuration du noyau
L’option « Old hard disk (MFM/RLL/IDE) driver » permet de prendre en charge les disques durs
via un pilote de disque alternatif, qui peut être nécessaire sur certains vieux systèmes dont le
comportement n’est pas semblable à celui des ordinateurs récents au niveau du séquencement des
opérations. La réponse recommandée est ’N’.
476
Annexe A. Options de configuration du noyau
L’option « SCSI media changer support » permet de prendre en charge les périphériques de
changement de média que l’on peut trouver dans les bibliothèques de bandes magnétiques ou dans
certains jukebox. La réponse recommandée est ’N’.
L’option « Probe all LUNs on each SCSI device » permet d’effectuer la détection de tous les
numéros logiques d’unités SCSI de chaque périphérique. Comme la plupart des périphériques SCSI ne
disposent que d’un seul numéro d’unité logique, la réponse recommandée est ’N’.
L’option « Verbose SCSI error reporting (kernel size +=12K) » permet d’utiliser un jeu de
messages d’erreurs alternatif pour le SCSI. Ces messages sont plus lisibles, mais prennent plus de place
dans le noyau. La réponse recommandée est ’N’.
L’option « SCSI logging facility » permet d’activer les traces du sous-système SCSI. La réponse
recommandée est ’N’.
477
Annexe A. Options de configuration du noyau
478
Annexe A. Options de configuration du noyau
aux développeurs du noyau pour tester les techniques de reconstitution des informations dans les
fonctionnalités RAID. La réponse recommandée est ’N’.
L’option « Device mapper support (NEW) » permet d’activer la gestion des volumes virtuels. Avec
cette option, vous pourrez faire des agrégats de plusieurs disques, périphériques RAID ou périphériques
loopback afin de simuler un périphérique de type bloc de très grande capacité. Notez que cette
fonctionnalité ne permet pas d’accéder aux partitions de type agrégat de Windows 2000 et Windows XP.
Pour ce type de partition, consultez le sous-menu « Partition types » du menu « File systems ». La
réponse recommandée est ’N’.
L’option « Crypt target support » permet d’utiliser les volumes virtuels pour chiffrer les systèmes
de fichiers qui y sont stockées. La réponse recommandée est ’N’.
L’option « Snapshot target (EXPERIMENTAL) (NEW) » permet d’effectuer une photographie de
l’état complet d’un volume virtuel à un instant donné, de manière atomique. La réponse recommandée
est ’N’.
L’option « Mirror target (EXPERIMENTAL) (NEW) » permet de répliquer un volume sur un autre
volume afin d’en avoir en permanence une copie conforme. La réponse recommandée est ’N’.
L’option « Zero target (EXPERIMENTAL) (NEW) » permet de créer un volume virtuel sur lequel
toutes les écritures sont ignorées, et dont les données sont toujours nulles en lecture. Ce type de volume
peut être utile dans certaines situation de restauration. La réponse recommandée est ’N’.
L’option « Multipath target (EXPERIMENTAL) (NEW) » permet de donner aux gestionnaires de
volume la possibilité d’accéder aux périphériques capables de gérer plusieurs jeux de ports
d’entrée/sortie. Si vous activez cette option, vous pourrez accéder aux options des pilotes de
périphériques pris en charge par Linux. La réponse recommandée est ’N’.
479
Annexe A. Options de configuration du noyau
généralement pour connecter des périphériques exigeant une bande passante très élevée, comme les
caméras vidéo par exemple. La réponse recommandée est ’N’.
L’option « Excessive debugging support » est réservée pour les développeurs de gestionnaires de
périphériques. Elle permet de stocker sur disque toutes les informations transitant sur le bus FireWire, ce
qui sature généralement les disques durs extrêmement rapidement. Il faut répondre par ’N’ à cette
question.
L’option « OUI Database build-in » permet d’inclure dans le gestionnaire de périphérique
IEEE1394 une base de données des noms des fabricants. Cette fonctionnalité consommant 300k dans le
noyau et n’étant pas nécessaire, la réponse recommandée est ’N’.
L’option « Build in extra config rom entries for certain functionnality » permet
d’inclure dans le support de fonctionnalités complémentaires qui nécessitent des informations de
configuration stockées dans la mémoire morte des adaptateurs. Si vous activez cette option, vous
accéderez à l’option « IP-1394 Entry », qui permet d’utiliser le protocole IP pour communiquer via
des interfaces IEEE1394. La réponse recommandée pour ces deux options est ’N’.
L’option « Export all symbols of ieee1394’s API » permet d’exporter les fonctions des
couches 1394 du noyau qui ne sont utilisées par aucun pilote utilisé. Cela permet d’utiliser des pilotes
externes au noyau qui en auraient besoin. La réponse recommandée est ’N’.
L’option « Texas Instruments PCILynx support (NEW) » permet d’activer la gestion des cartes
FireWire PCILynx de Texas Instruments. Cette option n’est disponible que si l’option « I2C support »
du menu « I2C support » a été activée. La réponse recommandée est ’N’.
L’option « OHCI-1394 support » active la prise en charge des contrôleurs IEEE 1394 respectant les
spécifications OHCI (il s’agit d’un standard de communication pour les contrôleurs). Ce pilote n’a été
testé qu’avec un contrôleur de Texas Instruments, mais ce contrôleur est l’un des plus utilisés du marché.
La réponse recommandée est ’Y’.
L’option « OHCI-1394 Video support » permet d’utiliser la capture vidéo des cartes FireWire. La
réponse recommandée est ’Y’.
L’option « SBP-2 support (Harddisks, etc.) » permet d’activer la gestion des périphériques
SBP-2, qui comprennent les disques durs et les lecteurs de DVD connectés sur les bus FireWire. La
réponse recommandée est ’Y’.
L’option « Enable Phys DMA support for SBP2 (Debug) » n’est pas documentée et ne sera pas
décrite ici.
L’option « Ethernet over 1394 » permet d’utiliser une interface IEEE1394 comme une interface
Ethernet. La réponse recommandée est ’N’.
L’option « OHCI-DV I/O support » permet d’activer l’envoi et la réception d’images DV par un port
IEEE1394 au travers d’une interface simplifiée. La réponse recommandée est ’N’.
L’option « Raw IEEE 1394 I/O support » permet aux programmes de communiquer directement
avec le matériel IEEE 1394. C’est en général le mode de fonctionnement désiré, aussi la réponse
recommandée à cette question est-elle ’Y’.
L’option « IEC61883-1 Plug support » permet d’activer le gestionnaire de connexion IEC61883-1.
Cette option vous donnera l’accès à l’option « IEC61883-6 (Audio transmission) support »,
qui permet d’activer la gestion du protocole de transmission de données audio et musicales IEC61883-6
au travers d’une interface IEEE1394. La réponse recommandée est ’N’.
480
Annexe A. Options de configuration du noyau
481
Annexe A. Options de configuration du noyau
L’option « General Instruments Surfboard 1000 (NEW) » permet de prendre en charge les
cartes modem Surfboard 1000 utilisées pour accéder à Internet via les opérateurs de câble. La réponse
recommandée est ’N’.
L’option « FDDI driver support » permet d’activer la gestion des cartes Ethernet FDDI. Les options
qui suivent permettent de sélectionner les gestionnaires de périphériques pour les cartes FDDI gérées par
Linux. La réponse recommandée est ’N’.
L’option « HIPPI driver support (EXPERIMENTAL) » permet la gestion des cartes HIPPI. Les
options qui suivent permettent de sélectionner les gestionnaires de périphériques pour les cartes de ce
type. La réponse recommandée est ’N’.
L’option « PLIP (parallel port) support » permet d’activer les connexions par port parallèle. Ce
type de connexion peut être utilisé pour transférer des fichiers par un câble parallèle entre deux
ordinateurs. La réponse recommandée est ’N’.
L’option « PPP (point-to-point protocol) support » permet d’activer la gestion des
connexions PPP. Ces connexions sont utilisées pour accéder à Internet via un modem, ou pour établir une
connexion de manière plus générale via un câble série ou tout autre moyen de communication existant. Il
est conseillé d’activer le support de ce type de connexion, à moins que vous soyez sûr de ne jamais vous
connecter à Internet. La réponse recommandée ici est ’Y’.
L’option « PPP multinlink support (EXPERIMENTAL) » permet d’utiliser plusieurs lignes PPP
pour augmenter la bande passante en les agrégeant. Par exemple, si vous disposez de plusieurs lignes
téléphoniques, vous pouvez vous connecter plusieurs fois à votre fournisseur d’accès et accroître ainsi
votre bande passante. Bien entendu, pour que cette technique fonctionne, il faut que le fournisseur
d’accès l’autorise. La réponse recommandée est ’N’.
L’option « PPP filtering » permet d’autoriser le filtrage des paquets traversant les interfaces PPP
existantes dans le système. Cette fonctionnalitépeut être utile pour réaliser un firewall ou pour effectuer
des actions spécifiques lorsque certains paquets sont reçus. La réponse recommandée est ’N’.
L’option « PPP support for async serial ports » permet de prendre en charge les
communications PPP sur les câbles série classiques. C’est en général l’option qui convient lorsqu’on
veut se connecter à Internet à l’aide d’un modem classique. Notez que cette option n’est pas utilisable
pour les connexions à l’aide d’un modem Numéris. La réponse recommandée est ’Y’.
L’option « PPP support for sync tty ports » permet de prendre en charge les communications
PPP avec les adaptateurs synchones, tels que les cartes SyncLink. La réponse recommandée est ’N’.
L’option « PPP Deflate compression » permet de prendre en charge l’algorithme de compression
Deflate (le même algorithme que celui utilisé par le programme gzip) pour compresser les données
transmises sur les connexions PPP. La réponse recommandée est ’Y’.
L’option « PPP BSD-Compress compression » permet de prendre en charge l’algorithme de
compression LZW pour compresser les données transmises sur les connexions PPP. Cet algorithme est
soumis à un brevet de logiciel et son utilisation est supposée être soumise à paiement de droits.
Cependant, les brevets de logiciel sont encore illégaux en Europe, et il est tout à fait légal de l’utiliser.
Les taux de compressions obtenus sont de toutes manières inférieurs à ceux de la méthode Deflate, aussi
la réponse recommandée est-elle ’N’.
L’option « PPP over Ethernet (EXPERIMENTAL) » permet de réaliser des connexions point à point
sur un réseau de type Ethernet. Ce protocole est également souvent utilisé par les fournisseurs d’accès
pour transférer les données via les modems ADSL. La réponse recommandée est donc ’Y’.
482
Annexe A. Options de configuration du noyau
L’option « PPP over ATM » permet de réaliser des connexions point à point sur un réseau ATM. La
réponse recommandée est ’N’.
L’option « SLIP (serial line) support » permet de connecter deux ordinateurs par une ligne série
ou par un modem. Les options suivantes permettent de fixer les paramètres des connexions SLIP. Le
protocole SLIP est en train de tomber en désuétude et est remplacé par PPP. La réponse recommandée à
cette question est donc ’N’.
L’option « CSLIP compressed headers » permet d’activer la compression des en-têtes IP pour le
protocole SLIP. La réponse recommandée est ’N’.
L’option « Keepalive and linefill » permet d’activer la surveillance de la connexion SLIP. Cette
option est utilisée sur les connexions SLIP passant par des lignes analogiques de mauvaise qualité. La
réponse recommandée est ’N’.
L’option « Six bit SLIP encapsulation » permet de faire en sorte que le protocole SLIP n’envoie
que des données codées sur 6 bits. Cela permet d’améliorer la qualité des transmissions sur les réseaux
peu fiables, ou qui ne peuvent pas transférer plus de 7 bits de données. La réponse recommandée est ’N’.
L’option « Fibre Channel driver support » permet d’activer la gestion des adaptateurs Fiber
Channel. L’option qui suit donne la possibilité de sélectionner le gestionnaire de périphériques pour les
cartes Interphase à base de chipset Tachyon. La réponse recommandée est ’N’.
L’option « Traffic Shaper (EXPERIMENTAL) » permet d’activer la possibilité de contrôler le débit
maximal de données à travers une interface réseau. La réponse recommandée est ’N’.
L’option « Network console logging support (EXPERIMENTAL) » permet d’activer la
possibilité d’envoyer les messages générés par le noyau vers le réseau, plutôt que de les envoyer à la
console. La réponse recommandée est ’N’.
483
Annexe A. Options de configuration du noyau
484
Annexe A. Options de configuration du noyau
L’option « X.25 async driver » permet d’activer la gestion du protocole X.25 sur une ligne série
normale ou sur un modem. La réponse recommandée est ’N’.
485
Annexe A. Options de configuration du noyau
486
Annexe A. Options de configuration du noyau
Interface CAPI
La nouvelle interface ISDN pour Linux est basée sur le standard CAPI (« Common ISDN Application
Programming Interface ») et peut être activée à l’aide de l’option « CAPI2.0 support ». On préférera
cette interface à l’ancienne, aussi la réponse recommandée est-elle ’Y’ si l’on désire utiliser les lignes
ISDN sous Linux.
L’option « Verbose reason code reporting (kernel size +=7K) » permet d’indiquer le degré
de traces utilisé par le gestionnaire de périphériques des cartes AVM. La réponse recommandée est ’N’.
L’option « CAPI2.0 Middleware support (EXPERIMENTAL) » permet d’étendre l’interface CAPI
pour permettre le transfert des connexions établies via l’interface CAPI vers un terminal classique. La
réponse recommandée est ’N’.
L’option « CAPI2.0 /dev/capi support » permet de donner l’accès à l’interface CAPI 2.0 aux
applications par l’intermédiaire d’un fichier spécial de périphérique /dev/capi20. L’utilisation de ce
fichier spécial de périphérique nécessite l’installation d’une bibliothèque de fonctions dédiée. La réponse
recommandée est ’N’.
L’option « CAPI2.0 filesystem support » permet d’activer le support d’un système de fichiers
virtuel semblable au système de fichiers /dev/pts/, dans lequel les terminaux créés par les
fonctionnalités CAPI apparaîtront. Cette option est nécessaire pour utiliser le démon pppd avec son
module pppdcapiplugin. La réponse recommandée est ’N’.
L’option « CAPI2.0 capidrv interface support » permet d’utiliser les cartes compatibles CAPI
avec l’interface de programmation ISDN classique. La réponse recommandée est ’N’.
Les options qui suivent permettent de prendre en charge les cartes AVM et Eicon. La réponse
recommandée est ’N’.
487
Annexe A. Options de configuration du noyau
L’option « Generic input layer (needed for keyboard, mouse, ...) » permet d’activer la
prise en charge des pilotes des périphériques d’entrée sous Linux. Cela comprend le clavier et les souris,
aussi la réponse recommandée est-elle ’Y’.
L’option « Mouse interface » permet d’offrir un accès aux périphériques de type souris aux
applications utilisateur, par l’intermédiaire de fichiers spéciaux de périphériques /dev/input/mouseX
et /dev/input/mice. Cette option vous donnera également accès à la sous-option « Provide legacy
/dev/psaux device », qui permet de prendre en charge le fichier spécial de périphériqe /dev/psaux
ordinairement utilisé pour les souris PS/2. La réponse recommandée est ’Y’ pour ces deux questions.
Les options « Horizontal screen resolution » et « Vertical screen resolution »
permettent de définir la résolution horizontale et verticale de l’écran, afin de permettre l’utilisation d’une
tablette de digitalisation USB comme une souris. Ces deux données permettent de faire la conversion
entre les coordonnées de la tablette et les coordonnées de l’écran. Si vous disposez d’une telle tablette,
vous devez entrer ici la résolution du mode graphique que vous utilisez prioritairement. Dans les autres
cas, les valeurs de ces options ne sont pas utilisées.
L’option « Joystick interface » active la prise en charge des joysticks et permet aux applications
d’y accéder au travers des fichiers spéciaux de périphériques /dev/input/jsN, où N est le numéro du
joystick, et dont les numéros de codes majeur et mineurs sont respectivement 13 et 0 à 31. La réponse
recommandée est ’N’.
L’option « Touchscreen interface » active la prise en charge des périphériques de pointage absolus
qui gèrent le protocole Touchscreen de Compaq. Cette option vous donnera également la possibilité de
fixer la résolution du mode graphique que vous utilisez, pour permettre au gestionnaire de faire la
correspondance entre la position sur le TouchScreen et les pixels de l’écran. La réponse recommandée
est ’N.
L’option « Event interface support » active la gestion des fichiers spéciaux
/dev/input/eventN (où N est le numéro du périphérique), qui permettent de lire les événements
provenant des périphériques d’entrée de manière générique. Ces fichiers peuvent être utilisés par
plusieurs périphériques distincts, et permettent de connecter plusieurs périphériques d’entrée sur la
même machine en les gérant de manière uniforme. La réponse recommandée est-elle ’Y’.
L’option « Event debugging » permet de générer des traces sur tous les événements qui se produisent
au niveau des périphériques d’entrée. Ces traces ne sont utiles qu’aux développeurs des gestionnaires de
périphériques d’entrée, et peuvent générer de grandes quantités d’informations dans les fichiers de traces.
De plus, elles contiendront également les mots de passe et constituent donc un trou de sécurité important.
La réponse recommandée est donc ’N’.
Les options qui suivent permettent d’activer des gestionnaires complémentaires pour les périphériques
d’entrée. Vous trouverez en particulier les gestionnaires de périphériques pour les souris PS/2 et sérielles,
ainsi que les gestionnaires pour les Joysticks et les Touchscreen. Vous devez activer les options
correspondantes à votre matériel. Notez également que la prise en charge des claviers et des souris USB
doit se configurer au niveau du menu « USB support » et ne peut être faite ici, même si les options
précédentes restent nécessaires.
L’option « Miscellaneous devices » permet d’accéder aux options de configuration de gestionnaires
de périphériques complémentaires, tels que celui permettant de contrôler le haut-parleur du PC (option
« PC Speaker support ») et celui qui permet de relayer la gestion des périphériques d’entrées à des
programmes utilisateurs (option « User level driver support »). La réponse recommandée est ’Y’
pour l’option « PC Speaker support », et ’N’ pour pour l’option « User level driver
support ».
488
Annexe A. Options de configuration du noyau
489
Annexe A. Options de configuration du noyau
L’option « Unix98 PTY support » permet d’activer les pseudo-terminaux compatibles Unix 98. Les
pseudo-terminaux sont des composants logiciels permettant d’émuler des terminaux. Il y a deux
composants par pseudo-terminal : la partie maître est le programme qui cherche à accéder au
pseudo-terminal, et la partie esclave est le programme qui simule le terminal physique. Les composants
maîtres peuvent ouvrir le pseudo-terminal par l’intermédiaire des fichiers spéciaux /dev/ptyxx. Les
composants esclaves doivent ouvrir le fichier spécial /dev/ptmx afin d’obtenir un numéro n de
pseudo-terminal à utiliser, puis ils ouvrent le fichier /dev/pts/n. Ce dernier fichier spécial est créé à la
volée par le noyau, grâce à un système de fichiers virtuel. Pour que ce mécanisme fonctionne, il faut
donc que le système de fichiers /dev/pts/ ait été également activé dans les options de configuration
des systèmes de fichiers, et qu’il soit monté (voir la configuration du fichier /etc/fstab). La réponse
recommandée est ’Y’.
L’option « Legacy (BSD) PTY support » permet d’activer la gestion des pseudo-terminaux classique
tels qu’ils sont utilisés sur les systèmes BSD. Ces pseudo-terminaux sont simplement accédés via des
fichiers spéciaux de périphériques /dev/ttyxx, à raison d’un fichier par pseudo-terminal. Cette
technique est obsolète depuis l’introduction des terminaux Unix98, que l’on peut activer avec l’option
précédente. Toutefois, certains programmes peuvent ne pas avoir portés et ne pouvoir accéder que via
cette ancienne interface. Dans ce cas, cette option devra être activée. Si vous répondez ’Y’ à cette option,
vous accéderez à l’option « Maximum number of legacy PTY in use (NEW) », qui vous permettra
de choisir le nombre de pseudo-terminaux que le système gèrera. La valeur par défaut est 256. La
réponse recommandée à cette option est ’N’.
L’option « Parallel printer support » permet d’activer la gestion des imprimantes connectées sur
port parallèle. Le fait d’activer cette option n’empêche pas d’utiliser le port parallèle pour d’autres
périphériques. Il est recommandé d’activer cette option sous forme de module parce qu’ainsi, les
fonctionnalités d’impression ne seront chargées que lorsque cela sera nécessaire. La réponse
recommandée est donc ’M’.
L’option « Support for console on line printer » permet de rediriger les messages destinés à
la console sur une imprimante connectée au port parallèle. Ces messages sont alors imprimés au fil de
l’eau. La réponse recommandée est ’N’.
L’option « Support for user-space parallel port device drivers » active la gestion du
fichier spécial de périphérique /dev/parport, au travers duquel les programmes peuvent accéder de
manière uniforme au port parallèle. Cette fonctionnalité n’est pas nécessaire pour utiliser une imprimante
ou des périphériques ATAPI connectés sur port parallèle, aussi la réponse recommandée est-elle ’N’.
L’option « Texas Instruments parallel link cable support » permet de prendre en charge
les connexions aux calculatrices Texas Instruments à l’aide d’un câble parallèle. La réponse
recommandée est ’N’.
L’option « Intel/AMD/VIA HW Random Number Generator support » permet de prendre en
charge les générateurs de nombres aléatoires matériels fournis sur les cartes mères récentes. Ces
générateurs permettent d’obtenir des nombres aléatoires utilisés dans les algorithmes de chiffrement et
de sécurité. La réponse recommandée est ’Y’.
L’option « /dev/nvram support » permet d’activer l’accès à la mémoire non volatile de l’horloge
temps réel. Cette mémoire peut être accédée par l’intermédiaire du fichier spécial de périphérique
/dev/nvram, de code majeur 10 et de code mineur 144. La réponse recommandée est ’Y’.
L’option « Enhanced Real Time Clock Support » permet d’activer l’accès aux compteurs de
l’horloge temps réel par l’intermédiaire du fichier spécial de périphérique /dev/rtc, de code majeur 10
490
Annexe A. Options de configuration du noyau
et de code mineur 135. Cette option doit être activée si vous disposez d’une machine multiprocesseur. La
réponse recommandée est ’Y’.
L’option « Generic /dev/rtc emulation » permet de simuler l’interface /dev/rtc à l’horloge
temps réel du système pour le cas où vous ne voudriez pas activer l’option précédente. L’option suivante
permet de compléter l’émulation avec la prise en charge d’une opération complémentaire, qui peut être
nécessaire pour certains programmes. La réponse recommandée est ’N’.
L’option « Double Talk PC internal speech card support » permet d’activer la gestion du
synthétiseur de voix Double Talk. La réponse recommandée est ’N’.
L’option « Siemens R3964 line discipline » active la gestion des synchronisations entre les
périphériques utilisant le protocole de communication R3964 de Siemens. La réponse recommandée est
’N’.
L’option « Applicom intelligent fieldbus card support » active la gestion des cartes
Applicom « intelligent fieldbus ». La réponse recommandée est ’N’.
L’option « Sony Vaio Programmable I/O Control Device support » permet d’activer la
gestion des contrôleurs d’entrée / sortie programmables des portables Sony Vaio. La réponse
recommandée est ’N’.
L’option « /dev/agpgart support (AGP support) » active la gestion des transferts de données
accélérés par le bus AGP pour les pilotes de cartes graphiques. Ces transferts peuvent être pilotés au
travers du fichier spécial de périphérique /dev/agpgart, de code majeur 10 et de code mineur 175.
Cette fonctionnalité n’est pas nécessaire pour le bon fonctionnement des cartes graphiques AGP, mais
elle permet d’accroître les performances des pilotes 3D. Elle est également indispensable pour permettre
l’accès au registre MTRR du processeur permettant de contrôler le bus AGP. La réponse recommandée
est ’Y’ si vous disposez d’une carte graphique AGP, et ’N’ sinon. Les options qui suivent permettent de
sélectionner le type de chipset utilisé par la carte mère, afin de déterminer la manière dont le port AGP
fonctionne. Si vous avez activé cette fonctionnalité, vous devez choisir l’option correspondant à votre
chipset également.
L’option « Direct Rendering Manager (XFree86 DRI support) » permet d’activer le support
de l’architecture DRI (abréviation de l’anglais « Direct Rendering Infrastructure ») de XFree86 ou de
[Link]. La version fournie avec le noyau 2.6 nécessite l’utilisation de XFree86 en version 4.1 ou plus, ou
de [Link] en version 6.7 ou plus. Vous devrez sélectionner le type de carte graphique installé sur le
système à l’aide des options suivantes. La réponse recommandée est donc généralement ’N’, sauf si vous
disposez d’une des cartes graphiques listées. Dans ce cas, vous devriez certainement utiliser XFree86
4.4.0 ou [Link] 6.7, afin de bénéficier des gestionnaires de périphériques les plus récents. Notez enfin que
certaines cartes graphiques 3D, bien que parfaitement supportées sous Linux, n’utilisent pas les
fonctionnalités DRI du noyau. C’est en particulier le cas pour toutes les cartes graphiques à base de puce
NVidia, pour lesquelles il faut utiliser le module fourni avec le pilote de NVidia. Vous pouvez donc
répondre ’N’ à cette question si vous disposez d’une telle carte graphique.
L’option « ACP Modem (Mwave) support » permet d’activer la prise en charge des Winmodems ACP
(également connu sous le nom Mwave). De tels modems sont intégrés en particulier dans les Thinkpad
600E, 600 et 770 d’IBM. La réponse recommandée est ’N’.
L’option « RAW driver (/dev/raw/rawN) (OBSOLETE) » permet d’accéder directement, sans copie
de données lors des opérations d’entrée/sortie, aux périphériques de type bloc. Cet accès se fait via des
fichiers de périphériques spéciaux /dev/raw/ dont les numéros de périphériques majeur et de mineurs
sont identiques à ceux du fichier spécial de périphérique de type bloc ainsi manipulé. Cette option permet
491
Annexe A. Options de configuration du noyau
donc de réaliser des entrées / sorties de manière extrêmement performantes. Comme cette fonctionnalité
n’est utilisable que par des applications particulières (en général des grosses bases de données), la
réponse recommandée est ’N’. De plus, cette option est obsolète, car il est à présent possible d’accéder
aux périphériques de manière directe avec les interfaces de programmation standards du système.
L’option « HPET - High Precision Event Timer » permet d’activer la gestion des timers à haute
précision de Linux. Ces timers seront accessibles via le fichier spécial de périphérique /dev/hpet. Cette
option vous donnera également accès à l’option « Allow mmap of HPET (NEW) », qui permet de
désactiver la projection en mémoire de ce fichier. Cette option doit être désactivée pour certains types de
matériel, car ceux-ci exposent trop d’informations à l’utilisateur via cette interface. La réponse
recommandée est ’N’.
L’option « Maximum number of RAW devices to support (1-8192) » permet d’indiquer le
nombre maximum de périphériques bruts pris en charge par le noyau. La réponse recommandée est
’256’.
L’option « Hangcheck timer » permet d’activer un chien de garde permettant de déterminer si le
système est bloqué depuis un temps trop long et, si tel est le cas, de le redémarrer ou afficher un message
de trace. La réponse recommandée est ’N’.
492
Annexe A. Options de configuration du noyau
Sous-menu « IPMI »
L’option « IPMI top-level message handler » permet de prendre en charge la surveillance des
capteurs du système (température, voltage, etc.). Les options qui suivent permettent de configurer les
fonctionnalités de ce driver. La réponse recommandée est ’N’.
493
Annexe A. Options de configuration du noyau
L’option « Enable procfs status report (+2kb) » permet de générer un répertoire ftape/ dans
le système de fichiers virtuel /proc/. Ce répertoire contient des informations concernant l’état courant
du pilote ftape. La réponse recommandée à cette question est ’N’.
L’option « Debugging output » permet de fixer la quantité de traces que le pilote ftape génère. La
valeur recommandée est « Normal ».
L’option « Floppy tape controllers » permet de sélectionner le type de contrôleur de disquettes.
La valeur recommandée est « Standard ». Si vous choisissez un autre type de contrôleur, vous devrez
spécifier les paramètres matériels pour ce contrôleur dans les trois options qui suivent.
L’option « Default FIFO threshold (EXPERIMENTAL) » est expérimentale et ne doit pas être
modifiée. La valeur recommandée est 8.
L’option « Maximal data rate to use (EXPERIMENTAL) » permet de réduire la vitesse maximale
de transfert utilisés par le pilote ftape. Cette option est expérimentale et ne doit pas être modifiée. La
valeur par défaut est 2000.
L’option « I2C bit-banging interfaces » active la gestion des adaptateurs « bit-banging ». Cette
option est nécessaire pour faire fonctionner les cartes d’acquisition TV basées sur les puces électroniques
494
Annexe A. Options de configuration du noyau
Bt848. La réponse recommandée est ’N’, sauf si vous disposez d’une telle carte. Les options suivantes
activent la gestion des périphériques utilisant cette interface. Il n’est pas nécessaire de les activer pour
faire fonctionner les cartes d’acquisition TV à base de Bt848. La réponse recommandée pour ces options
est ’N’.
L’option « I2C PCF 8584 interfaces » active la gestion des adaptateurs PCF. Les options suivantes
permettent d’activer les périphériques utilisant cette interface. Les réponses recommandées à ces
questions sont ’N’.
L’option « I2C PCA 9564 interfaces » active la gestion des adaptateurs PCA. Les options suivantes
permettent d’activer les périphériques utilisant cette interface. Les réponses recommandées à ces
questions sont ’N’.
Les sous-menus « I2C Hardware Bus support », « I2C Hardware Sensors Chip support » et « Other I2C
Chip support » permettent de prendre en charge les divers capteurs I2C présents sur les systèmes
modernes. Vous devez activer les options correspondantes à votre matériel si vous désirez utiliser cette
fonctionnalité.
Les options « I2C Core debugging messages », « I2C Algorithm debugging messages »,
« I2C Bus debugging messages » et « I2C Chip debugging messages » permettent d’activer
la génération de messages de trace complémentaires relatives aux fonctionnalités I2C. La réponse
recommandée pour ces questions est ’N’.
495
Annexe A. Options de configuration du noyau
496
Annexe A. Options de configuration du noyau
mode texte à utiliser au démarrage de Linux. Ce mode peut être indiqué grâce à un paramètre passé au
noyau lors du démarrage. La réponse recommandée est ’Y’.
Il existe également un gestionnaire pour les cartes graphiques MDA (ce sont des cartes extrêmement
vieilles), qui peut être activé à l’aide de l’option « MDA text console (dual-headed)
(EXPERIMENTAL) ». Ce gestionnaire permet également de disposer d’un second affichage en mode
texte, si l’on installe la carte MDA en parallèle de la carte VGA du PC. Cette option ne doit être choisie
que si la carte MDA n’est pas la carte d’affichage principale. La réponse recommandée est ’N’.
Le sous-menu « Console display driver support » permet également d’utiliser le gestionnaire de
périphérique du frame buffer pour la console, si l’option « Support for frame buffer devices »
a été activée. Pour cela, il suffit d’activer l’option « Framebuffer Console support ». Cette option
donnera la possibilité d’inclure une police de caractères graphique pour la console, à l’aide de l’option
« Select compiled-in fonts ». Encore une fois, ces options ne sont pas nécessaires pour gérer
correctement la console sur les ordinateurs de type PC.
Le sous-menu « Logo configuration » permet d’utiliser un logo représentant Tux au démarrage, si la
fonctionnalité de frame buffer a été activée. Pour cela, il faut activer l’option « Bootup logo » et
choisir un des logos proposés parmi les options suivantes. Cette fonctionnalité étant absolument
indispensable pour la bonne marche de votre système et la sécurité de vos données, vous devez
impérativement l’activer et admirer le magnifique Tux !
Le sous-menu « Backlight & LCD device support » permet de configurer les pilotes de contrôle de la
lumière de rétroéclairage des écrans à LCD de certaines machines, telles que les PDA. Les sous-options
de ce menu permettent de sélectionner les fonctionnalités prise en charge par ces pilotes. La réponse
recommandée est ’N’.
Menu « Sound »
L’option « Sound card support » permet d’activer la gestion des cartes son. Si vous ne disposez pas
de carte son, choisissez la réponse ’N’, sinon, activez cette fonctionnalité. Elle vous permettra de choisir
parmi les deux jeux de drivers pour les cartes son dont dispose Linux actuellement. Les pilotes les plus
performants sont sans aucun doute les drivers ALSA (« Advanced Linux Sound Architecture », mais
vous aurez peut-être à utiliser les drivers OSS (« Open Sound System ») pour certaines cartes son.
Les drivers ALSA seront choisis de préférence en activant l’option « Advanced Linux Sound
Architecture ». Cependant, l’interface de programmation des drivers OSS étant très utilisée, on
veillera à activer les options de compatibilité « OSS Mixer API », « OSS PCM (digital audio)
API », et « OSS Sequencer API ».
L’option « Sequencer support » permet de prendre en charge le séquenceur ALSA pour la gestion
des fichiers MIDI. Elle vous permettra d’accéder à l’option « Sequencer dummy client », qui permet
de gérer un simple client transférant les événements MIDI d’une entrée vers une sortie. La réponse
recommandée est ’Y’ pour ces deux questions.
L’option « RTC Timer support » permet de faire en sorte que les gestionnaires de carte son ALSA
utilise l’horloge matérielle de l’ordinateur pour les opérations de séquencement demandant une grande
précision. Il est recommandé d’activer cette fonctionnalité.
L’option « Verbose printk » et les options de débogage introduites par l’option « Debug » permettent
de faciliter le diagnostic et le débogage des gestionnaires ALSA. Il n’est pas nécessaire de les activer en
temps normal, aussi la réponse recommandée est-elle ’N’.
497
Annexe A. Options de configuration du noyau
Les options qui suivent permettent de sélectionner les gestionnaires de périphériques pour le matériel
installé. Ces gestionnaires sont classés par type d’interface (périphériques virtuels ou logiciels, cartes
ISA ou PCI, appareils connectés par un port USB ou PCMCIA) dans les sous-menus correspondants.
Vous devez bien entendu activer la prise en charge des gestionnaires de périphériques pour le matériel
disponible dans votre ordinateur. Notez que les périphériques proposés dépendent de la prise en charge
des bus correspondants. En particulier, les périphériques audio USB ne seront accessibles que si vous
activer le support de l’USB dans le menu « USB support » ainsi que le support des périphériques audio
USB (option « USB Audio/MIDI driver »).
L’option « Open Sound System (DEPRECATED) » permet d’activer la prise en charge des anciens
pilotes OSS. Elle donne accès à deux jeux de pilotes, dont les pilotes OSS eux-mêmes. Les différentes
options proposées permettent de sélectionner les gestionnaires de périphériques pour les différents
matériels supportés.
Notez que le gestionnaire de périphériques pour le mixer intégré des cartes d’acquisition TV basées sur
la puce Bt848 se situe parmi les pilotes OSS (option « TV card (bt848) mixer support »). Vous
devez donc l’intégrer sous forme de module si vous disposez d’une telle carte. Il n’est pas nécessaire si
vous utilisez les pilotes ALSA.
498
Annexe A. Options de configuration du noyau
non-Intel (Compaq, SiS, Aladdin). Vous devez choisir le pilote approprié au chipset de votre carte mère.
Notez que la prise en charge de l’USB 2.0 n’est pas exclusive de celle de l’USB classiques, les
contrôleurs USB 2.0 étant généralement fournis avec des contrôleurs USB auxiliaires permettant
d’accéder aux périphériques USB 1.0. Les gestionnaire de périphérique pour les contrôleurs USB 2.0 ne
prenant en charge que les contrôleurs USB 2.0, vous devrez également inclure le gestionnaire de
périphériques adéquat pour vos périphériques USB classiques si vous désirez y accéder.
L’option « SL811HS HCD support » permet de prendre en charge les contrôleurs USB SL811HS, qui
ne sont pas pris en charge directement par les pilotes UHCI, OHCI ou EHCI. La réponse recommandée
est ’N’.
L’option « USB Audio support » permet de prendre en charge les périphériques audio connectés sur le
port USB, comme des hauts-parleurs par exemple. Cette option nécessite également d’activer l’option
« USB Audio/MIDI driver » du menu « ALSA USB devices » pour permettre la prise en charge
totale des périphériques audio USB. La réponse recommandée est ’N’.
L’option « USB Bluetooth TTY support (NEW) » permet d’accéder à des périphériques Bluetooth
non standards par une interface télétype. Cette fonctionnalité n’est disponible que si le support de
Bluetooth a été désactivé dans le menu « Bluetooth support ». La réponse recommandée est ’N’.
L’option « USB MIDI support » active la gestion des périphériques MIDI connectés sur port USB. La
réponse recommandée est ’N’.
L’option « USB Modem (CDC ACM) support » permet de prendre en charge les modems analogiques
et Numéris utilisant l’interface CDC ACM (abréviation de l’anglais « Communication Device Class
Abstract Control Model ») connectés sur le port USB. La réponse recommandée est ’N’.
L’option « USB Printer support » active la gestion des imprimantes connectées sur le port USB. La
réponse recommandée est ’N’.
L’option « USB Mass Storage support » active la gestion des périphériques USB de masse (lecteurs
de CD, clefs USB, etc.) ainsi que de la plupart des appareils photos USB, dont les mémoires flash sont
accessibles comme des périphériques de masse. La réponse recommandée est ’Y’.
L’option « USB Mass Storage verbose debug » permet de demander au gestionnaires de
périphériques USB de masse de générer des messages de débogage dans les fichiers de traces du
système. La réponse recommandée est ’N’.
Les options qui suivent permettent d’activer les gestionnaires de périphériques pour les périphériques de
stockage supportés par Linux. Notez qu’il n’est pas nécessaire de disposer d’un gestionnaire de
périphériques pour accéder aux clefs USB et à la plupart des appareils photos. La réponse recommandée
pour ces options est donc ’N’, sauf si vous disposez d’un de ces appareils.
L’option « USB Human Interface Devices (full HID) support » permet d’activer la prise en
charge des périphériques d’entrée et de saisie tels que les claviers, souris et tablettes de digitalisation. Ce
pilote gère complètement les périphériques d’entrée USB, et est incompatible avec les pilotes simplifiés
pour le clavier et la souris, que l’on peut activer avec les options « USB HIDBP Keyboard (simple
boot) support » et « USB HIDBP Mouse (simple boot) support » du sous-menu « USB HID
Boot Protocol drivers ». La réponse recommandée est ’N’.
L’option « HID input layer support » permet d’utiliser les périphériques d’entrée USB par
l’intermédiaire de l’interface générique de gestion des périphériques de Linux. Cette option n’est
accessible que si l’option « Input core support » du menu « Input core support » a également été
activée. La réponse recommandée est ’N’.
499
Annexe A. Options de configuration du noyau
L’option « Support for USB Gadgets » du sous-menu « USB Gadget Support » permet d’activer la
500
Annexe A. Options de configuration du noyau
prise en charge du port USB par Linux pour les périphériques (c’est-à-dire du point de vue opposé à celui
de l’ordinateur auquel on connecte ces périphériques). Cette option n’est utile que pour ceux qui réalisent
des périphériques USB avec un système Linux embarqué. La réponse recommandée est donc ’N’.
Menu « SN Devices
Ce menu n’est pas utilisable sur les architectures basées sur les processeurs x86 ou AMD. Les options
qu’il contient ne sont pas décrites dans ce document.
501
Annexe A. Options de configuration du noyau
surtout sur les ordinateurs vendus pour le grand public actuellement. Aussi est-il recommandé d’utiliser
les systèmes de fichiers EXT2 ou EXT3, qui sont finalisés depuis longtemps déjà.
Quoi qu’il en soit, il est fortement recommandé d’utiliser un système de fichiers journalisé, car cela
ajoute une sécurité accrue sur les données. Il est de plus impératif de compiler le pilote du système de
fichiers racine dans le noyau. Si cela n’est pas fait, le noyau ne pourra pas monter le système de fichiers
racine et se terminera en affichant le message « kernel panic ». Il ne faut pas compiler ce système de
fichiers en tant que module, pour les mêmes raisons.
Les systèmes de fichiers Linux peuvent parfois prendre en charge des fonctionnalités avancées telles que
les attributs étendus et les listes de contrôle d’accès en marge des mécanismes de gestion des droits Unix
classiques. Ces fonctionnalités sont généralement accessibles via les options « Extended
attributes » et « POSIX Access Control Lists » des systèmes de fichiers en question. Ces
fonctionnalités peuvent être utiles pour les serveurs de fichiers, mais ne sont en général pas traitées par
tous les utilitaires systèmes. La réponse recommandée à ces options est donc ’N’.
Certains systèmes de fichiers nécessitent le support de systèmes de fichiers de base. En particulier, les
systèmes de fichiers VFAT (qui gère la FAT32) et MSDOS fs (qui gère les partitions DOS 12 et 16 bits)
exigent le support du système de fichiers DOS FAT en général. Pour utiliser ces systèmes de fichiers, on
devra donc activer l’option « DOS FAT fs support ». De même, pour lire les CD-ROM au format
Joliet (l’extension Microsoft au format ISO 9660 pour supporter les noms longs sous Windows), il faudra
activer l’option « ISO 9660 CDROM file system support ». De toutes façons, il est fortement
recommandé de gérer ce système de fichiers si l’on veut utiliser des CD-ROMs.
Quatre systèmes de fichiers sont virtuels. Ils ne correspondent à aucun support physique, et leur
arborescence est créée uniquement en mémoire, à la volée, par le noyau. Il s’agit du système de fichiers
/proc/, qui fournit des informations dynamiquement sur l’état du système, du système de fichiers
/dev/, qui est un système de fichiers obsolète qui permet de gérer les fichiers spéciaux de périphériques
à la volée, du système de fichiers /dev/pts/, qui permet de créer des fichiers spéciaux de périphériques
à la demande pour les pseudo-terminaux et du système de fichiers /dev/shm/, qui permet de gérer les
segments de mémoire partagée POSIX. À ces quatre systèmes de fichiers s’ajoute également un système
de fichiers uniquement mémoire (option « HugeTLB file system support »), dont le
fonctionnement n’est toutefois pas encore documenté. Il est fortement recommandé d’activer la gestion
des systèmes de fichiers /proc/, /dev/pts/ et /dev/shm/, car ils sont utilisés par beaucoup de
programmes. On préférera désormais l’utilisation de udev au système de fichiers /dev/, aussi est-il
déconseillé d’activer ce système de fichiers à présent.
La plupart des systèmes de fichiers récents supportent la fonctionnalité de quota, qui permet de limiter la
quantité d’espace disque disponible pour chaque utilisateur, L’activation de ces fonctionnalités se fait au
travers de l’option « Quota support ». Vous pouvez activer ces options si vous le désirez, bien qu’elles
ne soient pas d’une utilité fondamentale pour une machine classique.
Enfin, Linux dispose d’une fonctionnalité permettant de monter automatiquement les systèmes de
fichiers nommée le « Kernel automounter ». Deux versions de cette fonctionnalité ont été développées, et
sont accessibles via les options « Kernel automounter support » et « Kernel automounter
version 4 support (also supports v3) ». Ces fonctionnalités sont utiles pour monter les
systèmes de fichiers réseau ou les systèmes de fichiers amovibles à la demande. Il est donc recommandé
d’activer l’une de ces fonctionnalités. Notez que la version 4 du protocole de montage automatique
permet également de prendre en charge la version 3.
502
Annexe A. Options de configuration du noyau
L’option « NTFS file system support » vous permettra d’accéder aux systèmes de fichiers NTFS,
utilisé par tous les systèmes NT (Windows NT, Windows 2000 et Windows XP). La réponse
recommandée est ’Y’. Les deux sous-options de ce système de fichiers permettent respectivement de le
déboguer et d’autoriser l’écriture sur les systèmes de fichiers NTFS. Le support de l’écriture est encore
incomplet, et il ne permet que d’écraser des données dans un fichier existant. En revanche, contrairement
aux anciennes versions de ce systèmes de fichiers, la fonctionnalité d’écriture peut à présent être utilisée
sans risque.
503
Annexe A. Options de configuration du noyau
L’option « /proc file system support » permet de prendre en charge le système de fichiers
/proc/, qui fournit bon nombre d’informations sur le système et qui permet de le paramétrer. La
réponse recommandée est ’Y’.
L’option « Virtual memory file system support (former shm fs) » vous permettra
d’activer la gestion des segments de mémoire partagée via un système de fichiers virtuel. Cette technique
est utilisée par de nombreux programmes, aussi est-il recommandé d’activer cette option.
L’option « HugeTLB file system support » n’est pas documentée et ne sera pas décrite ici.
504
Annexe A. Options de configuration du noyau
L’option « SMB file system support (to mount WfW shares, etc.) » permet d’accéder aux
répertoires partagés par les machines fonctionnant sous Windows. Cette fonctionnalité n’est possible que
si les postes Windows utilisent TCP/IP comme protocole de réseau de base, et non NetBIOS. La réponse
recommandée est ’Y’.
Les « Use a default NLS (NEW) » et « Default Remote NLS Option » permettent de spécifier
une page de codes par défaut pour lire les noms de fichiers et de répertoires partagés par le serveur. La
réponse recommandée est ’N’.
L’option « CIFS support (advanced network filesystem for Samba, Window and other
CIFS compliant servers) » permet d’activer la nouvelle version du système de fichiers SMB, que
les systèmes Windows NT et que le logiciel Samba 3 utilisent en particulier. La réponse recommandée
est ’Y’.
L’option « NCP file system support (to mount NetWare volumes) » permet d’accéder aux
volumes NetWare. Cette fonctionnalité nécessite la gestion d’IPX au niveau de la machine Linux. On
notera qu’il est inutile d’activer cette fonctionnalité si l’on désire faire en sorte que la machine Linux soit
serveur de fichiers Novell. Les options qui sont proposées si l’on active cette fonctionnalité permettent de
paramétrer les accès aux volumes NetWare (sécurité, verrous sur les fichiers, droits d’accès...). La
réponse recommandée est ’N’.
L’option « Coda file system support (advanced network fs) » permet d’activer le support
du système de fichiers réseau Coda, qui donne accès aux périphériques par le réseau comme s’ils étaient
branchés sur la machine locale. Cette option active les fonctionnalités clientes au niveau du noyau, mais
il faut également des outils complémentaires pour implémenter les fonctions serveurs. La réponse
recommandée est ’N’.
L’option « Andrew File System support (AFS) (EXPERIMENTAL) » permet de prendre en
charge le système de fichiers réseau AFS, en lecture seule uniquement pour l’instant. La réponse
recommandée est ’N’.
505
Annexe A. Options de configuration du noyau
du système. Les pages de codes recommandées pour un système français sont les suivantes :
Pour toutes les autres pages de codes, la réponse recommandée est ’N’.
L’option « Default NLS Option » permet de choisir la page de code par défaut à utiliser parmi celles
qui ont été choisies. La réponse recommandée est « iso8859-1 ».
506
Annexe A. Options de configuration du noyau
L’option « Kernel log buffer size (16 => 64KB, 17 => 128KB) » permet de spécifier la
taille du tampon circulaire utilisé pour l’affichage des messages de traces du noyau. Si cette taille est trop
petite et que le noyau génère beaucoup de messages lors du démarrage ou lors du chargement du
périphérique, certains messages peuvent être perdus. De ce fait, le déboguage de la configuration peut en
être compliquée, et cette option devient alors utile. La taille indiquée est la puissance de deux à utiliser
pour spécifier la taille effective du tampon. Les noyaux utilisant l’ACPI peuvent générer beaucoup de
messages de traces lors de la détection du matériel, aussi est-il recommandé de fixer la taille de ce
tampon à 15 au moins. Cette fonctionnalité n’est disponible que si l’option « Kernel debugging » du
menu « Kernel hacking » est activée.
L’option « Collect scheduler statistics » permet d’accumuler des statistiques sur
l’ordonnanceur du système afin de déterminer les temps de latence et d’optimiser certains processus. La
réponse recommandée est ’N’.
L’option « Debug memory allocations » permet d’activer des contrôles plus stricts sur les
mécanismes d’allocation et de libération de la mémoire dans le noyau. La réponse recommandée est ’N’.
L’option « Debug preemptible kernel » permet d’activer des vérifications complémentaires pour
les noyaux préemptibles. La réponse recommandée est ’N’.
L’option « Spinlock debugging » permet de contrôler que les sections critiques de type spinlock sont
toujours bien initialisées et que les erreurs les plus classiques ne sont pas faites lors de leur utilisation. La
réponse recommandée est ’N’.
L’option « Sleep-inside-spinlock checking » permet d’activer une alarme en cas d’appel d’une
méthode pouvant provoquer la suspension du processus appelant au sein d’une section critique de type
spinlock. Ces sections critiques ne permettent en effet pas aux threads appelant de rendre la main à
l’ordonnanceur du noyau, ce qui constitue un bogue grave que cette option permet de détecter. La
réponse recommandée est ’N’.
L’option « kobject debugging » permet d’activer la génération de traces complémentaires sur les
objets systèmes. La réponse recommandée est ’N’.
L’option « Highmem debugging » permet d’activer la génération de traces complémentaires sur les
accès à la mémoire haute pour les systèmes qui ont plus de un gigaoctet de mémoire. La réponse
recommandée est ’N’.
L’option « Verbose BUG() reporting (add 70K) » permet d’activer la détermination des fichiers
et numéros de ligne pour l’affichage des piles d’appel lors de l’affichage d’un bug grave. Cette option
permet d’aider les développeurs pour la mise au point du noyau, mais augmente sensiblement sa taille.
La réponse recommandée est ’N’.
L’option « Compile the kernel with debug info » permet de compiler le noyau avec les
informations symboliques de déboguage. Ces informations sont très utiles pour les développeurs pour
l’analyse des bogues. La réponse recommandée est ’N’.
L’option « Debug Filesystem » permet d’activer la prise en charge d’un système de fichiers spécial
utilisé par les développeurs du noyau pour y stocker des fichiers de déboguage. La réponse recommandée
est ’N’.
L’option « Compile the kernel with frame pointers » permet de désactiver une optimisation
du compilateur dont le but est normalement de simplifier les appels de fonctions. Cette optimisation peut
empêcher un débogage correct des piles d’appel du noyau, aussi les développeurs du noyau ils la
désactivent-ils généralement à l’aide de cette option. La réponse recommandée est ’N’.
507
Annexe A. Options de configuration du noyau
L’option « Early printk » permet d’activer les fonctions d’affichage sur la console et le port série très
tôt dans la phase de démarrage du noyau. Cette option est utile si le noyau plante au démarrage avant
qu’il n’ait eu le temps d’initialiser la console. Toutefois, son implémentation n’est pas très élégante et
cette option ne doit être activée que si nécessaire. La réponse recommandée est donc ’N’.
L’option « Check for stack overflows » permet de vérifier qu’aucun débordement de pile n’a lieu
dans le noyau. La réponse recommandée est ’N’.
L’option « Kprobes » permet d’activer une fonctionnalité d’instrumentation au sein du noyau
virtuellement à n’importe quel emplacement mémoire. Cette fonctionnalité permet d’appeler une
fonction lors d’un accès en des endroits prédéfinis. La réponse recommandée est ’N’.
L’option « Stack utilization instrumentaiton » active une fonctionnalité permettant de
connaître la taille maximum utilisée par tous les threads du noyau. La réponse recommandée est ’N’.
L’option « Page alloc debugging » permet de supprimer les pages mémoires libérées de l’espace
d’adressage du noyau, afin de détecter les accès aux pages mémoires non disponibles. Cette
fonctionnalité facilite la détection de bogues relatifs à l’utilisation de la mémoire. La réponse
recommandée est ’N’.
L’option « Use 4Kb for kernel stacks instead of 8Kb (NEW) » permet de réduire la taille de
la pile d’exécution des threads au sein du noyau. Cette réduction permet d’exécuter plus de threads dans
le système. La réponse recommandée est ’N’.
508
Annexe A. Options de configuration du noyau
système. Ce module n’ayant pas d’utilité autre que pédagogique, la réponse recommandée pour cette
option est ’N’.
L’option « BSD Secure Level » est un module de sécurité permettant de définir des niveaux de
sécurité comme cela est possible sur les systèmes BSD, afin de réduire les droits des processus de
manière complémentaire. Cela peut être utilisé pour s’assurer qu’un attaquant, même après avoir acquis
les droits administrateurs, restera limité dans ses actions. La réponse recommandée est ’N.
L’option « NSA SELinux Support » permet de prendre en charge les extensions de sécurité ajoutées à
Linux par la NSA (« National Security Agency » américaine). Cette option donnera accès à des options
complémentaires de configuration de ce modèle de sécurité. La réponse recommandée est ’N’.
509
Annexe B. Compilation et mise à jour des
principaux composants du système
Les paragraphes suivants contiennent les remarques et les options à choisir pour compiler les principaux
composants du système. La compilation de GCC et du noyau a déjà été vue et ne sera donc pas décrite
ici. Les informations fournies ci-dessous ne sont pas très détaillées, car la plupart des gens n’en n’ont pas
besoin. Elles relèvent plus de la création du système que de son installation, mais elles sont fournies car
elles peuvent être utiles pour les personnes désirant approfondir sérieusement le sujet et disposant d’un
certain niveau en informatique.
• extraire les fichiers sources de leur archive dans un répertoire source srcdir ;
• créer un répertoire pour les objets et s’y placer ;
• taper :
CFLAGS=-O2 ../srcdir/configure --enable-shared --host=i686-pc-linux-gnu \
--prefix=/usr
• lancer make.
Lorsque la compilation sera terminée, vous pourrez tester le nouveau programme avant de l’installer.
Pour cela, il suffit de taper la commande suivante :
make check
Le programme make ainsi configuré sera installé avec la simple commande suivante :
make install
510
Annexe B. Compilation et mise à jour des principaux composants du système
La compilation et l’installation de ces outils pourront alors être faites simplement avec les deux
commandes suivantes :
make
make install
Comme d’habitude, vous pourrez tester que tout s’est bien passé à l’aide de la commande make check
avant de lancer l’installation.
511
Annexe B. Compilation et mise à jour des principaux composants du système
• les sources du noyau Linux 2.6 doivent être disponibles dans le répertoire /usr/src/linux/ ;
• le compilateur GCC (version 3.3.5 ou plus) doit avoir été compilé et installé ;
• les outils de manipulation des fichiers binaires (binutils 2.15 ou plus) doivent avoir été compilés et
installés ;
• le programme make utilisé doit être de version récente (3.80 ou plus).
• extraire les fichiers sources de leur archive dans un répertoire source srcdir ;
• créer un répertoire pour les objets en dehors du répertoire des sources de la bibliothèque et s’y placer ;
• taper :
CFLAGS=-O2 ../srcdir/configure --prefix=/usr --enable-shared \
--enable-add-ons=libidn,nptl --with-tls
make
Une fois la compilation effectuée, vous pouvez tester la nouvelle bibliothèque avant de l’installer. Pour
cela, tapez la commande suivante :
make check
Il est vivement recommandé d’effectuer ce test. Si la moindre erreur apparaît pendant l’exécution du test,
n’installez surtout pas la bibliothèque, vous détruiriez sans aucun doute votre système.
512
Annexe B. Compilation et mise à jour des principaux composants du système
gcc ou le shell. Dans ce cas, il faut identifier et remplacer les composants défecteux (ce n’est pas
une blague, ce problème m’est personnellement arrivé avec trois barettes mémoires et un
processeur en moins d’un an, et il est arrivé à bien d’autres personnes dans le monde). Il est facile
de penser que, avec la baisse du prix des barettes mémoires que l’on a vécu ces derniers temps, les
fabricant sont tentés d’être un peu plus laxistes au niveau du contrôle qualité des composants en fin
de chaîne. Le phénomène risque donc de devenir courant, et il peut parfaitement vous arriver. Bien
entendu, il va de soi qu’il ne faut pas overclocker sa machine lorsqu’on se lance dans des opérations
telles que celles-ci. L’overclocking est de toutes manières une technique douteuse dont le but n’est
que d’arriver plus vite à avoir des problèmes curieux, surtout sous Linux. Vous êtes avertis.
make install
Note : ATTENTION ! La technique utilisée par le fichier Makefile pour l’installation de la bibliothèque
C ne permet pas de remplacer la bibliothèque C du système en cours d’exécution de manière fiable.
En pratique, cette commande ne fonctionnera que pour une mise à jour ou une installation de
bibliothèque C compatible avec celle en cours d’exécution (c’est-à-dire compilée avec les mêmes
options). Le remplacement de la bibliothèque en cours d’exécution par une bibliothèque compilée de
même version mais incompatible échouera et laissera le système dans un état pitoyable. Il est
recommandé, dans ce cas, de générer un paquetage pour votre distribution et d’utiliser les scripts
d’installation fournis avec elle.
La commande suivante doit être ensuite utilisée pour installer l’ensemble des locales prises en charge par
la bibliothèque C :
make localedata/install-locales
La compilation des paramètres internationaux pour la France se fera alors avec la commande suivante :
Cette commande permet de compiler les fichiers des paramètres d’affichage des monnaies et des dates,
ainsi que le jeu de caractères utilisé pour comparer et trier les chaînes de caractères. Dans l’exemple
donné ci-dessus, la langue choisie est le français (« fr ») tel qu’il est parlé en France (« FR »), avec le jeu
de caractères ISO-8859-15. Les fichiers compilés sont placés dans le répertoire /usr/lib/locale/, à
raison d’un sous-répertoire pour chaque locale configurée. Si ce répertoire n’existe pas sur votre
machine, vous devrez le créer manuellement, car la commande localedef ne le fait pas automatiquement.
Une fois la bibliothèque C installée, il est nécessaire de mettre à jour les fichiers d’en-tête du noyau
utilisés pour la compilation des autres programmes. En effet, les fichiers d’en-tête du noyau utilisés pour
la compilation de la bibliothèque C ne sont peut-être pas les mêmes que ceux de l’ancienne bibliothèque,
et il est nécessaire de les remplacer pour que la compilation des autres programmes avec la nouvelle
bibliothèque se fasse de manière cohérente. Ces fichiers d’en-têtes sont normalement placés dans les
répertoires /usr/src/linux/include/linux/, /usr/src/linux/include/asm/ et
513
Annexe B. Compilation et mise à jour des principaux composants du système
/usr/src/linux/include/asm-generic/. Ces deux derniers sont des liens symboliques vers les
fichiers d’en-tête de la plate-forme matérielle cible du noyau (généralement,
/usr/src/linux/include/asm-i386/ et /usr/src/linux/include/asm-generic/). Ils
doivent donc être recopiés dans le répertoire des en-têtes du système, à savoir le répertoire
/usr/include/. Cela pourra être réalisé avec les commandes suivantes :
cd /usr/include
rm -rf linux asm*
( cd /usr/src/linux/include ; tar cf - linux/* asm/* asm-generic/* ; ) | tar xvf -
Note : Vous aurez peut-être à recompiler GCC après installation de la nouvelle bibliothèque C, ainsi
qu’un certain nombre d’autres programmes, car la compatibilité binaire d’une version à l’autre de la
bibliothèque C est très relative. Si la version que vous utilisez est un simple correctif de bug
cependant, la compatibilité sera sans doute totale, mais il faut savoir qu’à chaque version majeure un
certain nombre de fonctionnalités sont modifiées et peuvent nécessiter des mises à jour en cascade.
À partir de la version 2.3 de la bibliothèque C et de la version 2.13 des binutils, une amélioration dans le
chargement des bibliothèques dynamiques a été apportée. Cette amélioration permet de « précharger »
ces bibliothèques et donc de gagner du temps au démarrage des programmes. Pour pouvoir bénéficier de
ces améliorations, il faut installer un outil complémentaire nommé « prelink ». Les sources de cet outil
pourront être trouvés sur le compte de son auteur, à l’adresse [Link] Sa
compilation requiert que la bibliothèque libelf, permettant de manipuler les fichiers binaires, soit
installée. Les sources de cette bibliothèque peut également être récupérés sur Internet, à l’adresse
[Link] L’installation de cette
bibliothèque et de prelink se fait simplement à l’aide des commandes suivantes :
./configure --prefix=/usr
make
make install
Note : Pour pouvoir utiliser correctement prelink, vous devez créer un fichier /etc/[Link]
contenant la liste de tous les répertoires des bibliothèques de votre système, à raison d’une ligne par
répertoire. Le contenu de ce fichier est donc typiquement le suivant :
De plus, sachez que le préchargement des bibliothèques ne peut fonctionner que si toutes les
bibliothèques dont dépend un programme, directement ou indirectement (c’est-à-dire par
l’intermédiaire d’éventuelles autres bibliothèques) ont été générées avec les binutils 2.13 ou plus.
514
Annexe B. Compilation et mise à jour des principaux composants du système
Cela implique qu’un certain nombre de composants systèmes (pour ne pas dire tous) devront être
recompilés au préalable. Une mise à jour de votre distribution semble donc être la solution la plus
simple à ce stade.
Compilation de OpenSSL
Les communications sur Internet n’ont jamais été considérées comme quelque chose de sûr. C’est pour
cela que bon nombre de programmes ont recours au chiffrement des données pour assurer des
communications fiables. Ce chiffrement est une nécessité vitale si vous désirez acheter quelque chose sur
Internet ou consulter vos comptes en ligne, tant pour assurer votre protection que celle des intervenants
commerciaux. La plupart des sites commerciaux refuseront l’accès aux clients non sécurisés.
La plupart des distributions utilisent, pour assurer le chiffrement, une bibliothèque fournissant un accès
standard à la plupart des algorithmes de chiffrement : OpenSSL. Vous pourrez trouver cette bibliothèque
sur Internet ([Link]
La compilation d’OpenSSL n’est pas compliquée, car un jeu de fichier makefile pour Linux est fourni
avec les sources. Vous devez simplement tapez la commande suivante pour les sélectionner :
Note : Par défaut, OpenSSL va s’installer dans le répertoire /usr/local/ssl/, y compris les fichiers
d’en-tête. Il faut donc ajouter le chemin /usr/local/ssl/ dans les variables d’environnement
C_INCLUDE_PATH et CPLUS_INCLUDE_PATH si on veut compiler des programmes qui utilisent
SSL (c’est en particulier le cas de KDE). Une autre solution est de demander une configuration
explicite et d’utiliser l’option --prefix pour indiquer le répertoire de base pour l’installation, et
l’option --openssldir pour indiquer le répertoire d’installation des utilitaires :
pour effectuer l’installation des bibliothèques et des en-têtes dans les répertoires /usr/lib et
/usr/include respectivement, et de placer les clefs privées et les fichiers de configuration dans le
répertoire /etc/ssl.
Une fois la configuration effectuée, il suffit de taper les commandes suivantes pour effectuer la
compilation et l’installation :
make
make install
Comme d’habitude, vous pouvez effectuer un test avec la commande make test avant de réaliser
l’installation pour vérifier que tout est correct.
515
Annexe B. Compilation et mise à jour des principaux composants du système
#define TT_CONFIG_OPTION_BYTECODE_INTERPRETER
./configure --prefix=/usr
make
make install
Fontconfig est une bibliothèque de gestion des polices de caractères au sens général. Elle est maintenue
par le projet Freedesktop ([Link] Elle peut être installée également très
simplement, avec les trois commandes suivantes :
Remarquez que pour certaines versions de cette bibliothèque, la documentation ne compile pas. On peut
malgré tout réaliser l’installation sans problème.
Une fois ces bibliothèques installées, la compilation de [Link] se déroule donc comme suit :
516
Annexe B. Compilation et mise à jour des principaux composants du système
make World
Note : La compilation de XWindow lui-même suppose qu’il y ait un lien de /usr/bin/cc vers le
compilateur C natif de votre système, en l’occurrence /usr/bin/gcc. Il en est de même pour le
préprocesseur. Vous devrez donc créer un lien symbolique de /lib/cpp vers /usr/bin/cpp. De
même, il faut s’assurer qu’il y ait un lien symbolique de /usr/lib/[Link] vers la version
courante de cette bibliothèque (allez savoir pourquoi ce lien n’existe pas sur certaines
distributions...).
La compilation des documentation de [Link] nécessite également que vous disposiez des outils de
génération de documentation SMGL. Ces outils comprennent OpenJade, un traducteur SGML
utilisant des feuilles de styles DSSSL, et les feuilles de styles associées. Ces outils sont
normalement fournis avec toute bonne distribution, leur installation ne sera donc pas traitée dans ce
document. Notez toutefois qu’il faut s’assurer que des liens symboliques jade et nsgmls existent et
référencent respectivement les programmes openjade et onsgmls pour que la compilation des
documentations puisse bien se passer.
Toutes les options de compilation de [Link] sont indiquées dans les fichiers du répertoire
/xc/config/cf/. Le fichier [Link] est le fichier de configuration central des sources de XWindow.
Il lit les options des fichiers de configuration des autres systèmes, en particulier le fichier [Link].
C’est pour cela qu’il faut définir les options de configuration dans le fichier [Link] et non pas dans le
fichier [Link]. Vous trouverez un exemple de fichier [Link] adapté à Linux dans le fichier
[Link].
Normalement, il n’est pas nécessaire d’apporter la moindre modification au fichier [Link] pour
compiler [Link] sous Linux. En effet, les valeurs par défaut conviendront dans la plupart des cas. Les
options décrites ci-dessous ne le sont donc qu’à titre informatif :
517
Annexe B. Compilation et mise à jour des principaux composants du système
• l’option BuildFonts peut être fixée à « NO » si vous ne voulez pas compiler les polices de caractères
(en général, on ne les compile qu’une seule fois, car ce n’est plus nécessaire lors des mises à jour) ;
• l’option BuildServersOnly peut être fixée à « YES » si vous ne désirez compiler que les serveurs X
(par exemple pour une mise à jour).
Vous pouvez laisser les autres options entre commentaires. La compilation de [Link] se fera alors
simplement en exécutant la commande suivante dans le répertoire d’installation des sources :
make World
Note : Notez qu’il n’est pas nécessaire, en général, de compiler les polices de caractères. En effet,
celles-ci ne sont que très rarement modifiées d’une version à l’autre de X11, et les polices de
l’ancienne version peuvent parfaitement convenir. Il en est de même pour la documentation, qui n’est
pas toujours mise à jour à chaque version mineure.
L’installation de XWindow se fait alors simplement avec les deux commandes suivantes :
make install
make [Link]
./configure --prefix=/usr/X11R6
make
make install
Ce jeu de commandes installera Lesstif dans le répertoire /usr/X11R6/LessTif. Bien entendu, vous
êtes libre d’utiliser un autre emplacement, mais il vous faudra alors modifier les chemins de recherche
des fichiers d’en-tête et des bibliothèques lorsque vous voudrez utiliser des programmes qui en ont
besoin.
518
Annexe B. Compilation et mise à jour des principaux composants du système
Lorsque vous aurez récupéré ces archives, vous devrez les décompresser toutes les deux dans le même
répertoire. Vous disposerez alors d’un sous-répertoire Mesa-6.2.1, dans lequel se trouvent tous les
fichiers sources.
La compilation de MESA se fait simplement avec en exécutant la commande suivante :
make système
où système est le nom du système cible pour lequel MESA doit être compilé. Vous obtiendrez la liste
des systèmes utilisables si vous n’en spécifiez aucun. Une fois la compilation effectuée, l’installation se
fait manuellement, par copie des fichiers. Ceci se réalise simplement avec les deux commandes
suivantes :
cp -r include/GL /usr/include
cp -pd lib/* /usr/lib
Note : Il est nécessaire de compiler les programmes de test pour que la bibliothèque GLUT soit
installée. Pour cela, il faut que l’archive [Link].bz2 ait été décompactée avant la
compilation de la bibliothèque MESA.
Il est recommandé de supprimer les fichiers de l’ancienne version de la bibliothèque MESA fournie
avec [Link]. Ces fichiers sont situés dans le répertoire /usr/X11R6/lib/, et portent des noms du
type libGL*.
Si vous avez installé des bibliothèques permettant de bénéficier de l’accélération 3D matérielle de
votre carte graphique, vous devrez supprimer les bibliothèques installées par MESA, et au besoin
réinstaller vos bibliothèques prenant en charge votre carte graphique. Dans le cas contraire, les
programmes utilisant OpenGL seront considérablement ralentis, et vous ne pourrez certainement
plus les utiliser. Ce genre de situation se produit par exemple sur les machines disposant de cartes
graphiques à base de puces NVidia, pour lesquelles vous devez utiliser les pilotes fournis par NVidia
([Link] afin de bénéficier des accélérations 3D par le matériel.
519
Annexe B. Compilation et mise à jour des principaux composants du système
cd /usr/lib
• les sources sont extraites dans le répertoire qt-x11-free-3.3.4/. Il faut renommer ce répertoire en
qt/ (c’est-à-dire, supprimer les numéros de version) ou faire un lien symbolique qt vers ce répertoire
(solution permettant de conserver les anciennes bibliothèques, pour les anciens programmes) ;
• il faut ensuite ajouter les variables d’environnement dans le .profile ou .login (selon le shell
utilisé, pour bash, il faut modifier .profile) comme indiqué dans le fichier INSTALL du répertoire
qt. Ces variables d’environnement sont utilisées par le processus de compilation. Vous devrez bien
entendu corriger les chemins définis par défaut pour référencer le répertoire d’installation des sources
de Qt ;
• il faut recharger le fichier .profile ou .login afin de définir ces variables ;
• lancer la commande configure avec les options suivantes :
make
• lancer ldconfig.
Outre la bibliothèque Qt, KDE utilise également quelques bibliothèques utilitaires qu’il est fortement
recommandé d’installer. Il s’agit principalement de la bibliothèque pcre ([Link] qui
permet de gérer les expressions rationnelles, de la bibliothèque Xine ([Link] qui permet de
jouer des fichiers vidéo de manière indépendante de leur format, et d’un certain nombre de
bilbliothèques du gestionnaire de bureau Gnome ([Link] :
520
Annexe B. Compilation et mise à jour des principaux composants du système
• les bibliothèques libxml et libxslt, qui permettent d’analyser les documents au format XML ;
• et des bibliothèques libart et ImLib, qui permettent de manipuler les différents formats d’image de
manière uniforme.
Ces bibliothèques peuvent être compilées de manière classique, à l’aide du classique triplet configure,
make et make install.
D’autres bibliothèques devront être installées pour bénéficier de fonctionnalités complémentaires.
Cependant, l’installation de ces bibliothèques reste facultative et n’est pas nécessaire à la compilation
complète de KDE. Certaines d’entre-elles sont cependant très intéressantes, et leur installation devra être
considérée en fonction de vos besoins. Les bibliothèques et utilitaires utilisés par les différents
composants de KDE sont listés ci-dessous
521
Annexe B. Compilation et mise à jour des principaux composants du système
Une fois les bibliothèques utilitaires et la bibliothèque Qt compilées, on peut s’attaquer à KDE
lui-même. La compilation de KDE suppose que les variables d’environnement de la bibliothèque Qt sont
toujours définies, il ne faut donc pas les supprimer après avoir compilé celle-ci.
KDE se configure classiquement, avec le programme de configuration configure. Pour chaque
composant de KDE, il faut procéder comme suit :
En général, KDE est installé dans le répertoire /opt/kde/. Il faut donc spécifier les bons préfixes lors
de l’appel à configure. La ligne de commande à utiliser est donc la suivante :
./configure --prefix=/opt/kde
Comme d’habitude, il faut éventuellement indiquer le type de machine avec l’option --host et
demander l’utilisation des bibliothèques dynamiques avec l’option --enable-shared.
L’ordre des opérations lors de la compilation de KDE est important, parce que certaines parties de KDE
en utilisent d’autres. En particulier, il faut impérativement compiler et installer les bibliothèques en
premier. Il est donc recommandé d’opérer dans l’ordre suivant :
• arts ;
• kdelib ;
• kdebase ;
• les autres composants de KDE, kdenetwork devant être compilé avant kdepim, et kdeaddons devant
être compilé en dernier.
Note : Si l’on veut que la bibliothèque Xine puisse utiliser le serveur de son arts, il est nécessaire de
la compiler après celui-ci. Toutefois, elle devra être compilée avant le paquetage kdemultimedia, qui
l’utilise pour la lecture des fichiers vidéo).
Note : Contrairement aux autres parties du système, il faut compiler KDE dans le répertoire des
sources. En effet, certaines bibliothèques fournies avec les sources sont nécessaires pour la
compilation correcte de quelques modules non essentiels de KDE.
D’autre part, si KDE est déjà présent sur votre système, il faut le supprimer avant de le recompiler
(ou au moins renommer son répertoire si vous n’êtes pas sûr de vous...). En effet, les fichiers
522
Annexe B. Compilation et mise à jour des principaux composants du système
Note : KDE 3.4.2 et Qt 3.3.4 sont capables d’utiliser les fonctionnalités les plus avancées des
serveurs X. Ces fonctionnalités peuvent apporter un plus indéniable, et il est recommandé que
XWindow soit correctement installé avant de lancer leur compilation . En particulier, il est
recommandé d’avoir compilé et installé la bibliothèque FreeType 2, pour le support des polices
TrueType et l’anti-aliasing des polices de caractères, ainsi que la bibliothèque Open GL MESA.
Note : Enfin, sachez que KDE 3.4.2 nécessite la version 1.4.2 ou plus de l’environnement
d’exécution java pour permettre l’utilisation de java et de javascript dans le navigateur Konqueror.
Cet environnement peut être téléchargé gratuitement sur le site de Sun ([Link] Les
binaires fournis par Sun ne sont pas des logiciels libres, mais ce sont les seuls qui respectent
réellement la norme Java (ce qui est logique, puisqu’elle est imposée par Sun). L’installation de cet
environnement d’exécution se fait extrêmement simplement. Il est recommandé d’installer les
binaires dans le répertoire /usr/lib/jrex.y.z et de créer un lien symbolique /usr/lib/java vers
ce répertoire, afin de permettre l’installation de plusieurs versions de l’environnement d’exécution
java tout en sélectionnant la version x.y.z par défaut. Après installation, vous devrez ajouter le
répertoire /usr/lib/java/bin aux répertoires de votre variable d’environnement PATH pour
permettre l’utilisation de Java par les programmes tels que Konqueror. Enfin, le script de lancement
de la machine virtuelle utilise les commandes cut et head, et suppose qu’elles sont installées dans
le répertoire /usr/bin/, alors que la plupart des distributions les placent directement dans le
répertoire /bin/. Vous aurez donc peut-être à faire des liens symboliques cut et head sur ces deux
commandes dans le répertoire /usr/bin/.
Notez que le support de Java doit également être activé manuellement dans la configuration de
Konqueror pour que vous puissiez utiliser toutes les fonctionnalités de Java.
523
Annexe B. Compilation et mise à jour des principaux composants du système
dans l’environnement Gnome est donc relativement important, et l’opération de compilation peut donc
être relativement fastidieuse.
Les fichiers d’archives de Gnome 2.10.0 peuvent être téléchargés directement à partir du site du projet
Gnome ([Link] ou à partir de l’un de ses miroirs. Les sources sont réparties dans trois
répertoire. Le répertoire platform/ contient les sources des bibliothèques de base de Gnome, qu’il est
conseillé d’installer même si on n’utilise pas l’environnement Gnome lui-même, car elles sont souvent
utilisées par des programmes indépendants. Le répertoire desktop/ contient les sources des
programmes de l’environnement de bureau Gnome lui-même. Enfin, le répertoire bindings/ contient
les sources des bibliothèques permettant de programmer et de commander les programmes Gnome dans
différents langages de programmation. Certaines de archives complémentaires doivent également être
récupérées sur le site du projet Freedesktop ([Link]
Les dépendances entre les différents constituants de Gnome sont très fortes, et l’ordre de compilation est
extrêmement important. Notez que l’ordre de compilation indiqué dans les pages d’aide du site de
Gnome est partiellement faux, et suppose de surcroît quelques prérequis quand aux outils
complémentaires. En particulier, OpenJade et Python 2.2 ou plus doivent être installés, ainsi que les
DTD XML DocBook 3.0 et 4.1.2 (définition de grammaire de document XML pour les documentations
informatiques). Enfin, certains modules ne compilent pas en l’état et requièrent des dépendances sur des
sous-systèmes des versions précédentes de Gnome. En d’autres termes, la compilation de Gnome n’est
pas une chose aisée, et on aura tout intérêt à utiliser les versions fournies par les distributions.
Il est possible d’installer Gnome dans un autre répertoire que le répertoire par défaut en spécifiant le
répertoire destination à l’aide de l’option --prefix lors de la compilation de chaque module. Toutefois,
il est impératif dans ce cas d’ajouter le répertoire des binaires de Gnome dans la variable
d’environnement PATH, ainsi que le répertoire des bibliothèques de Gnome dans la variable
d’environnement LD_LIBRARY_PATH pour que la compilation des composants de Gnome se déroule
sans problème. Il est également nécessaire d’ajouter le répertoire de stockage des informations sur les
paquetages sources dans la variable d’environnement PKG_CONFIG_PATH si ces paquetages ne sont
pas installés dans un emplacement standard.
Certaines des bibliothèques de Gnome sont utilisées par de nombreux autres projets, aussi est-il
recommandé des les installer directement dans le répertoire système /usr/. C’est en particulier le cas
des bibliothèques de gestion de paquetage source pkgconfig, des bibliothèques de gestion des fichiers
XML, de la bibliothèque utilitaire glib, de la bibliothèque de gestion du son audiofile des bibliothèque
graphiques gtk+ et libart.
La première étape dans la compilation de Gnome est donc d’installer ces bibliothèques. L’ordre
d’installation recommandé est le suivant :
524
Annexe B. Compilation et mise à jour des principaux composants du système
• gnome-mime-data ;
• pango (bibliothèque d’internationalisation de gestion du texte, requise par gtk+) ;
• atk (bibliothèque de gestion de l’accessibilité, requise par gtk+) ;
• gtk-doc (utilitaires d’aide à la documentation) ;
• gtk+ (bibliothèque graphique) ;
• libgtop (bibliothèque portable de gestion des processus) ;
• libIDL (bibliothèque de gestion des fichiers de description d’interfaces CORBA) ;
• ORBit2 (implémentation de CORBA) ;
Toutes ces bibliothèques et ces programmes peuvent être installés simplement en exécutant avec les
commandes suivantes :
Note : Vous devrez peut-être indiquer à Gnome où se trouve la DTD XML de DocBook une fois les
bibliothèques libxml et libxslt installées. Cela peut être réalisé à l’aide des commandes suivantes :
La première commande permet de créer un fichier de configuration vierge pour l’enregistrement des
DTDs au niveau de la bibliothèque libxml, et la deuxième permet d’ajouter la DTD DocBook dans ce
fichier. Bien entendu, vous ne devrez exécuter la première commande que si le fichier
/etc/xml/catalog n’existe pas déjà. Le chemin indiqué pour le fichier [Link] donné ici l’est
à titre d’exemple et doit bien entendu être modifié en fonction de l’emplacement où vous avez installé
la DTD DocBook.
La compilation et l’installation des autres composants de Gnome se fait ensuite également à l’aide des
commandes configure, make et make install. Toutefois, le répertoire d’installation peut être fixé à un
autre répertoire que le répertoire système, à l’aide de l’option --prefix. Ces composants doivent être
compilés et installés dans l’ordre suivant :
• GConf ;
• esound ;
• hicolor-icon-theme (disponible sur le site de Freedesktop) ;
• gnome-icon-theme ;
• libglade ;
525
Annexe B. Compilation et mise à jour des principaux composants du système
• libbonobo ;
• gamin (disponible sur le site de Freedesktop) ;
• gnome-vfs ;
• libgnome ;
• libgnomecanvas ;
• gail ;
• at-spi ;
• libbonoboui ;
• libgnomeprint ;
• libgnomeprintui ;
• gnome-keyring ;
• libgnomeui ;
• startup-notification ;
• gtk-engines ;
• gnome-themes ;
• scrollkeeper ;
• system-tools-backends ;
• libxklavier ;
• libgtkhtml ;
• gstreamer ;
• gst-plugins ;
• desktop-file-utils ;
• libgsf (non fourni avec les sources officiels de Gnome, mais disponible sur le site de Gnome malgré
cela) ;
• libcroco (non fourni avec les sources officiels de Gnome, mais disponible sur le site de Gnome malgré
cela) ;
• librsvg ;
• libwnck ;
• libsoup ;
• gal ;
• gtkhtml ;
• libgail-gnome ;
• libgnomesu ;
• gcalctool ;
• gconf-editor ;
526
Annexe B. Compilation et mise à jour des principaux composants du système
• gdm ;
• gtksourceview ;
• gedit ;
• ggv ;
• gnome-desktop ;
• gnome-menus ;
• eel ;
• eog ;
• evolution-data-server ;
• gnome-panel ;
• gnome-applets ;
• gnome-audio ;
• gnome-backgrounds ;
• gnome-docs-utils ;
• bug-buddy ;
• gnome-mag ;
• gnome-netstatus ;
• gnome-nettool ;
• gnome-session ;
• gnome-speech ;
• dasher ;
• gnome-system-monitor ;
• vte ;
• gnome-system-tools ;
• gnome-terminal ;
• gnome-utils ;
• gnome-volume-manager ;
• gnome-games ;
• gnome2-user-docs ;
• gok ;
• gnopernicus ;
• gpdf ;
• gucharmap ;
• metacity ;
• nautilus ;
527
Annexe B. Compilation et mise à jour des principaux composants du système
• nautilus-cd-burner ;
• file-roller ;
• gnome-media ;
• nautilus-media ;
• control-center ;
• gnome-pilot ;
• gnome-pilot-conduits ;
• gnome-spell ;
• evolution ;
• evolution-webcal ;
• ximian-connector ;
• epiphany ;
• sound-juicer ;
• totem ;
• vino ;
• yelp ;
• zenity ;
• gnomemeeting.
528
Annexe B. Compilation et mise à jour des principaux composants du système
make
et l’installation avec :
make install
Notez cependant que les outils smbmnt et smbumount ne sont pas setuid. Leurs droits doivent donc être
modifiés avec les deux commandes suivantes :
chmod +s /usr/bin/smbmnt
chmod +s /usr/bin/smbumount
529
Annexe C. Formulaire pour la création des
lignes de mode de [Link]
Les formules données dans cette annexe donnent les relations entre les différentes valeurs utilisées dans
les lignes de mode de [Link]. Elles peuvent vous aider à comprendre les relations entre les principaux
paramètres de ces lignes.
Ces formules utilisent des variables qui représentent les valeurs des lignes de mode et les caractéristiques
techniques de votre écran. Le tableau donné ci-dessous liste les variables utilisées :
Variable Signification
DC « Dot Clock », fréquence de base du balayage. Représente le nombre de pixels
balayés par seconde et sert de base de temps pour tous les calculs.
BW « Bandwidth », bande passante de fonctionnement du moniteur. Représente la
limite supérieure de la fréquence de base du balayage que le moniteur peut accepter.
Cette valeur fait partie des caractéristiques techniques du moniteur. Elle peut être
extrapolée à partir de la résolution maximale que le moniteur peut afficher.
GCMF « Graphic Card Maximum Frequency », la plus grande valeur de fréquence de
balayage que la carte graphique peut générer. Cette valeur fait partie des
caractéristiques techniques de la carte graphique.
MHF « Max Horizontal Frequency », fréquence maximale du balayage horizontal. C’est
la plus forte valeur de la plage de fréquences horizontales pour les moniteurs
multisynchrones. Cette donnée fait partie des caractéristiques techniques du
moniteur.
MVF « Max Vertical Frequency », fréquence maximale du balayage vertical. C’est la
plus forte valeur de la plage de fréquences verticales pour les moniteurs
multisynchrones. Cette donnée fait partie des caractéristiques techniques du
moniteur.
RR « Refresh Rate », taux de rafraîchissement des images du mode graphique. C’est le
nombre d’images générées par seconde pour ce mode graphique.
HR « Horizontal Resolution », résolution horizontale du mode graphique. C’est le
nombre de pixels visibles dans ce mode graphique.
HFL « Horizontal Frame Length », longueur totale d’une ligne dans ce mode. C’est le
nombre de pixels total du mode graphique, visibles ou non. Les pixels non visibles
sont les pixels de la zone de blanking horizontal.
HST « Horizontal Sync Time », durée minimale des signaux de synchronisation du
balayage horizontal. Cette donnée fait partie des caractéristiques techniques du
moniteur.
HSL « Horizontal Sync Length », longueur des signaux de synchronisation du balayage
horizontal, exprimée en pixels. Cette donnée peut être déduite directement de la
durée des signaux et de la fréquence de base du balayage.
HBT « Horizontal Blanking Time », durée minimale du blanking horizontal dans ce
mode graphique. C’est la durée pendant laquelle le faisceau électronique doit être
éteint. Cette donnée fait partie des caractéristiques techniques du moniteur.
530
Annexe C. Formulaire pour la création des lignes de mode de [Link]
Variable Signification
HBL « Horizontal Blanking Length », longueur totale du blanking en pixels. Cette
donnée peut être déduite directement de la durée du blanking et de la fréquence de
base du balayage.
VR « Vertical Resolution », résolution verticale du mode graphique. C’est le nombre de
lignes visibles dans ce mode graphique.
VFH « Vertical Frame Height », hauteur totale d’une image dans ce mode. C’est le
nombre de lignes total du mode graphique, lignes non visibles comprises. Les
lignes non visibles sont les lignes de la zone de blanking vertical.
VST « Vertical Sync Time », durée minimale des signaux de synchronisation du
balayage vertical. Cette donnée fait partie des caractéristiques techniques du
moniteur.
VSH « Vertical Sync Height », nombre de lignes balayées pendant le signal de
synchronisation du balayage vertical. Cette donnée peut être déduite de la durée des
signaux de synchronisation du balayage vertical, de la longueur totale d’une ligne
et de la fréquence de base du balayage.
VBT « Vertical Blanking Time », durée minimale du blanking vertical dans ce mode
graphique. C’est la durée pendant laquelle le faisceau électronique doit être éteint
avant et après un retour de balayage vertical. Cette donnée fait partie des
caractéristiques techniques du moniteur.
VBH « Vertical Blanking Height », nombre totale de lignes du blanking vertical. Cette
donnée peut être déduite de la durée du blanking vertical, de la longueur totale
d’une ligne et de la fréquence de base du balayage.
Certaines des variables mentionnées dans ce tableau peuvent être directement déduites des autres. C’est
en particulier le cas de RR, HSL, HVL, VSH et VBH.
Le taux de rafraîchissement dépend bien entendu de la fréquence de base du balayage et du nombre total
de pixels à balayer. Il peut donc être calculé directement avec la formule suivante :
RR = DC ÷ (HFL × VFH)
HSL = HST × DC
HBL = HBT × DC
Le même raisonnement peut être fait pour le nombre de lignes parcourues pendant le signal de
synchronisation du balayage vertical et le blanking. Cependant, il ne faut pas utiliser la fréquence de base
directement quand on calcule sur les lignes, car cette fréquence est exprimée en pixels par seconde et les
lignes contiennent HFL pixels. Il faut donc diviser cette fréquence par HFL pour obtenir la fréquence en
nombres de lignes par seconde. Les formules à utiliser seront donc les suivantes :
531
Annexe C. Formulaire pour la création des lignes de mode de [Link]
Par ailleurs, la longueur totale des lignes doit bien entendue être supérieure à la résolution plus la taille
de la zone de blanking horizontal. Le même raisonnement peut être appliqué au nombres de lignes total,
à la résolution verticale et au nombre de lignes utilisées pour le blanking. On disposera donc des
relations suivantes :
HFL ≥ HR + HBL
VFH ≥ VR + VBH
Le choix des valeurs des lignes de mode est soumis à un certain nombre de contraintes, qui expriment les
limitations techniques du moniteur et de la carte graphique. Ces contraintes sont exprimées ci-dessous.
Il va de soi que les signaux de synchronisation de balayage doivent être compris dans le blanking. Les
deux premières contraintes sont donc les suivantes :
HSL ≤ HBL
VSH ≤ VBH
Par ailleurs, la fréquence de balayage de base doit bien entendu être tolérée à la fois par le moniteur et
par la carte graphique. Elle doit donc vérifier les deux inégalités suivantes :
DC ≤ BP
DC ≤ GCMF
Enfin, il faut que les fréquences de balayage horizontales et verticales utilisées soient inférieures aux
fréquences de balayage maximales que le moniteur peut gérer. Cette règle n’est valide que pour les
moniteurs multisynchrones. Pour les moniteurs à fréquences fixes, il faut que les fréquences de balayage
horizontale et verticale soient strictement égales à celles du moniteur.
La contrainte horizontale donne une troisième condition sur DC :
Or :
soit :
532
Annexe C. Formulaire pour la création des lignes de mode de [Link]
soit :
Cette inéquation impose une limite inférieure en dessous de laquelle DC peut se trouver, ou une limite
supérieure au delà de laquelle il peut se trouver. En pratique, la limite supérieure ne peut jamais être
atteinte. Il faut donc que la fréquence de base soit inférieure à la première racine de l’équation associée à
l’inéquation donnée ci-dessous. Cette équation est du second degré et sa résolution ne pose pas de
problème particulier. Certains moniteurs ont un temps nul pour les signaux de synchronisation verticaux.
Comme le second membre de cette équation est négatif en pratique, la limite à respecter pour la
fréquence de balayage de base est exprimée dans ce cas par l’inéquation suivante :
533
Appendix D. GNU Free Documentation License
Version 1.1, March 2000
Copyright (C) 2000 Free Software Foundation, Inc.
59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is
not allowed.
0. PREAMBLE
The purpose of this License is to make a manual, textbook, or other written document "free" in the sense
of freedom: to assure everyone the effective freedom to copy and redistribute it, with or without
modifying it, either commercially or noncommercially. Secondarily, this License preserves for the author
and publisher a way to get credit for their work, while not being considered responsible for modifications
made by others.
This License is a kind of "copyleft", which means that derivative works of the document must themselves
be free in the same sense. It complements the GNU General Public License, which is a copyleft license
designed for free software.
We have designed this License in order to use it for manuals for free software, because free software
needs free documentation: a free program should come with manuals providing the same freedoms that
the software does. But this License is not limited to software manuals; it can be used for any textual
work, regardless of subject matter or whether it is published as a printed book. We recommend this
License principally for works whose purpose is instruction or reference.
1. APPLICABILITY AND DEFINITIONS
This License applies to any manual or other work that contains a notice placed by the copyright holder
saying it can be distributed under the terms of this License. The "Document", below, refers to any such
manual or work. Any member of the public is a licensee, and is addressed as "you".
A "Modified Version" of the Document means any work containing the Document or a portion of it,
either copied verbatim, or with modifications and/or translated into another language.
A "Secondary Section" is a named appendix or a front-matter section of the Document that deals
exclusively with the relationship of the publishers or authors of the Document to the Document’s overall
subject (or to related matters) and contains nothing that could fall directly within that overall subject.
(For example, if the Document is in part a textbook of mathematics, a Secondary Section may not
explain any mathematics.) The relationship could be a matter of historical connection with the subject or
with related matters, or of legal, commercial, philosophical, ethical or political position regarding them.
The "Invariant Sections" are certain Secondary Sections whose titles are designated, as being those of
Invariant Sections, in the notice that says that the Document is released under this License.
The "Cover Texts" are certain short passages of text that are listed, as Front-Cover Texts or Back-Cover
Texts, in the notice that says that the Document is released under this License.
A "Transparent" copy of the Document means a machine-readable copy, represented in a format whose
specification is available to the general public, whose contents can be viewed and edited directly and
straightforwardly with generic text editors or (for images composed of pixels) generic paint programs or
(for drawings) some widely available drawing editor, and that is suitable for input to text formatters or
for automatic translation to a variety of formats suitable for input to text formatters. A copy made in an
534
Appendix D. GNU Free Documentation License
otherwise Transparent file format whose markup has been designed to thwart or discourage subsequent
modification by readers is not Transparent. A copy that is not "Transparent" is called "Opaque".
Examples of suitable formats for Transparent copies include plain ASCII without markup, Texinfo input
format, LaTeX input format, SGML or XML using a publicly available DTD, and standard-conforming
simple HTML designed for human modification. Opaque formats include PostScript, PDF, proprietary
formats that can be read and edited only by proprietary word processors, SGML or XML for which the
DTD and/or processing tools are not generally available, and the machine-generated HTML produced by
some word processors for output purposes only.
The "Title Page" means, for a printed book, the title page itself, plus such following pages as are needed
to hold, legibly, the material this License requires to appear in the title page. For works in formats which
do not have any title page as such, "Title Page" means the text near the most prominent appearance of the
work’s title, preceding the beginning of the body of the text.
2. VERBATIM COPYING
You may copy and distribute the Document in any medium, either commercially or noncommercially,
provided that this License, the copyright notices, and the license notice saying this License applies to the
Document are reproduced in all copies, and that you add no other conditions whatsoever to those of this
License. You may not use technical measures to obstruct or control the reading or further copying of the
copies you make or distribute. However, you may accept compensation in exchange for copies. If you
distribute a large enough number of copies you must also follow the conditions in section 3.
You may also lend copies, under the same conditions stated above, and you may publicly display copies.
3. COPYING IN QUANTITY
If you publish printed copies of the Document numbering more than 100, and the Document’s license
notice requires Cover Texts, you must enclose the copies in covers that carry, clearly and legibly, all
these Cover Texts: Front-Cover Texts on the front cover, and Back-Cover Texts on the back cover. Both
covers must also clearly and legibly identify you as the publisher of these copies. The front cover must
present the full title with all words of the title equally prominent and visible. You may add other material
on the covers in addition. Copying with changes limited to the covers, as long as they preserve the title of
the Document and satisfy these conditions, can be treated as verbatim copying in other respects.
If the required texts for either cover are too voluminous to fit legibly, you should put the first ones listed
(as many as fit reasonably) on the actual cover, and continue the rest onto adjacent pages.
If you publish or distribute Opaque copies of the Document numbering more than 100, you must either
include a machine-readable Transparent copy along with each Opaque copy, or state in or with each
Opaque copy a publicly-accessible computer-network location containing a complete Transparent copy
of the Document, free of added material, which the general network-using public has access to download
anonymously at no charge using public-standard network protocols. If you use the latter option, you must
take reasonably prudent steps, when you begin distribution of Opaque copies in quantity, to ensure that
this Transparent copy will remain thus accessible at the stated location until at least one year after the last
time you distribute an Opaque copy (directly or through your agents or retailers) of that edition to the
public.
It is requested, but not required, that you contact the authors of the Document well before redistributing
any large number of copies, to give them a chance to provide you with an updated version of the
Document.
4. MODIFICATIONS
535
Appendix D. GNU Free Documentation License
You may copy and distribute a Modified Version of the Document under the conditions of sections 2 and
3 above, provided that you release the Modified Version under precisely this License, with the Modified
Version filling the role of the Document, thus licensing distribution and modification of the Modified
Version to whoever possesses a copy of it. In addition, you must do these things in the Modified Version:
A. Use in the Title Page (and on the covers, if any) a title distinct from that of the Document, and from
those of previous versions (which should, if there were any, be listed in the History section of the
Document). You may use the same title as a previous version if the original publisher of that version
gives permission.
B. List on the Title Page, as authors, one or more persons or entities responsible for authorship of the
modifications in the Modified Version, together with at least five of the principal authors of the
Document (all of its principal authors, if it has less than five).
C. State on the Title page the name of the publisher of the Modified Version, as the publisher.
D. Preserve all the copyright notices of the Document.
E. Add an appropriate copyright notice for your modifications adjacent to the other copyright notices.
F. Include, immediately after the copyright notices, a license notice giving the public permission to use
the Modified Version under the terms of this License, in the form shown in the Addendum below.
G. Preserve in that license notice the full lists of Invariant Sections and required Cover Texts given in
the Document’s license notice.
H. Include an unaltered copy of this License.
I. Preserve the section entitled "History", and its title, and add to it an item stating at least the title,
year, new authors, and publisher of the Modified Version as given on the Title Page. If there is no
section entitled "History" in the Document, create one stating the title, year, authors, and publisher
of the Document as given on its Title Page, then add an item describing the Modified Version as
stated in the previous sentence.
J. Preserve the network location, if any, given in the Document for public access to a Transparent copy
of the Document, and likewise the network locations given in the Document for previous versions it
was based on. These may be placed in the "History" section. You may omit a network location for a
work that was published at least four years before the Document itself, or if the original publisher of
the version it refers to gives permission.
K. In any section entitled "Acknowledgements" or "Dedications", preserve the section’s title, and
preserve in the section all the substance and tone of each of the contributor acknowledgements
and/or dedications given therein.
L. Preserve all the Invariant Sections of the Document, unaltered in their text and in their titles. Section
numbers or the equivalent are not considered part of the section titles.
M. Delete any section entitled "Endorsements". Such a section may not be included in the Modified
Version.
N. Do not retitle any existing section as "Endorsements" or to conflict in title with any Invariant Section.
If the Modified Version includes new front-matter sections or appendices that qualify as Secondary
Sections and contain no material copied from the Document, you may at your option designate some or
536
Appendix D. GNU Free Documentation License
all of these sections as invariant. To do this, add their titles to the list of Invariant Sections in the
Modified Version’s license notice. These titles must be distinct from any other section titles.
You may add a section entitled "Endorsements", provided it contains nothing but endorsements of your
Modified Version by various parties--for example, statements of peer review or that the text has been
approved by an organization as the authoritative definition of a standard.
You may add a passage of up to five words as a Front-Cover Text, and a passage of up to 25 words as a
Back-Cover Text, to the end of the list of Cover Texts in the Modified Version. Only one passage of
Front-Cover Text and one of Back-Cover Text may be added by (or through arrangements made by) any
one entity. If the Document already includes a cover text for the same cover, previously added by you or
by arrangement made by the same entity you are acting on behalf of, you may not add another; but you
may replace the old one, on explicit permission from the previous publisher that added the old one.
The author(s) and publisher(s) of the Document do not by this License give permission to use their
names for publicity for or to assert or imply endorsement of any Modified Version.
5. COMBINING DOCUMENTS
You may combine the Document with other documents released under this License, under the terms
defined in section 4 above for modified versions, provided that you include in the combination all of the
Invariant Sections of all of the original documents, unmodified, and list them all as Invariant Sections of
your combined work in its license notice.
The combined work need only contain one copy of this License, and multiple identical Invariant Sections
may be replaced with a single copy. If there are multiple Invariant Sections with the same name but
different contents, make the title of each such section unique by adding at the end of it, in parentheses,
the name of the original author or publisher of that section if known, or else a unique number. Make the
same adjustment to the section titles in the list of Invariant Sections in the license notice of the combined
work.
In the combination, you must combine any sections entitled "History" in the various original documents,
forming one section entitled "History"; likewise combine any sections entitled "Acknowledgements",
and any sections entitled "Dedications". You must delete all sections entitled "Endorsements."
6. COLLECTIONS OF DOCUMENTS
You may make a collection consisting of the Document and other documents released under this License,
and replace the individual copies of this License in the various documents with a single copy that is
included in the collection, provided that you follow the rules of this License for verbatim copying of each
of the documents in all other respects.
You may extract a single document from such a collection, and distribute it individually under this
License, provided you insert a copy of this License into the extracted document, and follow this License
in all other respects regarding verbatim copying of that document.
7. AGGREGATION WITH INDEPENDENT WORKS
A compilation of the Document or its derivatives with other separate and independent documents or
works, in or on a volume of a storage or distribution medium, does not as a whole count as a Modified
Version of the Document, provided no compilation copyright is claimed for the compilation. Such a
compilation is called an "aggregate", and this License does not apply to the other self-contained works
thus compiled with the Document, on account of their being thus compiled, if they are not themselves
derivative works of the Document.
537
Appendix D. GNU Free Documentation License
If the Cover Text requirement of section 3 is applicable to these copies of the Document, then if the
Document is less than one quarter of the entire aggregate, the Document’s Cover Texts may be placed on
covers that surround only the Document within the aggregate. Otherwise they must appear on covers
around the whole aggregate.
8. TRANSLATION
Translation is considered a kind of modification, so you may distribute translations of the Document
under the terms of section 4. Replacing Invariant Sections with translations requires special permission
from their copyright holders, but you may include translations of some or all Invariant Sections in
addition to the original versions of these Invariant Sections. You may include a translation of this License
provided that you also include the original English version of this License. In case of a disagreement
between the translation and the original English version of this License, the original English version will
prevail.
9. TERMINATION
You may not copy, modify, sublicense, or distribute the Document except as expressly provided for under
this License. Any other attempt to copy, modify, sublicense or distribute the Document is void, and will
automatically terminate your rights under this License. However, parties who have received copies, or
rights, from you under this License will not have their licenses terminated so long as such parties remain
in full compliance.
10. FUTURE REVISIONS OF THIS LICENSE
The Free Software Foundation may publish new, revised versions of the GNU Free Documentation
License from time to time. Such new versions will be similar in spirit to the present version, but may
differ in detail to address new problems or concerns. See [Link]
Each version of the License is given a distinguishing version number. If the Document specifies that a
particular numbered version of this License "or any later version" applies to it, you have the option of
following the terms and conditions either of that specified version or of any later version that has been
published (not as a draft) by the Free Software Foundation. If the Document does not specify a version
number of this License, you may choose any version ever published (not as a draft) by the Free Software
Foundation.
538
Annexe E. Licence de documentation libre GNU
Disclaimer
This is an unofficial translation of the GNU Free Documentation License into French. It was not
published by the Free Software Foundation, and does not legally state the distribution terms for software
that uses the GNU FDL--only the original English text of the GNU FDL does that. However, we hope
that this translation will help French speakers understand the GNU FDL better.
Ceci est une traduction française non officielle de la Licence de documentation libre GNU. Elle n’a pas
été publiée par la Free Software Foundation, et ne fixe pas légalement les conditions de redistribution des
documents qui l’utilisent -- seul le texte original en anglais le fait. Nous espérons toutefois que cette
traduction aidera les francophones à mieux comprendre la FDL GNU.
Traduction française non officielle de la GFDL Version 1.1 (Mars 2000)
Copyright original :
Copyright (C) 2000 Free Sofware Foundation, inc
59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
Pour la traduction :
Version 1.0 FR (Jean Luc Fortin, juillet 2000)
Version 1.1 FR (Christian Casteyde, mars 2001)
Version 1.1.1 FR (César Alexanian, mars 2001)
Version 1.1.2 FR (Christian Casteyde et César Alexanian, mars 2001)
Version 1.1.3 FR (Christian Casteyde, avril 2001)
Chacun est libre de copier et de distribuer des copies conformes de cette Licence, mais nul n’est autorisé
à la modifier.
0 - PRÉAMBULE
L’objet de cette Licence est de rendre tout manuel, livre ou autre document écrit « libre » au sens de la
liberté d’utilisation, à savoir : assurer à chacun la liberté effective de le copier ou de le redistribuer, avec
ou sans modifications, commercialement ou non. En outre, cette Licence garantit à l’auteur et à l’éditeur
la reconnaissance de leur travail, sans qu’ils soient pour autant considérés comme responsables des
modifications réalisées par des tiers.
Cette Licence est une sorte de « copyleft », ce qui signifie que les travaux dérivés du document d’origine
sont eux-mêmes « libres » selon les mêmes termes. Elle complète la Licence Publique Générale GNU,
qui est également une Licence copyleft, conçue pour les logiciels libres.
Nous avons conçu cette Licence pour la documentation des logiciels libres, car les logiciels libres ont
besoin d’une documentation elle-même libre : un logiciel libre doit être accompagné d’un manuel
garantissant les mêmes libertés que celles accordées par le logiciel lui-même. Mais cette Licence n’est
pas limitée aux seuls manuels des logiciels ; elle peut être utilisée pour tous les documents écrits, sans
distinction particulière relative au sujet traité ou au mode de publication. Nous recommandons l’usage de
cette Licence principalement pour les travaux destinés à des fins d’enseignement ou devant servir de
documents de référence.
1 - APPLICABILITÉ ET DÉFINITIONS
539
Annexe E. Licence de documentation libre GNU
Cette Licence couvre tout manuel ou tout autre travail écrit contenant une notice de copyright autorisant
la redistribution selon les termes de cette Licence. Le mot « Document » se réfère ci-après à un tel
manuel ou travail. Toute personne en est par définition concessionnaire, et est référencée ci-après par le
terme « Vous ».
Une « Version modifiée » du Document désigne tout travail en contenant la totalité ou seulement une
portion de celui-ci, copiée mot pour mot, modifiée et/ou traduite dans une autre langue.
Une « Section secondaire » désigne une annexe au Document, ou toute information indiquant les
rapports entre l’auteur ou l’éditeur et le sujet (ou tout autre sujet connexe) du document, sans toutefois
être en rapport direct avec le sujet lui-même (par exemple, si le Document est un manuel de
mathématiques, une Section secondaire ne traitera d’aucune notion mathématique). Cette section peut
contenir des informations relatives à l’historique du Document, des sources documentaires, des
dispositions légales, commerciales, philosophiques, ou des positions éthiques ou politiques susceptibles
de concerner le sujet traité.
Les « Sections inaltérables » sont des sections secondaires considérées comme ne pouvant être modifiées
et citées comme telles dans la notice légale qui place le Document sous cette Licence.
Les « Textes de couverture » sont les textes courts situés sur les pages de couverture avant et arrière du
Document, et cités comme tels dans la mention légale de ce Document.
Le terme « Copie transparente » désigne une version numérique du Document représentée dans un
format dont les spécifications sont publiquement disponibles et dont le contenu peut être visualisé et
édité directement et immédiatement par un éditeur de texte quelconque, ou (pour les images composées
de pixels) par un programme de traitement d’images quelconque, ou (pour les dessins) par un éditeur de
dessins courant. Ce format doit être pouvoir être accepté directement ou être convertible facilement dans
des formats utilisables directement par des logiciels de formatage de texte. Une copie publiée dans un
quelconque format numérique ouvert mais dont la structure a été conçue dans le but exprès de prévenir
les modifications ultérieures du Document ou dans le but d’en décourager les lecteurs n’est pas
considérée comme une Copie Transparente. Une copie qui n’est pas « Transparente » est considérée, par
opposition, comme « Opaque ».
Le format de fichier texte codé en ASCII générique et n’utilisant pas de balises, les formats de fichiers
Texinfo ou LaTeX, les formats de fichiers SGML ou XML utilisant une DTD publiquement accessible,
ainsi que les formats de fichiers HTML simple et standard, écrits de telle sorte qu’ils sont modifiables
sans outil spécifique, sont des exemples de formats acceptables pour la réalisation de Copies
Transparentes. Les formats suivants sont opaques : PostScript, PDF, formats de fichiers propriétaires qui
ne peuvent être visualisés ou édités que par des traitements de textes propriétaires, SGML et XML
utilisant des DTD et/ou des outils de formatage qui ne sont pas disponibles publiquement, et du code
HTML généré par une machine à l’aide d’un traitement de texte quelconque et dans le seul but de la
génération d’un format de sortie.
La « Page de titre » désigne, pour les ouvrages imprimés, la page de titre elle-même, ainsi que les pages
supplémentaires nécessaires pour fournir clairement les informations dont cette Licence impose la
présence sur la page de titre. Pour les travaux n’ayant pas de Page de titre comme décrit ci-dessus, la
« Page de titre » désigne le texte qui s’apparente le plus au titre du document et situé avant le texte
principal.
2 - COPIES CONFORMES
Vous pouvez copier et distribuer le Document sur tout type de support, commercialement ou non, à
condition que cette Licence, la notice de copyright et la notice de la Licence indiquant que cette Licence
540
Annexe E. Licence de documentation libre GNU
s’applique à ce Document soient reproduits dans toutes les copies, et que vous n’y ajoutiez aucune
condition restrictive supplémentaire. Vous ne pouvez pas utiliser un quelconque moyen technique visant
à empêcher ou à contrôler la lecture ou la reproduction ultérieure des copies que vous avez créées ou
distribuées. Toutefois, vous pouvez solliciter une rétribution en échange des copies. Si vous distribuez
une grande quantité de copies, référez-vous aux dispositions de la section 3.
Vous pouvez également prêter des copies, sous les mêmes conditions que celles précitées, et vous pouvez
afficher publiquement des copies de ce Document.
3 - COPIES EN NOMBRE
Si vous publiez des copies imprimées de ce Document à plus de 100 exemplaires, et que la Licence du
Document indique la présence de Textes de couverture, vous devez fournir une couverture pour chaque
copie, qui présente les Textes de couverture des première et dernière pages de couverture du Document.
Les première et dernière pages de couverture doivent également vous identifier clairement et sans
ambiguïté comme étant l’éditeur de ces copies. La première page de couverture doit comporter le titre du
Document en mots d’importance et de visibilité égale. Vous pouvez ajouter des informations
complémentaires sur les pages de couverture. Les copies du Document dont seule la couverture a été
modifiée peuvent être considérées comme des copies conformes, à condition que le titre du Document
soit préservé et que les conditions indiquées précédemment soient respectées.
Si les textes devant se trouver sur la couverture sont trop importants pour y tenir de manière claire, vous
pouvez ne placer que les premiers sur la première page et placer les suivants sur les pages consécutives.
Si vous publiez plus de 100 Copies opaques du Document, vous devez soit fournir une Copie
transparente pour chaque Copie opaque, soit préciser ou fournir avec chaque Copie opaque une adresse
réseau publiquement accessible d’une Copie transparente et complète du Document, sans aucun ajout ou
modification, et à laquelle tout le monde peut accéder en téléchargement anonyme et sans frais, selon des
protocoles réseau communs et standards. Si vous choisissez cette dernière option, vous devez prendre les
dispositions nécessaires, dans la limite du raisonnable, afin de garantir l’accès non restrictif à la Copie
transparente durant une année pleine après la diffusion publique de la dernière Copie opaque
(directement ou via vos revendeurs).
Nous recommandons, mais ce n’est pas obligatoire, que vous contactiez l’auteur du Document
suffisamment tôt avant toute publication d’un grand nombre de copies, afin de lui permettre de vous
donner une version à jour du Document.
4 - MODIFICATIONS
Vous pouvez copier et distribuer une Version modifiée du Document en respectant les conditions des
sections 2 et 3 précédentes, à condition de placer cette Version modifiée sous la présente Licence, dans
laquelle le terme « Document » doit être remplacé par les termes « Version modifiée », donnant ainsi
l’autorisation de redistribuer et de modifier cette Version modifiée à quiconque en possède une copie. De
plus, vous devez effectuer les actions suivantes dans la Version modifiée :
A. Utiliser sur la Page de titre (et sur la page de couverture éventuellement présente) un titre distinct de
celui du Document d’origine et de toutes ses versions antérieures (qui, si elles existent, doivent être
mentionnées dans la section « Historique » du Document). Vous pouvez utiliser le même titre si
l’éditeur d’origine vous en a donné expressément la permission.
B. Mentionner sur la Page de titre en tant qu’auteurs une ou plusieurs des personnes ou entités
responsables des modifications de la Version modifiée, avec au moins les cinq principaux auteurs du
Document (ou tous les auteurs si il y en a moins de cinq).
541
Annexe E. Licence de documentation libre GNU
C. Préciser sur la Page de titre le nom de l’éditeur de la Version modifiée, en tant qu’éditeur du
Document.
D. Préserver intégralement toutes les notices de copyright du Document.
E. Ajouter une notice de copyright adjacente aux autres notices pour vos propres modifications.
F. Inclure immédiatement après les notices de copyright une notice donnant à quiconque l’autorisation
d’utiliser la Version modifiée selon les termes de cette Licence, sous la forme présentée dans
l’annexe indiqué ci-dessous.
G. Préserver dans cette notice la liste complète des Sections inaltérables et les Textes de couverture
donnés avec la notice de la Licence du Document.
H. Inclure une copie non modifiée de cette Licence.
I. Préserver la section nommée « Historique » et son titre, et y ajouter une nouvelle entrée décrivant le
titre, l’année, les nouveaux auteurs et l’éditeur de la Version modifiée, tels que décrits sur la Page de
titre, ainsi qu’un descriptif des modifications apportées depuis la précédente version.
J. Conserver l’adresse réseau éventuellement indiquée dans le Document permettant à quiconque
d’accéder à une Copie transparente du Document, ainsi que les adresses réseau indiquées dans le
Document pour les versions précédentes sur lesquelles le Document se base. Ces liens peuvent être
placés dans la section « Historique ». Vous pouvez ne pas conserver les liens pour un travail datant
de plus de quatre ans avant la version courante, ou si l’éditeur d’origine vous en accorde la
permission.
K. Si une section « Dédicaces » ou une section « Remerciements » sont présentes, les informations et
les appréciations concernant les contributeurs et les personnes auxquelles s’adressent ces
remerciements doivent être conservées, ainsi que le titre de ces sections.
L. Conserver sans modification les Sections inaltérables du Document, ni dans leurs textes, ni dans
leurs titres. Les numéros de sections ne sont pas considérés comme faisant partie du texte des
sections.
M. Effacer toute section intitulée « Approbations ». Une telle section ne peut pas être incluse dans une
Version modifiée.
N. Ne pas renommer une section existante sous le titre « Approbations » ou sous un autre titre entrant
en conflit avec le titre d’une Section inaltérable.
542
Annexe E. Licence de documentation libre GNU
543
Annexe E. Licence de documentation libre GNU
auteurs des Sections inaltérables pour les remplacer par des traductions, mais vous pouvez inclure les
traductions des Sections inaltérables en plus des textes originaux. Vous pouvez inclure une traduction de
cette Licence à condition d’inclure également la version originale en anglais. En cas de contradiction
entre la traduction et la version originale en anglais, c’est cette dernière qui prévaut.
9 - RÉVOCATION
Vous ne pouvez pas copier, modifier, sous-licencier ou distribuer le Document autrement que selon les
termes de cette Licence. Toute autre acte de copie, modification, sous-licence ou distribution du
Document est sans objet et vous prive automatiquement des droits que cette Licence vous accorde. En
revanche, les personnes qui ont reçu de votre part des copies ou les droits sur le document sous couvert
de cette Licence ne voient pas leurs droits caducs tant qu’elles en respectent les principes.
10 - RÉVISIONS FUTURES DE CETTE LICENCE
La Free Software Foundation peut publier de temps en temps de nouvelles versions révisées de cette
Licence. Ces nouvelles versions seront semblables à la présente version dans l’esprit, mais pourront
différer sur des points de détail en fonction de nouvelles questions ou problèmes. Voyez
[Link] pour plus de détails.
Chaque version de cette Licence est dotée d’un numéro de version distinct. Si un Document spécifie un
numéro de version particulier de cette Licence, et porte la mention « ou toute autre version ultérieure »,
vous pouvez choisir de suivre les termes de la version spécifiée ou ceux de n’importe quelle version
ultérieure publiée par la Free Software Foundation. Si aucun numéro de version n’est spécifié, vous
pouvez choisir n’importe quelle version officielle publiée par la Free Sofware Foundation.
544