top of page
  • Photo du rédacteurOlivier Lebeau

Linux pour les débutants #2 - Système de fichiers et Shell

Maintenant que mon système Linux est installé, il est nécessaire de savoir comment l'utiliser. Le système d'exploitation ne sert pas à grand chose si on ne peut rien en faire. D'autant plus que si tu as longtemps était habité à Windows, il y'a des habitudes à prendre qui sont bien différentes d'un système basé sur Windows.


Alors, allons-y pour cette seconde partie de Linux pour les débutants qui va décrire le système de fichiers Linux et cette chose qu'on appelle le shell !


Have you met Shell ?

Le shell est un héritage du système Unix dont les systèmes Linux ont hérité. Il s'agit d'une interface en ligne de commande qui possède un flux d'entrée, les saisies utilisateurs, et un flux de sortie composé du résultat de la commande.

Le principal shell sur la majorité des systèmes Linux aujourd'hui est BASH pour Bourne Again SHell, Bourne étant l'inventeur du shell historique d'Unix. D'autres Shell existent comme ksh, tcsh, ou encore zsh qui est celui que j'utilise et qui est déployé par défaut sur les systèmes Kali Linux ou MacOS qui l'utilise depuis de nombreuses années.


Pour accèder à ton Shell, pas énormément d'options, tu passes par ton application Terminal. Va alors apparaitre la fameuse fenêtre qu'on a tous déjà vu au moins une fois, si ce n'est dans un film d'action où un hackeur déverouille n'importe qu'elle système en deux coups de cuillères à pots.


A partir de là, qu'est ce qu'il est possible de faire ? Et bien tout ! Tout le système peut être administrer en ligne de commande, à défaut de connaitre les commandes, c'est d'ailleurs ce qui est utilisé pour les systèmes serveurs pour lesquelles l'installation de l'interface graphique n'est pas faite. L'accès au système est alors possible seulement en ligne de commande que ce soit localement par la console ou à distance par le biais d'un protocole comme SSH.


Néanmoins, les deux modes de connexions ne sont pas totalement identiques, ou du moins, ne fonctionnent pas de la même façon. Lors d'une connexion console, le système utillise un terminal appelé TeletypeWriter (TTY) qui est le terminal historique. Il s'agit d'un périphérique qui va transmettre les entrées/sorties entre les processus et les périphériques (clavier / souris ) via une connexion directe aux différents systèmes.

D'un autre côté, lors d'une connexion SSH ou Telnet, le terminal employé, Pseudo Terminal Slave (PTS) est un pseudo-terminal que le noyau Linux va émuler suite à une connexion par un programme. Le shell vient alors s'intercaler entre les périphériques et l'utilisateur et sera donc le point convergent pour toutes les entrées/sorties.


Il est possible de vérifier quels sont les utilisateurs connectés et quels sont les terminaux employés par ces utilisateurs. Toujours dans mon terminal, je peux utiliser la commande who pour afficher les utilisateurs actuellement connectés.



Mon utilisateur est connecté par différents biais,

  • seat0 : correspond à ma session X, c'est à dire, l'interface graphique.

  • pts/2 : qui est une connexion effectuée par le biais de SSH.

  • tty3 : qui est une connexion par le biais d'un terminal.


Les installations Linux possèdent nativement et dès l'installation plusieurs terminaux disponibles. Pous y accèder, il est possible d'utiliser le raccourci : ctrl + alt + F[1...6] ou alors la commande chvt [1...6] avec [1...6] un numéro entre 1 et 6. Se faisant, il est possible d'accèder aux différents terminaux et de revenir sur l'interface graphique à tout moment.


Command Line Interface

Une fois connecté au Terminal, une ligne s'affiche :

Cette ligne aussi appelée le prompt est ce qui permet à l'utilisateur de saisir des commandes. Il s'agit de l'input du Shell.

Elle est composée de la façon suivante :

  • rooli : Ici mon nom d'utilisateur, il s'agit de l'utilisateur couramment connecté.

  • ctrlaltdefend : Ici la machine sur laquelle je suis connectée. Il s'agit du nom d'hôte de la machine.

  • ~ : Il s'agit du répertoire courant. Le "~" indique qu'il s'agit du répertoire d'accueil (home directory) de l'utilisateur.

  • $ : Indique qu'il s'agit d'un utilisateur standard. Dans le cas d'un utilisateur à privilèges le "$" est remplacé par "#"


La présentation du prompt diffère en fonction du système d'exploitation et du shell employé. Dans mon exemple, il s'agit d'un Shell zsh sous Kali Linux. Si tu as une distribution différente, il est possible que ça soit différent dans l'affichage mais le principe reste le même.


C'est à travers ce prompt qu'il sera possible d'exécuter des commandes. Ce sont ces commandes qui permettent à l'utilisateur d'indiquer au système quelles sont les opérations qu'il doit effectuer.

Elles sont composées de la façon suivante et ce quelque soit la commande :

