Linux, c'est UNIX !
Note : Cette introduction est tirée en grande partie du Guide du
ROOTard, déjà cité.
Linux est une implantation des spécifications POSIX, avec des extensions
System V et Berkeley (ce qui signifie qu'il ressemble à UNIX, bien qu'il ne
provienne pas du tout des mêmes sources).
Bien que le système Linux soit relativement récent (la première
version distribuée par Linus Torvalds le fut en 1991, et la version
1.0 date de février 1994), Linux s'appuie en fait sur une longue
histoire qui débuta en 1969 dans les laboratoire de AT&T. C'est en
effet dans ces laboratoires que le premier système UNIX vu le jour,
sous la direction de Ken Thompson et Dennis Rithchie. C'est
d'ailleurs le même D. Rithchie qui est à l'origine du langage C,
langage dont les motivations ont été l'implémentation d'une version à
la fois proche du matériel et suffisamment portable. Pour
une histoire plus détaillée d'UNIX, cf.
.
Le but de ce cours est d'offrir de nombreux points d'entrée dans les
possibilités du système UNIX : les commandes usuelles, les scripts, etc.
afin que le lecteur se familiarise avec toutes les possibilités
d'automatisation de tâches que le système propose. Même pour ceux qui
connaissent déjà tous les concepts fondamentaux de ce volet, les
spécificités de Linux sont ici indiquées.
1 Diffusion du présent document
Ce document appartient à IDEALX.
Il est librement diffusable dans les termes de la Licence de
Documentation Libre GNU
(traduit de la GNU Free Documentation License).
2 Connaître l'arborescence de fichiers du système Linux
Sous UNIX, les périphériques sont traités comme des fichiers :
tous les périphériques sont accessibles via un fichier contenu dans le
répertoire /dev. L'aspect des fichiers depuis un programme est dans
une large mesure indépendante de
la structure physique des disques et autres périphériques de stockage
du système. Chaque partition d'un disque vient se greffer, via
la commande mount, à l'arborescence du système.
L'arborescence de Linux suit un modèle standardisé (FSSTND) : elle est
presque la même entre les différentes distributions. Bien entendu, tous les
répertoires ne sont pas décrits en grand détail : une installation minimale
de Linux comporte plusieurs dizaines de milliers de fichiers...
-
/etc
-
Contient les fichiers de configuration généraux de tous les programmes du
système.
-
/etc/rc.d
- Contient les commandes à
exécuter au démarrage du système.
- /bin
-
Contient des commandes nécessaires lors du démarrage du système. Ces
commandes pourront par la suite être utilisées par les utilisateurs.
- /sbin
- Contient des commandes nécessaires lors du
démarrage du système, mais en général inutiles pour les utilisateurs
(soit parce qu'ils n'ont pas les droits suffisants pour que ces programmes
fassent quoi que ce soit d'utile pour eux, soit parce que leur sortie ne
les intéresse normalement pas).
- /home
-
Est réservé à l'hébergement des comptes des utilisateurs (un sous-dossier
par personne). Il est ainsi facile de partager tous les comptes personnels
en réseau. L'administrateur root ne figure pas dans ce répertoire,
car en cas d'échec du réseau dans ce scénario il doit tout de même pouvoir
se loguer.
- /dev
-
Ce répertoire contient des fichiers spéciaux (de type caractère
ou bloc) permettant d'accéder aux périphériques. On ne peut pas toujours
les éditer avec un éditeur de texte ; mais un programme peut effectuer dessus
d'autres opérations que la lecture/écriture et cela a un effet sur le
matériel (ex : changer la fréquence d'échantillonnage sur la carte son,
accéder directement à la mémoire vidéo...). Ces fichiers sont munis de
droits, ce qui permet à l'administrateur de décider qui a accès à quels
périphériques.
- /proc
-
C'est un pseudo-répertoire : en réalité, son contenu n'existe pas
physiquement sur le disque, mais est créé dynamiquement par le
noyau lui-même. On y trouve nombre d'informations techniques
utiles, notamment sur les périphériques reconnus par le système (numéro de
ports et interruptions), des statistiques du
noyau, du réseau et des processus en cours d'exécution, etc.
- /boot
-
C'est le répertoire qui contient le noyau. Il est lu et copié en mémoire
au démarrage du système, et ensuite les fichiers du noyau ne servent plus.
Note : Pour des raisons de compatibilité avec le BIOS, les noyaux
doivent être physiquement inscrits sur le disque en-deçà du
1024ème cylindre. Une bonne façon de garantir cela est que
/boot soit une partition à part, entièrement sise dans les
cylindres 0 à 1023.
- /usr
-
Contient tous les programmes et fichiers de données qui ont pour
caractéristiques : de ne pas être nécessaires au démarrage de la machine (de
sorte qu'on peut installer /usr sur un serveur réseau, ce qui
facilite grandement l'administration), et de ne jamais être modifiés en
fonctionnement normal de l'ordinateur (de sorte que /usr peut
être partagé en lecture seule, pour la sécurité et les performances).
-
/usr/bin et /usr/sbin
-
Les différents programmes non graphiques, avec le même distinguo
que ci-dessus.
- /usr/bin
commandes utilisables par tous les utilisateurs, et non
nécessaires lors du démarrage du système;
- /usr/sbin
commandes réservées au super-utilisateur, et non nécessaires lors du démarrage du
système;
Contient les pages de manuel.
- /usr/doc
-
Contient de nombreuses documentations et sources
d'informations.
- /usr/share
-
Contient des fichiers de données dans un format portable (des textes,
des images, etc. mais pas de l'assembleur), qui pourraient être partagés en
réseau même entre des clients Linux qui n'ont pas tous le même type de
processeur (ce qui ferait gagner énormément de place sur un serveur servant
plusieurs types de client). La migration des fichiers de /usr/lib
vers /usr/share selon leur type est un processus lent, mais qui
arrive petit à petit dans les distributions.
- /usr/X11R6
-
Contient tous les fichiers du système X-Window (serveurs X,
programmes graphiques, bibliothèques, etc.)
- /usr/local
-
Lieu où sont stockés les fichiers spécifiques au système
installé (installation locale) : il contient une arborescence similaire
à celle de /usr. Lorsque l'on récupère et installe un
logiciel à partir des sources, il convient de l'installer dans
/usr/local parce que le domaine /usr est géré par RPM et
qu'il convient ne pas modifier les fichiers des programmes dans son dos.
- /var
-
Contient des données mises à jour par différents programmes
durant le fonctionnement du système. Autrement dit : cette partition doit
rester accessible en écriture, au contraire de /usr, mais elle peut
être également partagée en réseau.
- /var/lock
-
Fichiers de blocage, pour interdire par exemple deux utilisations
simultanées du modem par deux processus.
- /var/spool
-
Files d'attente de différents services (imprimantes, messagerie
électronique...) : par exemple,les courriers électroniques de
<utilisateur> sont déposés dans le fichier
/var/spool/mail/<utilisateur>.
Contient les fichiers de rapport constitué de messages datés émis par
les différents démons et le noyau. Ils sont classés par thème ; le fichier
/etcsyslog.conf permet de modifier leur répartition.
- /tmp
- Contient les données temporaires des différents
programmes (parfois, /tmp est un lien symbolique vers
/var/tmp).
3 Extensions GNU des commandes UNIX usuelles
La plupart des outils GNU ont des options supplémentaires par rapport aux
commandes UNIX habituelles.
Nous ne pouvons ici nous lancer dans une description détaillée des
innombrables commandes du shell. Le lecteur est renvoyé à
l'aide-mémoire et aux pages de manuel.
4 Le processus d'amorçage de Linux
Le programme init est le seul lancé au démarrage du système par
le noyau (il a le numéro de processus 1) :
4.1 Runlevel
Les niveaux d'exécution, au nombre de 7, indiquent au système de
quelle façon il doit s'initialiser, ou plus précisément dans quel état
de configuration il doit se trouver lors de son fonctionnement. On
peut passer d'un niveau à l'autre avec la commande init.
Le fichier /etc/initab contient les actions à lancer en fonction du
niveau de démarrage.
-
le niveau 1 est un mode mono-utilisateur : seul root peut
accéder à la console. Ce mode n'est normalement utilisé que pour des
opérations de maintenance sensibles, qui nécessitent un
fonctionnement minimal du système pour éviter les interférences dues
à d'autres utilisateurs. Pratiquement aucun script de démarrage
n'est exécuté;
- le niveau 2 est un mode multi-utilisateurs, sans support réseau.
On retrouve les six consoles texte virtuelles usuelles. Les scripts
spécifiques à la gestion du réseau ne sont pas exécutés;
- le niveau 3 est identique au niveau 2, mais avec le support
réseau.
- le niveau 4 est par défaut identique au niveau 3, mais vous
pouvez librement l'utiliser pour vos propres besoins, pour des
configurations personnalisées (exemple : mode d'économie d'énergie
sur un ordinateur portable).
- le niveau 5, enfin, est identique au niveau 3, mais provoque un
démarrage en mode graphique avec présentation de l'écran de login
X-Window.
Seuls les deux niveaux extrêmes sont normalisés dans Linux :
-
le niveau 0 (halt) est celui dans lequel doit passer le système
lorsqu'on désire arrêter la machine, afin de le faire
<<proprement>>, notamment en vérifiant que toutes les informations
qui doivent être écrites sur le disque, l'ont effectivement été;
- le niveau 6 (reboot) est identique au niveau 0, mais en plus il
provoque un redémarrage à chaud de l'ordinateur (c'est un équivalent
de la combinaison de touches Ctrl+Alt+Suppr).
4.2 Scripts de démarrage
La distribution RedHat se réfère au modèle système V, plutôt qu'au
modèle BSD pour les scripts de démarrages: pour chaque niveau, les
scripts qui vont lancer les services du système se trouvent dans le
répertoire /etc/rc.d/rcX.d où X est le niveau de démarrage.
Ces scripts permettent de lancer les
différents services délivrés par le système (services réseaux,
imprimante, cron, etc.). La plupart de ces scripts
peuvent être exécutés avec les arguments suivants: start, restart,
stop, status. Certains ont des arguments supplémentaires (reload,
probe, etc.), d'autres non.
En fait les /etc/rc.d/rcX.d répertoires ne contiennent que
des liens symboliques vers les vrais fichiers de scripts qui sont
stockés dans le répertoire /etc/rc.d/initd.d. Le nom des
liens respecte un certain format :
-
la première lettre doit être 'S' ou 'K', selon que le
script doit être lancé à l'entrée ou à la sortie du niveau
d'exécution ;
- suivent deux chiffres, qui sont utilisés pour déterminer un
certain ordre dans le lancement des scripts : inutile de lancer la
gestion du courrier électronique si le réseau n'est pas en place...
enfin, plusieurs caractères, qui sont en général le nom du fichier
dans le répertoire init.d.
La présence ou l'absence d'un lien particulier détermine si le script
est lancé ou non.
5 Les fichiers de configuration spécifiques de Linux
5.1 XF86Config
L'interface graphique standard sous UNIX est X-Window (ou encore X,
voire X11). X est très puissant et riche, permettant notamment
l'affichage distant sur le réseau. Linux utilise l'implémentation
XFree86. Les paramètres de XFree86 se trouvent dans le fichier
XF86Config, généralement placé dans le répertoire
/etc/X11. Ce fichier est généré par l'application graphique
XF86Setup, mais peut également s'éditer manuellement à l'aide
d'un éditeur de texte. Le fichier est segmenté en plusieurs sections
(par exemple Section "Screen" [...] EndSection pour la section
relative à la résolution d'écran): une pour le clavier, pour le
moniteur, pour la résolution de l'écran, les fichiers (chemin des polices
de caractères), et les périphériques de pointage (souris, etc.).
Par exemple, pour configurer la résolution de l'affichage, il faut
rajouter la sous-section suivante dans la section Screen: ou Depth est
le nombre de bits par pixels, et Modes est la résolution (qui doit
être définie préalablement dans la section Monitor)
Subsection "Display"
Depth 32
Modes "1280x1024"
EndSubsection
5.2 conf.modules
Ce fichier contient les options des différents modules que le noyau sera
amené à charger en mémoire au cours de son exécution, et permet d'associer,
via un alias un périphérique à un pilote donné. Par exemple: alias eth0 ne,
pour associer le module ne.o (pilote ne2000) à la première interface Ethernet.
5.3 isapnp.conf
Ce fichier contient la configuration de isapnp, programme destiné a
gérer les périphériques ISA Plug-and-Play (les périphériques PCI PNP
sont directement gérés par le noyau).
6 Outils d'administration propres à Linux
6.1 fdisk
Pour manipuler les partitions des disques durs, Linux propose un outil
interactif proche de celui que l'on trouver sous Windows/MS-DOS,
fdisk. Pour le démarrer, il suffit de taper fdisk
avec en argument le device associé au disque que l'on veut éditer. Les
devices associés aux disques IDE sont /dev/hda,
/dev/hdb, etc. alors que pour les disque SCSI,
/dev/sda, /dev/sdb, etc.
fdisk permet de détruire, créer, éditer et détruire des partitions
(primaires ou étendues) déjà existantes. Cependant, il ne permet pas de
redimensionner une partition (il faut pour cela détruite une ancienne
partition et en créer une nouvelle). Seules 4 partitions primaires
sont possibles, mais les partition étendues permettent de définir
autant de partitions que nécessaire. La seule restriction à connaître
est que la partition contenant le noyau doit être dans une plage de
cylindres inférieure à 1024 (à cause du BIOS des PC et de LILO, voir commande suivante)
Une fois lancé, p permet d'afficher l'état des partitions, m permet
d'obtenir les commandes principales. Pour créer une nouvelle
partition, il suffit de taper n. Pour installer un système Linux,
deux types de systèmes de fichier sont utilisés : ext2fs (numéro 83, pour extended
file système version 2) et Linux Swap (numéro 82). ext2fs est le
système de fichier standard de Linux et Linux Swap permet de définir
des espaces disque comme mémoire virtuelle. Cette mémoire s'ajoutera à
la mémoire RAM réelle (mais sera évidement beaucoup plus lente).
Linux peux s'installer sur un système de fichier déjà existant (par
exemple FAT), mais, pour bénéficier de performances optimales, il est
fortement recommandé d'utiliser une (voir plusieurs) partitions
spécifiques pour Linux (ext2fs).
6.2 LILO
LILO est un acronyme pour LInux LOader; c'est le programme (spécifique à l'architecture i386) qui va se
charger de choisir quel système lancer au démarrage et, dans le cas ou
le système est Linux, de choisir quel noyau charger en mémoire.
LILO est en fait un petit programme lancé depuis le secteur d'amorce de
la partition bootable ou depuis le MBR
(Master Boot Record) du disque de démarrage. Une petite astuce à ne
pas oublier est que Windows a la fâcheuse tendance de formater le MBR
après chaque installation, effaçant le pointeur vers LILO. Par
conséquent, il est recommandé d'avoir en réserve une disquette de boot
qui permet de relancer Linux et, de là, de remettre LILO à sa place (en
tapant simplement /sbin/lilo).
La configuration de LILO se change en éditant le fichier
/etc/lilo.conf. On peut y définir les différents systèmes et noyau sur
lesquels amorcer (booter) le système. Chaque système/noyau sera
accessible au démarrage par un label configurable dans ce fichier. Par
exemple, pour lancer le noyau bzImage-2.2.15 situé dans /boot avec
comme label linux, il suffit de rajouter dans le lilo.conf les lignes
suivantes.
image=/boot/bzImage-2.2.15
label=linux
read-only
root=/dev/hda1
Après avoir modifié le fichier lilo.conf, il ne faut surtout pas
oublier de lancer la commande lilo (sans arguments et en tant que super
utilisateur). Sans cela, les modification ne seront pas prises en
compte par LILO au prochain redémarrage, ce qui peut avoir des
conséquences désastreuses (par exemple si l'ancien noyau est détruit).
Cette commande génère l'exécutable qui sera appellé par le BIOS du PC
depuis le secteur de boot. Cet exécutable est sauvegardé dans le
répertoire /boot, qui doit se trouver en deça des 1024
cylindres pour pouvoir être accédé directement par le BIOS. Cependant,
les BIOS des PC récents ne présentent plus cette limitation, et les
dernières versions de LILO en tiennent compte. LILO permet aussi de
passer des paramètres au noyau Linux (via l'instruction append). Un des paramètres
les plus fréquemment utilise est mem, qui permet d'indiquer au noyau la
quantité de RAM disponible sur le système (en effet, le noyau ne détecte
pas systématiquement toute la mémoire si celle si excède 64Mo). Par
exemple, si le système dispose de 256 Mo de RAM, il faut rajouter dans
le lilo.conf la ligne suivante: append="mem=256M"
6.3 ldconfig
Met à jour le cache (un index qui permet de répertorier et localiser les
bibliothèques dynamiques disponibles sur le système) et créée les liens
symboliques adéquats vers les bibliothèques dynamiques nécessaires aux
programmes qui les utilisent. De sorte que si un exécutable requiert une
version générique d'une bilbiothèque dynamique, c'est la version spécifique
disponible sur le système qui sera chargée via un lien symbolique. Par exemple
si un programme a besoin de la bibliothèque liblib.so.1, c'est en réalité
liblib.so.1.0.14 qui sera chargé, de manière transparente. ldconfig
créée automatiquement ces liens. Lorsqu'une nouvelle bibliothèque est
installée manuellement, il ne faut pas oublier de relancer ldconfig.
Pour afficher les bibliothèques partagées disponibles dans le cache, il suffit
de lancer ldconfig avec l'option -p
6.4 top
top affiche la liste des processus en cours d'exécution
sur le système. Par défaut, il rafraîchit son affichage toutes les 5
secondes. On peut spécifier d'autre intervalles en tapant la touche s
et en indiquant ensuite un nombre de secondes. Une autre possibilité
est de n'afficher que les processus appartenant à un certain
utilisateur (touche u, suivie du username). Pour quitter, il suffit de
taper la touche q.
6.5 pidof
pidof est une commande permettant de retrouver l'id d'un processus a
partir de son nom... et à condition que le programme ait été compilé en respectant
les convention de la distribution installée. Pour certaines applications
compilées et installées à partir des sources, il peut arriver que
la commande pidof échoue. En ce cas, ps auxc | grep process
donnera une réponse plus fiable.
6.6 killall
Permet de lancer un signal à un processus en lui
donnant son nom (contrairement à kill qui a besoin du pid, le
processus id). De plus, comme son nom l'indique, cette commande redoutablement
puissante envoie le signal à l'ensemble des processus portant le même
nom. Mieux vaut, par conséquent, ne pas l'invoquer en tant que
super-utilisateur pour tuer un shell récalcitrant... sous peine de s'attirer
les foudres des autres utilisateurs.
6.7 free
Indique l'état de la mémoire.
total used free shared buffers cached
Mem: 258052 243812 14240 66892 50520 58040
-/+ buffers/cache: 135252 122800
Swap: 136512 3336 133176
La première ligne correspond à l'état de la mémoire RAM (RAM totale,
utilisée, disponible, partagée, buffer et cache), la seconde indique la
mémoire libre sans tenir compte des buffers et du cache. La dernière
indique la taille et l'utilisation de la mémoire swap.
6.8 pstree
Affiche tous les processus (un peu comme comme ps aux), mais en
indiquant la structure arborescente des processus (chaque processus est
en effet lancé par un processus père. Cette commande permet ainsi de constater
que tous les processus systèmes sont en fait lancés par le processus initial
init).
7 Compilation de programmes Linux
De plus en plus de programmes distribués sous forme de code source
utilisent l'outil GNU autoconf afin de faciliter leur compilation
sur un système donné. L'utilisateur est ainsi dispensé d'une souvent
fastidieuse édition des fichiers Makefile contenant les
instructions de compilation proprement dites. De sorte que
la compilation et l'installation d'un programme à partir de son code
source se résume souvent à taper successivement :
./configure
make
make install
Le script configure s'efforce de conjecturer automatiquement
l'ensemble des paramètres système nécessaires à la compilation: il tente
notamment de détecter les différentes bibliothèques installées,
l'emplacement des fichiers d'en-tête, leurs numéro de version ainsi que
celui des programmes (afin, par exemple, de prendre en compte les particularités du compilateur),
l'architecture matérielle (type du processeur), etc. afin
de générer les Makefiles adéquats. Il permet en outre de spécifier
certaines options ou emplacement de bibliothèques si celles sont situées
dans des endroits exotiques, et n'ont pu être détectées automatiquement.
La liste des options disponibles est affichée en exécutant simplement
./configure --help. Une des options les plus utiles est
l'option --prefix= qui permet de changer l'endroit où
installer le logiciel (fichiers exécutables, pages manuel, fichiers de
configuration, etc.). En effet, la plupart du temps, les logiciels
vont se loger dans /usr/local par défaut. Or ce
répertoire n'est en général accessible en écriture qu'au super
utilisateur. Cette option permet donc à un utilisateur ne possédant pas
les droits de root d'installer dans son répertoire local (homedir) les
logiciels qu'il souhaite compiler lui même.
Ce document a été traduit de LATEX par
HEVEA.