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

_images/hierarchie_dos.png

Hiérarchie unique sous Linux

_images/hierarchie_unix.png

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

-i, --interactive

Idem que pour cp.

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 pour ugo,

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

Créer un lien physique

Avec cp:

cp -l src dest

Avec ln:

ln src dest

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

Inode

Pour le SE chaque fichier a un identifiant interne unique, partagé par tous les liens physiques vers ce fichier.

Cet identifiant est appelé numéro d'inode.

-i, --inode

Option de ls pour afficher les numéros d'inode.

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

Créer un lien symbolique

Avec ln:

ln -s src dest

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ères x, y ou z

    • [^xyz] : n'importe quel caractère autre que x, y ou z

    • [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

  1. À l'aide de la ligne de commande, créez un répertoire SELINUX dans votre répertoire de départ.

  2. Dans SELINUX, créez un répertoire TP01.

  3. Vérifiez (dans l'interface graphique) que les répertoires ont bien été créés.

Exercice 2

  1. Ouvrez le répertoire TP01 dans l'explorateur de fichier, et vérifiez à chaque étape suivante l'effet des commandes que vous tapez.

  2. Dans le répertoire TP01, copiez le fichier "/etc/passwd".

  3. Affichez le contenu de ce fichier.

  4. Effacez cette copie.

Exercice 3

  1. Placez vous dans le répertoire "/etc".

  2. Copiez le fichier "fstab" dans votre répertoire TP01.

  3. Revenez dans TP01 et renommez "fstab" en "table".

  4. Toujours dans TP01, créez un répertoire "systeme".

  5. Restez dans le répertoire TP01 et déplacez "table" dans "systeme".

  6. Toujours à partir du répertoire TP01, faites une copie de "table" nommée "table1" dans votre répertoire personnel.

  7. Affichez le contenu du répertoire courant.

  8. Affichez l’inode de table1.

  9. Renommez "table1" en  "table2".

  10. Copiez "table2" dans le répertoire "TP01" en le renommant "table3".

  11. Supprimez le répertoire "TP01".

Exercice 4

  1. À l'aide de la commande écho, affichez un point suivi d'une étoile .*.

  2. Créez un répertoire META dans votre répertoire SELINUX, et placez vous dans ce nouveau répertoire.

  3. Faite une copie dans le répertoire courant du fichier "/etc/passwd".

  4. Créez une copie de "ce fichier nommée "copie1.txt".

  5. Créez d'autres copies de "copie2.txt" nommées "copie3.txt", "copie4.txt", "copie5.txt", "copie6.txt".

  6. Copiez le fichier "copie6.txt" en "copie*.txt".

  7. Supprimez le fichier que vous venez de créer. Attention à ne supprimer que lui.

  8. Créez un répertoire DIR1 dans le répertoire courrant.

  9. Déplacez dans DIR1 les copies 2, 4 et 6, en utilisant une seule commande (la plus courte possible).

  10. Supprimez tous les fichiers avec l'extension ".txt" dans le répertoire courant.

Exercice 5

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

  2. Créez un lien physique, nommé "ln_passwd", de "cp_passwd" dans le répertoire où se trouve "cp_passwd".

  3. Modifiez le fichier "cp_passwd", par exemple en ajoutant une ligne quelconque en haut du fichier.

  4. Ouvrez le fichier "ln_passwd". Est-il modifié ? Pourquoi ? Quel est son inode ?

  5. Supprimez le fichier "cp_passwd". Le fichier "ln_passwd" est il supprimé ? Si non, pouvez vous lire son contenu ?

  6. Renommez "ln_passwd" en "cp_passwd". AFfichez le contenu de "cp_passwd" avec more. Que constatez-vous ?

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

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

  2. Tapez "ls –l private.txt". Quel est le résultat ?

  3. Ajoutez au groupe la possibilité de lire le fichier en utilisant la forme classique de chmod.

  4. Faites de même avec les autres utilisateurs, mais avec la forme octale.

  5. Comment vérifiez-vous le bon fonctionnement de votre commande ?

  6. Modifiez les droits pour tout interdire à tout le monde…

  7. Essayez de lire le fichier. Que se passe-t-il?

  8. Rétablissez les droits de lecture pour le propriétaire.

  9. Essayez de modifier le contenu du fichier. Que se passe-t-il ?

  10. Rétablissez les droits d’écriture pour le propriétaire.