SME-101.00 Linux de base

From SME Server
Revision as of 21:25, 5 November 2018 by Michelandre (talk | contribs) (GA-001 2018-11-05_15h20 // Mise à jour et diverses petites corrections)
Jump to navigation Jump to search


Description générale

Pour connaître les rudiments de Linux ou rafraîchir vos connaissances, vous pouvez consulter ce document: SME-101.00 Linux de base. Il donne un aperçu des fonctionnalités de base de Linux qui sont indispensables à toute personne qui désire se familiariser à l'environnement Linux et surtout comprendre et maîtriser les concepts de base.

Vous serez en mesure de recourir à la documentation en ligne (man), manipuler l'arborescence des fichiers, comprendre l'organisation générale du système, gérer les droits d'accès, découvrir les variables d’environnement, les fichiers particuliers, la quincaillerie réseau, utiliser les principales commandes bash, etc.

Un chapitre particulier, qu'il n'est pas nécessaire de maîtriser mais simplement connaître, explique les principes de base de la communication TCP/IP.

Enfin, une introduction à l'éditeur vi est donnée à la fin du document.

Référence: Ce cahier est une adaptation de la page http://www.linux-france.org/article/kafkafr/.

Autre référence: free-electrons.com/doc/legacy/command-line/unix_linux_introduction_fr.pdf.


But final du cours SME-101

Après avoir suivi le cours SME-101, l'Étudiant possédera un site de Commerce en ligne fiable et hautement sécuritaire. De plus, il pourra utiliser un clone de son site, sur un Serveur SME virtuel sur sa station de travail, pour tester de nouvelles extensions et applications sans compromettre la sécurité ou l'intégrité de son site en ligne.



Cours SME-101

Le cours SME-101, se voulant une base solide pour la création d'un site de Commerce en ligne, comprend plusieurs cahiers:

Tous les logiciels nécessaires sont du domaine public ou LIBRE sous licence GPL; ils ne coûtent pas un sous. Le seul achat nécessaire est l'obtention d'un nom de domaine FQDN au prix initial de $15 CAD et son renouvellement annuel d'environ $30 CAD.


Particularités de ce document

Notes au lecteur

  • Les captures d’écrans ne sont que des références.
  • Les informations écrites ont préséance sur celles retrouvées dans les captures d’écrans. Se référer aux différents tableaux lorsque ceux-ci sont présents.

Conventions

  • Toutes les commandes à entrer à la console du Serveur SME commencent habituellement avec l'invite # pour l'usager root ou $ pour un usager sans privilège particulier.
  • L'invite mysql> de la console MySQL est toujours présente.
  • La sortie de la commande est séparée de celle-ci par une ligne vide sans couleur de fond.
  • L'invite de retour n'est jamais présent pour la plupart des commandes.
  • Les affichages à surveiller sont en rouge, bleu, orange ou magenta.
# ping 192.168.1.149
192.168.1.149 is alive


Les liens de référence Internet sont en bleu de même que ceux intra-document mais, ces derniers débute par un " # ".

   Manipulation, truc ou ruse pour se tirer d’embarras.

   Une recommandation ou astuce.

   Une note.

   Une étape, note ou procédure à surveiller.

   Danger pour la sécurité du système.

   Indique que la commande est sur une seule ligne. Pour ce document en PDF, il faudra copier la commande entière dans un éditeur de texte ASCII tel que NotePad++ et la mettre sur une seule ligne avant de la copier à la console.

Une chaîne de caractères en magenta indique qu’il faut remplacer cette chaîne par vos propres paramètres.

Commande à exécuter si ce n'est déjà fait.
Commande indiquée à titre d'information seulement.


Linux

Aperçu général

Nous présentons ici ce qu'est Linux, d'où il vient et comment il est distribué actuellement. Pour ceux ayant déjà une connaissance d'autres systèmes d'exploitation, nous proposons également une comparaison avec quelques-uns d'entre eux, sans doute les plus connus.

Un peu d'histoire... UNIX!

Caractéristiques principales

Linux est un système multitâche. Cela signifie que plusieurs programmes peuvent s'exécuter simultanément; par exemple, vous pourriez rédiger une lettre sur un traitement de textes, tout en attendant qu'un programme d'images de synthèse termine son calcul, et ce en même temps qu'un CD diffuse une musique plus ou moins mélodieuse. Il n'y a pas de limite théorique au nombre d'applications qui peuvent ainsi fonctionner simultanément: les facteurs limitants sont en premier lieu la quantité de mémoire dont dispose l'ordinateur, et en second lieu, la puissance du processeur. Pour fixer les idées, il est très courant d'avoir une cinquantaine de programmes (on dit aussi "processus") s'exécutant sous Linux dès qu'une couche graphique est démarrée.

Ensuite, Linux est multi-utilisateur. C'est-à-dire que tout est prévu pour que plusieurs personnes utilisent le système, éventuellement simultanément (si le "câblage" le permet). En pratique, chaque personne utilisant le système dispose d'un compte, qui peut être vu comme une certaine zone qui lui est allouée, accessible par un nom et un mot de passe. Elle ne peut normalement pas en sortir, et encore moins aller modifier (volontairement ou non) les zones allouées à d'autres personnes. Il existe un mécanisme de droits permettant d'assurer ce contrôle permanent qui peut paraître contraignant mais évite bien des erreurs.

Linux est de plus fortement "orienté réseaux": il offre tous les outils et tous les mécanismes pour la mise en place de réseaux locaux, l'intégration dans des réseaux existants, la connexion à l'Internet, que ce soit comme source, traiteur ou collectionneur d'informations. Héritée de son inspirateur Unix, cette caractéristique fait de Linux l'un des systèmes les plus ouverts qui soit.

Enfin, et c'est probablement ce qui fait sa plus grande force, Linux est LIBRE (Open Source): chacun peut examiner le code en langage C du système, le modifier selon ses besoins, proposer des ajouts ou des améliorations... Aujourd'hui, plusieurs milliers de programmeurs, communicant par l'Internet, participent au développement de Linux. Dès qu'une nouvelle version apparaît, des milliers d'utilisateurs l'installent, la testent, signalent les erreurs. Une entreprise ne peut qu'approcher de la force colossale que représente cette masse.

Ajoutons que s'il fut initialement développé pour les ordinateurs de types PC, Linux existe également sur de nombreuses autres plateformes, à base de processeurs PowerPC, Alpha, 68K, et d'autres. À l'heure où nous écrivons ces lignes, il existe même un projet de portage pour le PalmPilot de 3Com!


Les distributions

Si l'on veut être rigoureux, le terme "Linux" en lui-même ne désigne que le coeur du système (appelé le noyau, ou plus communément le kernel), cette zone un peu obscure qui permet d'utiliser le matériel et de communiquer avec le reste du monde. Mais par lui-même, Linux serait bien incapable d'enregistrer le moindre texte tapé au clavier!

La méthode usuelle pour obtenir Linux est d'acquérir l'une des nombreuses distributions qui existent. Une distribution est un assemblage, autour d'un noyau Linux, d'un ensemble plus ou moins vaste de programmes utilitaires permettant d'utiliser toute la puissance de Linux. En général, ces distributions sont gratuites, et se présentent soit sous forme de CD-ROM, soit de disquettes (pour les petites...), et sont même parfois directement téléchargeables depuis l'Internet (ce qui peut prendre beaucoup de temps!)

Il est possible d'obtenir une distribution, soit en la commandant directement auprès du fournisseur (en général par l'Internet), soit en l'achetant en magasin spécialisé. Ce que l'on paie alors correspond le plus souvent à l'emballage et à la documentation imprimée qui accompagnent le CD-ROM... Toutefois, il existe des distributions payantes, qui ne sont alors pas librement re-distribuables. Enfin, il n'est pas rare de trouver une distribution pour accompagner un ouvrage traitant de Linux, ou une simple revue disponible en bureau de presse...

Citons quelques-unes des distributions Linux les plus célèbres: RedHat, CentOS, SME, SuSE, etc.


Système de fichiers

Le système de fichiers d'un système d'exploitation est un ensemble de principes et de règles selon lesquels les fichiers sont organisés et manipulés. Chaque système d'exploitation possède son système de fichier privilégié, même s'il peut en utiliser d'autres. Le tableau ci-dessous donne quelques noms.

Tableau 1: Systèmes de fichiers.
Système Système de fichier
MS-DOS FAT, aussi appelé FAT-16 (File Allocation Table 16bits)
Windows 95/98 FAT32, extension du système FAT-16 (File Allocation Table 32bits)
Windows NT/7/8.x NTFS (New Technology File System)
OS/2 HPFS (High Performance File System)
Linux Ext2fs (Second Extended File System), Ext3, Ext4


Qu'est-ce qu'un fichier?

Fondamentalement, un fichier est une suite de caractères (on dit "octets") qui constitue un ensemble cohérent (en principe) d'informations. Le fichier est l'élément fondamental d'un système d'exploitation: les instructions nécessaires au fonctionnement de ce système, sa configuration, comment il doit réagir à telle situation, toutes ces informations sont stockées dans des fichiers.

Plus généralement, les fichiers sont utilisés pour stocker les travaux des utilisateurs. Pour ces derniers, les fichiers sont identifiables par un nom, qui doit respecter certaines contraintes (voir plus bas). Cette définition, très générale, inclut également les fichiers qui rassemblent des informations sous forme structurée selon les principes des bases de données, par exemple le fichier des assurés sociaux de la Sécurité Sociale: c'est là une forme plus restrictive de la notion de fichier.

Enfin, les fichiers sont eux-mêmes stockés physiquement sur différents supports, comme les disquettes, les disques durs, les CD-ROMs...


Tout est fichier!

Il en est ainsi sous Unix, et donc sous Linux: tous les éléments du système sont manipulés par des fichiers! Cela peut paraître un peu déroutant de penser que le clavier sur lequel on frappe désespérément est considéré par le système comme un fichier, spécial certes, mais fichier tout de même. Toutefois cette uniformisation permet de simplifier grandement la manipulation du système en général, et sa programmation en particulier.

Sous Linux, les noms de fichiers sont limités à 255 caractères et ne doivent en principe comporter que des caractères alphanumériques (c'est-à-dire des lettres et des chiffres), ainsi que les symboles . - _ ~ + %. Il est toutefois possible d'insérer un espace ou d'autres caractères "bizarres" dans un nom de fichier, mais ceci est très fortement déconseillé.

Attention, le système fait la différence entre les majuscules et les minuscules! Ainsi, dans un même répertoire on peut avoir les deux fichiers lettre.txt et Lettre.txt. Nous ne saurions trop vous déconseiller d'abuser de ce genre de possibilités.

Une petite particularité: les fichiers (ou répertoires) dont le nom commence par un point ('.') sont des fichiers cachés, c'est-à-dire qu'ils ne sont pas listés normalement par la commande ls.

Vous aurez sans doute remarqué que nous utilisons une forme de caractère particulière pour les noms de fichiers, ceci afin de faciliter la lecture: il en sera ainsi tout au long de ce chapitre.


Les répertoires

Les répertoires sont des fichiers un peu particuliers, qui "contiennent" d'autres fichiers et d'autres répertoires.

Le terme de "contenir" n'est pas tout à fait approprié, ce n'est qu'une image. Plus précisément, un répertoire est un fichier contenant des références et des descriptions pour d'autres fichiers (qui peuvent être des répertoires...). Ce terme est toutefois celui employé couramment.

On obtient ainsi une structure arborescente, telle que celle visible sur la Figure 1. L'utilisation de répertoires est vivement conseillée pour organiser ses informations.

Il existe sous Linux (et Unix) un répertoire "ancêtre" de tous les autres, qui contient tous les autres (directement ou suite à des intermédiaires): le répertoire root, que l'on note simplement '/' (ce symbole se lit barre oblique ou slash).

Prenons une analogie, pour bien faire saisir cette notion de répertoire. Considérez votre système comme une bibliothèque: la bibliothèque dans son ensemble peut être assimilée au répertoire racine. Mais généralement, une bibliothèque est subdivisée en sections: la section "histoire", la section "géographie", la section "roman"... ce sont là les répertoires situés dans la racine. Entrons dans la section "roman". On y trouve d'autres divisions, les romans "policiers", les romans "picaresques", les romans "à l'eau de rose"... ce sont des sous-répertoires du répertoire "roman". Mais peut-être y a-t-il des romans inclassables, qui n'entrent dans aucune des divisions prévues: ils seront simplement entassés à l'entrée de la section "roman", directement accessibles, comme les fichiers présents dans un répertoire. Au sein des romans policiers, on peut trouver encore d'autres catégories selon la langue, l'auteur, etc. pour parvenir enfin jusqu'à une étagère ou un rayon, qui ne soit pas subdivisé: les rayons sont remplis de livres, qui sont les fichiers, car comme les fichiers ils ont un nom (le titre) et un propriétaire (l'auteur).

Chaque répertoire contient deux répertoires particuliers:

  • Pour désigner le répertoire lui-même.
.


  • Pour désigner le répertoire de niveau juste supérieur.
..


Ainsi, sur la Figure 1, le .. du répertoire rc.d désigne le répertoire etc.


Une notion importante sous Linux est celle de répertoire courant. On peut considérer une arborescence comme un ensemble de villes reliées par des routes; le répertoire courant désigne alors la ville où l'on se trouve. Pour reprendre l'analogie de la bibliothèque, le répertoire courant est la section ou sous-section dans laquelle on est en train de déambuler nonchalamment.

Pour définir complètement un fichier, il est nécessaire de connaître la succession de répertoires qu'il faut parcourir pour le trouver: c'est le chemin du fichier.

Si ce chemin commence par le symbole '/', il est dit absolu: il indique la succession de répertoires depuis la racine pour obtenir le fichier. Par exemple, le texte /etc/passwd est le chemin pour le fichier passwd qui se trouve dans le répertoire etc. Par abus de langage, on appelle également chemin absolu le texte /usr/local/man, qui ne désigne pas un fichier particulier, car comme on le voit sur la Figure 1, man est un répertoire dans /usr/local. Mais rappelons que les répertoires ne sont que des fichiers particuliers...

Dans le cas contraire, le chemin est dit relatif: il prend comme point de départ le répertoire courant. Ainsi, si le répertoire courant est /usr/local, le texte man/man1 équivaut au chemin absolu /usr/local/man/man1. En utilisant le .. évoqué plus haut, en partant du même point de départ, le texte ../bin équivaut au chemin absolu /usr/bin. On parle également d'indirection, lorsque le chemin commence par un ...

Ces principes et notions peuvent paraître déroutantes dans un premier temps, mais un peu de pratique les font devenir une seconde nature.


Hiérarchie standard

Il existe une certaine normalisation dans l'architecture des répertoires sous Linux (comme sous Unix, d'ailleurs). La Figure 1 présente une organisation standard. Il peut toutefois exister des variations d'une distribution à l'autre, mais dans l'ensemble c'est assez bien respecté.

Les flèches en pointillés indiquent qu'il est fréquent de trouver d'autres répertoires, mais sans qu'il existe véritablement de norme.

Figure 1: Hiérarchie standard des répertoires.


Quelques précisions concernant la Figure 1

  • /etc → Contient les fichiers de configuration généraux, les commandes à exécuter au démarrage du système, et même le mode de 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 quelque sorte réservées à l'administrateur du système, ou super-utilisateur.
  • /home → Est réservé à l'hébergement des comptes des utilisateurs.
  • /dev → Ce répertoire contient tous les fichiers spéciaux utilisés pour accéder au matériel, qu'il s'agisse du clavier, du disque dur, de la carte son...
  • /proc → Voici un pseudo-répertoire: en réalité, son contenu n'existe pas physiquement sur le disque, mais est manipulé directement par le système lui-même. On y trouve nombre d'informations techniques utiles.
  • /usr → Répertoire à usages multiples, dont les principaux sont:
    - /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.
    - /usr/man → Contient les pages de manuel.
    - /usr/doc → Contient de nombreuses documentations et sources d'informations.
    - /usr/X11R6 → Contient (normalement) tous les fichiers se rapportant à la couche graphique X-Window (non utilisée avec SME).
    - /usr/local → Lieu où sont stockés les fichiers spécifiques au système installé.
  • /var → Contient des données mises à jour par différents programmes durant le fonctionnement du système.
    - /var/lock → Fichiers de blocage, pour interdire par exemple deux utilisations simultanées du modem.
    - /var/spool → Répertoires utilisés pour l'organisation du travail des imprimantes, de la messagerie électronique, etc.
    - /var/log → Contient les fichiers journaux (logs) provenant de différents points du système.


Quelques fichiers sensibles

Ces fichiers sensibles sont des fichiers particulièrement importants, sur lesquels repose une grande partie de la stabilité du système, voire de son simple fonctionnement. Il est donc vivement recommandé de ne pas modifier, encore moins d'effacer, ces fichiers, sans un luxe de précautions et sans savoir très précisément ce que l'on fait.

  • /etc/passwd → Le fichier des utilisateurs et des mots de passe associés. Supprimez ce fichier, et il vous sera impossible d'utiliser votre système!
  • /etc/inittab → Précise le mode de démarrage du système et les actions associées. La suppression ou une altération malheureuse de ce fichier peut rendre le système impossible à démarrer.
  • /etc/fstab → Liste des partitions utilisées par le système et selon quelle méthode il les utilise. À ne pas toucher sans savoir! Vous pourriez rendre votre système très instable.
  • XF86Config → Peut se situer en différents endroits (mais souvent sous /etc/X11) selon la distribution employée. Contient la configuration de la couche graphique. Attention, les informations qu'il contient sont spécifiques au matériel utilisé: une modification hasardeuse peut rendre la couche graphique non fonctionnelle, voire endommager le matériel, notamment l'écran (non utilisée avec SME).
  • vmlinuz... → Peut-être le plus important de tous. Se situe généralement, soit sous la racine (/), soit sous /boot. En fait, il s'agit du système lui-même! C'est le coeur des fonctions internes qui réalisent le fonctionnement de tout le système.

Ne sont évoqués ici que les fichiers les plus importants. Il existe naturellement un grand nombre d'autres fichiers, qu'il convient de traiter avec douceur, même si les effets d'une erreur sont moins catastrophiques.


Accéder au système et le quitter proprement

Procédure d'accès au système

Sauf circonstance exceptionnelle, l'accès à un système Linux se fait par une procédure d'identification, en fournissant un mot de passe: Linux est en effet protégé, dans le sens où seules les personnes autorisées peuvent l'utiliser. Celles-ci sont appelées les utilisateurs du système. L'ensemble de cette procédure (nom et mot de passe) est appelée communément procédure de login, ou simplement login. Bien que cela ne soit pas très français, on dit aussi d'un utilisateur qu'il se "logue" sur le système.

Pour l'instant, bornons-nous à décrire brièvement la connexion au système. Lorsque vous démarrez Linux, après un défilement plus ou moins long et ésotérique d'informations diverses, une ligne avec un curseur attend une entrée de votre part, par exemple:

login as: 


Le terme login fait référence à l'identification attendue: à cet endroit, vous devez taper un nom d'utilisateur, validé par la touche [Entrée]. Pour un système qui vient d'être installé, ce nom est généralement root.

login as: root


Puis apparaît la ligne:

root@192.168.1.156's password:


Le premier mot est le nom utilisé pour se loguer suivi du caractère "@" et le nom du domaine du serveur ou son adresse IP. Enfin le mot password:.

A cet endroit vous donnez le mot de passe correspondant à l'utilisateur indiqué précédemment. Il est normal de ne rien voir s'afficher à l'écran: c'est pour éviter que quelqu'un ne lise votre mot de passe par-dessus votre épaule. Validez par [Entrée], et vous pouvez alors commencer à utiliser le système.


Notion de console

Considérez un ordinateur sur lequel tourne, par exemple, Linux. Ce que l'on appelle la console, c'est l'ensemble écran-clavier-souris, directement branchés sur l'ordinateur en question. La console se distingue du terminal (constitué des mêmes éléments) en ceci que ce dernier accède à l'ordinateur par l'intermédiaire d'un réseau.

Physiquement, il ne peut y avoir qu'une seule console pour un ordinateur donné (sauf de très rares exceptions). Linux, toutefois, offre la possibilité de "faire comme si" l'ordinateur disposait de plusieurs consoles: ces consoles sont alors dites virtuelles, car à un instant donné, seule l'une d'entre elles correspond à une réalité physique. Dans la littérature que vous pouvez rencontrer, il n'est pas rare de voir désigner les consoles par le terme "TTY" (qui vient du mot "teletype").

En mode texte, ces consoles sont habituellement au nombre de 6. Ce nombre peut varier (7 pour SME), être adapté à vos besoins spécifiques, selon le contenu du fichier /etc/inittab.

Le passage d'une console virtuelle à l'autre peut se faire à n'importe quel moment durant le fonctionnement du système: il suffit, au clavier, de presser simultanément la touche [Alt] et l'une des touches de fonction [Fn], où n est le numéro de la console virtuelle que vous souhaitez obtenir. Au démarrage, vous êtes sous la console 1.

   Ce mécanisme peut vous paraître un gadget, mais son utilité vous apparaîtra rapidement à l'usage. Une utilisation typique est d'utiliser une console pour saisir et exécuter des commandes plus ou moins complexes, et une ou plusieurs autres consoles pour visualiser diverses documentations expliquant comment utiliser ces commandes.

Nous n'avons évoqué ici que le cas du mode texte. Un mécanisme analogue existe pour le mode graphique (non utilisé avec SME), plus sophistiqué (sans pour autant être plus complexe).


Quitter le système

Au stade actuel de son développement, Linux est suffisamment robuste pour fonctionner vingt-quatre heures sur vingt-quatre, pour une durée théoriquement infinie (sauf dysfonctionnement grave d'un programme, au point de déstabiliser le système). Mais pour une machine personnelle, il est plus courant de ne l'allumer que lorsqu'on en a besoin, et de l'éteindre aussitôt que l'on a terminé ce que l'on avait à faire.

Du fait de sa complexité, Linux ne doit pas être arrêté brutalement, sous peine de risquer d'endommager gravement le système dans son ensemble (ceci est également vrai pour d'autres systèmes, tels que Windows ou Unix): il est nécessaire, en quelque sorte, de prévenir Linux que l'on s'apprête à stopper son fonctionnement. Ceci afin de lui permettre de s'assurer que tout ce qui devait être sauvegardé l'a bien été, et plus généralement de prévenir les éventuels utilisateurs ou machines qui lui sont connectés.

L'arrêt immédiat du système se fait par l'une des deux commandes, équivalentes:

# shutdown -h now


# halt


Si l'on désire non seulement arrêter immédiatement le système, mais en plus redémarrer la machine juste après cet arrêt, l'une des deux commandes suivantes peut être utilisée:

# shutdown -r now


# reboot


Seul l'utilisateur root est normalement autorisé à utiliser ces commandes, mais certains environnements graphiques permettent à d'autres utilisateurs d'arrêter la machine.

Nous n'avons évoqué ici que les procédures d'arrêt les plus simples. Vous pouvez toutefois avoir besoin d'un comportement plus sophistiqué, selon vos besoins: consultez les pages man de shutdown pour plus de détails.


Le shell

Le shell est l'interpréteur de commandes. C'est un programme lancé juste après la procédure de login (voir plus haut), dont le rôle est d'interpréter et d'exécuter les diverses commandes que vous pouvez lui donner: c'est en quelque sorte lui qui va réaliser la communication entre vous et le système.

En fait, "shell" est un terme générique: il existe en effet plusieurs types de shell, chacun ayant sa propre syntaxe, son propre langage de programmation - car on peut écrire de véritables programmes pour le shell, pour des opérations trop sophistiquées pour la ligne de commande.

