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.

Seuls les deux niveaux extrêmes sont normalisés dans Linux :

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 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.