À présent, vous possédez de bonnes bases pour construire votre système GNU-Linux. Dans ce chapitre, nous allons aborder quelques notions très utiles des fonctionnalités avancées de GNU-Linux.
Une expression rationnelle est une description d'un ensemble de caractères. On utilise cette description pour éplucher un fichier à la recherche d'un texte correspondant à cette expression rationnelle. Les expressions rationnelles sont analogues aux motifs de recherche du shell (voir partie 8.6) mais elles sont plus compliquées et beaucoup plus puissantes. elles sont à la fois plus compliquées et plus puissantes.
Une expression rationnelle est formée de texte et de méta-caractères. Un méta-caractère est simplement un caractère avec une signification particulière. Les méta-caractères comprennent les signes suivants:
. * [] - \ ^ $
Si une expression rationnelle ne comprend que du texte (pas de méta-caractère),
cela correspond exactement au texte. Par exemple, l'expression rationnelle
mon expression rationnelle
correspond exactement au texte
mon expression rationnelle
et à rien d'autre. Les expressions
rationnelles prennent habituellement en compte la casse.
Vous pouvez utiliser la commande egrep
pour extraire les lignes
d'un fichier qui contiennent une expression rationnelle. Sa syntaxe est la
suivante:
egrep 'regexp' nomdefichier1 ...
Les guillemets simples ne sont pas obligatoires mais cela ne mange pas de pain de les ajouter.
Par exemple, pour trouver toutes les lignes contenant le mot GNU dans la GPL, vous tapez:
egrep 'GNU' /usr/doc/copyright/GPL
egrep
va vous égrener les lignes correspondantes sur la sortie
standard. Si vous voulez toutes les lignes contenant freedom
(liberté) suivi d'un ensemble quelconque de caractères et suivi du mot GNU,
vous pouvez taper:
egrep 'freedom.*GNU' /usr/doc/copyright/GPL
Le .
signifie « n'importe quel caractère » et le
*
signifie « zéro ou plus de la chose précédente » soit
dans ce cas « zéro ou plus de n'importe quel caractère ». Ainsi,
.*
correspond bien à n'importe quel texte. egrep
effectue un traitement ligne par ligne donc freedom
et
GNU
doivent se trouver sur la même ligne.
Voici un récapitulatif des méta-caractères dans expressions rationnelles:
.
Correspond à un seul caractère, à l'exception du caractère newline (retour chariot)
*
Correspond à zéro ou plus d'occurences de ce qui précède. Ainsi, l'expression
a*
correspond à zéro ou plus de a
minuscule et
.*
correspond à zéro ou plus de caractères quelconques.
[caractères]
Les crochets doivent contenir un ou plusieurs caractères. L'expression
complète correspond exactement à l'ensemble des caractères. Ainsi,
[abc]
correspond à un a
, un b
et un
c
. Cela ne correspond pas à une chaîne vide et cela ne correspond
pas non plus à un caractère autre que ces trois-là.
^
Impose la correspondance en début de ligne. L'expression ^The
ne
correspond à The
que si elle apparaît en début de ligne: il ne
peut y avoir d'espace, ou de texte, avant le The
. Si vous désirez
autoriser des espaces, vous pouvez autoriser 0 ou plus d'espaces avec ^
*The
.
$
Impose la correspondance en fin de ligne. fin$
requiert que le
texte fin
soit placé en fin de ligne sans espace ni texte à la
fin.
[^caractères]
C'est la négation de la liste des caractères entre crochets.
[^abc]
correspond à tout caractère simple, à l'exception de a, b
ou c.
[caractères-caractères]
Vous pouvez inclure un intervalle dans une liste de caractères entre crochets.
Pour faire la correspondance avec toutes les lettres minuscules, utilisez
[a-z]
. Vous pouvez multiplier les intervalles: ainsi, pour avoir
les trois premières lettres de l'alphabet et les trois dernières, essayez
[a-cx-z]
. Pour avoir toutes les lettres dans toutes les casses,
essayez [a-zA-Z]
. Vous pouvez mélanger les intervalles avec des
caractères simples ou bien le méta-caractère ^
:
[^a-zBZ]
signifie « tout sauf une lettre minuscule, un B ou
ou un Z ».
()
Vous pouvez utiliser les parenthèses pour regrouper les expressions rationnelles, comme dans des expressions mathématiques.
||
signifie « ou ». Vous pouvez vous en servir pour fournir une série
d'expressions alternatives. On met généralement ces expressions entre
parenthèses comme ceci: c(ad|ab|at)
correspond à cad
,
cab
ou cat
. Sans les parenthèses, cela aurait
correspondu à cad
ou bien ab
ou bien at
.
\
Protège tout caractère spécial. Si vous désirez trouver un *
,
vous devez taper \*
. Le \ signifie d'ignorer le sens usuel de
*
.
Voici une série d'exemples concrets pour vous aider.
c.pe
correspond à cope, cape, caper
c\.pe
correspond à c.pe, c.per
sto*p
correspond à stp, stop, stoop
car.*n
correspond à carton, cartoon, carmen
xyz.*
correspond à xyz
et tout ce qui s'ensuit.
Certains outils, comme egrep
, ne font la correspondance que
jusqu'à la fin de la ligne.
^The
correspond à The
en début de ligne
atime$
correspond à atime
en fin de ligne
^Only
correspond à Only
en début de ligne - pas
d'espace, de caractère, rien. Seul Only
est accepté.
b[aou]rn
correspond à barn, born, burn
ver[D-F]
correspond à verD, verE, verF
ver[^0-9]
correspond à Ver
suivi de tout sauf d'un
chiffre.
the[ir][re]
correspond à thier, therr, there, theie
[A-Za-z][A-Za-z]*
correspond à tous les mots composés seulement de
lettres et d'au moins une lettre. Cela ne peut pas contenir des chiffres ou
des espaces.
Maintenant que vous avez compris les bases sur les fichiers, il est temps d'apprendre plus de choses à leur sujet.
Chaque fichier de votre système est représenté par un i-noeud (en anglais, inode pour Information Node, prononcez « aïe-node », noeud d'information). un i-noeud contient toutes les informations du fichier. Cependant, l'i-noeud n'est pas directement visible. De plus, chaque i-noeud est lié au système de fichiers par un ou plusieurs liens physiques. Les liens physiques contiennent le nom du fichier et le numéro d'i-noeud. L'i-noeud contient le fichier en lui-même, c'est-à-dire, l'emplacement où l'information est stockée sur le disque, les permissions d'accès, le type de fichier et ainsi de suite. Le système peut trouver n'importe quelle i-noeud s'il a son numéro.
Un simple fichier peut avoir plus d'un lien physique. Cela signifie que tous ces fichiers multiples correspondent au même fichier (c'est-à-dire qu'ils sont associés au même numéro d'i-noeud). Cependant, vous ne pouvez faire de lien physique entre des systèmes de fichiers: tous les liens physiques à un fichier particulier (i-noeud) doivent être dans le même système de fichiers. C'est parce que chaque système de fichiers possède sa propre table d'i-noeuds et que l'on ne peut dupliquer des numéros d'i-noeud sur différents systèmes de fichiers.
Parce que tous les liens physiques à une certaine i-noeud se réfèrent au même fichier, vous pouvez modifier le fichier en l'appelant par un nom et voir ensuite les modifications en l'appelant par un des autres noms. Essayez ceci:
cd; echo "Bonjour" > premierlien
Vous allez dans votre répertoire personnel et vous créez un premier fichier
appelé premierlien
contenant le mot « Bonjour ». Ce que
vous venez de faire est juste de rediriger la sortie de echo
(echo
renvoie juste ce que vous lui donnez) en la plaçant dans
premierlien
. Allez voir le chapitre sur le shell pour de plus
amples explications.
cat premierlien
Pour vérifier le contenu de premierlien
.
ln premierlien secondlien
Crée un lien physique: secondlien
pointe maintenant sur le même
i-noeud que premierlien
.
cat secondlien
Pour confirmer que secondlien
est bien identique à
premierlien
.
ls -l
Remarquez bien que le nombre de liens physiques affiché pour
premierlien
et secondlien
est 2.
echo "change" >> secondlien
C'est une nouvelle redirection du shell (ne vous souciez pas des détails).
Vous avez ajouté le mot « change » à secondlien
.
Confirmez-le avec cat secondlien
.
cat premierlien
premierlien
a aussi le mot « change » ! C'est parce que
premierlien
et secondlien
se réfèrent au même
fichier. Peu importe comment vous l'appelez lorsque vous le modifiez.
chmod a+rwx premierlien
Cela modifie les permissions de premierlien
. Entrez la commande
ls -l
pour vérifier que les permissions de secondlien
ont aussi été modifiées. Cela signifie que les informations de permission
résident dans l'i-noeud, et non dans le lien.
rm premierlien
Cela détruit le lien. C'est une astuce de rm
. Cela détruit en
réalité le lien et non le fichier. Maintenant, tapez ls -l
et
remarquez que secondlien
est toujours là. Notez bien aussi que le
nombre de liens est passé de 2 à 1.
rm secondlien
Cela détruit le second lien. Quand il ne reste plus de lien rattaché à un fichier, Linux détruit le fichier lui-même c'est-à-dire son i-noeud.
Tous les fichiers fonctionnent ainsi, et même les fichiers spéciaux comme les
périphériques (comme /dev/hda
).
Un répertoire n'est qu'une liste de nom de fichiers et de numéros d'i-noeuds, c'est-à-dire une liste de liens physiques. Lorsque vous créez un lien physique, vous ajouter seulement une association numéro-nom à un répertoire. Lorsque vous détruisez un fichier, vous détruisez juste un lien physique d'un répertoire.
Nous avons dissimulé jusqu'à présent le fait que le noyau Linux considère presque tout comme un fichier. Cela inclut les répertoires et les périphériques. Ce sont juste des genres de fichiers un peu spéciaux.
Comme vous devez vous le rappelez, le premier caractère dans ls -l
renvoie le type du fichier. Pour un fichier ordinaire, cela ne renvoie que
-
tout simplement. Les autres possibilités sont les suivantes:
d
: répertoire
l
: lien symbolique
b
: périphérique bloc
c
: périphérique caractère
p
: tube nommé
s
: socket
Liens symboliques
Les liens symboliques (aussi appelés symlink ou liens logiciels) sont l'autre type de lien avec les liens physiques. Un lien symbolique est un fichier spécial qui « pointe vers » un lien physique de n'importe quel système de fichiers monté. Lorsque vous tentez de lire le contenu d'un lien symbolique, cela vous renvoie le contenu du fichier pointé plutôt que le contenu du lien en lui-même. Puisque les répertoires, les périphériques et autres liens symboliques sont des fichiers, vous pouvez pointer un lien symbolique sur chacun de ces objets.
Pour résumé, un lien physique est un nom de fichier et son numéro d'i-noeud. Un fichier est réellement un i-noeud: un emplacement sur un disque, le type du fichier, les modes de permission, etc... Un lien symbolique est un i-noeud qui contient le nom du lien physique. Un lien symbolique appareille deux noms de fichiers ensemble tandis qu'un lien physique appareille un nom de fichier avec un numéro d'i-noeud.
Tous les liens physiques d'un même fichier ont le même état. Cela veut dire qu'il n'y en a pas un de privilégié. Si vous effectuez une opération sur l'un, c'est comme la faire sur n'importe lequel d'entre eux. C'est parce que le lien physique réfère au même i-noeud. Les opérations sur les liens symboliques, pour leurs parts, affectent parfois le propre i-noeud du lien (celui contenant le nom du lien physique) et parfois affectent le lien physique sur lequel ils pointent.
Il y a un certain nombre de différences importantes entre les liens symboliques et les liens physiques.
Les liens symboliques peuvent traverser des systèmes de fichiers. C'est parce qu'ils contiennent les noms complets des fichier, en partant d'un répertoire racine et que les noms complets de fichiers sont uniques. Puisque les liens physiques pointent vers un numéro d'i-noeud et que les numéros d'i-noeuds sont uniques qu'à l'intérieur d'un système de fichiers, ils deviendraient impossible de les qualifier avec certitude si l'on ne connaissait pas le système de fichiers.
Vous pouvez faire des liens symboliques vers des répertoires mais cela n'est
pas possible pour les liens physiques. Chaque répertoire a des liens physiques
- son référencement dans son répertoire parent, son entrée .
et
l'entrée ..
dans chacun de ses sous-répertoires - mais pour
pouvoir ordonner le système de fichiers, aucun autre lien physique n'est
autorisé. En conséquence de quoi, le nombre de fichiers d'un répertoire est
égal au nombre de liens physiques du répertoire moins deux (vous retirez le nom
du répertoire et le lien .
).
Pour comparer un lien physique et un lien symbolique: vous pouvez uniquement faire un lien physique sur un fichier existant car il doit exister un numéro d'i-noeud sur lequel se référer. Par contre, vous pouvez faire un lien symbolique sur n'importe quel fichier, qu'il existe +réellement ou pas.
Détruire un lien symbolique détruit seulement le lien. Cela n'a pas d'impact sur le fichier anciennement pointé. Détruire le seul lien physique d'un fichier conduit à détruire le fichier.
Essayez ceci:
cd; ln -s /tmp/moi MonTmp
Vous vous positionnez dans votre répertoire personnel. ls
avec
l'option -s
fabrique un lien symbolique et dans ce cas, ce lien
s'appelle MonTmp
et pointe sur le fichier /tmp/moi
.
ls -l MonTmp
Vous devriez observer une sortie du genre:
lrxwrxwrxw 1 havoc havoc 7 Dec 6 12:50 MyTmp -> /tmp/me
La date ainsi que l'utilisateur et le groupe devrait être différents pour vous.
Notez le type du fichier: l
. Cela indique un lien symbolique.
Regardez aussi les permissions. Les liens symboliques ont toujours ces
permissions. Si vous tentez de changer les permissions d'un fichier symbolique
via chmod
, vous allez réellement changer les permissions du
fichier sur lequel il pointe.
chmod 700 MonTmp
Vous devriez obtenir un No such file or directory
(pas trouvé de
fichier ou de répertoire portant ce nom) car le fichier /tmp/moi
n'existe pas. Remarquez que cela n'a pas empêché la création du lien
symbolique.
mkdir /tmp/moi
Cela crée le répertoire /tmp/moi
.
chmod 700 MonTmp
devrait maintenant fonctionner sans problème.
touch MonTmp/monfichier
Pour créer un fichier dans MonTmp
.
ls /tmp/moi
Le fichier a vraiment été créé dans /tmp/moi
.
rm MonTmp
Détruit le lien symbolique. Remarquez que cela ne retire que le lien et non ce
vers quoi il pointe. Ensuite, vous devez utiliser rm
et non pas
rmdir
:
rm /tmp/moi/monfichier; rmdir /tmp/moi
Cela nettoie tout ce qu'il reste.
Fichiers périphériques
Les fichiers périphériques se réfèrent à un périphérique physique ou virtuel de
votre système, comme votre disque dur, votre carte vidéo, votre écran et votre
clavier. Un exemple de périphérique virtuel est la console, représentée par
/dev/console
.
Il y a deux sortes de périphériques: bloc et caractère. On peut avoir accès aux périphériques caractères caractère par caractère. Rappelez-vous que la plus petite unité de données qui peut être écrite ou bien être lue à partir du périphérique est un caractère (octet).
On peut accéder aux périphériques bloc avec des unités plus grandes appelées blocs, qui contiennent un certain nombre de caractères. Votre disque dur est un périphérique bloc.
Vous pouvez lire ou écrire dans des fichiers périphériques comme vous le feriez
avec n'importe quelle autre sorte de fichiers, quoique le fichier puisse
contenir alors un étrange baragouin incompréhensible à nous autres humains.
Écrire n'importe quoi dans ces fichiers n'est pas une bonne idée. Parfois si.
Par exemple, vous pouvez envoyer un fichier PostScript dans le périphérique de
l'imprimante /dev/lp0
ou bien envoyer des commandes de modem au
fichier périphérique idoine à partir du bon port série.
Il existe un fichier particulier appelé /dev/null
. Il détruit
tout ce qu'il reçoit. Si vous ne voulez pas quelque chose, envoyez-le dans
/dev/null
. C'est essentiellement un puits sans fond. Si vous
tentez de lire /dev/null/
, vous obtiendrez un end-of-file
(EOF, caractère de fin de fichier) immédiatement. /dev/zero
est
similaire, à l'exception du fait que sa lecture vous renverra le caractère
\0
(pas le même que le chiffre 0).
Tubes nommés (FIFO)
Un tube nommé est un fichier qui agit comme un tube. Vous entrez quelque chose dans le fichier et cela ressort. Ceci est appelé une FIFO (First-In-First-Out, premier entré, premier sorti) car la première chose que vous entrez est aussi la première chose que l'on sort.
Si vous écrivez dans un tube nommé, le processus d'écriture ne s'arrête pas tant qu'il y a quelque chose à lire dans le tube. Si vous lisez dans un tube nommé, le processus de lecture attend qu'il y ait quelque chose à lire avant de s'arrêter. La taille du tube est toujours zéro. Il ne stocke pas de donnée: il lie simplement deux processus à travers le signe « | » du shell. Dans tous les cas, puisque le tube a un nom, les deux processus n'ont pas à appartenir à la même ligne de commandes ou même à être lancé par le même utilisateur.
Vous pouvez essayer ceci:
cd; mkfifo montube
Activez alors le tube:
echo "bonjour" > montube &
Cela place le processus qui essaie d'écrire « bonjour » dans le tube en arrière-plan. Remarquez bien que le processus ne rend pas la main: il attend que quelqu'un vienne lire dans le tube:
cat montube
À ce moment, le processus echo
s'achève car cat
a lu
le tube et le processus cat
a affiché bonjour
.
rm montube
Vous pouvez détruire les tubes comme n'importe quel autre fichier.
Les sockets
Les sockets sont similaires aux tubes mais elles ne fonctionnent qu'à travers un réseau. C'est de cette façon que votre ordinateur travaille en réseau. Vous avez peut-être entendu parler de « WinSock », qui sont les sockets de Windows.
Nous n'irons pas plus loin sur ce sujet car vous n'aurez pas l'occasion de vous
en servir, à moins de programmer. En tout cas, si vous apercevez un fichier
marqué avec un type s
sur votre ordinateur, vous saurez de quoi il
s'agit.
proc
Le noyau Linux fournit un système de fichiers particulier qui est monté sous
/proc
dans les systèmes Debian. C'est ce que l'on appelle un
« pseudo-système de fichiers » parce qu'il n'existe pas réellement
sur vos périphériques physiques.
Le système de fichiers proc
contient des informations sur le
système et sur les processus en cours. Certains des « fichiers » de
proc
sont raisonnablement compréhensibles par un être humain
(essayez cat /proc/meminfo
et cat /proc/cpuinfo
).
Les autres fichiers sont un amas incompréhensible de chiffres. Les utilitaires
systèmes traduisent les informations contenues dans ces chiffres et vous les
présentent de façon plus compréhensible.
Les gens paniquent souvent lorsqu'ils remarquent qu'un fichier en particulier -
/proc/kcore
- est souvent énorme, C'est, à un cheval près, une
copie du contenu de la mémoire de votre ordinateur. Il est utilisé pour
déboguer le noyau. Il n'existe nulle part physiquement donc ne vous préoccupez
pas de sa taille.
Si vous désirez en savoir plus sur /proc
, tapez man 5
proc
.
Il est parfois nécessaire de recopier un répertoire dans un autre emplacement.
Peut-être avez-vous ajouté un nouveau disque dur et vous désirez faire une
copie de /usr/local
dessus. Il y a plusieurs façons de procéder:
La première est d'utiliser la commande cp
. La commande cp
-a
demande à cp
de préserver le maximum d'informations.
Vous pourriez ainsi utiliser la commande suivante:
cp -a /usr/local /destination
Cependant, il existe quelques cas qui ne fonctionnent pas[50]. Dès-lors, la meilleure façon de
procéder lors d'une grande copie est d'enchaîner deux commandes
tar
consécutives, comme ceci:
tar -cSpf - /usr/local | tar -xvSpf -C /destination
La première commande tar
archive le répertoire et l'entube dans le
second. La seconde commande déploie l'archive dans l'emplacement spécifié avec
l'option -C
.
Dans la partie 9.1, nous avons parlé des permissions sur les fichiers dans Linux. C'est une façon fondamentale de sécuriser votre système. Si vous faîtes tourner un système multi-utilisateurs ou un serveur, il est primordial d'établir des bonnes permissions. Une bonne règle de base consiste à configurer les fichiers avec les permissions les plus basses autorisant leur bon usage.
Si vous faîtes tourner un serveur en réseau, il y a quelques petites bricoles
auxquelles il faut faire attention. Premièrement, vous devez désinstaller ou
arrêter les services que vous n'utilisez pas. Un bon point de départ est le
fichier /ect/inetd.conf
. Vous pouvez probablement désactiver
quelques services. Pour la plupart des services réseau, vous pouvez contrôler
qui y a accès. Les fichiers /etc/host.allow
et
/etc/hosts.deny
(documentés dans man 5 hosts_access
)
peuvent contrôler qui a accès à quel service. Vous devez aussi être à jour des
rustines (patches) ou des mises-à-jour proposées par Debian. Elles
sont disponibles dans votre miroir FTP de Debian.
Les règles suivantes de bon sens doivent aussi s'appliquer:
telnet
ou ftp
. Utilisez des protocoles de cryptage
ou évitez de vous loguer à distance.
/tmp
est une exception à cette règle.
Bien que cela soit de peu d'utilité pour quelqu'un qui ne fait pas tourner un serveur, cela vaut la peine de se renseigner sur les questions de sécurité. Le mécanisme de sécurité de Debian vous protège de la plupart des virus.
Debian est une plateforme privilégiée pour le développement de logiciels et la programmation. Voici une liste des langages et pseudo-langages supportés: C, C++, Objective-C, Perl, Python, m4, Ada, Pascal, Java, awk, Tcl/Tk, SQL, assembleur, Bourne shell, csh et bien d'autres encore. L'écriture de programmes est hors du propos de ce livre mais voici les programmes de développement parmi les plus populaires que l'on trouve sur Debian:
gcc
Le compilateur C de GNU: un compilateur moderne et optimisé de C.
g++
Le compilateur C++ extrait de gcc
cpp
Le pré-processeur de C de gcc
perl
L'interpréteur Perl. Perl est un super langage multi-usages.
gdb
Le débogueur GNU. Il est utilisé pour déboguer de nombreux langages.
gprof
Extraction de profile. Ce programme vous aide à optimiser votre programme pour augmenter ses performances.
emacs
GNU Emacs est un éditeur et un environnement intégré de travail.
as
C'est l'assembleur de GNU.
p.karatchentzeff@free.fr