command [-options] [arguments]

La même commande peut de cette façon produire différents résultats ou être utilisée à différentes fins en fonctions des options et des arguments qui lui sont fournis.


Par exemple, dans le cas de la commande ssh il est possible d'utiliser différentes combinaisons d'arguments et d'options pour mettre en place la connexion avec un appareil distants :


# Pour se connecter en SSH en local avec l'utilisateur rooli
ssh -l rooli localhost 

# Pareil 
ssh rooli@localhost 

# Pour se connecter en SSH en local avec l'utilisateur rooli mais sur le port 2222
ssh -l rooli -p 2222 localhost 

Au besoin, la liste complète des options et arguments associés à une commande est disponible par le biais d'une autre commande : man comme manuel et qui prend en argument la commande dont on a besoin d'informations.

# Page de manuel de SSH
man ssh 

Le système de fichiers

Le système de fichiers sur les distributions Linux est constitué d'une arborescence de fichiers qui ont pour origine le répertoire "/" (racine).

Si je liste ce répertoire racine, il y existe un ensemble de répertoire communs à toutes les distributions Linux. Ces répertoires et cette hiérarchie sont définis par le Filesystem Hierarchy Standard (FHS).


Ainsi quelque soit la distribution de Linux, tu pourras retrouver les dossiers suivants qui posséderont les mêmes rôles :

  • /bin : Contient les binaires des commandes essentielles au système. Par exemple, la commande Sudo pour obtenir les droits d'administrateur se trouve dans ce répertoire.

  • /boot : Contient les fichiers nécessaires au démarrage du système avec les fichiers kernel, bootload et initramfs

  • /dev : Contient les fichiers qui représentent les périphériques connectés au système.

  • /etc : Contient les fichiers de configuration système.

  • /home : Contient les répertoires d'accueil des utilisateurs.

  • /lib : Contient les librairies partagées et les modules du kernel.

  • /media : Contient les fichiers qui représentent les points de montage amovibles (CD/USB)

  • /mnt : Points de montage temporaires

  • /opt : Contient les applications additionnelles qui sont installées sur le système.

  • /proc : Contient des fichiers essentiels pour le système.

  • /root : Contient le répertoire d'accueil de l'utilisateur root

  • /sbin : Contient des fichiers binaires essentiels au fonctionnement du système.

  • /srv : Contient les données des différents services système.

  • /tmp : Répertoire pour placer des fichiers temporaires

  • /usr : arborescence complémentaire pour les fichiers systèmes destinés aux utilisateurs standards.

    • /usr/bin : Fichiers exécutables système

    • /usr/lib : librairies partagées liées à /usr/bin

    • /usr/sbin : Programmes d'administration système.

  • /var : Données variables. Bases de données, fichiers de logs, mail,...


Deux répertoires spéciaux viennent s'ajouter à celle-ci et sont retrouvés dans toute l'arborescence et quelque soit le répertoire dans lequel l'utilisateur se trouve "." et "..".

  • . : renvoie au répertoire courant

  • .. : renvoie au répertoire parent


Inodes, blocs et permissions

Le système de fichiers Linux est composée d'Inodes. Ce sont des structures de données utilisées par le système de fichier pour stocker les informations sur un fichier ou un répertoire qui ont tous un inode associé qui contient les métadonnées.


Les métadonnées contenues par les inodes sont les suivantes :

  • Mode : Type de fichier et permissions associées.

  • Taille : Taille du fichier en octets

  • UID : Identifiant de l'utilisateur propriétaire du fichier

  • GID : Identifiant du groupe propriétaire du fichier

  • Timestamps : Informations sur les dates de création, modification et dernier accès au fichier

  • Compteur de liens : Nombre de hard link pointant vers l'inode

  • Pointeurs vers les blocs de données : Adresses des blocs de données sur le disque où les données réelles du fichier sont stockées.


Dans les faits, un Inode est généré au moment de la création d'un fichier. Le système associe un inode à un fichier qui sera alors identifié par rapport au numéro de l'inode correspondant et le chemin du répertoire dans lequel il se trouve.


Dans les métadonnées contenues dans les inodes on retrouve des pointeurs qui indiquent les blocs où les données du fichier sont stockées. Les blocs sont des unités de stockage qui ont une taille fixe. La taille dépend du type de système de fichiers et du partitionnement de celui-ci, en général on retrouve des blocs de 1024, 2048 ou 4096 octets. Les fichiers sont stockés dans ces blocs et en fonction de la taille de ceux-ci peuvent être répartis sur plusieurs blocs.


Chaque fichier a des permissions associées qui permettent de moduler l'accès à celui-ci. Les permissions sont représentés comme un triplet (read, write, execute) qui détermine qui peut lire, écrire ou exécuter un fichier.

  • Lecture (r): L'utilisateur peut lire le contenu du fichier ou lister un répertoire

  • Ecriture (w): L'utilisateur peut modifier ou supprimer un fichier. Il peut créer, supprimer ou renommer des fichiers dans un répertoire

  • Exécution (x): L'utilisateur peut exécuter un fichier s'il s'agit d'un programme. Dans le cas d'un répertoire, l'utilisateur peut parcourir le répertoire pour accéder à des sous-répertoires.