Le shell standard (aussi appelé shell de base) fait partie des éléments fondamentaux du système et doit donc toujours être présent. C'est une reproduction fidèle du shell standard qui accompagne tout système Unix: il est assez fortement normalisé, ce qui permet d'écrire des programmes relativement portables d'un système à l'autre. On le désigne simplement par "sh", du nom du programme correspondant.

Sous Linux, on utilise plutôt une extension de ce shell, le shell bash (pour "Bourne Again SHell", du nom du créateur du shell standard qui développa également cette extension). En fait, bash est considéré comme le shell standard sous Linux: il respecte complètement la norme standard, avec quelques fonctionnalités en plus.

De nombreux autres shells existent. Citons les plus répandus, le C-shell et le KornShell.

Le C-shell (ou csh), comme son nom l'indique, présente une syntaxe proche de celle du langage C. Sans doute plus complexe à utiliser que le shell standard, les possibilités offertes sont toutefois plus vastes. C'est le deuxième shell le plus utilisé sous Linux, derrière bash.

Le KornShell (ou ksh) peut être vu comme une mixture du C-Shell et du Bourne Shell. Sa richesse n'a d'égale que sa complexité, c'est pourquoi il est assez peu utilisé. Mais il est bon de le connaître, même vaguement, ne serait-ce que pour votre culture personnelle.

En pratique, seule une connaissance générale du Bourne Shell est indispensable: c'est en effet lui qui est utilisé pour exécuter la très grande majorité des scripts de configurations, si ce n'est tous. Mais gardez à l'esprit que nombre d'outils graphiques, très conviviaux, vous permettent de réaliser nombre d'opérations sans taper une seule ligne de programme.


Commandes de bases

Format général des commandes

Une fois le système démarré, il attend les ordres que vous voudrez bien lui donner, sous la forme de ce que l'on appelle un prompt. Celui-ci qui peut présenter différentes formes selon les cas, par exemple:

# █


Dans celui-ci, les informations affichées sont (de gauche à droite):

  • le nom de l'utilisateur;
  • le nom de la machine sur laquelle cet utilisateur est connecté;
  • le répertoire courant.

Le caractère █ symbolise le curseur. C'est à cet endroit que vous entrez les commandes au clavier, en terminant par la touche [Entrée] (en général, la plus grosse du clavier, sur la droite des lettres). Par entrer une commande, on entend frapper au clavier une suite de lettres ou autres caractères, de manière à constituer des mots que le système pourra interpréter. Dans l'exemple qui suit, le symbole "˽"représente un espace frappé au clavier (qui donc n'affiche rien à l'écran):

# gzip˽-9˽Rapport.lyx˽Lettre.txt_


Les espaces sont très importants lorsque vous donnez une commande. Par exemple, les deux mots "gzip˽-9" seront interprétés de manière totalement différente par le système sous la forme "gzip-9", sans espace. Ceci fait partie des règles à respecter pour donner correctement une commande au système; l'ensemble de ces règles est désigné sous le terme de syntaxe, qui a en fait le même sens que lorsqu'on l'emploie pour parler de la syntaxe de la langue française.

Par ailleurs, il n'est pas rare que les commandes produisent un résultat à l'écran, c'est-à-dire affichent diverses informations. Dans la suite, nous parlerons alors d'affichage résultant, pour désigner ce qu'une commande pourra ainsi afficher.

Normalement, le système exécute la commande (si celle-ci est correctement orthographiée) avant d'autoriser la saisie d'une nouvelle commande. Toutefois, Linux est multitâche: il est donc possible de lancer une commande en arrière-plan, et de récupérer immédiatement la main. La commande s'exécutera alors pendant que vous faites autre chose. Ceci est particulièrement intéressant pour les commandes de longue durée, dont on peut ignorer l'affichage résultant. On réalise l'exécution d'une commande en arrière-plan en la faisant suivre du symbole "et-commercial" '&'. Par exemple:

# ls -alR / > tous_fichiers &


Cette commande va donner une liste complète des fichiers du système, et stocker le résultat dans le fichier tous_fichiers. C'est généralement quelque chose d'assez long (un système Linux comporte souvent quelque dix mille ou vingt mille fichiers)... Des explications permettant de comprendre cette commande viennent ci-dessous.

Comme vous l'avez constaté, nous utilisons une forme de caractère différente lorsqu'il s'agit de commandes ou de nom de fichiers.


Options

La plupart des commandes acceptent des options (appelées aussi paramètres), qui permettent de préciser la manière dont elles doivent s'exécuter.

Sous Linux, la manière usuelle de spécifier des options est un tiret '-' précédé d'un espace et suivi d'une lettre, ou alors d'un double-tiret '--' suivi d'un mot. Il est généralement possible de combiner plusieurs options "mono-lettres" en une seule. Par exemple:

# ls˽-lisa˽-color=tty (équivaut à ls˽-l˽-i˽-s˽-a˽-color=tty)


# rpm˽-i˽libg++-2.7.2.8-9.i386.rpm˽-nodeps


Encore une fois, les espaces sont très importants. Dans la deuxième commande, le mot libg++-2.7.2.8-9.i386.rpm est un nom de fichier. Remarquez que ce nom comporte justement un tiret: l'absence d'espace avant permet au système de comprendre que ce qui vient après le tiret n'est pas une option, mais la suite du nom de fichier. Deux options très répandues sont:

-h


--help

Donner une (courte!) aide sur l'utilisation de la commande.


# commande -V


# commande -ver

Donne le numéro de version de la commande utilisée.


Redirections

Il est fréquent que les commandes produisent un résultat à l'écran ou parfois demandent des informations complémentaires à l'utilisateur. Il est possible de rediriger ces entrées/sorties à l'aide des symboles '>' et '<': par exemple, le résultat d'une commande est trop long pour être affiché dans l'écran, ou bien on désire en garder une trace. Une redirection de la sortie de cette commande permet de stocker ce qu'elle afficherait normalement dans un fichier.

La commande suivante liste tous les éléments (habituellement désignés sous le vocable de packages) d'un système installé à partir d'une distribution RedHat, CentOS, SME ou SuSE:

# rpm -qa


Si vous possédez une telle distribution, le nombre de packages dépasse en général largement la hauteur de l'écran... Et c'est assez malcommode à consulter. Ce problème peut être résolu en envoyant l'affichage dans un fichier, qu'il sera alors possible de consulter à loisir ou d'imprimer:

# rpm -qa > tous_les_packages.txt


Les redirections peuvent être effectuées dans l'autre sens. Supposons que vous souhaitiez envoyer un courrier électronique dont le texte se trouve dans un fichier. Une méthode consiste à exécuter:

# mail untel@tel.adresse < message.txt


Ces exemples simples ne montrent pas toute la puissance des redirections. Disons simplement qu'il est possible de combiner les deux types ensemble, ou encore d'utiliser les pipes exposés maintenant...


Pipe

Ce mécanisme de Pipe[2] permet d'enchaîner l'exécution de plusieurs commandes, en branchant la sortie d'une commande sur l'entrée de la suivante, à l'aide du symbole '|' (obtenu sur un clavier Français "Canada" usuel en pressant simultanément sur la touche AltCar et la touche à gauche du caractère 1). Prenons un exemple.

Vous souhaitez connaître tous les fichiers de votre système dont le nom comporte les caractères 'doc'.

La commande permettant d'obtenir tous les fichiers du système est ls -alR /, nous l'avons déjà rencontrée.

Il existe une commande permettant de rechercher les lignes comportant un certain texte dans un fichier, et de n'afficher que celles-ci: la commande grep (inutile pour l'instant de la comprendre pleinement!).

Avec les redirections, nous pourrions obtenir ce que nous voulons par:

# ls -alR / > tous_fichiers


# grep doc tous_fichiers


Un pipe nous permet toutefois de simplifier l'expression et d'éviter la création d'un fichier:

# ls -alR / | grep doc


Le fonctionnement peut être illustré par la Figure 2.

Figure 2: Mécanisme d'un pipe.


Ce qui se passe en réalité, c'est que ce qui est normalement affiché par la première commande est utilisé par la deuxième, comme s'il s'agissait d'un véritable fichier.

La combinaison des pipes et des redirections, en donnant les options judicieuses aux commandes impliquées, permet de réaliser en une seule ligne de commande des opérations très complexes. Mais gare à ne pas se perdre soi-même...


Jokers

Il est fréquent qu'une commande fasse référence à, ou utilise, un fichier. On peut toutefois vouloir appliquer une commande à plusieurs fichiers, parfois en très grand nombre: le fait de retaper la commande pour chaque fichier peut devenir rapidement fastidieux.

C'est pourquoi il existe les caractères jokers: leur rôle est de remplacer une ou plusieurs lettres dans un nom de fichier, de la même manière que le joker d'un jeu de cartes remplace la carte manquante. Il existe deux caractères jokers selon ce que l'on veut faire:

Sans doute le plus utilisé, permet de remplacer un groupe de caractères (lettres ou autre).

*


Permet de remplacer un seul caractère.

?


Envisageons quelques exemples.

Vous souhaitez obtenir la liste de tous les fichiers du répertoire courant commençants par les lettres "courrier_". La commande est la suivante:

# ls courrier_*


Le caractère '*' est interprété comme "n'importe quoi": on demande donc la liste des fichiers commençant par courrier_ suivi de "n'importe quoi". Par contre, la commande:

# ls courrier_?

