Séance 2 : Système de fichiers¶
Généralités¶
Points communs avec Windows :
les fichiers sont organisés en une hiérarchie de répertoires
chaque fichier est identifié par un chemin indiquant sa position dans la hiérarchie
un chemin peut être absolu ou relatif (à un répertoire donné)
Différences avec Windows :
la casse (différence majuscule/minuscule) est significative dans les noms de fichier
le séparateur de chemin est le slash (
/
)les différents périphériques sont tous intégrés dans une hiérarchie unique
Hiérarchies multiples sous Windows¶
Hiérarchie unique sous Linux¶
Chemins absolus et relatifs¶
un chemin absolu commence toujours par un slash (
/
)un chemin relatif commence par un autre caractère, par exemple :
foo/bar
./toto
../images/toto.jpeg
mon_projet/.git
les fichiers/répertoires dont le nom local commence par
.
sont considérés comme cachés (ils n'apparaissent que si on le demande explicitement)
Note
sous Linux les noms de fichier n'ont pas forcément d'extension
l'extension n'a pas de rôle particulier pour le SE
on verra plus loin comment fonctionnent
.
et..
Note
Un petit jeu développé par Tierry Excoffier vous permet de vous entraîner à écrire des chemins relatifs et absolus (et à la Tab-complétion).
Répertoire courant¶
Tout processus (programme en cours d'exécution), y compris le shell, possède un répertoire courant.
Ce répertoire courant sert à résoudre les chemins relatifs utilisés par ce processus.
Commandes usuelles¶
pwd — print working directory¶
Affiche le répertoire courant du shell.
NB: le répertoire courant est « hérité » par les programmes lancés depuis le shell.
Note
Souvent, le répertoire courant apparaît dans l'invite de commande.
cd <dir> — change directory¶
Change le répertoire courant du shell.
-
<dir>
Chemin absolu ou relatif du répertoire destination.
ls [options] [path]... — list¶
Affiche une liste de fichiers (par défaut, ceux du répertoire courant).
-
[path]
Chemin du/des fichier(s) à afficher. Si
path
identifie un répertoire,ls
affiche les fichiers contenus dans ce répertoire.
-
-a
,
--all
¶
Affiche tous les fichiers, y compris les fichiers cachés.
cp [options] <src>... <dst> — copy¶
Copie un (ou plusieurs) fichier(s) vers un chemin donné.
-
<src>
Chemin du/des fichier(s) source(s).
-
<dst>
Si
<dst>
est le chemin d'un répertoire existant, tous les fichiers sources sont copiés dans ce répertoire, avec le même nom local.Sinon, il ne doit y avoir qu'un seul
<src>
, qui est copié en tant que<dst>
.
-
-i
,
--interactive
¶
Demande confirmation avant d'écraser un fichier existant.
Avertissement
Par défaut, cp ne demande pas de confirmation.
mv [options] <src>... <dst> — move¶
Déplace (ou renomme) un (ou plusieurs) fichier(s) vers un chemin donné.
-
<src>
Chemin du/des fichier(s) source(s).
-
<dst>
Si
<dst>
est le chemin d'un répertoire existant, tous les fichiers sources sont déplacés dans ce répertoire, avec le même nom local.Sinon, il ne doit y avoir qu'un seul
<src>
, qui est déplacé en tant que<dst>
.
rm [options] <path>... — remove¶
Supprime un (ou plusieurs) fichier(s).
-
<path>
Chemin d'un fichier à supprimé.
Ne peut pas être un répertoire (sauf si
-r
est utilisé).
-
-I
¶
Demande confirmation lorsque 3 fichiers ou plus vont être supprimés.
-
-r
¶
Si
<path>
désigne un répertoire, supprime récursivement son contenu.
rmdir <dir>... — remove directory¶
Supprime un (ou plusieurs) répertoire(s) vide(s).
Méta-données et permissions¶
D'une manière générale, on appelle méta-donnée toute information attachée à une donnée.
Tout fichier possède les méta-données suivantes :
taille des données
date de création
date de dernière modification
propriétaire (un compte utilisateur)
groupe
permissions
Permissions¶
Elles sont codées sur 12 bits, chacun représentant un droit particulier.
...
lecture pour le propriétaire
écriture pour le propriétaire
exécution pour le propriétaire
...
lecture pour les membres du groupe
écriture pour les membres du groupe
exécution pour les membres du groupe
...
lecture pour les autres utilisateurs
écriture pour les autres utilisateurs
exécution pour les autres utilisateurs
Note
Les bits marqués "..." sont moins utilisés, et ne sont pas traités dans ce cours.
Pour un répertoire, le droit en « exécution » est le droit d'en faire le répertoire courant, et d'accéder aux fichiers qu'il contient.
On représente souvent les permissions sous forme d'un nombre de 3 chiffres en octal.
Afficher les méta-données¶
Nouvelle option de ls
:
-
-l
¶
Affiche les méta-données des fichiers en plus de leur nom.
Exemple :
$ ls -l
total 12
-rw-r--r-- 2 pa pa 7 janv. 21 11:01 bar
drwxrwxrwx 3 root pa 4096 janv. 21 12:05 data
-rw-rw---- 1 pa www-data 64 janv. 21 11:52 toto
chown [options] [<user>][:<group>] <path>...¶
Change le propriétaire et/ou le groupe d'un (ou plusieurs) fichier(s).
-
<user>
L'identifiant (textuel ou numérique) du nouveau propriétaire.
-
<group>
L'identifiant (textuel ou numérique) du nouveau groupe.
-
<path>
Le chemin du fichier dont on souhaite modifier les méta-données.
-
-R
,
--recursive
¶
Si
<path>
identifie un répertoire, change récursivement les méta-données des fichiers qu'il contient.
chmod [options] <perm> <path>...¶
Change les permissions associées à un (ou plusieurs) fichier(s).
-
<perm>
la description en octal des nouvelles permissions, ou
une description des modifications à apporter où
u
,g
,o
désignent respectivement le propriétaire (user), le groupe, ou les autres utilisateurs (others),a
(all) est un alias pourugo
,+
ajoute une permission pour les cibles concernées,-
retire une permission pour les cibles concernées,r
,w
,x
désignent respectivement des droits en lecture (read), écriture (write), exécution.
exemples :
777
,640
,ug+x
,o-rwx
-
<path>
Le chemin du fichier dont on souhaite modifier les permissions.
-
-R
,
--recursive
¶
Si
<path>
identifie un répertoire, change récursivement les méta-données des fichiers qu'il contient.
Note
Seul l'administrateur a le droit de modifier le propriétaire.
Liens physiques¶
Sous Linux, il est possible que le même fichier (données + méta-données) existe sous plusieurs chemins.
Si on change les données depuis un des chemins, ces changements sont également visibles depuis les autres chemins.
On dit qu'il existe un lien physique entre ces chemins.
La commande ls -l
affiche le nombre de liens phyiques pour chaque fichier.
Note
Chaque répertoire contient toujours deux liens physiques cachés :
.
est un lien physique vers le réperoire lui même ;..
est un lien physique vers le répertoire parent.
Ces liens physiques sont utiles pour écrire des les chemins relatifs.
Gestion des données¶
Les données d'un fichiers ne sont stockées qu'une seule fois sur le disque, même si ce fichier possède plusieurs liens physiques.
La commande
rm
ne supprime pas directement les données ; elle supprime le chemin, donc le lien physique.Les données libérées lorsque le dernier lien physique est supprimé.
Tous les liens physiques pointant vers les mêmes données sont à égalité ; il n'y a pas d'« original » ou de « copie ».
Liens symboliques¶
Un lien symbolique est un type particulier de fichier, qui contient le chemin (absolu ou relatif) d'un autre fichier.
Lorsqu'on ouvre un lien symbolique, on accède aux données du fichiers vers lequel il pointe.
Exemple :
$ ls -l
total 12
-rw-r--r-- 2 pa pa 7 janv. 21 11:01 bar
drwxrwxrwx 3 root pa 4096 janv. 21 12:05 data
lrwxrwxrwx 1 pa pa 4 janv. 21 12:06 tata -> toto
-rw-rw---- 1 pa www-data 64 janv. 21 11:52 toto
Gestion des données¶
Contrairement au lien physique, le lien symbolique est un fichier différent du fichier vers lequel il pointe (avec son propre numéro d'inode).
Si le fichiers pointé est supprimé, le lien symbolique devient brisé (tenter de l'ouvrir provoquera une erreur).
Méta-caractères¶
Les méta-caractères sont des caractères spéciaux interprétés par le shell.
Lorsqu'ils sont utilisés dans une ligne de commande (seuls ou en combinaison avec d'autres caractères ou méta-caractères), l'argument qui les contient est remplacé par un ou plusieurs nom(s) de fichier correspondant.
Note
Les guillemets (simples '
ou doubles "
) inhibent l'interprétation de ces méta-caractères,
comme ils le font pour les espaces.
*
: n'importe quelle séquence de zéro, un ou plusieurs caractère(s)?
: exactement un caractère~
: le répertoire home de l'utilisateur courant[...]
: exactement un caractère appartenant à la séquence décrite, exemples :[xyz]
: un des caractèresx
,y
ouz
[^xyz]
: n'importe quel caractère autre quex
,y
ouz
[0-9]
: n'importe quel chiffre décimal[a-zA-Z_]
: n'importe quelle lettre minuscule ou majuscule, ou l'underscore.
Exemples:
ls *.c *.h
cp *.c ~/code/
chmod a-rwx solution_exo?.html
Échappement¶
On appelle échappement (en anglais escaping) le mécanisme qui permet d'inhiber le comportement spécial d'un caractère.
Le shell propose plusieurs mécanismes d'échappement, que nous avons déjà rencontrés :
les guillemets doubles (
"
) ou simples ('
) pour échapper tout une chaîne ;l'anti-slash (
\
) pour échapper un unique caractère.
Exemples :
echo Comment allez-vous \?
echo "* et ? sont des méta caractères"
Travaux dirigés¶
Exercice 1¶
À l'aide de la ligne de commande, créez un répertoire SELINUX dans votre répertoire de départ.
Dans SELINUX, créez un répertoire TP01.
Vérifiez (dans l'interface graphique) que les répertoires ont bien été créés.
Exercice 2¶
Ouvrez le répertoire TP01 dans l'explorateur de fichier, et vérifiez à chaque étape suivante l'effet des commandes que vous tapez.
Dans le répertoire TP01, copiez le fichier "/etc/passwd".
Affichez le contenu de ce fichier.
Effacez cette copie.
Exercice 3¶
Placez vous dans le répertoire "/etc".
Copiez le fichier "fstab" dans votre répertoire TP01.
Revenez dans TP01 et renommez "fstab" en "table".
Toujours dans TP01, créez un répertoire "systeme".
Restez dans le répertoire TP01 et déplacez "table" dans "systeme".
Toujours à partir du répertoire TP01, faites une copie de "table" nommée "table1" dans votre répertoire personnel.
Affichez le contenu du répertoire courant.
Affichez l’inode de table1.
Renommez "table1" en "table2".
Copiez "table2" dans le répertoire "TP01" en le renommant "table3".
Supprimez le répertoire "TP01".
Exercice 4¶
À l'aide de la commande écho, affichez un point suivi d'une étoile
.*
.Créez un répertoire META dans votre répertoire SELINUX, et placez vous dans ce nouveau répertoire.
Faite une copie dans le répertoire courant du fichier "/etc/passwd".
Créez une copie de "ce fichier nommée "copie1.txt".
Créez d'autres copies de "copie2.txt" nommées "copie3.txt", "copie4.txt", "copie5.txt", "copie6.txt".
Copiez le fichier "copie6.txt" en "copie*.txt".
Supprimez le fichier que vous venez de créer. Attention à ne supprimer que lui.
Créez un répertoire DIR1 dans le répertoire courrant.
Déplacez dans DIR1 les copies 2, 4 et 6, en utilisant une seule commande (la plus courte possible).
Supprimez tous les fichiers avec l'extension ".txt" dans le répertoire courant.
Exercice 5¶
Faites une copie nommée "cp_passwd" du fichier "/etc/passwd" dans votre répertoire home. Quel est l’inode de cette copie? Comparez-le avec l’inode de "/etc/passwd".
Créez un lien physique, nommé "ln_passwd", de "cp_passwd" dans le répertoire où se trouve "cp_passwd".
Modifiez le fichier "cp_passwd", par exemple en ajoutant une ligne quelconque en haut du fichier.
Ouvrez le fichier "ln_passwd". Est-il modifié ? Pourquoi ? Quel est son inode ?
Supprimez le fichier "cp_passwd". Le fichier "ln_passwd" est il supprimé ? Si non, pouvez vous lire son contenu ?
Renommez "ln_passwd" en "cp_passwd". AFfichez le contenu de "cp_passwd" avec
more
. Que constatez-vous ?Supprimez "cp_passwd".
Exercice 6¶
Recommencez l'exercice précédent en remplaçant le lien physique par un lien symbolique. Commentez les différences.
Exercice 7¶
Dans votre répertoire d’accueil, créez un fichier "private.txt" dont la lecture et l’écriture ne sont autorisées que pour son propriétaire.
Tapez "ls –l private.txt". Quel est le résultat ?
Ajoutez au groupe la possibilité de lire le fichier en utilisant la forme classique de chmod.
Faites de même avec les autres utilisateurs, mais avec la forme octale.
Comment vérifiez-vous le bon fonctionnement de votre commande ?
Modifiez les droits pour tout interdire à tout le monde…
Essayez de lire le fichier. Que se passe-t-il?
Rétablissez les droits de lecture pour le propriétaire.
Essayez de modifier le contenu du fichier. Que se passe-t-il ?
Rétablissez les droits d’écriture pour le propriétaire.