Ces trois éléments sont combinés au sein d'un triplet ( rwx ) qui défini pour un utilisateur quels sont les droits qu'il a sur un fichier ou un répertoire. Le triplet est modulé pour assigner le bon niveau de droit au fichier allant d'aucuns droits avec un triplet vide ( --- ) à tous les droits ( rwx ).


Il est possible de voir ces permissions en utilisant la commande ls -l.

ls -l 
total 4
-rw-r--r-- 1 user group 123 Jun 1 17:46 monfichier1
-rwxrw-r-- 1 user group 123 Jun 1 17:30 monfichier2
drwxrw-r-- 2 user group 4096 Jun 1 17:20 mondossier1

Dans les lignes ci-dessous, le résultat de la commande ls -l affiche les fichiers et répertoires du dossier courant sur mon terminal. Si tu regardes le début de chaque ligne tu peux voir les caractères suivants pour monfichier1 : -rw-r--r--


Il s'agit des permissions appliquées à ce fichier. Il est possible de décomposer cette chaine de caractères en 4 parties :

  • - : Premier caractères qui indique le type de fichier ( - :pour un fichier, d : pour un dossier, l : pour un lien symbolique)

  • rw- : Permissions associées à l'utilisateur propriétaire.

  • r-- : Permissions associées au groupe propriétaire.

  • r-- : Permissions associées à tous les autres utilisateurs.


Dans cet exemple, l'utilisateur propriétaire peut lire et modifier le fichier tandis que tous les autres ne peuvent que lire le contenu du fichier.


Naviguer dans le système de fichiers Linux


Chaque fichier est accessible à travers le système au travers de son chemin absolu ou chemin relatif. Le chemin relatif se base sur la localisation actuel de l'utilisateur dans l'arborescence et le chemin absolu se base par rapport à la racine "/". De cette façon, un fichier toto qui se situe dans le /home de mon utilisateur peut être accéder de plusieurs façons :

# Le fichier toto se trouve dans le dossier /home/rooli/Desktop 
# L'utilisateur rooli se trouve dans /home/rooli/Desktop 
# Pour accéder au fichier, je peux alors utiliser le chemin relatif 
cat toto 

# ou le chemin absolu 
cat /home/rooli/Desktop/toto

# avec cat une commande permettant de visualiser le contenu d'un fichier 

En revanche, si je déplace mon utilisateur en me plaçant dans /home/rooli qui est le répertoire parent. La commande "cat toto" ne fonctionnera plus puisque mon fichier toto ne se trouve plus dans le répertoire courant. Je peux en revanche y référer en ajoutant le nom du dossier "Desktop" dans le chemin relatif :

Pour info, la commande pwd permet d'afficher le répertoire courant dans lequel se situe l'utilisateur.

Admettons maintenant que j'ai un fichier tata dans /home/rooli/ et que mon utilisateur se situe dans /home/rooli/Desktop comment est-ce que je peux interagir avec ce fichier en utilisant un chemin relatif ?

Rappelle-toi, j'ai deux répertoires spéciaux quelque soit le répertoire dans lequel je me trouve dont un qui se réfère au répertoire parent : "..". En utilisant ce répertoire je peux donc remonter d'un niveau au dessus et retomber dans /home/rooli depuis /home/rooli/Desktop.

De même, si tu fais un test, en utilisant autant de fois que nécessaire le ".." tu peux remonter jusqu'à la racine. Tu peux par exemple lister les utilisateurs du système en interrogeant le fichier passwd ou /etc/passwd en utilisant son chemin absolu. Depuis /home/rooli/Desktop, je peux faire ../../../etc/passwd par exemple.

Lister des fichiers c'est bien, mais il est aussi nécessaire de pouvoir se déplacer au sein du système, je te laisse certaines commandes de base pour que tu puisses expérimenter !


  • cd : Change Directory. Permet de se déplacer dans l'arborescence

  • ls : list. Permet de lister le contenu d'un répertoire

  • cat : Permet de lire le contenu d'un fichier.

  • mv : Permet de déplacer ou renommer un fichier.

  • rm : Permet de supprimer un fichier ou un répertoire.

  • mkdir : permet de créer un répertoire

  • rmdir : permet de supprimer un répertoire

  • touch : permet de créer un fichier vide

Conclusion

A travers cet article tu as pu voir les bases du fonctionnement de Linux.

  • Le shell

  • Le système de fichier

  • Une introduction sur les permissions.


N'hésite pas à expérimenter c'est comme ça qu'on apprend. De cette façon tu pourras mieux comprendre le fonctionnement des différentes commandes et du système en général !


Comments


bottom of page