limite l'affichage aux fichiers dont le nom commence par courrier_ suivi d'un seul caractère (quel qu'il soit).


Pour reprendre en partie l'exemple donné sur les pipes plus haut, une recherche équivalente dans le répertoire courant s'écrirait:

# ls *doc*


man

Besoin d'un renseignement sur la fonction ou l'utilisation d'une commande? Des questions sur la structure d'un fichier de configuration? La commande man est là pour ça!

La commande man donne accès aux "pages man[3]", les pages de manuel. Ces pages se trouvent dans le répertoire /usr/man, mais peuvent également se trouver en d'autres endroits plus spécialisés (voir Figure 1).

Ce que l'on appelle communément "le man" est subdivisé en plusieurs sections selon le propos des pages[4], comme le montre le Tableau 2.

Tableau 2: Les sections des pages man.
Nom Description
1 Commandes utilisateurs usuels et communes
2 Appels système (fonctions du kernel)
3 Sous-programmes (fonctions des librairies de programmation)
4 Périphériques (fichiers dans /dev)
5 Format (structure) de certains fichiers, comme /etc/passwd
6 Jeux
7 Divers
8 Outils d'administration système (réservé à root)
9 Autres fonctions du noyau (kernel)
n Documentation nouvelle (qui peut être déplacée par la suite)
o Documentation ancienne (qui peut disparaître un jour)
l Documentation locale (spécifique au système que l'on utilise)


Pour accéder à la page concernant une commande (par exemple, chmod), il suffit de taper:

# man chmod


La commande man possède de nombreuses options de ligne de commande. Citons par exemple:

Permettre d'obtenir toutes les pages concernant le nom donné (essayez par exemple man -a kill).

-a → Pour provoquer un formatage PostScript de la page, avant de l'envoyer sur la sortie standard.

-t → Une redirection permet d'obtenir un fichier PostScript immédiatement imprimable:

# man -t adduser > adduser.ps


Il existe de nombreuses autres possibilités. Mais rien de vous empêche de faire:

# man man


Enfin, si vous savez dans quelle section se trouve la page cherchée (dans le cas de commandes possédant un équivalent en programmation), il est possible d'indiquer la section où chercher la page voulue:

# man 2 mount


# man 8 mount


Le man est une source inépuisable de renseignements. Surtout ne jamais le négliger! Mais il est également possible d'obtenir de nombreuses informations dans le répertoire /usr/doc, notamment le sous-répertoire HOWTO.


Parcours et manipulation des répertoires

Promenade dans les répertoires

La commande cd permet de changer le répertoire courant.

Supposons nous trouver dans le répertoire /home, et pour quelque raison nous voulons aller dans le répertoire /usr/doc. Les trois séries de commandes suivantes effectuent l'opération souhaitée:

# cd /usr/doc
# cd ../usr/doc
# cd ..
# cd usr
# cd doc


Encore un exemple: nous sommes dans /usr/local/doc, et nous voulons aller dans /usr/X11R6/doc. Trois manières d'y parvenir:

# cd ..
# cd ..
# cd X11R6
# cd doc
# cd ../../X11R6/doc
# cd /usr/X11R6/doc

A vous de trouver laquelle vous préférez...


Création de répertoires

mkdir est utilisée pour créer un répertoire. Il est naturellement possible d'utiliser un chemin relatif ou un chemin absolu. Pour créer un répertoire dans le répertoire courant, il suffit de taper quelque chose du genre:

# mkdir rep


Une option intéressante est l'option '-p': elle permet de créer en une fois une hiérarchie de répertoire. Supposons que dans le répertoire courant, le répertoire Lettres n'existe pas, que l'on veuille le créer, ainsi qu'un sous-répertoire perso, contenant lui-même un répertoire Nath. On peut le faire en exécutant simplement:

# mkdir -p Lettres/perso/Nath


Suppression de répertoires

La commande rmdir est utilisée pour supprimer un répertoire. Normalement, si le répertoire n'est pas vide, la commande envoie un message d'erreur. Il est toutefois possible de supprimer une hiérarchie de répertoires vides en une seule fois, avec l'option -p. Par exemple, juste après avoir exécuté:

# mkdir -p Lettre/perso/Nath


on peut supprimer tous les répertoires que l'on vient de créer avec:

# rmdir -p Lettre/perso/Nath


Par contre, la commande

# rmdir -p Lettre/perso

renverra une erreur, car perso contient encore Nath et donc n'est pas vide.


Savoir où l'on est

La commande pwd toute simple donne le répertoire courant, par son chemin absolu. Bien pratique dans certains cas...


Encombrements des répertoires et des fichiers

Deux outils pour le contrôle de l'espace disque occupé par les fichiers.

  • du permet de connaître l'espace disque occupé par les fichiers d'un répertoire.
  • df permet de connaître l'espace disque total occupé et restant sur les partitions de votre système.


Illustration

La Figure 3 illustre l'utilisation des commandes évoquées dans cette section. Le répertoire courant apparaît en grisé sur le dessin. Naturellement, seule une partie de l'arborescence est présentée.

Figure 3: Démonstration de manipulations de répertoires.


Manipulation des fichiers

Liste des fichiers dans un répertoire

ls donne la liste des fichiers contenus dans un répertoire. Appelée sans arguments, ls donne la liste des fichiers dans le répertoire courant.

Il existe de nombreuses options à ls. Nous n'évoquerons ici que les principales et les plus utiles, pour le reste, consultez la page man correspondante man ls.

  • Lister les fichiers cachés (dont le nom commence par un point).
# ls -a


  • Affichage "long": donne des informations supplémentaires sur les fichiers, tels que la taille, la date de dernière modification, les droits d'accès, etc.
# ls -l


  • Lister récursivement le contenu des sous-répertoires. Essayez donc un ls -alR /...
# ls -R


  • Afficher les fichiers en les ordonnant selon leur extension (les caractères après le dernier point).
# ls -X


  • Lister sur une seule colonne. Par défaut, ls utilise plusieurs colonnes, selon la longueur des noms à afficher.
# ls -1


  • Appliquer une couleur selon le type de fichier: une pour les répertoires, une pour les commandes exécutables, etc.
# ls -color=tty


Supprimer des fichiers

Il est évidemment possible de supprimer des fichiers sous Linux. La commande à utiliser est rm. Prenez garde aux erreurs de manipulation: une fois un fichier effacé, il n'est plus possible de récupérer son contenu, celui-ci est irrémédiablement perdu. Par exemple, s'il existe dans le répertoire courant un fichier nommé core (les fichiers de ce nom sont généralement générés lorsqu'un programme provoque une erreur), vous pouvez le supprimer par:

# rm core


Les options les plus utilisées de rm

Supprimer tout un répertoire, ainsi que ses sous-répertoires.

Attention! Sur certains systèmes, une commande telle que rm -R .* peut avoir des conséquences catastrophiques: elle supprime le répertoire courant, ainsi que les répertoires qu'il contient. Or, le répertoire .., qui désigne l'ancêtre du répertoire courant, est contenu dans celui-ci: sur certaines versions, rm va alors "remonter" dans l'arborescence, parvenir à la racine, puis redescendre... En quelques secondes, vous pouvez ainsi supprimer tous les fichiers de votre système Linux!

# rm -R


Demander une confirmation avant de supprimer un fichier.

# rm -i


Copier des fichiers

La copie de fichiers (c'est-à-dire une duplication à l'identique, comme un clonage) s'effectue par cp. Il est toujours nécessaire d'indiquer ce que l'on copie (la source), puis vers quel endroit on le copie (la destination). Les caractères jockers (voir le paragraphe #Jokers) peuvent bien entendu être utilisés.

Méfiez-vous lorsque vous utilisez cette commande, surtout en tant qu'utilisateur root (voir le paragraphe #Le super-utilisateur): sauf configuration particulière, si vous copiez un fichier sur un autre de même nom dans un autre répertoire, ce dernier sera purement et simplement écrasé sans avertissement, c'est-à-dire que son contenu sera irrémédiablement perdu.

Enfin, la commande cp peut être utilisée pour simplement dupliquer un fichier dans un même répertoire. Par exemple, si dans le répertoire courant se trouve un fichier nommé Rapport.lyx, que vous souhaitez modifier mais en conservant la version précédente, vous pouvez effectuer:

# cp Rapport.lyx Rapport.lyx.org

Le fichier actuel sera ainsi sauvegardé en tant que Rapport.lyx.org.


Si vous n'êtes pas satisfait de vos modifications, vous pourrez toujours restaurer la version précédente par:

# cp Rapport.lyx.org Rapport.lyx


Nous utilisons ici le fait que copier un fichier sur un fichier de même nom, écrase celui-ci: le Rapport.lyx sera exactement identique à celui que vous aviez sauvegardé avec la première commande.

Une utilisation plus courante de cp est de copier un fichier situé quelque part dans le répertoire courant, pour par exemple l'éditer. Si vous souhaitez ainsi disposer dans le répertoire courant du fichier Printing-HOWTO situé dans le répertoire /usr/doc/HOWTO, vous pouvez utiliser:

# cp /usr/doc/HOWTO/Printing-HOWTO .

Le . final désigne, rappelez-vous, le répertoire courant.


Quelques options

Pour copier une arborescence récursivement: si la source est un répertoire, cette option va copier ce répertoire et son contenu ainsi que tous les sous-répertoires qu'il contient.

# cp -R source destination


Demander une confirmation si un fichier risque d'être écrasé.

# cp -i source destination


Afficher le nom de chaque fichier avant de le copier. Utile lorsqu'on copie un répertoire ou qu'on utilise les caractères jockers.

# cp -v source destination


Déplacer ou renommer des fichiers

mv permet de déplacer des fichiers (les fichiers sont copiés comme avec cp, puis effacés de la source). Si le répertoire source est le même que le répertoire destination, cette commande permet de renommer des fichiers.

Par exemple, s'il se trouve dans le répertoire courant un fichier nommé Lettre que vous voudriez renommer (changer son nom) en Lettre-2017.01.06 (une bonne manière d'insérer la date dans un nom de fichier), vous pouvez effectuer:

# mv  Lettre  Lettre-2017.01.06


Supposons maintenant que vous souhaitiez déplacer ce fichier dans un répertoire qui s'appellerait Archives, c'est-à-dire placer une copie du fichier dans ce répertoire et supprimer l'original. Une première méthode est:

# cp Lettre-2017.01.06 Archives
# rm Lettre-2017.01.06


La commande mv permet de faire la même chose en une seule ligne:

# mv Lettre-2017.01.06 Archives


   De même que pour la commande cp, méfiez-vous: cette commande peut écraser des fichiers si la cible existe déjà.


La commande mv possède peu d'options.

  • Forcer le déplacement, même si la cible existe déjà: ceci supprime les éventuels messages d'avertissement.
# mv -f source destination


  • Au contraire, cette option provoque une demande de confirmation si des fichiers risquent d'être écrasés.
# mv -i source destination


La complétion des noms de fichier

Il s'agit là d'un petit quelque chose très pratique du shell Bash. Prenons un exemple. Entrez la commande suivante (sans danger):

# cd /etc

Le résultat de cette commande est de nous amener dans le répertoire /etc, qui devient donc le répertoire courant.


Maintenant, tapez les caractères suivants, mais n'appuyez pas immédiatement sur [Entrée]:

# more H


Appuyez maintenant sur la touche de [Tabulation]. Normalement, vous devriez voir apparaître:

# more HOSTNAME


Que s'est-il passe? Lorsque vous avez appuyé sur la touche [Tabulation], le shell a recherché dans le répertoire courant les fichiers dont le nom commence par la lettre 'H' (rappelez-vous que Linux distingue les majuscules des minuscules dans les noms de fichiers). En principe, il n'y en qu'un seul, et le shell complète alors le nom du fichier. Recommencez, avec cette fois:

# more f

suivi à nouveau de la touche [Tabulation]. Rien ne se passe, avec un peu de chance vous devriez même entendre un bip: c'est que plusieurs fichiers commencent par la lettre 'f'. Appuyez une deuxième fois sur [Tabulation] rapidement, et le shell affichera tous les fichiers commençant par 'f'.


Ceci fonctionne également si vous donnez un groupe de lettres, ou un chemin (relatif ou absolu).

Pour vous replacer dans votre répertoire personnel de login.

# cd


Si [Tabulation] est suivi d'un bip, plusieurs fichiers commencent par rc dans le répertoire /etc/rc.d.

# more /etc/rc.d/rc


Cette petite fonctionnalité est très pratique dès que l'on se trouve confronté à des noms de fichiers un peu longs. Expérimentez-la, vous l'apprécierez rapidement!


Affichage de fichiers (texte)

more et less permettent de consulter le contenu d'un fichier à l'écran, en l'affichant page par page. Par exemple:

# more /etc/inittab


# less /etc/passwd


Vous pouvez passer à la page suivante en appuyant sur la barre d'espace de votre clavier. Pour remonter d'une page avec less, il suffit de presser la touche b (back). Normalement, less ne vous rend pas automatiquement la main: une fois arrivé à la fin du document, il faut presser la touche q pour terminer less et pouvoir entrer une autre commande.

more est la commande la plus ancienne. less est une sorte de "super-more", en ceci qu'il ajoute nombre de fonctionnalités. Consultez la page man correspondante pour plus de détails. less accepte des commandes lors de son fonctionnement: vous les tapez simplement au clavier, lorsque less a fini d'afficher une page, suivies d'un appui sur [Entrée].

Effectuer une recherche du motif dans le texte (les caractères '<' et '>' ne doivent pas être inclus). Très utile pour rechercher un mot dans un document long: pour rechercher le mot "bonjour", entrez la commande /bonjour.

/<motif>


Retourner au début du fichier.

# g


Aller à la fin du fichier.

# G


Aller à la ligne n du fichier.

# ng


Il est assez fréquent d'utiliser ces commandes à travers un pipe (voir le paragraphe #Pipe) pour lire un affichage long résultant d'une commande. Par exemple, la commande dmesg permet de voir les messages du système lors du démarrage: cela représente souvent plus d'une page-écran. Pour pouvoir consulter facilement ces messages, vous pouvez effectuer:

# dmesg | more


Illustration

La Figure 4 vous propose une démonstration des commandes rm, cp et mv évoquées plus haut. Les répertoires sont dans des cadres aux coins arrondis, les fichiers dans des cadres aux coins droits. Le répertoire courant est toujours yves.

Figure 4: Démonstration de manipulation de fichiers.


Le contenu des fichiers est symbolisé par un motif de remplissage: un même motif remplissant les cadres de deux fichiers différents, signifie des contenus identiques.


Programme, processus, logiciel & Co

Nous allons tenter ici de clarifier quelques termes d'emploi fréquent. Commençons par un que nous avons déjà rencontré, le terme de programme.

Une définition un peu abstraite, tirée d'un dictionnaire, est de dire qu'un programme est une suite d'instructions compréhensible par l'ordinateur, organisée de manière à ce que celui-ci accomplisse une tâche donnée. C'est sans doute exact, mais ça ne nous renseigne pas sur la forme que prennent les programmes sur notre système Linux...

Essayez donc la commande suivante:

# more /bin/more


Normalement, vous devriez voir une série de caractères parfaitement incompréhensible, peut-être même entendre quelques beeps et récupérer un affichage désordonné (dans ce dernier cas, changez de console virtuelle, comme indiqué au paragraphe #Notion de console). Que vient-il de se passer?

La commande more vous est déjà connue, elle permet d'afficher le contenu d'un fichier. Lorsque vous appuyez sur [Entrée] après avoir tapé la commande, vous demandez au système d'exécuter un programme; more en l'occurrence. Mais sans doute avez-vous remarqué que le fichier dont nous avons demandé l'affichage porte le même nom que la commande...

Ce fichier est justement celui qui contient le programme correspondant à la commande more. Les instructions d'un programme (ce qu'il doit faire) sont en effet contenues dans un fichier, le plus souvent sous une forme que l’œil humain ne peut saisir mais, aisément utilisable par l'ordinateur (on parle alors de fichier binaire et tous les programmes ne se présentent pas sous cette forme). La très grande majorité des commandes sont donc des programmes dont les instructions sont contenues dans des fichiers binaires.

Mais continuons notre enquête. Lorsque le système tente d'exécuter un programme, il lit le fichier qui le contient pour le placer dans sa mémoire. Alors seulement les instructions du programme sont exécutées, laquelle exécution se traduit le plus souvent par l'utilisation de davantage de mémoire par la lecture ou l'écriture de divers fichiers, des affichages à l'écran... Le programme que nous avons exécuté plus haut, par exemple, a lu un fichier /bin/more et affiché son contenu à l'écran.

On se trouve alors en présence d'une entité dans la mémoire de l'ordinateur, qui évolue, qui agit sur différents éléments qui lui sont accessibles. On pourrait même considérer qu'elle est née (lors de la lecture du "fichier-programme" par le système), qu'elle vit (lors de l'exécution des instructions contenues dans le programme), et qu'elle mourra (lorsque sa tâche sera accomplie). Cette entité presque vivante est ce que l'on appelle un processus. Dans un système tel que Linux, tout processus est "lancé" par un autre processus et est à même d'"enfanter" un ou plusieurs processus: on peut donc parler de "relation père-fils" entre les processus. Sachez qu'il est très courant d'avoir plus d'une vingtaine de processus s'exécutant simultanément lors du fonctionnement d'un système Linux, éventuellement communiquant entre eux. Pour s'y retrouver, le système attribue à chacun d'eux un numéro unique, désigné par le terme de PID (Process Identifier[5]). Par ailleurs, un même programme peut être exécuté plusieurs fois: à chaque exécution correspondra un processus à part.

Naturellement, la plupart des processus ne font guère parler d'eux: sinon, votre écran serait rapidement rempli de messages et il vous serait impossible de vous retrouver dans un fouillis pareil. En fait, la plupart des processus tournent en arrière-plan; c'est-à-dire qu'ils font ce qu'ils doivent faire en silence. Par exemple, le processus qui vous permet d'accéder au système n'intervient que lorsqu'il est sollicité; le reste du temps il est silencieux. On parle communément de daemons[6] pour désigner de tels processus lorsqu'ils font partie des composantes du système.

Pour finir notre "bestiaire occulte", citons le cas des zombies. Ce sont des processus parvenus au terme de leur exécution (soit normalement, soit à la suite d'une erreur), mais que le système ne parvient pas à éradiquer de la mémoire. Ils demeurent donc ainsi, le plus souvent totalement inactifs, mais occupant une certaine quantité de mémoire, ce qui peut devenir gênant si leur nombre augmente trop. En général, cet état survient quand un processus se termine alors que le système n'a pas le temps de s'occuper de l'effacer de la mémoire parce qu'il est trop sollicité. Cela peut également arriver lorsque le processus a provoqué une erreur telle que le système ne sait pas quoi en faire. Mais cela reste assez rare, ne vous inquiétez pas.

Nous savons maintenant ce qu'est un programme et un processus. Donnons alors quelques définitions.

Un logiciel est un ensemble de programmes fortement liés entre eux, destinés à remplir une mission nécessitant plusieurs tâches plus ou moins complexes. Par exemple, un traitement de texte qui peut aussi bien être utilisé pour rédiger un curriculum vitae que pour rédiger un livre entier.

Un système d'exploitation, dont nous parlons depuis le début, est un logiciel particulier; son rôle est de permettre à d'autres programmes de s'exécuter dans les meilleures conditions et d'utiliser le matériel électronique de l'ordinateur. L'exécution d'un système tel que Linux peut donner lieu à l'apparition d'une multitude de processus.

Enfin, ce que l'on désigne par code source est ce qu'un (ou plusieurs) être humain a tapé au clavier, dans un certain langage de programmation compréhensible par lui, pour construire un programme. Ce texte n'est pas compréhensible par l'ordinateur et doit subir une phase de traduction (ou compilation) pour obtenir un fichier binaire. Par exemple, Linux lui-même est programmé dans un langage (presque) intelligible, nommé langage C et normalement le code source de Linux se trouve dans une arborescence située dans le répertoire /usr/src/linux. Notez qu'habituellement le code source des logiciels et systèmes commerciaux n'est pas ainsi librement disponible: Linux (et la plupart des outils qui l'accompagnent) appartient au mouvement LIBRE (OpenSource) et fait figure d'exception.


Programmes usuels

Manipuler fichiers et répertoires aisément: mc

Ce petit programme est inspiré de Norton Commander qui était disponible pour le système MS-DOS. Son nom "complet" est Midnight Commander et on l'obtient avec la commande mc. Il en résulte alors un écran ressemblant à celui proposé à la Figure 5.

Figure 5: Écran de Midnight Commander (mc).


Il est possible que le résultat que vous obtenez ne soit pas en couleur: il faut alors utiliser l'option -c et exécuter plutôt mc -c.

L'écran se trouve divisé en deux parties que nous appellerons les volets de gauche et de droite. Chacun vous permet de consulter le contenu d'un répertoire dont le chemin complet figure en haut du volet. Dans notre exemple, le volet de gauche affiche le contenu du répertoire /lib, tandis que celui de droite affiche le contenu du répertoire propre à l'utilisateur qui a lancé mc (c'est le sens du symbole "~", qui représente toujours le répertoire principal d'un utilisateur).

Dans les listes contenues dans chacun des volets, différents codes de couleur sont utilisés pour représenter différents éléments. Ainsi, les répertoires contenus dans le répertoire visité apparaissent en blanc brillant et caractères gras, précédés d'un slash ('/'). Les fichiers exécutables (correspondant à des programmes) apparaissent en vert et le nom est précédé d'une étoile ('*'). Les fichiers dont le nom est précédé d'une arobase ('@') sont des liens symboliques (voyez le paragraphe #Mécanisme des liens pour plus d'information sur les liens).

Sur la droite des noms de fichier, vous voyez également une colonne avec la taille du fichier (en octets) et une colonne avec la date de dernière modification du fichier. Dans l'un des deux volets, il y a toujours un fichier sélectionné et celui-ci est marqué par une barre de couleur; dans notre exemple c'est le répertoire /.. du volet de gauche qui est sélectionné. Vous pouvez déplacer la sélection avec les touches de déplacement (flèches Haut et Bas), ou bien les touches [Début] (retour au début de la liste), [Fin] (aller à la fin de la liste), [Page Avant] (descendre de plusieurs lignes) et [Page Arrière] (remonter de plusieurs lignes). Pour passer d'un volet à l'autre, utilisez la touche de [Tabulation].

Tout en bas de l'écran figure la liste des fonctions que vous pouvez appeler, à l'aide d'une des touches de fonction. Le fonctionnement est assez simple. Par exemple, si vous pressez la touche [F5] (notez le mot "Copy" à côté du 5 dans la ligne du bas), cela va réaliser la copie de l'élément sélectionné dans un volet vers le répertoire affiché dans l'autre volet. Vous pouvez ainsi copier un seul fichier, ou bien toute une arborescence.

Essayez-le, vous ne tarderez pas à l'apprécier!


Quincaillerie

Notions d'architecture matérielle

Linux demeure un système exigeant. Si vous devez "administrer" une machine Linux (la configurer, installer le système...), nous pensons qu'il est indispensable de posséder quelques notions concernant les matériels des ordinateurs de type PC. Aussi aborderons-nous ici quelques aspects essentiels et volontairement simplifiés.


Les disquettes et les disques durs

Les disquettes et les disques durs entrent dans la catégorie des supports de mémoire de masse. Bien que cela ne soit pas tout à fait vrai pour une disquette, un disque dur est généralement capable de stocker beaucoup plus d'informations que la mémoire centrale d'un ordinateur. En général, le disque dur est le support sur lequel les systèmes d'exploitation, les logiciels divers que vous utilisez ainsi que vos fichiers personnels sont installés.

La disquette était souvent utilisée comme outil de sauvegarde ou de transport de données si celles-ci n'étaient pas trop volumineuses. Dans le cas de Linux ou MS-DOS, il était également possible d'installer un système d'exploitation sur une disquette, encore que ses fonctionnalités soient grandement réduites. Habituellement le lecteur de disquettes est le premier endroit où l'ordinateur va chercher un système lorsqu'il démarre; c'était souvent la seule façon de réparer un système sur disque dur qui avait été endommagé d'une manière ou d'une autre.

Physiquement, une disquette était un disque souple de plastique magnétisé comparable à une bande de cassette audio ou vidéo. Les informations étaient enregistrées sur ce support de façon analogue. Un disque dur se présente de la même façon, mais cette fois le disque est rigide, plus épais et se compose de plusieurs plateaux superposés. Voyez les photos de la Figure 6 pour apprécier la façon dont un disque dur est construit. Le nombre de têtes de lecture, c'est-à-dire le nombre de faces utilisés sur les différents plateaux, est l'un des éléments de ce que l'on appelle la géométrie d'un disque dur. Pour une disquette, ce nombre valait 2 dans la grande majorité des cas (un disque, donc deux faces, donc deux têtes).

Figure 6: L'intérieur d'un disque dur.


Un autre élément est le nombre de pistes ou de cylindres. Les pistes sont des anneaux concentriques subdivisant la face d'un plateau en autant de zones distinctes. Sauf situation très exceptionnelle, toutes les faces du disque présentent le même nombre de pistes. Lorsqu'il y a plusieurs plateaux (dans le cas des disques durs), les pistes des différentes faces qui sont à l'aplomb les unes des autres forment un ensemble que l'on désigne alors sous le terme de cylindre. Une disquette usuelle comportait 80 cylindres, certains disques durs, plusieurs milliers.

Le "découpage" du disque ne s'arrête pas là. Les pistes sont elle-mêmes subdivisées en secteurs. Le secteur est la plus petite unité discernable sur un disque. Le plus souvent, toutes les pistes ont le même nombre de secteurs, mais il arrive que les pistes extérieures en possèdent davantage que les pistes intérieures pour tirer parti de la surface plus grande. Ceci est toutefois assez rare. Un secteur contient 512 octets ou caractères de données. D'autres tailles sont possibles (128, 256, 1024, 2048, 4096...). Une disquette normale contenait 18 secteurs par piste et un disque dur en contient au moins 63.

La Figure 7 vous propose un schéma de la structure qui vient d'être évoquée. Sur la vue de dessus, les zones d'un même ton de gris appartiennent à la même piste. Sur la vue par la tranche (imaginez le disque dur coupé en son centre), les tons de gris représentent alors chacun un cylindre particulier.

Figure 7: Structure d'un disque dur: vue de dessus et par la tranche.


En termes de performances, le taux de transfert maximal pour une disquette avoisinait les 300 kilo-octets par seconde tandis que certains disques durs atteignent des taux tels que 80 méga-octets par seconde, voire davantage! Un paramètre important est le temps moyen d'accès à une information; pour un disque dur, il est de l'ordre de quelques millisecondes (millième de seconde) et pour la disquette... certains esprits chagrins ironisent en disant qu'il fallait changer d'échelle et compter plutôt en minutes...


Partition des disques durs

Il existe un mécanisme qui permet de subdiviser un disque dur en plusieurs parties distinctes: les partitions. Celles-ci permettent de séparer, par exemple, les éléments constitutifs du système des données des utilisateurs. Ainsi, en cas de problème dans le système, les erreurs ont moins de chance de s'étendre aux données - et réciproquement. Typiquement, sur un système Linux, les répertoires qui contiennent les données des utilisateurs sont sur une (ou plusieurs) partition distincte du reste du système; une surcharge de données ne risque donc pas d'endommager le système et une erreur dans celui-ci a peu de chance de corrompre les données.

Le découpage d'un disque en partitions suit des règles un peu complexes, pour l'essentiel héritées de l'histoire. La première d'entre elles, est qu'une partition recouvre une suite continue de cylindres: les limites de partitions sont donc celles des cylindres et l'on dit qu'une partition s'étend du cylindre n au cylindre m. Une formule qui peut être utile donne la taille d'une telle partition, en méga-octets:

(m - n + 1) * Nt * Ns

2048

où Nt est le nombre de têtes, et Ns le nombre de secteurs par piste, du disque.

On distingue par ailleurs deux types de partitions: les partitions primaires et les partitions logiques.

Pour des raisons historiques, datant de l'époque où les disques étaient de taille bien moins importante qu'aujourd'hui, il n'était possible de créer que quatre partitions primaires qui sont numérotées par Linux de 1 à 4. Cette limite vient du fait que la faible capacité des disques durs ne justifiait pas de prévoir un nombre plus élevé.

Toutefois les capacités actuelles des disques rendent ce nombre insuffisant. C'est pourquoi fut développé la technique des partitions étendues et des partitions logiques.

Une partition étendue est l'une des quatre partitions primaires (généralement la dernière), destinée à être un réceptacle pour d'autres partitions en nombre théoriquement illimité. Ces partitions, contenues dans une partition étendue, sont appelées partitions logiques. Linux les numérote toujours à partir de 5.

Les partitions trouvent également leur utilité lorsque l'on veut faire cohabiter plusieurs systèmes. Il est possible, sur un même ordinateur, d'avoir côte à côte Windows-7, Windows-8.1, Linux... et même plusieurs fois le même système! Par exemple, un Linux d'utilisation normale et un autre pour effectuer des tests sur lequel un plantage est sans grande conséquence.

La manipulation des partitions se fait à l'aide d'outils spécialisés. Linux possède un programme nommé fdisk. Nous vous recommandons toutefois, si cela vous est possible, l'utilisation du programme GParted plus simple à manipuler et beaucoup plus puissant.

Les #Figure 8 et #Figure 9 vous propose deux exemples pour illustrer tout cela.

Figure 8: Exemple de partitions sur un disque dur (voir #Tableau 3).


Dans cet exemple, les quatre possibilités de partition primaire ont été utilisées. L'une d'entre elles est utilisée en partition étendue (la deuxième), pour contenir des partitions logiques (la deuxième partition primaire contient quatre partitions logiques).

L'exemple suivant est plus classique.

Figure 9: Exemple de partitions sur un disque dur.


Seules deux possibilités de partition primaire sont utilisées, la première pour Windows-7, la deuxième pour faire une partition étendue qui contient en l'occurrence six partitions logiques. Cet exemple vous montre par ailleurs comment il est possible de répartir différents éléments d'un système Linux sur plusieurs partitions: notez comment les répertoires /home, /root et /usr ne sont pas sur la même partition que la racine.


Structure logique d'un disque dur

Le début de cette section vous a exposé la structure physique d'un disque dur, divisé en cylindres, secteurs, etc. Puis nous avons évoqué le mécanisme des partitions. Mais où sont donc stockées les informations relatives aux partitions? Comment les systèmes reconnaissent-ils les partitions? Les réponses à ces questions sont l'objet de ce paragraphe.

La structure logique d'un disque dur est la manière dont sont organisées les différentes informations fondamentales concernant la manière dont le disque dur doit être utilisé par les systèmes.

Le premier secteur (physique) de chaque partition est un peu particulier: on l'appelle le secteur d'amorce[7], car il contient généralement le code nécessaire au lancement du système contenu dans la partition. S'il ne s'agit que d'une partition de données, ce secteur contient quelques informations utiles concernant la taille de la partition, son type, etc.

Encore plus particulier est le premier secteur physique du disque dur: ce secteur contient non seulement le code nécessaire au lancement du système actif sur votre système, mais en plus la fameuse Table des Partitions; cette table contient les paramètres des quatre partitions primaires du disque, c'est-à-dire les cylindres de début et de fin, le type, etc. Ce secteur si spécial, si fondamental pour le fonctionnement de la machine, est appelé le Master Boot Record[8], MBR en abrégé.

La Table des Partitions n'est toutefois pas suffisante en elle-même: elle ne peut contenir les informations des éventuelles partitions logiques contenue dans une ou plusieurs partitions étendues. Aussi, chaque partition logique contient une "mini" Table des Partitions pour réaliser en quelque sorte, un chaînage des partitions les unes au bout des autres. Le début de la chaîne, le premier maillon, se situe dans la Table des Partitions du MBR, où l'une des entrées est marquée comme partition étendue.

Enfin, la structure logique de chaque partition dépend directement du système de fichiers qu'elle abrite.


Le #Tableau 3 reprend l'Exemple de la #Figure 8, en montrant de quelle façon les partitions s'enchaînent les unes derrières les autres. Les références /dev/sdax sont données à titre d'exemple, et représentent les partitions d'un disque SCSI sur un système Linux.

Les disques IDE utilisent la nomenclature hd et les disques SCSI la nomenclature sd.

Tableau 3: Structure logique d'un disque dur SCSI.


Utilisation de la commande fdisk pour afficher les partitions d'un disque SCSI d'un système Linux.

# fdisk /dev/sda
WARNING: DOS-compatible mode is deprecated. It's strongly recommended to
         switch off the mode (command 'c') and change display units to
         sectors (command 'u').

Commande (m pour l'aide):


Affichage de l'aide.

# Commande (m pour l'aide): m
Commande d'action
   a   bascule le fanion d'amorce
   b   éditer l'étiquette BSD du disque
   c   basculer le fanion de compatibilité DOS
   d   supprimer la partition
   l   lister les types de partitions connues
   m   afficher ce menu
   n   ajouter une nouvelle partition
   o   créer une nouvelle table vide de partitions DOS
   p   afficher la table de partitions
   q   quitter sans enregistrer les changements
   s   créer une nouvelle étiquette vide pour disque de type Sun
   t   modifier l'id de système de fichiers d'une partition
   u   modifier les unités d'affichage/saisie
   v   vérifier la table de partitions
   w   écrire la table sur le disque et quitter
   x   fonctions avancées (pour experts seulement)

Commande (m pour l'aide):


Affichage de la Table des partitions d'un disque SCSI d'un système Linux.

# Commande (m pour l'aide):p
Disque /dev/sdb: 4294 Mo, 4294967296 octets
255 têtes, 63 secteurs/piste, 522 cylindres
Unités = cylindres de 16065 * 512 = 8225280 octets
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Identifiant de disque : 0xe474cc36

Périphérique Amorce  Début        Fin      Blocs     Id  Système
/dev/sda1               1          65      522081    7  HPFS/NTFS
/dev/sda2              66         321     2056320    5  Etendue
/dev/sda3             322         386      522112+   7  HPFS/NTFS
/dev/sda4             387         451      522112+  83  Linux
/dev/sda5              66         130      522081    7  HPFS/NTFS
/dev/sda6             131         195      522081    7  HPFS/NTFS
/dev/sda7             196         260      522081   82  Linux swap / Solaris
/dev/sda8             261         321      489951   83  Linux

Commande (m pour l'aide):


Les mémoires

Le sujet de la mémoire dans un ordinateur est suffisamment vaste pour lui consacrer un ouvrage entier. Nous n'aborderons ici que des notions très générales afin de clarifier quelques termes courants.


La mémoire centrale ou RAM

La mémoire centrale ou RAM[9] de l'ordinateur est utilisée pour contenir le code exécutable et les données des programmes que vous utilisez, y compris le système lui-même. Sa caractéristique principale est que son contenu est irrémédiablement perdu lorsqu'on coupe l'alimentation électrique de l'ordinateur, d'où son nom courant de "mémoire vive".

A l'heure actuelle, le temps d'accès moyen à une information contenue dans la mémoire centrale est de l'ordre de quelques nanosecondes (milliardième de seconde). Une taille usuelle pour la mémoire centrale est de 4 Go. Il est évident que plus cette taille est importante, plus le système peut l'utiliser pour stocker des informations auxquelles il accédera très rapidement par la suite.


La mémoire CMOS

Cette mémoire est utilisée pour conserver des paramètres généraux de la machine lorsque celle-ci est arrêtée, tels que la configuration du ou des disques durs, l'heure, la date, etc. Elle est entretenue par une pile branchée sur la carte mère et son contenu est perdu si on retire la pile ou si elle s'épuise. Mais inutile de paniquer, la durée de vie d'une telle pile est en général d'au moins quatre à cinq ans...


La mémoire vidéo ou VRAM

Cette mémoire est spécialisée pour l'affichage de l'écran. La quantité dont vous disposez détermine directement le nombre de couleurs et la finesse de graphisme que vous pouvez obtenir sur votre écran. Elle a généralement des temps d'accès très faibles, de l'ordre de quelques nanosecondes, sauf sur certains systèmes où elle n'est rien d'autre qu'une portion de la mémoire centrale réservée à cet usage (ce que nous déconseillons pour des questions évidentes de performances générales).


La mémoire cache

Il serait plus juste de parler des mémoires cache. Ces mémoires, qui se trouvent un peu partout, sont utilisées comme intermédiaires entre des composants relativement lents de la machine et d'autres plus rapides. Une de ses utilisations est de stocker des informations fréquemment utilisées pour permettre des accès plus rapides; par exemple entre le disque dur (lent, temps d'accès de l'ordre de millièmes de seconde) et la mémoire centrale (environ un million de fois plus rapide!).

Un exemple particulièrement important pour la puissance générale d'un système est la mémoire cache du processeur: il s'agit d'une mémoire ultra-rapide, bien plus que la mémoire centrale. Elle est utilisée pour stocker des informations venant de cette dernière fréquemment utilisées, telles que des données ou des portions de code exécutable.


La mémoire virtuelle

Imaginez la situation suivante: vous travaillez sur une machine dotée de 4Go de mémoire centrale, dont 3,5Go sont déjà occupés par divers programmes. Vous souhaitez lancer un logiciel qui a besoin d'au moins 1Go de mémoire centrale pour fonctionner. Vous allez donc vous trouver en "déficit" de 500Mo de mémoire.

Sur d'anciens systèmes tel que MS-DOS, cela se passe très simplement: le système refuse simplement de lancer le logiciel. Les systèmes modernes (dont fait partie Linux) sont plus subtils, et utilise le mécanisme de la mémoire virtuelle[10]. L'idée est d'utiliser une partie du disque dur comme s'il s'agissait de mémoire centrale, dont la taille paraît ainsi augmentée. Ce mécanisme vous permet d'utiliser plus de mémoire que votre machine n'en dispose réellement. Si cela est fort utile, surtout pour les machines disposant de peu de mémoire, gardez toutefois à l'esprit que le temps d'accès à une information sur le disque dur se mesure en millième de seconde tandis qu'il se mesure en milliardième de seconde pour la mémoire... Quand le système commence à utiliser ce mécanisme (on dit qu'il "swap"), attendez-vous donc à des performances fortement dégradées.


Autres matériels et périphériques

Un système d'exploitation digne de ce nom doit permettre à son propriétaire d'utiliser tous ses périphériques sans exception... du moins en théorie. En effet, la pratique est nettement moins drôle, surtout pour ceux qui osent sortir des sentiers battus en faisant confiance à Linux. Et là, les choses se gâtent.

  • Il faut déjà oublier les "win-périphériques", en général des modems et des imprimantes, conçus pour n'être utilisés que dans un environnement déterminé.
  • Il faut également tirer un trait sur le fameux pilote (driver) qui n'est fourni, en général, que pour le même environnement précité.
  • Il faut faire confiance à la "communauté" Linux qui développe chaque jour de nouveaux pilotes pour faire fonctionner votre périphérique (avant-) dernier cri.


Le système de fichiers de Linux en détail

Introduction

Nous détaillons ici quelques aspects importants du système de fichiers de Linux. Il n'est pas utile de parfaitement maîtriser toutes les notions abordées ici mais, au moins nous vous recommandons d'en avoir une connaissance générale.


Accès aux périphériques, au matériel

Comme nous l'avions évoqué au début de ce document, les systèmes Unix - et donc Linux - accèdent aux éléments matériels de la machine par l'intermédiaire de fichiers spéciaux.

Sous Linux, ces fichiers sont tous regroupés dans le répertoire /dev (comme device, périphérique en français). Le principe de fonctionnement de ces fichiers est un peu particulier et leurs noms sont (plus ou moins) normalisés. Un fichier spécial du répertoire /dev est caractérisé par deux nombres, les numéros majeur et mineur.


Disque IDE

Considérons les affichages suivants:

# ls -l /dev/hda
brw-rw-- 1  root  disk  3,   0  6 janv. 10:01 /dev/hda


# ls -l /dev/ttyS1
crw-r-r- 1  root  root  4,  65  6 janv. 10:02 /dev/ttyS1

Les numéros majeurs et mineurs apparaissent juste avant la date. Décrivons-les.

Le numéro majeur correspond à un périphérique donné: par exemple, 03 correspond au premier port IDE sur la carte mère, et les disques associés sont désignés par des fichiers dont le nom commence par hda pour le disque maître, hdb pour le disque esclave. Ainsi, le fichier /dev/hda est un accès direct au premier disque dur, pris dans sa globalité, en tant que suite ininterrompue d'octets pratiquement non structurée. Inutile de préciser qu'il vaut mieux éviter d'écrire dans ce fichier! Le début est notamment la Table des Partitions, à manier avec délicatesse... Voir le paragraphe #Partition des disques durs pour plus de détails concernant les partitions des disques.

Le numéro mineur correspond à une subdivision du périphérique. Dans le cas du port IDE, les mineurs à partir de 1 numérotent les partitions du premier disque (le disque maître), les mineurs à partir de 65 numérotent les partitions du second disque (le disque esclave). Par exemple, /dev/hda5 (dont on note les caractéristiques par 03:05) désigne la première partition logique du disque dur maître sur le premier port IDE, tandis que /dev/hdb2 (dont on note les caractéristiques par 03:66) désigne la deuxième partition primaire du disque dur esclave sur le premier port IDE.


Disque SCSI

# ls -l /dev/sd*
brw-rw---- 1 root disk 8,  0  7 janv. 22:54 /dev/sda
brw-rw---- 1 root disk 8,  1  7 janv. 22:54 /dev/sda1
brw-rw---- 1 root disk 8,  2  7 janv. 22:54 /dev/sda2
brw-rw---- 1 root disk 8, 16  7 janv. 22:54 /dev/sdb
brw-rw---- 1 root disk 8, 17  7 janv. 22:54 /dev/sdb1
brw-rw---- 1 root disk 8, 18  7 janv. 22:54 /dev/sdb2
brw-rw---- 1 root disk 8, 32  7 janv. 22:54 /dev/sdc
brw-rw---- 1 root disk 8, 33  7 janv. 22:54 /dev/sdc1
brw-rw---- 1 root disk 8, 34  7 janv. 22:54 /dev/sdc2
brw-rw---- 1 root disk 8, 48  7 janv. 22:54 /dev/sdd
brw-rw---- 1 root disk 8, 49  7 janv. 22:54 /dev/sdd1
brw-rw---- 1 root disk 8, 50  7 janv. 22:54 /dev/sdd2


Dans cet exemple, nous avons quatre disques SCSI. Chaque disque a deux partitions.

Le numéro majeur 8 correspond au port SCSI sur la carte mère, et les disques associés sont désignés par des fichiers dont le nom commence par sda pour le premier disque, sdb pour le deuxième disque, etc. Ainsi, le fichier /dev/sda est un accès direct au premier disque dur, pris dans sa globalité, en tant que suite ininterrompue d'octets pratiquement non structurée.


Disquette

Sauf situation assez exceptionnelle, vous n'aurez que très rarement à utiliser directement ces fichiers spéciaux. Un exemple d'une telle situation est lorsque le besoin de prendre une image d'une disquette se présente, par exemple pour la dupliquer.

Le fichier spécial correspondant au premier lecteur de disquette est /dev/fd0 (02:00). Pour dupliquer une disquette en conservant très précisément sa structure (notamment s'il s'agit d'une disquette de démarrage), la première étape consiste à prendre une image de la disquette:

# cp /dev/fd0 disque.img


Cette commande (notez l'utilisation de la commande usuelle cp) va lire la disquette octet par octet (ou plutôt secteur par secteur), sans s'occuper de sa structure et encore moins du système de fichier qu'elle contient (qu'il soit de type Linux, MS-DOS, ou autre). Le résultat est placé dans le fichier disque.img dans le répertoire courant. Ce fichier est ce qu'on appelle une image de la disquette (d'où son extension .img).

La seconde étape (après avoir changé la disquette dans le lecteur!) est exactement symétrique de la première:

# cp disque.img /dev/fd0

... va écrire le fichier image sur la disquette dans le lecteur. Vous aurez alors une copie absolument exacte de la disquette originale, au bit près.

Ceci peut évidemment se généraliser aux disques durs ou CD-ROMs.

Mais attention! Si vous avez une partition désignée par exemple par /dev/hda7, d'une taille de 900 Mo, la commande:

# cp /dev/hda7 partition-hda7.img

... va vous créer un fichier de 900 Mo dans le répertoire courant! Donc prenez garde à avoir l'espace nécessaire...


Character vs block

Enfin et pour finir, Linux effectue une distinction entre les périphériques d'entrée-sortie par caractères (character devices) et les périphériques d'entrée-sortie par blocs (block devices). La différence apparaît dans les exemples plus haut sur le premier caractère de la ligne résultant du ls: 'c' pour caractères, 'b' pour blocs. Les périphériques d'entrée-sortie par caractères ont comme caractéristique de transmettre et recevoir les informations octet par octet. C'est le cas des ports séries ou parallèles, des modems, etc. Par contre, les périphériques d'entrée-sortie par blocs transmettent ou reçoivent les informations sous forme de paquets d'octets, d'une taille fixe: c'est le cas des supports de mémoire de masse (disquettes, disques durs...). Ainsi, un même couple majeur/mineur peut désigner deux périphériques différents, selon que l'on considère un périphérique par caractères ou un périphérique par blocks.

A titre indicatif, voici quelques fichiers avec les périphériques associés dans le Tableau 4 ci-dessous. La colonne B/C indique s'il s'agit d'un périphérique de caractères ou un périphérique par blocks:

Tableau 4: Quelques fichiers spéciaux et les périphériques associés,
la liste complète occuperait plusieurs pages!
Fichier Majeur Mineur B/C Périphérique
/dev/mem 1 1 c accès direct à la mémoire centrale
/dev/fd0 2 0 b premier lecteur de disquettes
/dev/hda 3 0 b disque maître sur le premier port IDE
/dev/hda2 3 2 b seconde partition primaire sur ce disque
/dev/hdb 3 64 b disque esclave sur le premier port IDE
/dev/hdb5 3 69 b première partition logique sur ce disque
/dev/tty1 4 1 c première console virtuelle
/dev/lp0 6 2 c troisième port parallèle (imprimante)
/dev/sda 8 0 b premier disque dur SCSI
/dev/sda2 8 2 b deuxième partition sur ce disque
/dev/sdb 8 16 b deuxième disque dur SCSI
/dev/sdb1 8 17 b deuxième partition sur ce disque
/dev/psaux 10 1 c port PS/2 (souris)
/dev/kdb 11 0 c accès direct au clavier
/dev/scd0 11 0 b premier CD-ROM SCSI
/dev/sequencer 14 1 c séquenceur de la carte son
/dev/hdc 22 0 b disque maître sur le second port IDE
/dev/video0 81 0 c Acquisition vidéo
   Pour la liste complète des numéros majeur et mineur, voir:
https://github.com/torvalds/linux/blob/master/Documentation/admin-guide/devices.txt


L'arborescence unique et les systèmes de fichiers

Notions de montage

Affirmons-le encore une fois, sous le système Unix, et donc sous Linux, tout est fichier. Notamment, toutes les informations auxquelles accède le système sont incluses dans une arborescence unique; qu'elles soient sur le même support physique que le système ou sur des supports différents (autres partitions, disques, CD-ROMs, etc.).

D'où la notion de système de fichiers: un système de fichier, en gros, désigne une partition sur un support physique quelconque. Dans le cas d'une disquette ou d'un CD-ROM, désigne en général tout le disque. Cette notion peut être rapprochée de celle évoquée en début de document, au paragraphe #Système de fichiers; une partition donnée applique en général un seul système de fichier (au sens du paragraphe Système de fichiers, donc FAT16, NTFS, EXT3FS, ...), donc la confusion des deux notions est possible - et très souvent effectuée.

Lorsque l'on désire accéder aux informations d'un support donné (par exemple, un CD-ROM), il est nécessaire, en quelque sorte, "d'accrocher" le système de fichier qu'il contient à un point de l'arborescence, c'est-à-dire un répertoire (de préférence prévu à cet effet). Cette opération s'appelle le montage[11] du support en question. Une fois cette opération effectuée, les fichiers et répertoires du support apparaissent comme se trouvant dans le répertoire sur lequel le support a été monté.

Par exemple, vous possédez un CD-ROM contenant à sa racine le fichier liste.txt, ainsi que le répertoire Images. Si vous montez le CD-ROM sous le répertoire /mnt, l'accès au fichier se fera par /mnt/liste.txt, l'accès au répertoire par /mnt/Images, l'accès aux fichiers du répertoire Images par /mnt/Images/nom_de_fichier, et ainsi de suite.

Notez bien que si le répertoire /mnt contenait des fichiers avant le montage, ceux-ci deviennent absolument inaccessibles une fois le montage effectué. Prenons un exemple; supposons un répertoire /mnt, qui contient des fichiers:

# ls /mnt
cdrom dos1 dos2 eit floppy iomega nfs


Montons un CD-ROM sur ce répertoire (la commande utilisée est mount, elle sera détaillée par la suite), et examinons le contenu du répertoire:

# mount /dev/hdd /mnt
mount: block device /dev/hdd is write-protected, mounting read-only


# ls /mnt
3DFx           GTK1.2            Koffice       Sound 
Alien          Gnome1.0_Sources  Lisezmoi.txt  Themes
ContribSuite   Java1.2_pre1      Noyaux        docs
Dev_Graphique  Jeux              Revue         kde
EnVrac         KDE1.1            SciTech


On constate que les fichiers qui se trouvaient dans /mnt ont comme "disparus".

Mais que faire lorsque l'on souhaite changer le CD-ROM? Il existe l'opération inverse du montage, il s'agit - vous l'aurez deviné du démontage[12] des systèmes de fichiers (avec umount, détaillée plus loin). Si le point de montage contenait des fichiers avant le montage, ceux-ci redeviennent visibles:

# umount /mnt


# ls /mnt
cdrom dos1 dos2 eit floppy iomega nfs


Prenons un exemple réel. Il est assez commun, sur un système Linux, de répartir les différents éléments du système sur différents systèmes de fichiers, pas nécessairement sur le même disque. À la Figure 10, les éléments sur un même système de fichiers sont entourés de pointillés, le tout constituant un système Linux complet (l'arborescence est ici simplifiée).

Figure 10: Différents systèmes de fichiers pour un système Linux.


Pour finir, disons simplement qu'il est usuel de réserver plusieurs sous-répertoires dans le répertoire /mnt pour les montages temporaires, tels que disquettes et CD-ROMs, par exemple, /mnt/cdrom, /mnt/floppy, etc.

Deux commandes sont dédiées aux opérations de montage et démontage, les commandes mount et umount, exposées au paragraphe #Montage et démontage de systèmes de fichiers: mount et umount.


Mécanisme des liens

Les principes de fonctionnement du système de fichiers de Linux comporte la notion de liens. Pour être simple, un lien[13] est un point d'accès à un fichier. Ce point d'accès prenant la forme d'un nom dans un répertoire - la notion de fichier ne représente qu'une suite de caractères quelque part sur un disque. Quelle différence alors, entre le nom de fichier tel qu'exposé au début de ce document et le lien? En fait, le nom de fichier est un élément du lien qui comporte de nombreuses informations concernant le fichier (droits d'accès, taille, date de création...). De plus, nous avions évoqué une sorte d'équivalence entre le nom de fichier et le fichier lui-même. Mais un même fichier peut être référencé par plusieurs liens de noms différents s'ils sont dans le même répertoire, éventuellement de mêmes noms s'ils sont dans des répertoires différents.

On distingue deux types de liens: les liens physiques et les liens symboliques[14].

Un lien physique est un accès direct à la suite de caractères sur disque qu'est le fichier. Accéder au lien, c'est accéder directement au fichier. En pratique, lorsque vous effacez un fichier avec rm, vous indiquez un nom de fichier, donc un lien. Mais l'espace occupé par le fichier n'est effectivement libéré que lorsque le dernier lien physique qui y fait référence est effacé: rm ne supprime donc pas le fichier, seulement un lien qui lui est attaché. Ceci est une façon de protéger des fichiers contre l'effacement, mais rend l'utilisation des liens physiques délicates: il est facile d'engendrer un véritable capharnaüm dans l'arborescence...

Un lien symbolique, à contrario, est un accès indirect au fichier; on peut plutôt le voir comme une référence à un autre lien. Comme un lien secondaire sur le fichier correspondant. La grosse différence avec le lien physique est qu'il est possible d'effacer le fichier (c'est-à-dire effacer tous ses liens physiques) sans toucher aux liens symboliques (qui deviennent alors en quelque sorte orphelins; on parle de liens brisés). D'un maniement plus souple que les liens physiques, les liens symboliques peuvent également amener à une forêt inextricable de références, n'en abusez donc pas.

Une commande est dédiée à la manipulation des liens, la commande ln, présentée au paragraphe #Manipulation des liens: ln.


Utilisateurs: droits et devoirs

Linux est un système multi-utilisateur. C'est-à-dire que tout est prévu dans le système pour que plusieurs personnes puissent l'utiliser, même simultanément (dans le cas de configurations en réseau), sans se gêner les uns les autres.

Chaque utilisateur est identifié par un nom, et doit fournir un mot de passe[15] pour pouvoir utiliser le système. La procédure au cours de laquelle un utilisateur donne son nom et son mot de passe est appelée "procédure de login", ou simplement "login". Ce mot de passe est strictement personnel: théoriquement, vous ne devez communiquer le vôtre à personne, encore que cela ne prête pas beaucoup à conséquence sur une machine individuelle (sauf si vous possédez des fichiers confidentiels...).

De même, chaque utilisateur se voit attribué une certaine zone dans l'arborescence des répertoires (typiquement, un sous-répertoire dont le nom est celui de l'utilisateur dans le répertoire /home), que l'on appelle parfois le "répertoire personnel[16]"de l'utilisateur. L'utilisateur possède un pouvoir quasiment absolu de création, modification et destruction sur les fichiers de son répertoire personnel (fichiers dont il est le propriétaire), mais normalement il ne peut pas intervenir sur les répertoires des autres utilisateurs et encore moins sur les éléments constitutifs du système. Ceci confère à Linux un haut degré de sécurité vis-à-vis des diverses manipulations et autres fausses manoeuvres de ceux qui l'utilisent.

Afin de faciliter le travail coopératif, les utilisateurs peuvent êtres regroupés par groupes. Il est ainsi possible d'autoriser tout un groupe à accéder à certains fichiers, mais pas les autres utilisateurs.


Le super-utilisateur

Comme indiqué plus haut, normalement les utilisateurs ne peuvent accéder aux éléments constitutifs du système. Comment alors, accéder à ceux-ci quand le besoin s'en fait sentir, comme lors de l'installation d'un nouveau logiciel?

Pour les opérations nécessitant une modification particulière du système, il existe un utilisateur particulier, privilégié, le super-utilisateur[17], dont le nom est root. En fait, l'utilisateur root possède un pouvoir total sur l'intégralité du système, y compris celui de le détruire en quelques secondes. Il peut consulter, modifier et détruire n'importe quel fichier du système et on peut estimer qu'en pratique, root est implicitement propriétaire de tous les fichiers du système.

Si vous êtes seul à utiliser Linux sur votre machine personnelle, l'utilisateur root, c'est vous. Donc lorsque vous utilisez votre machine en tant que root, il convient de prendre un luxe de précautions et de bien savoir ce que vous faites; la précipitation est le chemin le plus sûr vers le massacre de votre système et la perte de vos données. C'est pourquoi il est vivement recommandé de créer au moins un autre utilisateur pour l'utilisation quotidienne du système. Une erreur de manipulation n'aura alors que des conséquences limitées sur l'intégrité du système.


Droits des fichiers et des répertoires

Pour réaliser la protection des fichiers évoquée plus haut, il existe un mécanisme de droits et de propriété attribués à chacun des fichiers du système. Tout fichier est la propriété d'un utilisateur et les droits s'articulent autour de cette notion.


Droits généraux: lecture, écriture, exécution

Linux (comme Unix) reconnaît trois droits fondamentaux.

  • le droit de lecture, symbolisé par la lettre 'r' (pour read), indique si l'on est autorisé à consulter le fichier, c'est-à-dire, par exemple, à afficher son contenu par une commande telle que more.
  • le droit de écriture, symbolisé par la lettre 'w' (pour write), indique si l'on est autorisé à modifier le contenu du fichier, par exemple à l'aide d'un programme tel que vi.
  • le droit de exécution, symbolisé par la lettre 'x' (pour execute), indique si l'on peut exécuter le fichier comme s'il s'agissait d'une commande. Ceci n'a évidemment de sens que pour les fichiers contenant des instructions compréhensibles par le système comme c'est le cas de fichiers tels que: /bin/more, /sbin/fdisk...

Les droits individuels d'un fichier peuvent être modifiés à l'aide de la commande chmod, exposée au paragraphe #Modifier les droits sur un fichier ou un répertoire: chmod.


Regroupement des droits

Les droits fondamentaux qui viennent d'être exposés sont, pour chaque fichier, présents dans trois groupes de droits distincts.

  • le premier groupe, symbolisé par la lettre 'u' (pour user), précise les droits pour le propriétaire du fichier.
  • le deuxième groupe, symbolisé par la lettre 'g' (pour group), précise les droits pour les utilisateurs du groupe auquel appartient le propriétaire du fichier.
  • le troisième groupe, symbolisé par la lettre 'o' (pour other), précise les droits pour, disons, le reste du monde, c'est-à-dire n'importe quel utilisateur (autre que le propriétaire du fichier et les utilisateurs de son groupe).

Par exemple, la commande more (voir le paragraphe #Affichage de fichiers (texte), normalement accessible à tout le monde, possède le droit en exécution du groupe other activé (de même que les droits en exécution des deux autres groupes). Par contre, la commande dd (voir le paragraphe #Entrées/sorties directes de données: dd) ne devrait avoir que le droit en exécution du propriétaire (en occurrence, root) d'activé.

Le propriétaire d'un fichier peut être modifié avec la commande chown.


Cas particulier des répertoires

Lorsque le fichier considéré est un répertoire, les droits prennent une signification un peu différente.

  • le droit en lecture indique que l'on peut obtenir la liste des fichiers du répertoire, par la commande ls par exemple.
  • le droit en écriture indique que l'on peut créer ou supprimer des fichiers du répertoire (la modification ou la consultation de ceux-ci dépend des droits de chaque fichier).
  • le droit en exécution indique si l'on peut "transiter" par le répertoire, c'est-à-dire le faire figurer dans une succession de répertoires dans un chemin, ou bien en faire le répertoire courant. Ceci est totalement indépendant des deux droits précédents.


Fichiers impliqués dans la gestion des utilisateurs

Le fichier des utilisateurs et de leur mot de passe: /etc/passwd

Ce fichier contient la liste des utilisateurs qui peuvent utiliser le système. Attention! Ne le supprimez pas. Si vous le supprimez, il vous sera impossible de vous connecter au système, même en tant que root.


Les variables d'environnement

Il arrive parfois que certaines informations doivent être mise à disposition d'un grand nombre de programmes. Par exemple, nous avons vu que lorsque vous exécutez une commande (telle qu'un simple ls), c'est en réalité un programme qui est exécuté. Or ce programme est contenu dans un fichier qui doit être lu pour que le système puisse exécuter le programme. Mais comment le système fait-il pour trouver le fichier en question? L'information indiquant à quels endroits chercher les fichiers contenant les programmes des diverses commandes doit donc être aisément accessible et, comme certaines commandes en appellent d'autres, cette information doit également être lisible par tout le monde.

Ce genre d'information largement diffusée dans le système est contenu dans ce que l'on appelle des variables d'environnement. Une variable est une zone de la mémoire, identifiée par une étiquette (un nom) et contenant quelque chose (un nombre, un mot...) Ces variables sont fixées, certaines au démarrage du système et d'autres lors de la connexion d'un utilisateur. Examinons l'une d'entre elle.


$PATH

Exécutez la commande suivante:

# echo $PATH
/sbin/e-smith:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin


La commande echo permet d'afficher quelque chose. Dans la commande précédente, nous lui demandons d'afficher le contenu d'une variable dont le nom est PATH. Notez l'utilisation du symbole dollar ('$') devant le nom de la variable, nécessaire lorsque l'on souhaite accéder au contenu de la variable.

C'est manifestement là une suite de répertoires, donnés par leur chemin absolu et séparés par le caractère deux-points (':'). Nous avons là précisément la réponse au problème posé au début de ce paragraphe. La variable d'environnement PATH contient une liste de répertoires dans lesquels chercher les fichiers contenant les programmes des commandes que l'on souhaite exécuter.

Supposons maintenant que vous souhaitiez modifier cette variable pour lui rajouter le répertoire /toto. Si vous utilisez le shell Bash, la commande à utiliser est:

# export PATH="$PATH:/toto"


Notez les deux modes d'emploi du nom de la variable. D'abord sans le dollar à gauche du signe égal, parce que l'on fixe sa valeur puis, avec le dollar "$", parce que l'on lit sa valeur. Vérifions ce que nous venons de faire.

# echo $PATH
/sbin/e-smith:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin:/toto

Ce qui est bien le résultat escompté.


Si par contre vous utilisez le C-shell, la commande est:

# setenv PATH "${PATH}:/toto"

Le résultat est le même, la variable PATH est modifiée.


env

Il existe un grand nombre de variables d'environnement, chacune destinée à un usage particulier. Chaque shell actif possède son propre ensemble de variables d'environnement. Si deux utilisateurs sont connectés simultanément sur la même machine, on a deux shells actifs. Chacun des shells possède ses propres variables d'environnement qui ne sont pas forcément les mêmes. Mieux, une variable donnée peut avoir deux valeurs différentes selon l'utilisateur.

Pour obtenir l'ensemble des variables d'environnement définies lorsque vous êtes connectés avec leurs valeurs, utilisez la commande env.

# env
HOSTNAME=sme-9
TERM=xterm
SHELL=/bin/bash
HISTSIZE=1000
SSH_CLIENT=192.168.1.81 53526 2222
SSH_TTY=/dev/pts/0
USER=root
LS_COLORS=rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:mi=01;05;37;41:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arj=01;31:*.taz=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.dz=01;31:*.gz=01;31:*.lz=01;31:*.xz=01;31:*.bz2=01;31:*.tbz=01;31:*.tbz2=01;31:*.bz=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.rar=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.jpg=01;35:*.jpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.axv=01;35:*.anx=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=01;36:*.au=01;36:*.flac=01;36:*.mid=01;36:*.midi=01;36:*.mka=01;36:*.mp3=01;36:*.mpc=01;36:*.ogg=01;36:*.ra=01;36:*.wav=01;36:*.axa=01;36:*.oga=01;36:*.spx=01;36:*.xspf=01;36:
MAIL=/var/spool/mail/root
PATH=/sbin/e-smith:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin:/toto
PWD=/root
LANG=fr_FR.UTF-8
HISTCONTROL=ignoredups
SHLVL=1
HOME=/root
LOGNAME=root
SSH_CONNECTION=192.168.1.81 53526 192.168.1.156 2222
LESSOPEN=||/usr/bin/lesspipe.sh %s
G_BROKEN_FILENAMES=1
_=/bin/env


Fichiers particuliers

Les runlevels

Les niveaux d'exécution[18], au nombre de 7 (8 pour SME), 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.

Pour passer au niveau d'exécution numéro 5.

# init 5


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

Mis à part les deux précédents, chaque distribution Linux dispose des autres niveaux comme elle l'entend. Nous prendrons ici l'exemple d'une distribution RedHat, mais ce qui suit est aisément transposable aux autres distributions.

Parmi les niveaux d'exécution, l'un d'eux est défini comme niveau par défaut, C'est le niveau qui est sélectionné lors du démarrage du système. Le lecteur astucieux aura compris qu'il n'est pas conseillé de fixer le niveau par défaut à 0 ou à 6...

Pour chaque niveau d'exécution, il existe un ensemble de scripts (des fichiers textes exécutables, en réalité des programmes en langage Shell) qui réalisent l'initialisation des différents services du système: configuration du clavier, du serveur mail, de la souris... Le niveau d'exécution par défaut permet de déterminer quels seront les scripts à exécuter et ainsi de spécialiser le comportement du système selon ce que vous souhaitez faire.

Par exemple, sur une distribution RedHat:

  • 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-utilisateur, sans support réseau. On retrouve les six consoles textes virtuelles usuelles (voir le paragraphe #Notion de console). 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. C'est le mode de fonctionnement usuel.
  • 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.
  • le niveau 5, enfin, est identique au niveau 3, mais provoque un démarrage en mode graphique sous la couche X-Window.

Le choix du niveau par défaut et les actions associées à chaque niveau sont inscrits dans un seul fichier qui est décrit ci-dessous.


Le fichier /etc/inittab

Il s'agit d'un simple fichier texte donc, modifiable avec n'importe quel éditeur de texte. Toutefois, si tout le monde peut le consulter, il faut être root pour le modifier.

Ce fichier est une suite de lignes ayant toutes la même forme générale et composées de quatre éléments (on dit "champs[19]"):

<id>:<niveau(x)>:<action>:<programme>


  • id → est une suite, de un à quatre caractères, utilisée pour identifier la ligne. On ne doit pas retrouver deux fois la même suite sur deux lignes différentes.
  • niveau(x) → indique quels sont les niveaux concernés par la ligne. Par exemple, '124' indique que la ligne ne concerne que les niveaux 1, 2 et 4.
  • action → précise de quelle manière la ligne doit être interprétée, c'est-à-dire dans quel cadre elle s'inscrit ou de quelle façon traiter les autres champs.
  • programme → est le programme à exécuter, dans le cadre précisé précédemment, pour les niveaux donnés.

Le plus simple, pour bien comprendre ces différentes notions, est d'examiner ensemble un exemple réel. Le fichier suivant est extrait d'un système RedHat Linux, version 5.2:

#
# inittab       This file describes how the INIT process should set up
#               the system in a certain run-level.
#
# Author:       Miquel van Smoorenburg, <miquels@drinkel.nl.mugnet.org>
#               Modified for RHS Linux by Marc Ewing and Donnie Barnes
#
# Default runlevel. The runlevels used by RHS are:
#   0 - halt (Do NOT set initdefault to this)
#   1 - Single user mode
#   2 - Multiuser, without NFS (The same as 3, if you do not have networking)
#   3 - Full multiuser mode
#   4 - unused
#   5 - X11
#   6 - reboot (Do NOT set initdefault to this)
# 
id:5:initdefault:

# System initialization.
si::sysinit:/etc/rc.d/rc.sysinit

l0:0:wait:/etc/rc.d/rc 0
l1:1:wait:/etc/rc.d/rc 1
l2:2:wait:/etc/rc.d/rc 2
l3:3:wait:/etc/rc.d/rc 3
l4:4:wait:/etc/rc.d/rc 4
l5:5:wait:/etc/rc.d/rc 5
l6:6:wait:/etc/rc.d/rc 6

# Things to run in every runlevel.
ud::once:/sbin/update

# Trap CTRL-ALT-DELETE
ca::ctrlaltdel:/sbin/shutdown -t3 -r now

# When our UPS tells us power has failed, assume we have a few minutes
# of power left.  Schedule a shutdown for 2 minutes from now.
# This does, of course, assume you have powerd installed and your
# UPS connected and working correctly.  
pf::powerfail:/sbin/shutdown -f -h +2 "Power Failure; System Shutting Down"

# If power was restored before the shutdown kicked in, cancel it.
pr:12345:powerokwait:/sbin/shutdown -c "Power Restored; Shutdown Cancelled"

# Run gettys in standard runlevels
1:12345:respawn:/sbin/mingetty -noclear tty1
2:2345:respawn:/sbin/mingetty tty2
3:2345:respawn:/sbin/mingetty tty3
4:2345:respawn:/sbin/mingetty tty4
5:2345:respawn:/sbin/mingetty tty5
6:2345:respawn:/sbin/mingetty tty6

# Run xdm in runlevel 5
x:5:respawn:/etc/X11/prefdm -nodaemon


   Avec la sortie de RedHat Enterprise Linux (RHEL) 6, RedHat utilisera le nouveau service de démarrage Upstart, en remplacement de l'ancien init.

La première chose, qui paraît manifeste, est que les lignes commençant par un dièse ('#') sont des commentaires. Leur présence est purement informative et ces lignes ne sont absolument pas prises en compte par le système. Ne négligez pas ces lignes, elles apportent beaucoup à la clarté des fichiers de configuration et autres scripts; il n'y en a jamais trop.

Considérons la première ligne "significative":

id:5:initdefault:
  • Cette ligne précise quel niveau doit être choisi pour démarrer le système (ici, le niveau 5). C'est le sens de l'action 'initdefault'. Ici, pas de programme associé, cela ne présente pas d'intérêt. Si vous supprimez cette ligne (ou mieux, vous placez un dièse au début), durant le démarrage le système demandera dans quel niveau il doit se placer pour terminer son initialisation. Cela peut être utile pour tester différentes configurations. Consultez la documentation de votre distribution pour connaître l'utilisation des niveaux de 1 à 6, si ce n'est pas explicité comme ici dans un commentaire.

La ligne suivante:

si::sysinit:/etc/rc.d/rc.sysinit


  • Indique un programme à exécuter dans les premiers temps du démarrage (action 'sysinit'), juste après que le matériel physique ait été reconnu. À ce stade, la notion de niveaux n'existe pas encore réellement, c'est pourquoi aucun n'est présent.

Viennent ensuite un certain nombre de lignes utilisées pour effectuer des actions spécifiques à chaque niveau. L'action wait indique que le processus d'initialisation ne se poursuivra pas tant que le programme spécifié ne sera pas terminé. Dans le cas présent c'est le même programme qui est appelé pour chaque niveau, mais avec un paramètre différent.

Le programme mentionné dans la ligne suivante, associé à l'action once, sera exécuté dès l'entrée dans un nouveau niveau. Le vide de la liste des niveaux est ici interprété comme "tous les niveaux".

La ligne qui suit réalise l'interception de la séquence de touches [Ctrl]+[Alt]+[Suppr] qui, normalement, provoque un redémarrage de la machine. C'est effectivement ce qui se passe, mais de manière contrôlée par le système, donc "proprement".

Les deux lignes suivantes ne sont utiles que si vous disposez d'un onduleur, et qu'il est correctement configuré. La première ligne provoque un arrêt du système après un certain délai, en cas de coupure de courant. La seconde ligne arrête la procédure d'arrêt (si cela est possible) dans l'éventualité où le courant revienne.

Les six lignes suivantes effectuent la mise en place des consoles textes virtuelles (voir le paragraphe #Notion de console au sujet des consoles virtuelles). En fait, le programme exécuté est celui qui demande le nom et le mot de passe de l'utilisateur pour contrôler l'accès au système. Comme à priori une telle procédure peut survenir plusieurs fois sur une même console (plusieurs utilisateurs qui se connectent et se déconnectent les uns après les autres), l'action respawn indique que le programme doit être relancé lorsque son exécution est terminée.

Notez que le niveau 1, que nous avions décrit comme un mode mono-utilisateur, ne se voit attribué qu'une seule console virtuelle (qui devient alors réelle...).

Enfin, la dernière ligne est utilisée pour un démarrage en mode graphique.

x:5:respawn:/etc/X11/prefdm -nodaemon


Pour plus de détails concernant ce fichier, consultez la page man correspondante: man 8 inittab.


Les scripts de démarrage

On désigne par ce terme, un ensemble de fichiers textes qui sont en fait des programmes en langage shell. Le rôle de ces programmes est de mettre en place la configuration générale de la machine lors du démarrage.

Par "mettre en place la configuration", on entend plusieurs choses:

  • configuration du clavier, des polices d'écran, de la souris, de toutes ces petites choses qui nous simplifient la vie;
  • démarrage de différents services (appelés aussi "daemons[20]"), c'est-à-dire les fonctionnalités que le système devra assurer durant son fonctionnement. ¨Par exemple: le serveur Internet, le courrier électronique, l'imprimante, les répertoires partagés...

Ces scripts se trouvent centralisés en un seul endroit, /etc/rc.d. Mais à partir de ce point, il n'existe pour l'instant pas de standard entre les différentes distributions (bien qu'une normalisation soit en cours). Encore une fois, pour conserver la cohérence avec ce qui précède, nous nous référerons à une distribution RedHat.

Cette distribution respecte une norme Unix, la norme dite System V. Disons tout de même ici que cette norme tant à se généraliser.

Le répertoire /etc/rc.d contient quelques fichiers et (au moins) huit répertoires. Décrivons, dans un premier temps, les fichiers (qui sont en fait des programmes exécutables en langage shell):

  • rc
  • rc.local
  • rc.news
  • rc.sysinit

Le sous-répertoire important est init.d: il contient tous les scripts de configuration des différents services qui doivent être lancés. En général, le nom du fichier exécutable correspondant à un certain service est assez explicite: par exemple, le fichier httpd lance (ou arrête, cela dépend des paramètres) le service qui permet à votre machine Linux de se comporter comme un serveur de pages HTML sur le Word Wide Web.

Viennent ensuite un certain nombre de sous-répertoires, dont le nom est de la forme rcn.d, le n correspond à un niveau d'exécution. Ainsi, si vous démarrez en niveau 5, c'est le répertoire rc5.d qui va déterminer quels scripts sont lancés.

Chacun de ces sous-répertoires contient un ensemble de liens symboliques (voir le paragraphe #Mécanisme des liens pour plus d'information sur les liens) vers certains des fichiers du répertoire init.d. Le nom des liens respecte un certain format:

  • la première lettre doit être 'S[21]' ou 'K[22]', 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. De plus, la distinction entre les scripts d'entrée (dont le lien commence par 'S') et les scripts de sortie (dont le lien commence par 'K'), associée à l'ordre induit par les deux chiffres, permet d'avoir un contrôle très précis sur la mise en place des services et leur arrêt.

Mais prenons un exemple. Dans le répertoire rc5.d se trouve un lien dont le nom est S11httpd. Le 'S' nous indique qu'il s'agit d'un script qui sera lancé lors de l'entrée dans le niveau 5, et sera (probablement) le onzième script à être exécuté. Le script sera httpd (avec l'argument 'start') qui, en l'occurrence, met en place le serveur Web.

Ce lien possède un lien symétrique, K03httpd, qui sera exécuté lors de la sortie du niveau 5 en troisième position, le script étant toujours httpd mais, cette fois avec l'argument stop.


Contrôle et adaptation du démarrage

Il se peut que vous souhaitiez modifier les scripts lancés au démarrage ou plus généralement, créer une configuration radicalement différente de celle que vous utilisez quotidiennement (par exemple, pour s'adapter à un environnement réseau). Plusieurs méthodes sont à votre disposition pour ce faire.

La première, la plus mauvaise, consiste à modifier les scripts contenus dans le répertoire /etc/rc.d/init.d. Ceci est vivement déconseillé. Mieux vaut créer vos propres scripts pour vos besoins. Dans ce cas, placez-les dans le répertoire /etc/rc.d/init.d, afin de correspondre à la norme en vigueur.

Vous pouvez également manipuler les liens contenus dans les répertoires rcn.d, pour en rajouter ou en supprimer. Prenez simplement garde à l'ordre dans lequel ils doivent être lancés en fixant convenablement les deux chiffres contenus dans le nom du lien. De plus, pour tout script de démarrage ajouté (commençant par 'S'), il est recommandé de créer son alter ego pour l'arrêt (commençant par 'K'). Une bonne idée est de regarder de quelle façon sont faits les scripts déjà existants pour reprendre le même canevas. Notez qu'il existe un outil graphique pour ce genre d'opération, tksysv (ou ksysv, si vous utilisez l'interface graphique KDE); il vous permet d'enlever ou d'ajouter des scripts dans les niveaux d'exécution et d'en préciser l'ordre d'exécution.

Une autre possibilité est d'utiliser un niveau inutilisé normalement par votre distribution (dans notre exemple, le niveau 4) pour en faire ce que vous voulez. Si, de plus, vous placez un dièse ('#') au début de la ligne contenant le initdefault du fichier /etc/inittab, à chaque démarrage le système vous demandera quel niveau vous voulez; une bonne manière d'avoir plusieurs configurations selon les situations. En général, un niveau ainsi personnalisé est plus ou moins fortement inspiré d'un niveau existant. Il peut donc être intéressant de dupliquer un niveau de référence comme base de départ.

Pour ce faire, placez-vous dans le répertoire /etc/rc.d et exécutez:

# rm rc4.d/*


pour "faire le ménage", c'est-à-dire "vider" le niveau 4, et ainsi éviter l'influence de configurations précédentes. Puis, pour dupliquer par exemple le niveau 5:

# cp rc5.d/* rc4.d


Le niveau 4 est alors absolument identique au niveau 5 et c'est à vous de jouer pour modifier ce qui doit l'être...

Naturellement, les numéros indiqués ici ne sont que des exemples; adaptez-les pour correspondre à votre propre configuration.


Montage automatique des partitions: /etc/fstab

Le fichier fstab contenu dans le répertoire /etc est utilisé lors du démarrage du système pour déterminer quelles sont les partitions qui doivent être montées lors du démarrage et, plus généralement, donne des informations sur les différents systèmes de fichiers auxquels le système peut accéder. Considérons l'exemple suivant:

...
/dev/hdb5        /                ext2    defaults          1 1
/dev/hdb9        /home            ext2    defaults          1 2
/dev/hdb11       /home/ftp        ext2    defaults          1 2
/dev/hdb10       /home/httpd      ext2    defaults          1 2
/dev/hdb8        /root            ext2    defaults          1 2
/dev/hda7        /usr             ext2    defaults          1 2
/dev/hdb12       /usr/src         ext2    defaults          1 2
/dev/hda6        swap             swap    defaults          0 0
/dev/hda1        /mnt/dos1        vfat    defaults          1 2
/dev/fd0         /mnt/floppy      auto    user,noauto       0 0
/dev/cdrom       /mnt/cdrom       iso9660 user,noauto,ro    0 0
none             /proc            proc    defaults          0 0
...


Décrivons les différentes colonnes qui apparaissent.

La première colonne est manifestement le fichier spécial correspondant à la partition ou au périphérique concerné. Le none de la dernière ligne ne doit pas vous étonner. En fait, le répertoire /proc est utilisé de façon interne par le noyau (kernel). Il ne contient par réellement des fichiers. Ceux qui peuvent y apparaître ne sont que des images d'informations contenues dans le noyau.

La deuxième colonne est évidemment le point de montage (le répertoire sur lequel on va accrocher la partition). Remarquez la ligne contenant le mot swap dans la deuxième colonne. Cette ligne désigne en fait la partition de mémoire virtuelle qui ne se monte pas (voir le paragraphe #La mémoire virtuelle pour plus de détail concernant la mémoire virtuelle).

La troisième colonne est le type de système de fichiers contenu sur la partition ou le périphérique concerné. ext2 est le système Ext2Fs, utilisé normalement par Linux. vfat est le système de fichiers de Windows 95/98; iso9660 est utilisé par les CD-ROMs. Notez auto, dans la ligne commençant par /dev/fd0, qui correspond au lecteur de disquette. En effet, une disquette peut être formatée selon différents systèmes de fichiers. auto demande au système de deviner quel est le type présent sur une disquette que l'on voudrait monter.

Suivent quelques options pour préciser de quelle manière la partition doit être traitée. Le mot defaults indique qu'il faut appliquer les options par défaut; ce qui inclus entre autre le montage automatique. Toutes les partitions ainsi marquées seront montées avec la simple commande:

# mount -a

Cette commande est exécutée durant le démarrage du système.

Par contre, les lignes commençant par /dev/fd0 et /dev/cdrom comportent un noauto. Ces périphériques ne seront pas montés automatiquement. Ce qui est, après tout, normal pour le lecteur de disquettes et le lecteur de CD-ROMs... Dans ces lignes apparaît également le mot user qui indique qu'un utilisateur quelconque est autorisé à monter le périphérique en question. Normalement, seul root est autorisé à monter les systèmes de fichiers. Consultez la page man de mount pour plus de détails concernant ces options.

L'avant-dernière colonne comporte un chiffre, 0 (zéro) ou 1. La fonction exacte de ce chiffre est un peu obscure. Remarquez toutefois qu'il n'est à 1 que pour les systèmes de fichiers effectivement montés au démarrage.

Enfin, la dernière colonne indique dans quel ordre les systèmes de fichiers doivent être vérifiés (c'est-à-dire contrôler qu'ils sont intègres et en bon état) lors du redémarrage. Normalement, le système de fichier abritant le répertoire racine doit toujours être vérifié en premier. D'où le 1 dans la première ligne. Les autres peuvent être vérifiés dans n'importe quel ordre, mais après la racine, ils sont tous à 2. Un 0 (zéro) indique que le système de fichiers n'a pas besoin d'être vérifié. C'est le cas naturellement pour la disquette et le CD-ROM mais, aussi pour la mémoire virtuelle et le "pseudo-système de fichiers" contenu dans /proc.


Commandes "avancées"

Description générique de l'utilisation d'une commande

Lorsque l'on souhaite décrire de manière concise l'utilisation d'une commande, on utilise un certain formalisme: on parle alors du format de la commande. Par exemple, pour la commande ln:

ln [-bdfinsvF] [-S backup-suffix] [-V {numbered,existing,simple}] [-version-control={numbered,existing,simple}] [-backup] [-directory] [-force] [-interactive] [-no-dereference] [-symbolic] [-verbose] [-suffix=backup-suffix] [-help] [-version] source [dest]


Une autre forme parfaitement équivalente est:

ln [options] source [dest]

Options: [-bdfinsvF] [-S backup-suffix] [-V {numbered,existing,simple}] [-version-control={numbered,existing,simple}] [-backup] [-directory] [-force] [-interactive] [-no-dereference] [-symbolic] [-verbose] [-suffix=backup-suffix] [-help] [-version]


L'exemple choisi est particulièrement complexe, mais il offre tous les symboles que vous pouvez rencontrer.

Premier principe: tout ce qui est entre crochets ('[' et ']') est facultatif. C'est-à-dire qu'il n'est pas obligatoire de donner l'option en question à la commande. Par exemple, dans ce qui précède, -backup est facultatif. Son absence n'empêchera pas la commande de s'exécuter, mais sa présence modifiera son fonctionnement. A l'inverse, ce qui n'est pas entre crochets est obligatoire, c'est le cas de source.

Deuxième principe; ce qui est entre accolades ('{' et '}') présente un choix, en général exclusif. Par exemple, pour l'option -version-control= doit être suivie de l'un des mots numbered, existing ou simple (ainsi que l'option -V, d'ailleurs).

Ensuite, prenons le cas du premier crochet, -bdfinsvF. Ceci n'est manifestement pas un mot. Simplement, il est possible de donner aucune ou plusieurs options à la commande parmi -b, -d, -f, etc et même des choses du genre -dnsF qui sont un collage de quatre options "mono-lettre".

Enfin, pour les options -S ou -suffix=, le mot backup-suffix doit être compris comme devant être remplacé par une chaîne de caractères de votre choix. Ceci vaut également pour les mots source et dest (qui en l'occurrence désignent des noms de fichiers). En général, la description textuelle de la commande permet de savoir (plus ou moins...) quoi mettre à la place de ces mots à remplacer.

Selon ce modèle, la commande suivante est valide.

# ln un_fichier.html un_autre_fichier.html


Voyez comment l'élément source, obligatoire pour cette commande, apparaît sous la forme de noms de fichiers.

Dans ce qui suit, nous utiliserons ce modèle pour décrire les commandes.


Retour sur la commande ls

La commande ls, avec l'option -l, permet d'obtenir les droits des fichiers d'un répertoire ainsi que de nombreuses autres informations. Considérons l'exécution de la commande ls -l dans un répertoire maison:

# ls -l
total 40
drwxr-xr-x   2   yves  users   1024   Nov 22  23:08  Ada 
drwxr-xr-x   2   yves  users   1024   Dec 13  19:48  Courrier 
-rw-r-r---   1   yves  users  13312   Jan 24  02:32  Curr_Vit.sdw 
drwx------   5   yves  users   1024   Nov 27  21:28  Desktop 
drwx------   2   yves  users   1024   Dec  9  10:58  Docs 
drwxr-xr-x   2   yves  users   1024   Feb  1  19:13  Downloads 
drwx------   2   yves  users   1024   Jan  3  22:52  Mail 
drwxr-xr-x   21   yves  users  1024   Nov 23  21:36  Office50 
drwx------   2   yves  users   1024   Nov 22  23:09  Progs 
-rw-r--r--   1   yves  users    362   Feb  7  18:08  Xrootenv.0 
drwxr-xr-x   9   yves  users   1024   Dec 28  17:38  YvesWeb 
-rw-r--r--   1   yves  users   9860   Feb  2  19:08  cartes_visite.fig 
-rw-r--r--   1   yves  users   5561   Nov 22  23:15  config-kernel 
-rw-r--r--   1   yves  users   2643   Jan 13  22:55  config_kernel.txt
lrwxrwxrwx   1   yves  users     13   Mar 29  20:28  Doc_Linux -> LUG/Linux_doc


Décrivons les informations affichées.

La première ligne (celle commençant par "total") totalise l'espace disque occupé par les fichiers listés, en kilo-octets.

Ensuite vient la liste des fichiers, un par ligne. Chaque ligne se décompose en plusieurs colonnes:

  • d'abord le type de fichier. La lettre d indique qu'il s'agit d'un répertoire, la lettre l signale un lien symbolique, un tiret - signale un fichier normal.
  • ensuite les droits du fichier: de gauche à droite, on trouve les droits pour le propriétaire, puis ceux du groupe, puis ceux accordés au reste du monde. Ainsi, le fichier config_kernel est lisible par tout le monde, mais modifiable seulement par son propriétaire. Le répertoire Docs n'est modifiable, listable et "traversable" que par son propriétaire.
  • puis le nombre de liens physiques sur le fichier (voir le paragraphe #Mécanisme des liens sur les liens pour plus de détails). Pour un répertoire, cela équivaut grosso modo au nombre de fichiers qu'il contient (rappelons que les répertoires sont considérés comme des fichiers).
  • vient alors le nom du propriétaire du fichier suivi du groupe auquel il appartient.
  • puis l'espace disque occupé par le fichier, donné en octets.
  • suivent la date et l'heure de la dernière modification du fichier (attention! ce n'est pas forcément le dernier accès, si celui-ci était simplement une consultation).
  • et enfin le nom du fichier. Notez la dernière ligne, qui est un lien symbolique. Le nom de fichier est suivi des caractères -> qui symbolisent une flèche. Puis le fichier auquel ce lien fait référence (voir le paragraphe #Mécanisme des liens, pour plus de détails).

Les fichiers cachés (commençant par un point .), et notamment les répertoires spéciaux . et .., n'apparaissent pas: il aurait fallu pour cela utiliser l'option -a de la commande ls.


Archivage de fichiers: tar et gzip

L'archivage est l'opération consistant à sauvegarder, d'une manière ou d'une autre, des fichiers importants. Soit que l'on veuille garder une trace d'un état ancien, soit que la perte de ces fichiers serait dramatique et donc on préfère en avoir une copie quelque part (de préférence sur un support assez peu sensible à l'usure, comme un CD ou une bande).

L'alter ego de l'archivage est la restauration qui est l'opération exactement inverse. À partir d'une sauvegarde, on récupère les fichiers qu'elle contient.

Il est rare de n'avoir qu'un seul fichier à sauvegarder. Plutôt quelques dizaines ou centaines et souvent l'espace occupé par ceux-ci est important. C'est pourquoi deux commandes furent créées pour faciliter cette opération: tar et gzip. D'autres commandes ou mécanismes plus sophistiqués existent, naturellement, mais ces deux commandes sont les plus répandues et toujours disponibles.


La commande tar

Elle permet, en gros, de "coller" plusieurs fichiers les uns au bout des autres pour n'obtenir qu'un seul fichier plus facilement manipulable. Toute sa puissance réside dans le fait qu'elle peut sauvegarder toute une arborescence. Si vos fichiers sont organisés en différents répertoires et sous-répertoires, la commande tar va "descendre" dans les répertoires qu'elle rencontre tout en conservant la structure qui sera remise en place lors d'une restauration éventuelle. Notez que tar était initialement destinée à être utilisées sur des bandes magnétiques (des unités de stockages remarquables par leur capacité, leur durée dans le temps, et leur lenteur). Donc, si vous voulez créer des archives sous forme de fichiers sur votre disque dur, il faudra utiliser l'option -f (décrite plus bas).

Les options de tar sont nombreuses. Le format de la commande est:

tar {c,d,r,t,u,x,A} [options] [fichier_tar] [fichiers...]


Ceci est évidemment un format abrégé. Normalement, fichier_tar est un fichier spécial (du répertoire /dev) qui correspond à un lecteur de bandes, sauf à utiliser l'option -f.

La première lettre désigne l'action à effectuer:

c → Création d'une nouvelle archive.

d → Compare les fichiers contenus dans fichier_tar avec les fichiers indiqués dans fichiers...

r → Ajoute les fichiers fichiers... à la fin de l'archive.

t → Affiche les noms des fichiers fichiers... s'ils sont contenus dans l'archive. Si le paramètre fichiers... est absent, liste les fichiers contenus dans l'archive.

u → Mise à jour. Les fichiers fichiers... sont intégrés à l'archives s'ils ne s'y trouvent pas déjà ou bien s'ils ont été modifiés.

x → Restauration des fichiers fichiers... depuis l'archive fichier_tar. Si fichiers... est absent, restaure tous les fichiers.

A → Permet de coller deux fichiers archives.


Quelques options, parmi les plus utilisées

-f fichier → Sans doute l'option la plus utilisée. Permet d'utiliser un fichier sur disque, plutôt que des données sur bande, pour les opérations d'archivage (sauvegarde ou restauration des fichiers).

-h → Déréférence les liens symboliques. C'est-à-dire, ne stocke pas le lien en tant que lien, mais plutôt le fichier sur lequel il pointe.

-ignore-failed-read → Normalement, la commande tar s'arrête avec un message d'erreur si elle rencontre des fichiers qu'elle ne peut lire (pour une raison ou pour une autre). Ce paramètre permet de continuer l'exécution de tar dans ce cas.

-k → Lors de l'extraction, empêche d'écraser des fichiers existants par des fichiers contenus dans l'archive et ayant le même nom.

-v → Mode "verbeux". Affiche le nom des fichiers sauvegardés ou restaurés.

-w → Demande d'une confirmation avant d'effectuer une quelconque action.

-z → Compresse les fichiers avec gzip avant de les sauvegarder ou les décompresse lors de la restauration. Permet donc d'obtenir une archive de taille réduite. Toutefois, l'algorithme de gzip est tel qu'il est plus efficace de compresser le fichier archive en un bloc plutôt que chacun de ses fichiers.

-directory=rep → Demande à tar de se placer dans le répertoire rep avant de faire quoi que ce soit.

-M → Pour créer des archives en plusieurs morceaux; utile pour un stockage sur disquettes. À utiliser avec l'option -L.

-P → Normalement, le slash initial ('/') des noms de fichiers est supprimé par tar. Ce paramètre permet de stocker l'intégralité du chemin absolu de chaque fichier. Attention, ceci peut être dangereux lors de la restauration.

-L=taille → Défini la taille en kilo-octets de chaque morceau de l'archive. À utiliser avec -M.

La complexité de la commande justifie de donner ici quelques exemples. Remarquez que nous utilisons systématiquement l'option -v pour avoir une liste de fichiers qui s'affiche à l'écran. Ceci n'est toutefois pas une obligation.

  • Utilisation "normale". Sauvegarde des répertoires /home, /root et de tous leurs sous-répertoires sur la bande qui se trouve dans le lecteur référencé par /dev/rmt0. Affiche le nom (absolu) de chaque fichier ainsi archivé. Notez la manière donc les commandes et les options sont accolées les unes aux autres. Gardez à l'esprit que le slash initial est supprimé.
# tar cvf /dev/rmt0 /home /root


  • Obtenir la liste des fichiers contenus dans l'archive qui se trouve sur la bande dans le lecteur /dev/rmt0.
# tar tvf /dev/rmt0


  • Restaurer le répertoire /home, et tous ses sous-répertoires, dans le répertoire courant (donc pas nécessairement dans /home), puisque le slash initial a été supprimé.
# tar xvf /dev/rmt0 /home


  • Sauvegarder le répertoire courant, en compressant les fichiers, et place l'archive dans le fichier backup.tgz (l'extension .tgz est l'extension usuelle des archives dont les fichiers ont été compressés) situé dans le répertoire parent.
# tar zcvf ../backup.tgz .


  • Restaurer les fichiers (toujours dans le répertoire courant) contenus dans l'archive backup.tgz.
# tar zxvf backup.tgz


La commande gzip

La commande gzip[23], quant à elle, permet de compresser un ou plusieurs fichiers. Cela consiste à appliquer un certain algorithme sur le contenu du fichier pour obtenir à la fin, un fichier de taille inférieure. Ceci permet d'éviter trop de perte d'espace disque. Dans le cas de fichiers textes (pages HTML, documents de traitement de textes...), la compression est souvent très forte. Il est courant de voir la taille du fichier ramenée à un quart de la taille initiale. Par contre, un algorithme de compression appliqué à des fichiers déjà compressés ne permet pas de réduire leur taille, voire l'augmente légèrement... C'est notamment le cas des fichiers images dans certains formats, par exemple GIF ou JPEG. Notez que le résultat d'une compression appliquée à un fichier a pour résultat un nouveau fichier de taille certes inférieure, mais parfaitement illisible pour un œil humain. Et d'une manière générale, plus le fichier à compresser est volumineux, plus le taux de compression (le rapport entre la taille initiale et la taille après compression) est élevé.

L'opération inverse est évidemment possible. À partir d'un fichier compressé, on récupère alors le fichier dans sa forme initiale sans aucune perte d'information (encore que ceci dépende des algorithmes; celui utilisé par gzip ne provoque pas de perte d'information).

L'utilisation générale de gzip est de la forme:

gzip [options] [fichiers]


Quelques options

-n → Où n est un nombre de 1 à 9. Permet de spécifier, en quelque sorte, la puissance de la compression. 1 est une compression minimum et rapide, 9 tente de compresser au mieux et donc plus lentement.

-d → Pour décompresser un fichier compressé.

-r → Lorsque que fichiers correspond à un répertoire, cette option permet de compresser les fichiers et les sous-répertoires qu'il contient.

-S suffix → Précise quelle extension doit être utilisée (par défaut, c'est .gz). Utile lorsque l'on tente de décompresser des fichiers compressés avec d'autres utilitaires compatibles tels que pkunzip sous DOS ou WinZip sous Windows (qui créent une extension .zip).


Quelques exemples

  • Compresser au mieux tous les fichiers du répertoire courant. Ces fichiers disparaîtront et seront remplacés par des fichiers portant le même nom, mais avec l'ajout de l'extension .gz.
# gzip -9 *


  • Compresser au mieux le fichier backup.tar qui deviendra alors backup.tar.gz et affiche le taux de compression.
# gzip -9 -v backup.tar


  • Décompresser le fichier backup.tar.gz.
# gzip -d backup.tar.gz


  • Décompresser le fichier images.zip.
# gzip -d -S zip images.zip 


Il semble évident que, dans l'optique de sauvegarder des fichiers, l'utilisation conjointe de tar et de gzip offre des possibilités intéressantes. Typiquement, une utilisation conjointe avec transfert du fichier archive sur une autre partition ou sur un réseau serait quelque chose du genre (pour sauvegarder le répertoire /home):

# tar cvf backup.tar /home
# gzip -9 backup.tar


(On utilise cp plutôt que mv, dans le cas ou la copie se passe mal)

# cp backup.tar.gz /mnt/nfs


(Inutile de garder l'archive à son point de création puisqu'elle a été copiée).

# rm backup.tar.gz


Par la suite, les fichiers ainsi sauvegardés pourront être restaurés par les opérations:

# cp /mnt/nfs/backup.tar.gz .
# gzip -d backup.tar.gz
# tar xvf backup.tar


Ré-attribution d'un fichier: chown, chgrp

Modifier les droits sur un fichier ou un répertoire: chmod

Cette commande permet de modifier les droits (les attributs) d'un fichier. Si vous ne connaissez pas la notion de droits sur un fichier, consultez le paragraphe #Droits des fichiers et des répertoires. La première chose à bien comprendre est que vous ne pouvez naturellement modifier les droits que d'un fichier dont vous êtes le propriétaire sinon, Linux ne serait pas un système très sécurisé...

chmod reconnaît les abréviations r, w et x pour les droits (respectivement, lecture, écriture et exécution) et les abréviations u, g et o pour les groupes de droits (respectivement, groupe relatif à l'utilisateur propriétaire, au groupe propriétaire, ou "aux autres[24]").

Sous réserve que vous en ayez le droit, vous pouvez ajouter ou retirer un ou plusieurs droits d'un ou plusieurs groupes de droits, en indiquant les abréviations des groupes concernés puis, un signe plus ('+') pour ajouter ou un signe moins ('-') pour retirer puis, les abréviations des droits que vous voulez modifier.

Par exemple, pour accorder les droits en lecture et écriture pour le propriétaire et le groupe propriétaire sur le fichier Rapport.lyx, exécutez la commande:

# chmod ug+rw Rapport.lyx


Notez que vous pouvez également appliquer ceci sur des répertoires.

Il est également possible d'utiliser les caractères jokers. Ainsi, pour accorder à vous seul le droit d'exécution sur tous les fichiers d'extension .x du répertoire courant, exécutez:

# chmod u+x *.x


Enfin, l'option -R permet d'appliquer chmod récursivement sur l'arborescence contenue dans le répertoire.

# chmod -R u+x programmes/*.exe

Ceci va fixer l'attribut d'exécution sur tous les fichiers d'extension .exe dans le répertoire programmes et dans tous les sous-répertoires qu'il peut contenir.


Manipulation des liens: ln

Si vous ne l'avez déjà fait, consultez le paragraphe #Mécanisme des liens pour bien comprendre la notion de lien sous Linux. La commande présentée ici permet de créer des liens, symboliques ou non. Sa forme générale est:

ln [options]  fichier_à_lier  fichier_lien


L'option la plus utile est l'option -s, qui permet de créer des liens symboliques plutôt que des liens physiques. Voici un exemple typique d'utilisation de ln.

Créer le fichier /cdrom, qui sera en fait un lien symbolique vers le répertoire /mnt/cdrom.

# ln -s /mnt/cdrom /cdrom


Par la suite, vous pourrez indifféremment utiliser l'un ou l'autre dans vos commandes, par exemple:

# mount /dev/hdd /cdrom
# mount /dev/hdd /mnt/cdrom

Ces commandes sont parfaitement équivalentes.


Montage et démontage de systèmes de fichiers: mount et umount

Ces deux commandes sont spécialement destinées au montage et au démontage des systèmes de fichiers. Deux opérations essentielles décrites au paragraphe #Notions de montage.


mount

La commande mount permet de monter un système de fichier en un point de l'arborescence. Sa forme est:

mount [options] [fichier spécial] [point de montage]


Si aucun paramètre n'est donné à la commande, on obtient simplement la liste des systèmes de fichiers actuellement montés. En principe, dès qu'un paramètre est donné, seul root peut utiliser mount.

L'utilisation la plus commune de mount est:

# mount /dev/hdd /mnt/cdrom


Ceci monte simplement le système de fichiers présent sur le CD-ROM dans le lecteur, en l'accrochant au répertoire /mnt/cdrom. Notez qu'il est tout à fait possible, sur votre système, que le fichier spécial impliqué ne soit pas /dev/hdd. En principe, sous cette forme, vous verrez un message vous avertissant que le système de fichiers est monté en "lecture seule". Cette petite complainte est normale, on ne peut écrire sur un CD-ROM.

Par ailleurs, la commande précédente peut échouer et renvoyer une erreur dans l'un des cas suivants:

  • il n'y a pas de CD-ROM dans le lecteur;
  • le répertoire courant d'au moins un utilisateur connecté au système est justement /mnt/cdrom ou l'un de ses sous-répertoires. Dans ce cas, mount refuse d'effectuer le montage;
  • le système de fichier qui se cache derrière /dev/hdd est déjà monté quelque part. En effet, on ne peut monter plusieurs fois un même système de fichiers.

Si la commande échoue, c'est le plus souvent pour l'une des raisons précédentes.

La commande mount ne possède que peu de paramètres.

-a → Tente de monter tous les systèmes de fichiers indiqués dans /etc/fstab qui ne présentent pas l'option noauto. Dans ce cas, il n'est pas nécessaire de préciser un fichier spécial ni un point de montage (puisqu'ils sont déjà indiqués dans le fichier /etc/fstab).

-n → Normalement, lorsque mount monte un système de fichier, celui-ci est noté dans le fichier /etc/mtab. Ce paramètre inhibe cette action.

-t <type> → Indique à mount, le type de système de fichiers que l'on tente de monter. Ceci ne devrait pas être nécessaire car, en général, mount devine assez bien à quoi il a affaire. Les types les plus courants sont:

msdos → Pour les anciens systèmes MS-DOS.

vfat → Pour les systèmes Windows 95 et Windows 98.

ntfs → Pour le système de Windows NT/Win-7/8.x.

iso9660 → Pour les CD-ROMs, du nom de la norme ISO qui leur est réservée.

hpfs → Pour le système OS/2.

[ext2 | ext3 | ext4 | reiserfs] → Pour le système natif de Linux.

nfs → Pour les systèmes de fichiers exportés sur le réseau, selon la norme NFS.

-o <options> → Options complémentaires pour affiner le montage. Nombre d'entre elles sont spécifiques d'un certain type de système de fichiers mais, certaines sont communes à tous, telles que:

noexec → Pour interdire l'exécution de programmes présents sur ce système de fichiers.

ro → Protège le système de fichier contre l'écriture.

rw → Autorise lecture et écriture.

remount → Utilisée sur un système déjà monté, pour en modifier les options.

-v → Affiche plein de messages d'informations lors du montage.


umount

La commande umount effectue l'opération inverse, c'est-à-dire démonte le système de fichiers. En reprenant l'exemple précédent, son utilisation usuelle peut prendre l'une des deux formes suivantes, parfaitement équivalentes:

# umount /dev/hdd
# umount /mnt/cdrom


On peut donc spécifier indifféremment le fichier spécial ou le point de montage. La commande peut échouer dans l'un des cas suivants:

  • un fichier ou un répertoire sous le point de montage est en cours d'utilisation,
  • rien n'est monté au point spécifié,
  • le fichier spécial indiqué n'a pas fait l'objet d'un montage.

umount ne reconnaît que les trois paramètres suivants, pratiquement jamais utilisés:

-a → tente de démonter tous les systèmes de fichiers notés dans /etc/mtab;

-n → à l'instar de mount, lorsque umount démonte un système de fichiers, celui-ci est retiré du fichier /etc/mtab; ce paramètre inhibe cela.

-t <type> → ne démonte que les systèmes de fichiers du type indiqué.


Entrées/sorties directes de données: dd

Cette commande est l'une des plus dangereuses qui soit. Elle permet d'écrire d'un endroit à un autre une série d'octets, sans s'occuper d'une éventuelle structuration de là où elle écrit. Vous pouvez ainsi, en une seule ligne, faire totalement et irrémédiablement disparaître les partitions de votre disque dur et rendre celui-ci inutilisable...

Sa forme générale est la suivante:

dd [-help] [-version] [if=file] [of=file] [ibs=bytes] [obs=bytes] [bs=bytes] [cbs=bytes] [skip=blocks] [seek=blocks] [count=blocks] [conv={ascii,ebcdic,ibm,block,unblock,lcase,ucase,swab,noerror,notrunc, sync}]

L'utilisation la plus fréquente que vous aurez sans doute à en faire est de prendre l'image binaire d'une disquette. Par image binaire, on entend habituellement recopier dans un fichier le contenu exact de la disquette, sans tenir compte de la manière dont elle est structurée ou formatée, sans savoir si elle contient ou non des fichiers. La commande est généralement:

# dd if=/dev/fd0 of=image.bin


Ceci provoque la lecture par dd de tout ce qui se trouve derrière /dev/fd0 (qui correspond au premier lecteur de disquette), sans opérer un quelconque montage de système de fichiers. L'écriture se fait dans le fichier image.bin dans le répertoire courant. Le fichier obtenu sera de la taille de la disquette en tant que support "brut", c'est-à-dire, légèrement supérieure à l'espace normalement disponible sur une disquette.

Particulièrement utile lorsque l'on souhaite copier une disquette sans s'occuper du type des fichiers qui y sont inclus ou bien lorsque le système de fichiers qu'elle contient ne peut être reconnu.

Les paramètres de dd les plus utilisés sont:

--help → Donne un cours message d'aide;

--version → Donne la version de dd installée;

if=file → Pour "input file" (fichier d'entrée). Indique la source que dd doit utiliser. Par défaut, c'est l'entrée standard, i.e le clavier.

of=file → Pour "output file" (fichier de sortie). Indique vers quoi dd doit inscrire les octets qu'elle a lue. Par défaut, c'est la sortie standard, i.e. l'écran.

ibs=bytes → Pour utiliser une lecture par blocs d'octets. Indiquer la taille des blocs (en nombre d'octets à lire en une seule fois).

obs=bytes → Pour utiliser une écriture par blocs d'octets. Indiquer la taille des blocs (en nombre d'octets à écrire en une seule fois).

bs=bytes → Combine les deux paramètres précédents, si l'on veut des blocs de même taille en lecture et en écriture.

skip=blocks → Indique combien de blocs il faut "sauter" avant de commencer à lire. La taille en octets de ces blocs est définie par ibs ou bs.

seek=blocks → Indique combien de blocs il faut "sauter" avant de commencer à écrire. La taille en octets de ces blocs est définie par obs ou bs.

count=blocks → Indique combien de blocs il faut lire. Par défaut, dd lit tous les blocs qu'elle trouve.


Donnons quelques exemples, pour éclairer un peu tout cela.

La commande suivante sauvegarde la "Table des Partitions" du premier disque dur IDE (cette table se trouvant dans le premier secteur physique du disque). La sauvegarde se fait dans le fichier partitions.img:

# dd if=/dev/hda of=partitions.img bs=512 count=1


Le fichier résultant a une taille d'exactement 512 octets qui est la taille normale d'un secteur de disque. La "Table des Partitions" pourra par la suite être restaurée avec:

# dd if=partitions.img of=/dev/hda

Les spécifications de taille sont superflues dans cette dernière commande.


Système de fichiers de Linux: mke2fs, ext2fsck

Il en est de Linux comme des autres systèmes. Pour qu'une partition puisse être utilisée avec le système de fichiers propre à Linux, il est nécessaire de la préparer. De plus, avec le temps, de petites erreurs ou incohérences peuvent se glisser dans la structure du système de fichier. Il est donc nécessaire de le vérifier régulièrement et éventuellement de corriger.


La commande mke2fs

Cette commande est utilisée pour créer un système de fichiers (vide, sans aucune information à l'intérieur) sur un disque ou une partition. Elle possède de nombreuses options, nous n'évoquerons ici que les plus fréquemment utilisées.

Son format complet est:

mke2fs [ -c | -l filename ] [ -b block-size ] [ -f fragment-size ] [ -i bytes-per-inode ] [ -N number-of-inodes ] [ -m reserved-blocks-percentage ] [ -o creator-os ] [ -q ]  [ -r fs-revision-level ] [ -R raid_options ] [ -s sparse-super-flag ] [ -v ] [ -F ] [ -L volume-label ] [ -M last- mounted-directory ] [ -S ] [ -V ] device [ blocks-count ]


Quelques options

-c → Recherche les blocs physiquement défectueux lors du formatage.

-i bytes-per-inode → Nombre d'octets dans chaque i-node. Doit être un multiple de 1024 (1 kilo-octet) et par défaut vaut 4096. Si vous estimez que le disque va contenir beaucoup de petits fichiers, une valeur de 2048 est un bon compromis. Par contre, si vous pensez stocker principalement de gros fichiers, préférez des valeurs de 8192, voire davantage.

-m reserved... → Pourcentage de blocs réservés pour le super-utilisateur (root), par défaut 5%. Pour une partition destinée uniquement au stockage de données, vous pouvez réduire ce nombre pour gagner un peu d'espace (mais ne le fixer jamais à zéro).

-v → Mode verbeux. Affiche des informations lors de l'exécution.

-L volume-label → Permet d'affecter un nom au disque ou à la partition (ce qui est rarement utile...).

Par exemple, vous voulez préparer une disquette pour être utilisée par Linux (attention, elle ne sera plus lisible par d'autres systèmes!), exécutez alors simplement:

# mke2fs /dev/fd0


Pour formater une partition /dev/sdb7 destinée à recevoir des fichiers de grandes tailles et nommée BigDatas (avec détails des opérations):

# mke2fs -i 8192 -m 1 -v -L BigDatas /dev/sdb7


La commande e2fsck

Il est nécessaire de vérifier de temps à autre la cohérence d'un système de fichiers (en général, se fait automatiquement à intervalles réguliers lors du démarrage du système). Cette commande permet également de réparer (dans une certaine mesure) un système de fichiers endommagé. Ce qui peut survenir lors d'un plantage du système ou de son arrêt intempestif.

Son format complet est:

e2fsck [ -pacnyrdfvstFSV ] [ -b superblock ] 
[ -B block- size ] [ -l|-L bad_blocks_file ] [ -C fd ] device


Quelques options

-b superblock → Permet d'utiliser un autre superblock que la normale. Peut aider dans certains cas. En général, des copies du superblock se trouve dans les blocs 8193, 16385, et ainsi de suite.

-c → Recherche des secteurs physiquement défectueux sur le disque.

-f → Force l'exécution, même si le système de fichiers semble correct.

-p → Réparation automatique.

-v → Mode verbeux. Affichage d'informations lors de l'exécution.

Il est fréquent, à la suite d'un plantage de la machine, que lors du démarrage, le processus d'initialisation s'interrompe pour vous signaler qu'un système de fichiers devant être monté (par exemple, /dev/hda5) est probablement défectueux. Il vous est alors demandé d'entrer le mot de passe root puis, d'exécuter e2fsk manuellement (attention, il est possible que votre clavier soit configuré en clavier américain). Si l'arrêt intempestif de la machine est survenu lors d'une très faible activité du disque, la première commande à utiliser est alors:

# e2fsck -f /dev/hda5


Si par contre, le disque connaissait une activité intense, il est probable que le superblock principal soit défectueux. Utilisez alors plutôt:

# e2fsck -f -b 8193 /dev/hda5


Dans ce cas, vous pouvez également utiliser l'option -c si vous craignez pour l'intégrité physique du disque. L'exécution prend beaucoup plus de temps...

Il peut arriver, dans certains cas, que e2fsck ne parvienne pas à corriger certaines erreurs parce que trop complexes ou trop nombreuses. Utilisez alors la combinaison de la dernière chance:

# mke2fs -S /dev/hda5
# e2fsck -f /dev/hda5


Mais inutile de vous dire que dans ce cas, il n'est pas garanti que vous puissiez récupérer toutes vos données... Il est toutefois très rare d'en arriver à cette extrémité.


Chercher un fichier dans l'arborescence: find

La commande find est utilisée pour rechercher des fichiers dans une arborescence selon un ou plusieurs critères et éventuellement d'effectuer une action sur les fichiers qui correspondent aux critères donnés. Cette commande est particulièrement riche et complexe à utiliser aussi, n'en donnerons-nous ici qu'un aperçu général. Pour plus de détails, consultez la page man associée.

La forme générale est:

find [chemins] [critères] [actions]


chemins désigne une liste de répertoires à utiliser comme points de départ de la recherche. Si aucun n'est indiqué, le répertoire courant est considéré comme point de départ. Dans tous les cas, les éventuels sous-répertoires contenus dans le (ou les) point(s) de départ sont également parcourus pour la recherche.

critères est une succession de conditions que les fichiers doivent satisfaire pour être retenus. Citons les plus utilisés:

-name modèle → donne un modèle pour le nom des fichiers. Il est possible d'utiliser les caractères jokers * et ? dans le modèle mais, dans ce cas, n'oubliez pas les guillemets;

-iname modèle → identique à -name mais, sans tenir compte de la casse des lettres (c'est-à-dire ne différencie pas les majuscules des minuscules);

-atime +n|-n|n → recherche les fichiers dont le dernier accès remonte à plus de, moins de, ou exactement n jours (n'utilisez que l'une des trois formes);

-mtime +n|-n|n → même chose mais, concernant la dernière modification plutôt qu'un simple accès au fichier.

-mount → restreint la recherche au même système de fichier que le point de départ;

-user nom → recherche les fichiers appartenant à l'utilisateur dont on donne le nom utilisé pour la connexion;


Enfin, actions est une série d'actions à effectuer sur les fichiers qui répondent aux critères donnés. Si aucune action n'est précisée, find affiche simplement le nom du fichier assorti de son chemin absolu complet. Citons:

-print → c'est l'action par défaut décrite plus haut;

-exec <command> {} \; → exécute la commande <commande> chaque fois qu'un fichier répondant aux critères est trouvé. Ce peut être gzip, rm, more, etc. La paire d'accolades ("{ }") symbolise le nom du fichier. N'oubliez pas le "\;" à la fin;

-ok <command> {} \; → même chose que -exec mais, avec une demande de confirmation avant d'exécuter la commande.


Donnons quelques exemples:

  • Obtenir la liste des fichiers ayant l'extension .lyx dans les répertoires Travail et Ecriture:
# find Travail Ecriture -name *.lyx


  • Trouver tous les fichiers core à partir du répertoire courant et les efface sans confirmation:
# find -name core -exec rm {} \;


  • Trouver tous les fichiers modifiés depuis les deux derniers jours:
# find / -mtime -2 


Manipulations sur les processus: ps, kill

Nous avons vu en début d'ouvrage, la notion de processus (voir le paragraphe #Programme, processus, logiciel & Co). Les deux commandes présentées ici permettent de les manipuler.


La commande ps

Elle permet d'obtenir des informations concernant les processus en cours d'exécution. Son format est:

ps [options]


Sans options, ps liste simplement les processus lancés par vous depuis votre connexion au système.

Les options reconnues par ps sont nombreuses, nous n'évoquerons ici que les plus courantes.

a → Liste tous les processus.

e → Inclue les variables d'environnement dans la description d'un processus.

f → Fait apparaître l'arborescence des processus.

l → Affichage long.

x → Affiche également les processus qui ne sont pas associés à une console particulière (c'est généralement le cas pour les daemons ou les programmes fonctionnant sous interface graphique).


Prenons un exemple:

# ps xf
 PID  TTY  STAT  TIME  COMMAND
 708   ?    S    0:12  /usr/X11R6/bin/wmaker
 720   ?    SN   0:00  perl ./build_signature
 741   ?    S    0:00  wmclock -shape
 742   ?    S    0:02  kvt -T K Virtual Terminal
 745 ttyp1  S    0:00  \_ bash
1003 ttyp1  S    0:01     \_ kscd
6533 ttyp1  R    0:00     \_ ps xf
 953   ?    S    0:19  lyx


On voit ici plusieurs processus n'ayant pas de console associée (colonne TTY) et l'arborescence nous montre, par exemple, que le processus kvt (de PID 742) a donné naissance au processus bash qui, lui-même, a créé les processus kscd et ps (il est normal que ps apparaisse dans la liste qu'il affiche. Après tout, lors de son exécution, c'est également un processus!).

Naturellement, tous les processus du système n'apparaissent pas ici. Le sens des colonnes est le suivant:

PRI → Priorité du processus. Un nombre élevé indique une priorité faible (n'apparaît pas dans l'encadré ci-dessus).

PID → Numéro unique affecté au processus par le système.

STAT → État du processus:

R → en cours d'exécution;

T → arrêté;

D → inactif et ne pouvant être interrompu;

S → inactif (sleep - endormi);

Z → zombie;

N → Valeur "nice" positive, c'est-à-dire processus a très faible priorité. (n'apparaît pas dans l'encadré ci-dessus).

TTY → Console associée au processus.

TIME → Temps accordé au processus sur le système, en heures et minutes.


Il existe d'autres colonnes, qui ne sont pas affichées ici. Consultez la (longue) page man de ps pour plus de détails.

Une utilisation fréquente de ps est de filtrer sa sortie avec un grep. Par exemple, si nous voulons obtenir tous les processus résultant de l'exécution du programme httpd, nous pourrions utiliser:

# ps ax | grep httpd


Résultat:

 617   ?    S  0:00 httpd
 620   ?    S  0:00 httpd
 621   ?    S  0:00 httpd
 622   ?    S  0:00 httpd
 623   ?    S  0:00 httpd
6557 ttyp1  S  0:00 grep httpd


Le programme httpd a donc été ici lancé cinq fois.

ps nous permet donc d'obtenir des informations sur les processus. Voyons maintenant comment agir sur eux.


La commande kill

Elle permet d'envoyer des signaux aux processus. Le mécanisme des signaux est un des aspects fondamentaux du fonctionnement d'un système de type Unix. Il s'agit simplement d'attirer l'attention d'un processus et de lui donner un nombre. Selon la valeur de ce nombre, le processus réagi en conséquence si une procédure prévue pour ce signal est prévue. Les processus peuvent en effet tout simplement ignorer les signaux qu'ils reçoivent, sauf quelques-un.

Ce mécanisme peut paraître extrêmement simpliste, mais il est très utilisé dans la communication entre processus. Ceux-ci ont rarement beaucoup de choses à se raconter et un simple nombre est souvent suffisant.

Le format de kill est:

kill [-l | -nombre] PID


L'option -l donne une liste de signaux prédéfinis. Cette liste donne le numéro du signal, ainsi que le mot équivalent pouvant être utilisé à la place du nombre.

Notez qu'il est toujours nécessaire de donner le numéro du processus (obtenu avec p, colonne PID) auquel s'adresse le signal.


Quelques signaux très utilisés

-1 ou -SIGHUP → Demande au processus de se "ré-initialiser", c'est-à-dire, en quelque sorte, de reprendre son exécution depuis le début. Utilisé essentiellement sur les daemons pour leur faire prendre en compte des modifications dans certains fichiers de configuration.

-15 ou -SIGTERM → Demande au processus de terminer son exécution, en exécutant immédiatement le code prévu à cet effet. C'est une manière "douce" de terminer un processus qui semble ne plus répondre.

-9 ou -SIGKILL → Ce signal ne peut être ignoré, que le processus ait prévu ou non une réponse. L'éventuel code de terminaison est exécuté si possible, puis le processus est vidé de la mémoire. C'est la manière "forte" pour faire disparaître un processus particulièrement récalcitrant.

Voici un exemple amusant. Connectez-vous au système sur une console texte quelconque, puis exécutez ps:

...
  PID TTY        TIME    CMD
 6585 tty2     00:00:00  bash
 6605 tty2     00:00:00  ps
...


Le shell actif est le shell bash. Envoyons-lui un signal avec:

# kill -15 6585


Rien ne se passe... parce que le bash en question est le shell principal de la connexion. Il ignore donc le signal 15 (SIGTERM). Soyons plus énergique:

# kill -9 6585


Cette fois, vous vous retrouvez devant l'écran de connexion comme si vous vous étiez déconnecté! La commande précédente "tue" littéralement le processus bash et comme c'était le processus qui vous permettait d'utiliser le système, vous vous trouvez déconnecté. Les deux prochaines commandes sont parfaitement équivalentes à celles-ci:

# kill -SIGTERM 6585
# kill -SIGKILL 6585


Prenez garde en utilisant les signaux (surtout le SIGKILL), vous pourriez être obligé de redémarrer votre machine...

Pour conclure, sachez également que, normalement, un utilisateur ne peut pas faire ainsi disparaître les processus d'autres utilisateurs (sauf bien sur, l'utilisateur root, qui a tous les droits...).


Partitionnement du disque: fdisk

Ce petit utilitaire vous permet de manipuler les partitions d'un disque dur. De nombreux autres utilitaires du même genre existent, souvent, plus agréables à utiliser. Mais, fdisk est le seul qui soit (normalement) toujours disponible et suffisamment peu exigeant pour fonctionner dans pratiquement n'importe quelle situation. Si vous n'êtes pas familier des notions relatives aux partitions des disques, consultez le paragraphe #Partition des disques durs.

Le format de la commande pour l'appeler est:

fdisk [-l | -s partition] [disque]


Les options

-l → donne une liste des partitions des différents disques, attachés au système, avec leurs caractéristiques (cylindres de début et de fin, taille, type de système de fichiers...), par exemple:

# fdisk -l
Disk /dev/hda: 128 heads, 63 sectors, 621 cylinders
Units = cylinders of 8064 * 512 bytes 

   Device Boot    Start       End    Blocks   Id  System
/dev/hda1             1       130    524128+   b  Win95 FAT32
/dev/hda2   *       131       131      4032    a  OS/2 Boot Manager
/dev/hda3           132       620   1971648    5  Extended
/dev/hda5           132       261    524128+   b  Win95 FAT32
/dev/hda6           262       294    133024+  82  Linux swap
/dev/hda7           295       620   1314400+  83  Linux

Disk /dev/hdb: 255 heads, 63 sectors, 527 cylinders
Units = cylinders of 16065 * 512 bytes

   Device Boot    Start       End    Blocks   Id  System
/dev/hdb1             1       527   4233096    5  Extended
/dev/hdb5             1        66    530082   83  Linux
/dev/hdb6            67        83    136521   82  Linux swap
/dev/hdb7            84       181    787153+  83  Linux
/dev/hdb8           182       245    514048+  83  Linux
/dev/hdb9           246       309    514048+  83  Linux
/dev/hdb10          310       342    265041   83  Linux
/dev/hdb11          343       424    658633+  83  Linux
/dev/hdb12          425       527    827316   83  Linux


Cet exemple montre la présence de deux disques durs sur le premier port IDE. La colonne Id est celle du code du type de système de fichiers présent sur la partition. La colonne Boot indique si la partition est celle utilisée lors du démarrage du système, ici /dev/hda2. Remarquez que les tailles sont données en kilo-octets.

-s partition → donne la taille de la partition donnée, par exemple pour un SME:

# fdisk -s /dev/md0
255936


disque → indique le disque dont on veut manipuler les partitions dans le mode interactif.

Le mode d'utilisation courant de fdisk est le mode interactif, si ni -l ni -s n'est donné. C'est-à-dire que le programme se comporte un peu comme un shell (en beaucoup plus simple), attendant que vous entriez une commande au clavier suivie de [Entrée]. Ces commandes sont de deux catégories: celles un peu dangereuses et celles très dangereuses. Citons les plus utilisées (mais il en existe de nombreuses autres):

m → affiche une liste des commandes disponibles.

p → affiche la liste des partitions avec leurs caractéristiques. Utilisez fréquemment cette commande, les numéros de partition peuvent varier au cours des manipulations.

d → supprime une partition dont on donne le numéro. Vous ne pouvez normalement pas supprimer une partition étendue si celle-ci contient encore des partitions logiques.

n → créé une nouvelle partition. Le programme vous demande d'abord quel type de partition vous voulez: primaire p, étendue e ou logique l. Vous devez créer une partition étendue avant de pouvoir créer des partitions logiques. Par ailleurs, notez bien que vous ne pouvez créer qu'une seule partition étendue (mais qui peut contenir presque autant de partitions logiques que vous voulez).

Ensuite, vous est demandé le numéro de la partition. Rappelez-vous que Linux numérote les partitions primaires de 1 à 4 et les partitions étendues toujours à partir de 5.

Il vous faut maintenant donner le premier cylindre de la partition dans l'intervalle qui vous est proposé. Entrez la plus petite valeur, bien souvent, elle convient parfaitement. Puis le dernier cylindre. Il est souvent plus commode de donner la taille désirée de la partition. Par exemple, pour créer une partition de 327 Mo, entrez +327M. Vous remarquerez peut-être un léger décalage entre les tailles demandées et les tailles réelles. Ceci vient de l'obligation de borner les partitions selon les limites de cylindres et il est probable que la taille que vous avez demandée ne soit pas un multiple de la taille d'un cylindre.

t → Par défaut, toute partition créée (sauf les partitions étendues, bien sûr) est marquée comme contenant le système de fichiers Ext2Fs, le système de fichiers de Linux. Cette commande permet de modifier cela. Le programme demande d'abord le numéro de la partition, puis le code du système de fichier voulu. Entrez l pour obtenir une liste des codes connus.

w → inscrit les changements sur le disque et quitte le programme. Si vous manipulez des partitions de type MS-DOS FAT16 ou FAT32, il est possible qu'un message d'erreur survienne lorsque le programme se termine. Il suffit normalement de redémarrer la machine pour que les changements soient correctement pris en compte.

q → quitte fdisk sans enregistrer les changements sur le disque.

Gardez toujours présent à l'esprit que les manipulations des tables de partitions sont des opérations particulièrement sensibles. Prenez donc toujours garde à ce que vous faites.

Par ailleurs, il est déconseillé (bien que cela soit possible) d'utiliser fdisk pour manipuler des partitions autres que celles devant êtres utilisées exclusivement par Linux (ceci concerne notamment les partitions DOS/Windows). Mieux vaut utiliser le programme de partitionnement spécifique de l'autre système que vous utilisez. Dans le même ordre d'idée, essayez de faire en sorte que les partitions soient numérotées "dans l'ordre". Par exemple, fdisk vous permet d'insérer (s'il y a de la place) la partition n° 7 entre les partitions 5 et 6, en jouant sur le numéro de premier cylindre. Il faut absolument l'éviter, cela ne pose pas de problème à Linux, mais c'est loin d'être le cas de tous les systèmes. Donc faites attention si vous utilisez un autre système d'exploitation que Linux sur votre machine.

Enfin, vous aurez remarqué l'absence de commande pour déplacer ou changer la taille d'une partition. fdisk ne permet pas ces opérations. Vous devez détruire une partition pour, par exemple, réduire sa taille; ce qui équivaut à perdre toutes les données qu'elle contient...

Dans tous les cas, la prudence recommande de sauvegarder vos données avant d'utiliser fdisk.


fdisk pour un système SME

# fdisk -l
Disque /dev/sda: 8589 Mo, 8589934592 octets
255 têtes, 63 secteurs/piste, 1044 cylindres
Unités = cylindres de 16065 * 512 = 8225280 octets
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Identifiant de disque: 0x00084ef9

Périphérique Amorce  Début        Fin      Blocs     Id  Système
/dev/sda1   *           1          32      256000   fd  Linux raid autodetect
La partition 1 ne se termine pas sur une frontière de cylindre.
/dev/sda2              32        1045     8131584   fd  Linux raid autodetect

Disque /dev/md1: 8322 Mo, 8322547712 octets
2 têtes, 4 secteurs/piste, 2031872 cylindres
Unités = cylindres de 8 * 512 = 4096 octets
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Identifiant de disque: 0x00000000

Disque /dev/mapper/main-root: 7461 Mo, 7461666816 octets
255 têtes, 63 secteurs/piste, 907 cylindres
Unités = cylindres de 16065 * 512 = 8225280 octets
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Identifiant de disque: 0x00000000

Disque /dev/mapper/main-swap: 855 Mo, 855638016 octets
255 têtes, 63 secteurs/piste, 104 cylindres
Unités = cylindres de 16065 * 512 = 8225280 octets
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Identifiant de disque: 0x00000000

Disque /dev/md0: 262 Mo, 262078464 octets
2 têtes, 4 secteurs/piste, 63984 cylindres
Unités = cylindres de 8 * 512 = 4096 octets
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Identifiant de disque: 0x00000000


Quincaillerie TCP/IP

Matériel

Le périphérique le plus courant sur PC pour construire un réseau local est la carte éthernet. Il en existe de nombreux modèles, de plusieurs fabricants, mais elles répondent toutes à la même norme IEEE 802.3 et sont (presque) toutes capables de communiquer entre elles.

Éthernet est un réseau " démocratique " dans le sens où il n'y a pas de machine centrale: la gestion du réseau est partagée à égalité entre tous les ordinateurs qui y sont connectés. Ce principe présente des avantages et des inconvénients, mais dans l'ensemble il a fait ses preuves.


Connexion interne

Physiquement, une carte éthernet se présente comme une carte d'extension standard, à insérer dans une fente libre du PC. Il existe des modèles pour les bus ISA 8 bits, ISA 16 bits, et PCI. Les cartes communiquent avec la machine par une ligne d'IRQ, une adresse de base ioport et éventuellement un canal DMA. Ces 3 caractéristiques peuvent être fixées par le constructeur ou configurables par l'utilisateur. Dans ce dernier cas, la configuration peut se faire soit par logiciel, soit par la manipulation de "cavaliers" (jumpers) sur la carte.


10 Base-T

Cette norme utilise de la paire torsadée, comme le fil de téléphone. Le connecteur (RJ45) est aussi semblable aux connecteurs téléphoniques modernes.

Les différentes cartes éthernet sont toutes reliées à un boîtier électronique central, appelé répartiteur (hub en anglais). C'est ce répartiteur qui s'occupe de commuter les signaux entre les différents câbles qui lui arrivent. En fait, si le réseau est gros, les ordinateurs ne sont pas tous reliés au même répartiteur. Chaque répartiteur accepte un certain nombre de connexions directes (typiquement, entre 4 et 16), mais peut être en plus relié lui-même à d'autres répartiteurs.

Figure 11: Câble RJ45.

Figure 12: Carte réseau.

Figure 13: Répartiteur.


Les adresses éthernet

Chaque carte éthernet est identifiée par une adresse unique, fixée par le constructeur et inscrite "en dur" sur la carte, appelée adresse MAC[25].

Cette adresse a une taille de 6 octets, généralement donnée sous forme hexadécimale, les octets étant séparés par des doubles points. Par exemple, 00:00:C0:CE:7F:2E est l'adresse d'une carte éthernet, de marque Western Digital, modèle WD8003. Les trois premiers octets identifient le fabricant, les trois derniers identifient le modèle et le numéro "de série".

Si votre carte éthernet est détectée au démarrage de Linux (ce qui est généralement le cas), vous pourrez voir cette adresse dans les messages de démarrage. Voici par exemple un extrait des messages de démarrage d'un PC (obtenu par la commande dmesg):

[...]
PPP line discipline registered. 
wd.c:v1.10 9/23/94 Donald Becker (becker@cesdis.gsfc.nasa.gov) 
eth0: WD80x3 at 0x300, 00 00 C0 CE 7F 2E WD8003, IRQ 5, shared memory at 0xd8000-0xd9fff. 
Partition check:
[...]


eth0 désigne la première interface éthernet, correspondant à la première carte reconnue. WD8003 est le nom de modèle, les autres informations sont des indications sur l'interface de communication avec le microprocesseur utilisé.

L'adresse matérielle permet au protocole éthernet de délivrer un message à son destinataire. Ce dernier connaît de la même façon l'adresse MAC de l'expéditeur.

Nous ne nous étendrons pas plus sur le protocole éthernet, qui dépasse largement le cadre de ce document.


Configuration d'une carte éthernet

La configuration d'une carte éthernet est généralement simple. Soit la carte est détectée au démarrage, (dans le noyau ou en module) et vous n'avez rien à faire, soit elle n'est pas supportée par Linux (très rare) et vous n'avez plus qu'à changer de carte!

En général, les distributions modernes (Debian, RedHat et dérivées, SuSE...) reconnaissent les cartes éthernet les plus courantes à l'installation et installent le noyau ou les modules nécessaires.


Introduction aux réseaux IP

   À consulter en cas de problèmes de communication seulement.

Référence: http://www.linux-france.org/article/formation/net.html par Vincent Defert - 28 Nov. 1998.


Introduction

Un réseau est un ensemble de dispositifs matériels et logiciels permettant à 2 machines ou plus de communiquer. Pour mettre en évidence les concepts importants, on peut utiliser l'analogie avec la vie quotidienne.

Imaginez que vous (M. Dupond) ayez un client (M. Schmidt) au téléphone. Celui-ci vous soumet un problème délicat. Vous attirez l'attention de votre collègue (M. Jones) et lui griffonnez quelques mots sur un bout de papier. M. Jones réfléchit un instant et vous griffonne sa réponse.

MM. Dupond, Schmidt et Jones représentent les machines connectées. Ces personnes sont reliées par 2 réseaux ("Liaison téléphonique" et "Liaison visuelle") auxquels ils sont reliés par 2 types d'interfaces ("Combiné téléphonique" et "Papier + Crayon"). M. Dupond, qui possède les 2 types d'interfaces, permet d'établir une communication entre M. Schmidt et M. Jones: il sert de passerelle entre les 2 réseaux. Enfin, chaque personne parle pendant un temps puis attend une réponse de son interlocuteur. Ils communiquent en échangeant des paquets d'informations.

A la lumière de cet exemple, on peut donc formuler ainsi les définitions des mots importants:

  • Réseau → Support permettant les échanges. Ce terme générique peut aussi bien désigner un câble reliant 2 machines qu'une ligne spécialisée (dont l'autre extrémité est reliée à une installation complexe, mais qui est vue comme un support ordinaire du point de vue d'une interface).
    Le terme de réseau désigne aussi la totalité de l'installation (machines, interfaces et câblage). Le contexte permet de distinguer facilement le sens dans lequel il doit être compris.
  • Interface → Dispositif assurant la connexion de la machine à un réseau. Les interfaces utilisées avec les réseaux informatiques sont les cartes réseaux, les modems et les ports parallèles.
  • Routeur → Machine assurant l'interconnexion de plusieurs réseaux. On parle aussi de passerelle (en anglais: "router" et "gateway"). Il peut s'agit d'une machine du réseau dans laquelle on a installé plusieurs interfaces ou d'un appareil spécialisé n'assurant que cette fonction.
  • Paquet → Unité de transport d'information.
  • Protocole → Ensemble de règles régissant les échanges d'informations.
  • Adresse → Identification des éléments intervenant dans la communication (interfaces et réseaux). L'analogie postale est particulièrement bonne: le nom de la rue correspond à l'adresse de réseau et le numéro de la maison à l'adresse de l'interface.


Réseaux IP

Les réseaux IP sont caractérisés par leur indépendance par rapport au matériel et par la possibilité d'établir une communication entre 2 machines situées sur des réseaux différents (on dit que c'est un protocole "routable"). Ces avantages découlent du mode d'adressage choisi. On affecte à chaque interface une adresse logique découlant de l'adresse du réseau auquel elle est connectée.

On fait ainsi d'une pierre 2 coups. Puisqu'il s'agit d'une adresse logique, on peut facilement faire évoluer le matériel (il suffit de donner à la nouvelle machine l'adresse de l'ancienne) et puisqu'elle découle de l'adresse du réseau auquel elle est reliée, il est facile de détecter si la machine à laquelle on veut envoyer des données est sur le même réseau ou non (auquel cas on doit passer par un routeur).

Prenons un exemple simple:

Figure 14: Exemple de réseau.


Réseau local isolé

host1 et host2 sont les noms des machines, eth0 le nom des interfaces, et mynet le nom du réseau (on peut aussi l'appeler "mon petit réseau local"; ça n'a aucune importance si ce n'est faciliter les conversations entre humains).

On a donc commencé par choisir une adresse de réseau: 192.168.0.0 (nous verrons plus loin pourquoi). Ensuite, on affecte une adresse logique à chacune des interfaces qui y est reliée, l'adresse de l'interface découlant de celle du réseau: 192.168.0.1, 192.168.0.2, etc.

Les adresses IP sont des nombres codés sur 32 bits. Par commodité, on les représente en décimal sous la forme de 4 nombres (de 0 à 255 chacun) séparés par des points ("dotted quad" en anglais).

Nous avons vu que l'adresse d'une interface découle de celle du réseau. La relation entre les 2 consiste à "couper" l'adresse en 2 parties. Les bits situés à gauche du point de coupure constituent la partie fixe (l'adresse du réseau) et ceux situés à droite sont disponibles pour numéroter les interfaces. L'adresse du réseau a donc tous les bits de la partie variable à 0. L'adresse dont tous les bits de la partie variable sont à 1 est réservée.

D'un point de vue arithmétique, on peut donc considérer que l'adresse de réseau peut être déterminée à partir de l'adresse d'une interface en faisant un ET logique entre l'adresse de l'interface et un nombre dont tous les bits de la partie fixe sont à 1 et ceux de la partie variable sont à zéro. Ce nombre est appelé masque de réseau (netmask en anglais). Le netmask est représenté sous forme de dotted quad, comme les adresses.

Selon la valeur de l'adresse IP, on distingue plusieurs classes de réseaux (correspondant à la position du point de coupure). Ces classes sont simplement des conventions destinées à faciliter l'attribution des plages d'adresses.

  • Classe A: le bit de poids le plus fort est à 0. Le netmask correspondant est 255.0.0.0. Les réseaux 0.0.0.0 et 127.0.0.0 étant réservés, la classe A correspond donc à 126 réseaux de 16 millions de machines.
  • Classe B: le bit de poids le plus fort est à 1, le suivant à 0. Son netmask est 255.255.0.0. Elle comporte donc environ 16000 réseaux de plus de 65534 machines.
  • Classe C: les 2 bits de poids le plus fort sont à 1, le suivant à 0. Le netmask est 255.255.255.0 et on a 2 millions de réseaux de 254 machines.


Il existe d'autres classes spéciales ou expérimentales sur lesquelles nous ne nous étendrons pas. Enfin, il est possible de créer des sous-réseaux à partir d'une plage d'adresses donnée en utilisant un netmask comportant plus de bits à 1 que le netmask conventionnel. Nous reviendrons sur ce point par la suite.

Remarque: Pour indiquer une adresse de réseau et son netmask, on utilise souvent une notation consistant à faire suivre l'adresse d'un slash ("/") et du nombre de bits à un dans le netmask. Exemples:

  • Adresse 192.168.12.0 - netmask 255.255.255.0 => 192.168.12.0/24
  • Adresse 10.0.0.0 - netmask 255.0.0.0 => 10.0.0.0/8
  • Adresse 10.0.0.0 - netmask 255.192.0.0 => 10.0.0.0/10
  • Adresse 172.16.128.0 - netmask 255.255.128.0 => 172.16.128.0/17


Dans le cas d'un réseau local privé, on peut choisir n'importe quelle adresse. Dans le cas d'un réseau local connecté à Internet, votre fournisseur de connectivité IP vous indique la plage d'adresses qui vous a été allouée.

Certains numéros de réseaux ont été réservés pour les réseaux locaux privés (RFC 1597):

  • Classe A: 10.0.0.0 (1 réseau)
  • Classe B: 172.16.0.0 à 172.31.0.0 (16 réseaux)
  • Classe C: 192.168.0.0 à 192.168.255.0 (256 réseaux)


Pour en finir avec les adresses réservées, signalons encore 2 cas: l'adresse de loopback et les adresses de broadcast.

L'adresse de loopback (127.0.0.1) correspond à une interface fictive présente sur toutes les machines, l'interface de loopback (lo ou lo0). Elle permet à la machine de s'envoyer à elle-même des paquets. Ça a peut être l'air bête, mais c'est très utile. On peut ainsi utiliser des applications réseau sans disposer d'interface physique ou sans qu'elle soit reliée au réseau. On peut par exemple, installer les programmes client et serveur d'une application dans la même machine pour aller faire une démonstration chez un (futur) client ou encore travailler chez-soi à la conception d'un site Internet, etc.

L'adresse de broadcast associée à un réseau correspond à une partie machine dont tous les bits sont à 1. Elle sert en particulier à déterminer quelle adresse physique correspond à une adresse IP donnée. Une requête envoyée à l'adresse de broadcast est reçue par toutes les machines, mais seule celle dont l'interface correspond à l'adresse demandée répond.

La question de l'adressage ayant été suffisamment traitée pour le moment, reste à aborder celle de la communication. Communiquer, c'est échanger des informations. Les règles régissant ces échanges sont appelées protocoles. Les principaux protocoles rencontrés avec les réseaux IP sont les suivants (liste loin d'être exhaustive).

Nom Description
IP (Internet Protocol) Échange de paquets entre nœuds
ICMP (Internet Control Message Protocol) Transmission de messages d'erreur et de contrôle entre machines et passerelles
ARP (Address Resolution Protocol) Correspondance entre adresse IP et adresse physique
RARP (Reverse Address Resolution Protocol) Correspondance entre adresse physique et adresse IP
TCP (Transmission Control Protocol) Transmission de données en mode connecté (mode "Stream")
UDP (User Datagram Protocol) Transmission de données sans connexion (mode "Datagram")
FTP (File Transfer Protocol) Services de haut niveau de transfert de fichiers
HTTP (HyperText Transfer Protocol) Serveurs Web
NNTP (Network News Transfer Protocol) Serveurs de News
SMTP (Simple Mail Transfer Protocol) Transmission de courrier électronique
POP (Post Office Protocol) Gestion de boîtes aux lettres électroniques
Telnet Échange de terminal


Cette liste permet de voir que les protocoles s'adressent à différents niveaux. Un programme de transfert de fichiers fournira une interface utilisateur au protocole FTP qui s'appuie lui même sur TCP, lequel utilise IP, ce dernier exploitant ARP et RARP. C'est pour cette raison qu'on parle souvent de la "pile TCP/IP" ou de la "suite de protocoles TCP/IP".

Les spécifications de ces protocoles sont appelées RFC (Request For Comments). On peut les trouver sur tous les grands sites FTP notamment: les sites universitaires, ceux des organismes de recherche et ceux des sociétés liées à l'internet. Exemples: ftp.lip6.fr, ftp.inria.fr, ftp.nic.fr.

Notez au passage que le terme "TCP/IP" est utilisé pour désigner des choses qui ne mettent pas nécessairement en œuvre le protocole TCP: "TCP/IP" est devenu un nom propre indépendant des abréviations qui le composent.

Supposons maintenant qu'une machine soit utilisée pour faire plusieurs choses (situation normale): serveurs Web, FTP, SMTP et POP. Cette machine n'a qu'une interface, donc qu'une adresse IP. Le problème qui se pose est de trouver un moyen d'indiquer à cette machine le programme auquel transmettre le paquet qu'on lui envoie.

La solution à ce problème est la notion de port. On affecte un numéro à chacun des services offerts par la machine (80 pour le serveur HTTP, 21 pour le serveur FTP, 25 pour le serveur SMTP et 110 pour le serveur POP).

Notez qu'on peut transmettre des données à un port selon 2 modes: connecté (TCP) ou non (UDP). Le mode connecté (ou mode Stream) garantit que les données seront reçues en totalité et dans l'ordre où elles ont été envoyées. Le mode non-connecté (ou mode Datagram) permet d'envoyer un message isolé sans garantie qu'il soit reçu.

Cette dernière définition peut surprendre, mais ce mode est très utile au cours d'un transfert de fichier (donc mode Stream); par exemple, on peut avoir besoin de transmettre un message d'alerte. On enverra alors cette information sous la forme d'un datagramme sur le même port (puisqu'il est destiné à la même application). Le programme de réception peut détecter l'arrivée de ces données "hors bande" et appeler la procédure adéquate sans interférer avec le transfert en cours (sauf s'il s'agit d'une demande d'interruption...). Si par malchance le message d'erreur n'était pas reçu, il pourrait être envoyé une seconde fois. L'absence de garantie d'acheminement n'est donc pas un handicap.


Le routage

Après avoir passé en revue les notions de base sur un exemple simple (réseau local isolé), nous sommes armés pour passer au cas de 2 réseaux locaux interconnectés. Cette situation se généralise dans le cas d'un réseau relié à l'Internet, c'est à dire à un nombre impressionnant d'autres réseaux. Nous parlerons aussi des connexions en "dial-up" (par modem).

Figure 15: Exemple de routage.


Réseaux locaux interconnectés

Pour permettre à 2 machines situées sur des réseaux différents, il est nécessaire d'établir une liaison entre ces 2 réseaux. La machine host01 remplit cette fonction de passerelle entre les 2 réseaux; elle dispose de 2 interfaces reliées chacune à un réseau. Il ne reste qu'à indiquer à la machine comment utiliser ces interfaces. C'est le rôle de la table de routage.

Chaque paquet émis possède une adresse de départ et une adresse d'arrivée. Lorsqu'une application envoie un paquet, la fonction système responsable de son acheminement parcoure la table de routage de la machine pour déterminer quelle interface elle devra utiliser.

Voici sous forme simplifiée les tables de routage des machines host01, host02 et host11.




La ligne des tables de routage de host02 et host11 dont l'adresse de destination est 0.0.0.0 correspond à la route par défaut, c'est à dire à l'interface à utiliser quand aucune des autres entrées de la table ne convient.

Supposons maintenant que host02 veuille envoyer un paquet à host11. L'adresse d'arrivée est donc 192.168.1.1. host02 parcoure chaque entrée de sa table de routage et vérifie si l'adresse d'arrivée remplit les conditions indiquées.

Sur la première ligne, il applique le masque 255.0.0.0 à 192.168.1.1 et trouve donc 192.0.0.0, alors que cette ligne est donnée pour 127.0.0.0. On passe donc à la suivante: 192.168.1.1 et 255.255.255.0 donne 192.168.1.0, ce qui ne correspond pas au 192.168.0.0 attendu. Il ne reste plus que la route par défaut: le paquet sera donc transmis à host01 (192.168.0.1).

Lorsque host01 reçoit ce paquet, il applique la même technique. Sur la première ligne, le résultat est identique au cas précédent. Sur la 2ème ligne, 192.168.1.1 et 255.255.255.0 donne 192.168.1.0, ce qui ne correspond pas au 192.168.0.0 attendu. Par contre, la condition de la 3ème ligne est satisfaite: le paquet sera donc transmis sur eth1 et reçu par host11.

Le routage ressemble à ces jeux éducatifs composés d'un ensemble de formes en plastique et d'une boîte comportant des trous appropriés. L'enfant doit essayer les différents trous jusqu'à ce qu'il trouve celui qui convient à la forme qu'il veut ranger dans la boîte. Moralité: TCP/IP, c'est enfantin!


Poste avec connexion dial-up

Le cas d'une connexion "dial-up" est intéressant parce qu'il met en œuvre la modification dynamique de la table de routage. Lorsque le modem établit la connexion avec son homologue à l'autre bout de la ligne téléphonique, une nouvelle interface ppp0 est créée et 2 entrées sont ajoutées à la table de routage (une vers le modem distant et une route par défaut).

Les différentes étapes sont les suivantes:

  • Le modem local numérote, le modem distant décroche et tous 2 négocient le protocole de communication (vitesse, compression, etc).
  • Une fois le lien physique établi, les machines négocient les paramètres du lien PPP. C'est à ce moment que l'interface associée au modem local est créée. La machine distante lui assigne alors une adresse IP et indique également l'adresse de la passerelle pour la route par défaut.
  • Lors de la déconnexion, les entrées ajoutées dans la table de routage sont supprimées, de même que l'interface ppp0.

Supposons par exemple que le modem local reçoive l'adresse 192.168.1.1 et que celle du modem distant soit 192.168.1.2, on aura alors les tables de routage suivantes:

Machine host01 non connectée

Machine host01 connectée


DNS (Domain Name System)

Jusqu'à maintenant, nous ne nous sommes occupés que des adresses des machines, mais dans la réalité on utilise leurs noms. Pour la plupart des gens, www.yahoo.fr est beaucoup plus facile à retenir que 195.67.49.44.

Toute machine peut utiliser un fichier local contenant la correspondance entre adresses IP et noms de machines. Le problème avec cette approche est qu'elle n'est valable que pour un réseau local qui ne change pas très souvent (car il faut alors mettre à jour les tables de toutes les machines!).

L'objet du Domain Name System est de fournir un moyen pour transformer les noms de machines en adresses IP à l'échelle planétaire. Le principe consiste à organiser les noms des machines de façon hiérarchique.

Ainsi, le nom www.yahoo.fr comporte 3 niveaux, lus de droite à gauche. Chaque niveau gère la totalité des niveaux immédiatement inférieurs. Un certain nombre de serveurs gèrent les domaines de premier niveau (ici: fr), ceux-ci déléguant à leur tour la gestion des niveaux inférieurs.

En résumé, les serveurs "racine" gèrent les domaines de plus haut niveau (com, fr, uk, etc), les Network Information Centers nationaux gérant tous les niveaux inférieurs (ex. le NIC France gère ibp.fr, gouv.fr, yahoo.fr, etc). Yahoo! France gère tous les noms se terminant par yahoo.fr, et ainsi de suite.

Lorsqu'une machine veut transformer un nom en adresse IP, elle fait appel à un serveur de noms qui se chargera d'exploiter toute l'arborescence de ses confrères pour obtenir le renseignement. Les serveurs de noms utilisent un "cache" pour éviter de déclencher une recherche à chaque demande.

Le système de délégation permet de résoudre le problème des mises à jour (à la durée de vie des informations copiées dans les caches près) et de laisser une totale liberté de gestion à chaque niveau.

Chaque serveur en charge d'un domaine doit être secondé par au moins un autre serveur. Ce sont les DNS secondaires, qui recopient à intervalles réguliers les données du serveur primaire et peuvent traiter les demandes en cas d'indisponibilité du serveur primaire.


Introduction à l'éditeur vi

Référence: http://www.iro.umontreal.ca/~dift3830/vi.html. (Dernière consultation, le 30 mai 2016. Novembre 2018, ce lien n'est plus fonctionnel.)

vi est un éditeur de texte très puissant. Sa convivialité par contre lui fait défaut. Ceci dit, il est toujours utile d'en connaître les rudiments, car son omniprésence est presque garantie sur les systèmes modernes.

La documentation de vi étant très abondante, on se limitera pour cette démo aux commandes les plus usuelles.

Tout d'abord l'invocation. On peut invoquer vi à partir du shell de plusieurs façons dont voici quelques-unes:

  • vi: ouvre vi avec un contenu vide.
  • vi nom_de_fichier: ouvre un fichier et l'affiche à l'écran.
  • vi +nom_de_fichier: ouvre un fichier et positionne le curseur à la fin de celui-ci.

Dès son invocation, vi se met en mode commande, dans ce mode il est possible d'entrer les commandes qui seront vues plus bas. Si on tape une commande susceptible de modifier un texte (insertion d'un caractère par exemple), vi bascule en mode édition; dans ce mode tous caractère tapé sera considéré comme faisant partie du texte, tandis que les caractères saisis en mode commande, seront eux interprétés comme étant des commandes et ne seront jamais rajoutés au texte.

Nous allons commencer par invoquer vi à partir du shell en tapant:

# vi

Ce qui devrait donner l'affichage ci-contre:

vi est déjà en mode commande, pour le faire passer en mode édition, on tapera la commande i (insert) qui nous permettra d'insérer du texte.

Afin de basculer du mode édition au mode commande il suffit de presser la touche [Échap].

Après avoir tapé le texte suivant:

vi est un éditeur de texte très

utile pour la communauté des
administrateurs.

On obtiendra l'affichage ci-contre.

Après cela, on pourrait passer en mode commande par simple pression sur la touche [Échap].

Une fois en mode commande, on voudrait par exemple, éliminer la ligne blanche qui se trouve juste après la première. Pour cela on positionne le curseur a la hauteur de la 2e ligne et on tape dd.

Ceci aura pour effet de supprimer la ligne.

Les commandes abondent dans vi, c'est pour cela qu'on n'en citera que quelques-unes.

Si on est satisfait, il ne nous reste plus qu'à sauvegarder le document sous le nom texte1.txt à l'aide de la commande suivante:

:w texte1.txt

(Pour les sauvegardes ultérieures, il n'est pas nécessaire d'ajouter le nom du fichier).

Afin de quitter vi il suffit de taper la commande:

:q texte1.txt


Commande Effets
i (insert) Insère un texte sur le curseur
I Insère au début de la ligne
a (append) Insère après le curseur
A Insère à la fin de la ligne
Les flèches pour les déplacements
Ctrl-F (forward) Défiler d'un écran vers le bas
Ctrl-B (backward) Défiler d'un écran vers le haut
nG (goto) va à la nième ligne dans le texte
G Va à la fin du texte
x Effacer le caractère courant
dd Effacer la ligne courante
D Effacer depuis la position du curseur jusqu'à la fin de la ligne
db(DeleteBegining) Effacer depuis la position courante jusqu'au début de la ligne
/chaîne rechercher la chaîne 'chaîne' dans le texte, on peut taper 'n' pour voir les autres occurrences
:w fichier copie le texte courant sur le disque sous le nom fichier
:wq (write & quit) écrit le fichier sur le disque et quitte vi.
:q! Quitter sans sauvegarder.
:set nu Affiche le numérotage des lignes.


   Victoire totale, hissons la bannière de la victoire.


  1. FQDN: Dans le DNS, un Fully Qualified Domain Name (FQDN, ou nom de domaine complètement qualifié) est un nom de domaine qui révèle la position absolue d'un nœud dans l'arborescence DNS en indiquant tous les domaines de niveau supérieur jusqu'à la racine. On parle également de domaine absolu, par opposition aux domaines relatifs. Par convention, le FQDN est ponctué par un point final.
    Référence: https://fr.wikipedia.org/wiki/Fully_qualified_domain_name.
  2. Pipe: En français, on parle de tubes.
  3. man: man-pages en anglais, "man" pour manual, manuel en français.
  4. pages: Liste extraite du Man-Pages mini-Howto.
  5. Identifiant ou Identificateur du Processus en français.
  6. daemon: De l'anglais daemon Disk and Execution Monitor. La traduction n'est peut-être pas très heureuse linguistiquement, mais elle correspond bien à l'idée.
  7. boot sector: en anglais. Rappelez-vous du terme boot (amorce ou démarrage), il revient fréquemment.
  8. Master Boot Record: à peu près enregistrement principal pour le démarrage, en français. On utilise plus volontiers le terme anglais ou l'abréviation MBR.
  9. RAM: Random Access Memory, mémoire à accès libre en lecture et écriture.
  10. virtuelle: swap memory en anglais.
  11. montage: action de monter: to mount, en anglais.
  12. démontage: démonter: to unmount, en anglais
  13. liens: link en anglais.
  14. symboliques: respectivement, hard links et symbolic links en anglais.
  15. mot de passe: password en anglais.
  16. répertoire personnel: home directory en anglais.
  17. super-utilisateur: super-user en anglais.
  18. runlevels: niveaux d'exécution, en français.
  19. champs: fields en anglais.
  20. De daemon (Disk and Execution Monitor) en anglais. En fait, services et démons sont deux choses différentes: le démon est le processus mémoire qui, par son exécution, rend un certain service (comme la gestion du courrier électronique). Mais la confusion est pour l'instant sans grande conséquence.
  21. S: pour start ou lancer/démarrer.
  22. K: pour kill ou arrêter.
  23. gzip: pour "GNU Zip", la version GNU de l'algorithme de compression de Lempel-Ziv.
  24. r pour Read, lecture; w pour Write, écriture; x pour eXecute, exécution.
  25. adresse MAC: (rien à voir avec les MacIntosh d'Apple) ou encore adresse physique, adresse matérielle (hardware).