1. Système de fichiers, arborescences

1.1. Système d'exploitation

Définition : Système d'exploitation

Un Système d'Exploitation (SE), ou Operating System en anglais (OS) est constitué d'un ensemble de programmes qui gèrent le fonctionnement de composants électroniques (ordinateur, téléphone portable, tablette, smartphone, montre connectée).

L'OS permet notamment :

  • de gérer les périphériques de stockage comme les disques durs (internes et externes), les CD/DVD/BluRay ainsi que les clés USB au travers de drivers qui sont des petits programmes qui seront chargés si on utilise un périphérique en particulier
  • de gérer le matériel pour exécuter les programmes (attribution de mémoire, gestion de l'accès aux fichiers et aux périphériques, ordonnancement pour l'exécution sur tel coeur du microprocesseur)

Généralement, l'OS impose un format spécifique de stockage des fichiers sur les périphériques comme les disques durs : il s'agit du système de fichiers du système d'exploitation.

Le système de fichiers définit notamment :

Voici quelques exemples de systèmes de fichiers liés à des systèmes d'exploitation :

 Système d'Exploitation   Type de système 
 MSDOS   FAT (Fat16, Fat32, VFAT) 
 WINDOWS   NTFS 
 LINUX   EXT (EXT2, EXT3, EXT4) 
 MACOS   HFS (HFS+) 
Exemples de Systèmes de fichiers

Par exemple le système de fichier FAT (File Allocation Table), qui est relativement ancien (1977), est généralement utilisé pour les clés USB notamment dans sa version FAT32 (1996).

En général, un ordinateur sous Windows ne pourra pas lire des fichiers sous LINUX à moins d'installer des drivers ou un logiciel spécifique. De la même manière un ordinateur sous LINUX ne pourra pas lire des fichiers sous NTFS à moins d'installer le package ntfs-3g.

Il existe d'autres systèmes d'exploitation comme :

1.2. Système de fichier MSDOS / Windows et Linux / Unix

1.2.1. MSDOS / Windows

Le système de fichier de MSDOS (FAT16, FAT32, VFAT), puis de Windows qui utilise NTFS (New Technology File System) depuis 1993 avec la version Windows NT 3.1, repose sur l'utilisation de lecteurs identifiés par une lettre : A: B: C: D:.

Ces lecteurs correspondent à un disque ou une partition (c'est à dire une partie du disque).

Dans une configuration classique, on trouvera les associations suivantes :

1.2.2. Linux / Unix

L'organisation d'un système Unix ou Linux repose sur une seule arborescence qui commence à la racine notée /.

Chaque sous-répertoire peut être associé à un support physique différent ou à une partition d'un disque.

Voici une arborescence de premier niveau sous Linux Ubuntu 20.04 à partir de la racine :

Voici quelques répertoires importants sous Linux :

/bin
/boot
/dev
/etc
/home
/mnt
/proc
/sys
/usr
/var

Vous trouverez plus d'explications sur la documentation Ubuntu.

1.3. Le shell

Le shell que l'on qualifie également de console ou de terminal est un programme qui exécute les commandes que saisit l'utilisateur au clavier. On peut le voir comme un petit langage de programmation.

Il permet d'interagir avec le système d'exploitation.

Il existe plusieurs types de shell :

1.4. HOME Directory (Home, Sweet Home)

UNIX/Linux étant un système multi-utilisateurs, chaque utilisateur dispose par convention de son espace personnel de fichiers dans le répertoire /home.

Par exemple, les utilisateurs jean et paul peuvent stocker leurs fichiers respectivement dans les répertoires /home/jean et /home/paul.

Comme nous le verrons plus tard, jean peut autoriser paul à avoir accès à ses fichiers ou lui interdire tout accès.

Le répertoire /home/jean de l'utilisteur jean s'appelle son HOME directory, soit en français son répertoire principal ou personnel.

Lorsque l'on ouvre un terminal, on se trouve dans ce répertoire. Pour retourner dans ce répertoire, il suffit de taper l'une des commandes suivantes :

richer@zentopia:~$ cd
richer@zentopia:/$ cd $HOME
richer@zentopia:/$ cd ~

Notamment le symbole ~ représente le HOME directory.

L'expression \$HOME prend le contenu de la variable HOME. Vous pouvez voir sa valeur en tapant la commande suivante dans le terminal :

richer@zentopia:~$ export | grep HOME

1.4.1. Différence entre chemin relatif et absolu

Dans une arborescence, lorsque l'on fait référence à un fichier ou un répertoire, on distingue :

Considérons l'arborescence de répertoires / fichiers suivante de l'utilisateur jean :


/home/jean
├── tds
│   ├── td1
│   │   ├── file10.txt
│   │   ├── file11.txt
│   │   ├── file1.txt
│   │   ├── file20.txt
│   │   ├── file2.txt
│   │   ├── file3.txt
│   │   └── images
│   │       └── pyramide.jpg
│   └── td2
└── tps
    ├── tp1
    │   ├── script1.sh
    │   └── script2.sh
    └── tp2

Le fichier file1.txt peut être accédé :

  • le symbole . désigne le répertoire actuel
  • et le symbole .. le répertoire parent.

1.5. Commandes

1.5.1. Format des commandes

Les commandes ont toutes le même format, à savoir :

commande [-options] [arguments]

Les crochets [] qui entourent "arguments" ou "-options" signifient que ceux-ci sont optionnels.

1.5.2. man pour l'accès au manuel

La commande man est l'abrégé de manual, c'est à dire le manuel d'utilisation (RTFM !)

Le manuel est composé de plusieurs niveaux (voir man man) :

1.5.3. pwd pour afficher le répertoire courant

pwd pour Print Working Directory affiche le répertoire dans lequel on se trouve.

# répertoire actuel
pwd
/home/jean/tds/td1

1.5.4. cd pour changer de répertoire

cd pour Change Directory permet de changer de répertoire.

# revenir au home directory
cd
# ou
cd ~

# aller dans le répertoire tds/td1
cd tds/td1

# aller dans le répertoire tp1/tp2
cd ../../tps/tp2
# ou
cd ~/tps/tp2

1.5.5. ls pour lister le contenu d'un répertoire

ls pour List Directory contents permet d'afficher les répertoires et les fichiers.

# lister les fichiers du répertoire courant
ls
# ou
ls *
file10.txt  file11.txt  file1.txt  file20.txt  file2.txt  file3.txt images

# lister tous les fichiers (dont les fichiers cachés, cf ci-après)
ls -a
.  ..  file10.txt  file11.txt  file1.txt  file20.txt  file2.txt  file3.txt

# lister les fichiers au format long
ls -l
total 28
-rw-rw-r-- 1 richer richer  370 nov.   1 23:39 file10.txt
-rw-rw-r-- 1 richer richer  982 nov.   1 23:39 file11.txt
-rw-rw-r-- 1 richer richer  142 nov.   1 23:38 file1.txt
-rw-rw-r-- 1 richer richer   27 nov.   1 23:39 file20.txt
-rw-rw-r-- 1 richer richer  273 nov.   1 23:39 file2.txt
-rw-rw-r-- 1 richer richer  529 nov.   1 23:39 file3.txt
drwxrwxr-x 2 richer richer 4096 nov.   1 23:44 images

# lister au format long avec tri sur taille du fichier
ls -l -S
ou
ls -lS
total 28
drwxrwxr-x 2 richer richer 4096 nov.   1 23:44 images
-rw-rw-r-- 1 richer richer  982 nov.   1 23:39 file11.txt
-rw-rw-r-- 1 richer richer  529 nov.   1 23:39 file3.txt
-rw-rw-r-- 1 richer richer  370 nov.   1 23:39 file10.txt
-rw-rw-r-- 1 richer richer  273 nov.   1 23:39 file2.txt
-rw-rw-r-- 1 richer richer  142 nov.   1 23:38 file1.txt
-rw-rw-r-- 1 richer richer   27 nov.   1 23:39 file20.txt

# lister les fichiers dans le répertoire /bin
ls /bin

Attention : sous Linux les fichiers cachés commencent par un point .

Au format long (-l), les champs affichés sont les suivants :

Concernant les permissions, elles sont listées pour le propriétaire (utilisateur), le groupe et les autres (user, group, others) :

  • r = Readable, on peut lire le fichier
  • w = Writable, on peut écrire dans le fichier
  • x = eXecutable, exécutable pour les fichiers ou accès pour les répertoires

Voir la commande chmod pour modifier les permissions.

On peut utiliser des caractères spéciaux pour spécifier les fichiers à afficher.

? [ ] - ^ * \

# ? pour un caractère
ls file?.txt
file1.txt  file2.txt  file3.txt

# [] pour une liste de caractères
# tous les fichiers dont le 5ème caractère est 1 ou 2 et qui commence par 'file'
ls file[1-2].txt
file1.txt  file2.txt

# tous les fichiers qui commencent par une lettre minuscule, puis 0 à n caractères et qui se terminent par ".txt"
ls [a-z]*.txt
file10.txt  file11.txt  file1.txt  file20.txt  file2.txt  file3.txt

# tous les fichiers qui commencent par "f", puis 0 à n caractères et qui se terminent par ".txt"
ls f*.txt
file10.txt  file11.txt  file1.txt  file20.txt  file2.txt  file3.txt

# tous les fichiers qui ne commencent par par la lettre f
ls [^f]*

1.5.6. chmod pour modifier les droits d'un fichier

La commande chmod (CHange file MODe bits) permet de modifier les droits d'un fichier ou d'un répertoire.

On distingue :

Le fichier /etc/group contient les groupes existants :

# nom du groupe:mot de passe:identifiant numérique:liste utilisateurs
root:x:0:
daemon:x:1:
bin:x:2:
...

cdrom:x:24:richer      utilisation du cdrom
sudo:x:27:richer       devenir super utilisateur
lpadmin:x:120:richer   gérer les imprimantes
richer:x:1000:  

On peut modifier les droits de deux manières différentes :

# interdire l'écriture pour le groupe et les autres sur un fichier
chmod go-w file1.txt

# donner tous les droits à l'utilisateur et aucun au groupe ou aux autres
chmod 0700 file1.txt

# jean ne donne aucun droit au groupe ou aux autres sur son HOME directory :
chmod go-rwx /home/jean

1.5.7. echo pour afficher du texte

La commande echo permet d'afficher du texte :

echo "Bonjour !"
Bonjour
echo "Bonjour $USER"
Bonjour richer

On peut également rediriger la sortie de la commande pour l'envoyer vers un fichier :

echo "Bonjour !" > file.txt

1.5.8. mkdir pour créer un répertoire

Pour créer un répertoire on utilise la commande mkdir pour MaKe DIRectory.

Cette commande accepte une option -p qui permet de créer une arborescence de répertoires.

A partir d'un terminal :

# créer un répertoire cms et un sous répertoire cm1 dans cms
mkdir cms
cd cms
mkdir cm1

# ou alors
mkdir -p cms/cm1

1.5.9. rmdir pour supprimer un répertoire

La commande rmdir (RemoVe DIRectory) permet de supprimer un répertoire s'il ne contient aucun fichier.

# supprimer le répertoire cm1 de cms
rmdir cms/cm1

1.5.10. rm pour supprimer des fichiers et des répertoires

La commande rm (ReMove) permet de supprimer des fichiers ou des répertoires.

# supprimer tous les fichiers
!!! A ne pas utiliser en général ou faire très attention !!!
rm *

# supprimer tous les fichiers récursivement (dans les sous répertoires)
!!! A ne pas utiliser !!!
rm -r *

# supprimer tous les fichiers d'extension ".txt" en mode interactif
rm -i *.txt

1.5.11. Afficher le contenu d'un fichier texte

On dispose de plusieurs commandes pour afficher le contenu d'un fichier texte :

# afficher le fichier file1.txt
cat file1.txt

# afficher le fichier file1.txt page par page
more file1.txt
ou
cat file1.txt | more

# afficher les 20 premières lignes
head -n 20 file1.txt
ou
cat file1.txt | head -n 20

# afficher les 15 dernières lignes
tail -n 15 file1.txt
ou
cat file1.txt | tail -n 15

Le symbole | (appelé pipe en anglais) fournit le résultat de la commande à sa gauche à la commande de droite.

1.5.12. tar ou zip pour archiver des fichiers

Il existe plusieurs utilitaires qui permettent de créer une archive et de la compresser, notamment l'utilitaire tar (Tape ARchiver) qu'il faut utiliser avec les options suivantes que l'on peut combiner :

# créer une archive du répertoire tds
tar -cf tds.tar tds

# créer et compresser
tar -czf tds.tar.gz tds
ou
tar -czf tds.tgz tds

# décompresser une archive
tar -xf tds.tar
ou
tar -xzf tds.tgz

# décompresser une archive vers le répertoire ~/tmp
tar -xzf tds.tgz -C ~/tmp

On peut également utiliser l'utilitaire zip :

# créer une archive du répertoire tds
zip -r tds.zip tds
  adding: tds/ (stored 0%)
  adding: tds/td2/ (stored 0%)
  adding: tds/td1/ (stored 0%)
  adding: tds/td1/images/ (stored 0%)
  adding: tds/td1/images/pyramide.jpg (deflated 1%)
  adding: tds/td1/file3.txt (deflated 51%)
  adding: tds/td1/file20.txt (deflated 15%)
  adding: tds/td1/file11.txt (deflated 50%)
  adding: tds/td1/file10.txt (deflated 41%)
  adding: tds/td1/file2.txt (deflated 44%)
  adding: tds/td1/file1.txt (deflated 36%)

# décompresser avec zip
unzip tds.zip

# décompresser avec zip dans le répertoire ~/tmp
unzip tds.zip -d ~/tmp

1.5.13. ps et kill pour gérer les processus

Sous Linux un processus est un programme qui s'exécute. Il est identifié par un identifiant entier appelé pid pour Processus IDentifier.

Pour afficher tous les processus qui s'exécutent, on utilise la commande ps -ef :

richer@zentopia:/$ ps -ef
UID          PID    PPID  C STIME TTY          TIME CMD
root           1       0  0 13:08 ?        00:00:01 /sbin/init splash
root           2       0  0 13:08 ?        00:00:00 [kthreadd]
root           3       2  0 13:08 ?        00:00:00 [rcu_gp]
root           4       2  0 13:08 ?        00:00:00 [rcu_par_gp]
root           5       2  0 13:08 ?        00:00:00 [netns]
...
richer      6937    3644  0 13:12 pts/1    00:00:00 bash
richer      6984    6937  1 13:12 pts/1    00:01:18 gedit autodescr_nasm.asm
richer      7379    2698  0 13:13 ?        00:00:00 /usr/libexec/gvfsd-network --spawner :1.3 /org/gtk/gvfs/e
richer      7398    2698  0 13:13 ?        00:00:00 /usr/libexec/gvfsd-dnssd --spawner :1.3 /org/gtk/gvfs/exe
...
www-data   12093    2013  0 14:14 ?        00:00:00 /usr/sbin/apache2 -k start
www-data   12097    2013  0 14:14 ?        00:00:00 /usr/sbin/apache2 -k start
www-data   12098    2013  0 14:14 ?        00:00:00 /usr/sbin/apache2 -k start
www-data   12099    2013  0 14:14 ?        00:00:00 /usr/sbin/apache2 -k start
www-data   12100    2013  0 14:14 ?        00:00:00 /usr/sbin/apache2 -k start

Dans la liste précédente on distingue le PID et le PPID, le parent PID, c'est à dire le numéro de processus qui est reponsable de la création du processus.

Dans l'exemple précédent, il y a 394 processus.

Pour supprimer un processus il faut utiliser la commande kill qui envoie un signal (une sorte de message) à un processus. Par exemple la commande kill -l donne la liste des signaux que l'on peut envoyer :

richer@zentopia:/$ kill -l
 1) SIGHUP	 2) SIGINT	 3) SIGQUIT	 4) SIGILL	 5) SIGTRAP
 6) SIGABRT	 7) SIGBUS	 8) SIGFPE	 9) SIGKILL	10) SIGUSR1
11) SIGSEGV	12) SIGUSR2	13) SIGPIPE	14) SIGALRM	15) SIGTERM
16) SIGSTKFLT	17) SIGCHLD	18) SIGCONT	19) SIGSTOP	20) SIGTSTP
21) SIGTTIN	22) SIGTTOU	23) SIGURG	24) SIGXCPU	25) SIGXFSZ
26) SIGVTALRM	27) SIGPROF	28) SIGWINCH	29) SIGIO	30) SIGPWR
31) SIGSYS	34) SIGRTMIN	35) SIGRTMIN+1	36) SIGRTMIN+2	37) SIGRTMIN+3
38) SIGRTMIN+4	39) SIGRTMIN+5	40) SIGRTMIN+6	41) SIGRTMIN+7	42) SIGRTMIN+8
43) SIGRTMIN+9	44) SIGRTMIN+10	45) SIGRTMIN+11	46) SIGRTMIN+12	47) SIGRTMIN+13
48) SIGRTMIN+14	49) SIGRTMIN+15	50) SIGRTMAX-14	51) SIGRTMAX-13	52) SIGRTMAX-12
53) SIGRTMAX-11	54) SIGRTMAX-10	55) SIGRTMAX-9	56) SIGRTMAX-8	57) SIGRTMAX-7
58) SIGRTMAX-6	59) SIGRTMAX-5	60) SIGRTMAX-4	61) SIGRTMAX-3	62) SIGRTMAX-2
63) SIGRTMAX-1	64) SIGRTMAX	

En l'occurrence, le signal de numéro 9 (SIGKILL) permet de tuer (demander la fin de l'exécution) d'un processus. Pour arrêter l'éditeur gedit, on tapera :

richer@zentopia:/$ ps -ef | grep "gedit"
richer      6984    6937  1 13:12 pts/1    00:01:29 gedit autodescr_nasm.asm
richer     12495   12120  0 14:29 pts/2    00:00:00 grep --color=auto gedit
richer@zentopia:/$ kill -9 6984

Note : il faut faire précéder la commande de sudo pour devenir super-utilisateur si on désire supprimer un processus qui ne nous appartient pas.