Le Système Unix

Guillaume Chanel

Remerciements à Jean-Luc Falcone

Cours système d'exploitation by Guillaume Chanel, Jean-Luc Falcone and University of Geneva is licensed under CC BY-NC-SA 4.0

Shell

Interface texte

Pourquoi utiliser une interface texte au temps des interfaces graphiques ?

Le Shell

  • Interface textuelle, ligne de commande
  • presque toutes les fonctionnalités d'Unix sont accessibles
  • Petits outils simple que l'on peut composer
  • Possibilité d'écrire des scripts

Les Shells

  • Il existe plusieurs shell différents (sh, bash, csh, zsh, ash, etc.)
  • Ils diffèrent par:
    • Manière d'écrire les scripts
    • Configuration et personnalisation
    • Commandes prédéfinies

Terminal & Pseudo-Terminal

image
terminal
image
VT220
image
Pseudo-terminal

Utilisateurs

Utilisateurs

  • Chaque utilisateur se loge sur une machine Unix avec une identité (user)
  • Un utilisateur est décrit par:
    • Nom d'utilisateur
    • Mot de passe
    • Identifiant numérique (userid)
    • Groupe par défaut
    • Répertoire home
    • Description
    • Shell par défaut
Notes
  • On peut créer un utilisateur pour certain programmes (par exemple serveur web).
  • Le utilisateurs "locaux" sont listés dans le fichier /etc/passwd.

Propriété & Permissions

  • Chaque processus appartient à un utilisateur
  • Chaque fichier et répertoire appartient à un utilisateur
  • Un utilisateur est abilité à:
    • Modifier ses fichiers et ses répertoires
    • Intéragir (et arrêter) ses processus

Super-utilisateur (root)

  • Il existe un super-utilisateur: root
  • Son userid est le 0
  • Il a le droit de tout faire.
Attention

Accès au mot de passe root: faille de sécurité majeure.

Groupes

Les utilisateurs peuvent faire partie d'un ou plusieurs groupes:

  • Groupe par défaut
  • Autres groupes

Ceci permet par exemple de:

  • restreindre l'accès à un répertoire à un seul groupe
  • donner accès à un périphérique à un seul groupe

Note

Les groupes "locaux" sont listés dans le fichier /etc/group.

Commandes importantes

whoami quel est mon nom d'utilisateur
groups de quels groupes fais-je partie ?
id affiche les identifiants de mon nom d'utilisateur et de mes groupes
w quels sont les utilisateurs logués sur la machine
who comme w mais avec moins d'infos
exit permet de quitter le shell courant

Manuel

Accèder au manuel (man)

  • Un manuel très complet est présent sur les systèmes Unix
  • Commande:

man [section] <sujet>

Exemples
$ man pwd
$ man 3 getcwd
$ man man
$ apropos sujet # une commande utile pour lister les sections d'un sujet

Sections du manuel sur GNU/Linux

1 Commandes générales
2 Appels systèmes
3 Librairie C
4 Fichiers spéciaux
5 Formats de fichiers et conventions
6 Jeux
7 Divers
8 Commandes d'administration et démons

RTFM !

Fichiers

Système de fichiers (1)

  • Manière d'organiser les données sur le disque:
    • Noms
    • Répertoires
    • Permissions
    • Metadonnées
    • Maintien de l'intégrité

Système de fichiers (2)

Il existe plusieurs types de systèmes de fichiers. Par exemple:

VFAT Ancien système de fichiers de Windows, très utilisé sur les clé-usb, lecteurs MP3, etc.
NTFS Système de fichiers récent sur Windows.
ext4 Système de fichiers par défaut sous beaucoup de distributions GNU/Linux
ISO9660 Système de fichiers des CD-ROMs
UDF Système de fichiers des DVDs
HFS+ Système de fichiers sur MacOSX
NFS Système de fichiers réseau sous Unix
IPFS Système de fichiers peer-to-peer distribué

Arborescence (1)

  • Tous les systèmes de fichiers sont "montés" sur une seule et même arborescence.
  • Seul root peut monter/démonter des systèmes de fichiers (par défaut)
  • La plupart des installations GNU/Linux actuelles, montent automatiquement les disques externes (CD, DVD, usb)

Arborescence (2)

Schema des partitions
Partitionnement des espaces

Arborescence (3)

Montage des partitions
Montage des systèmes de fichiers dans l'arborescence

Arborescence unix standard

/bin/Principaux exécutables
/boot/Fichiers de démarrage
/dev/Périphériques
/etcConfiguration système
/home/Données utilisateurs
/lib/Librairies système
/media/Montage des périphériques de stockage
/mnt/Point de montage manuel
/proc/Processus
/root/Répertoire perso du superutilisateur
/sbin/Exécutables pour la maintenance
/sys/Informations système
/usr/Applications et librairies utilisateurs
/var/Données variables (logs, spool, mail…)

Noms de fichiers et de répertoires

  • Maximum 255 caractères
  • Tous les caractères sont autorisés, mais déconseillés
    • espaces
    • . * ? / !
  • Si le nom du fichier commence par un point, il est caché.

Chemin d'accès

Les conventions suivantes (POSIX) s'appliquent:

  • La racine est représentée par /
  • Les répertoires sont séparés par /
  • Tout chemin qui ne commence par / est relatif au répertoire courant.
  • Le répertoire courant est symbolisé par .
  • Le réperoire parent est symbolisé par ..
  • Le répertoire home est symbolisé par ~

WTF?
~/././././hello
~/./hello/../hello/../.

Commandes utiles

pwd affiche le répertoire courant
cd change de répertoire courant
ls liste le contenu d'un répertoire

Lister un répertoire (ls)

ls [options]... [répertoire-ou-fichier]...

Par défaut, utilise le répertoire courant

Options courantes:

-l liste les fichiers (plus d'infos)
-h affiche les tailles en format humain
-a affiche les fichiers cachés
$ ls ..
$ ls dossier/sous-dossier
$ ls -l dossier1 dossier2 fichier
$ ls -l | less # utile si la sortie est trop longue

Créer un repertoire (mkdir)

mkdir [options]... répertoire-à-créer...

L'option -p permet de créer automatiquement les repertoires parents.

$ mkdir ../foo
$ mkdir ../foo/bar ../foo/bar/baz

$ mkdir -p ../foo/bar/baz  # equivalent des précédents en une commande

Déplacer et renommer des fichiers (mv)

mv [options]... fichiers... destination

Fonctionne aussi avec des répertoires

$ mv foo.avi bar.mpg baz.mkv video/  # deplace foo.avi et bar.mpg dans le dossier vidéo
$ mv SysInfo/ InfoBio ~/cours  # deplace les premiers éléments dans le répertoire cours du "home"

$ mv foo.AVI foo.avi  # renomme le fichier foo.AVI vers foo.avi (case sensitive)

$ mkdir bar
$ mv bar/ foo/  # renomme le dossier bar en foo SI foo n'existe pas !

Options de la commande mv

Que faire si on déplace un fichier vers une source ou un fichier existe déjà avec le même nom:

-f Ecrase silencieusement la destination si elle existe (force)
-i Demande une confirmation avant d'écraser la destination (interactive)
-u Efface la destination si elle est plus ancienne que la source (update)

Copier un fichier (cp)

cp [options]... fichiers... destination

Options:

-r Copie aussi le contenu des répertoires (recursive)
-a Préserve les attributs (permissions, propriétaire, etc.) et copie le contenu des répertoires (archive)
$ cp foo.txt foo.txt.backup
$ cp bar.txt baz.doc projet/  # copie les deux fichiers dans le dossier projet

Options de la commande cp

Que faire si on déplace un fichier vers une source ou un fichier existe déjà avec le même nom:

-f Ecrase silencieusement la destination si elle existe (force)
-i Demande une confirmation avant d'écraser la destination (interactive)
-u Efface la destination si elle est plus ancienne que la source (update)

Effacer un répertoire vide (rmdir)

rmdir [options]... répertoires...

L'option -p permet de supprimer automatiquement les repertoires parents si ils sont vides.

$ rmdir ../foo/bar/baz
$ rmdir ../foo/bar
$ rmdir ../foo

$ rmdir ../foo/bar/baz  # equivalent aux commandes précédentes

Effacer un fichier / répertoire (rm)

rm [options]... fichiers...

Options:

-r efface recursivement le contenu (recursive)
-f ne demande pas de confirmation (force)
-i demande une confirmation pour chaque fichier (interactive)
$ rmdir ../foo/bar/baz
$ rm foo.txt foo.txt.backup
$ rm -rf foo/  # supprime tout le contenu de foo

Y'a-t-il une différence ?

$ mv foo.avi video/

vs.

$ cp foo.avi video/
$ rm foo.avi

A. ouiB. non

https://votamatic.unige.ch, code BGPL

Si les fichiers sont sur le même système de fichier:

  • mv ne fait que déplacer le nom (le lien), sans déplacer les données
  • cp + rm copie les données puis les supprime (beaucoup moins efficace)

Agir sur un groupe de fichier wildcards

  • On peut utiliser les métacaractères (wildcards) suivants dans les noms des fichiers:
    *remplace zéro, un ou plusieurs caractères
    ? un seul caractère
  • Si le nom du fichier contient un astérisque ou un point d'intérogation on peut utiliser un backslash pour l'échapper.

Le Cauchemar

Attention !
$ rm -rf ~/*.txt
$ rm -rf ~/* .txt
image

Permissions

file permissions

Permissions - effets

Fichier:
ReadLire le contenu du fichier
WriteModifer le contenu d'un fichier
Warning en cas de suppression
eXecuteExécuter le fichier (exécutable binaire ou script)

Répertoire:
ReadLister les noms des fichiers inclus (mais pas les métadonnées)
WriteCréer, renommer ou détruire les fichiers inclus
eXecute"Ouvrir" le répertoire, voir les métadonnées, accèder au contenu des fichiers (mais pas aux noms), exécuter les fichiers exécutables.

Permissions - octal (3)

Changer les permissions (chmod)

chmod [options]... permission fichiers...

L'option -R agit récursivement sur le contenu des répertoires

$ chmod 666 foo.txt
$ chmod 640 videos/*
$ chmod 750 videos/
$ chmod -R 750 videos/  # change les permissions de videos/ mais aussi de TOUT son contenu

Changer les permissions (2)

  • La command chmod accepte également une représentation symbolique:
  • Elle se forme de la manière suivante:
    1. u (user), g (group), o (other), ou a (all)
    2. + (add), - (remove), ou = (set)
    3. Les permission au "format" rwx
$ chmod a+rw foo.txt  # ajoute les droit read et write à tous
$ chmod u=w foo.txt   # l'utilisateur n'a QUE le droit w
$ chmod g-wx foo.txt  # le groupe perd les droit write et execution

Changer le groupe (chgrp)

chrgp [options]... groupe fichiers...

L'option -R agit récursivement sur le contenu des répertoires

$ chgrp video *.avi
$ chgrp -R admin notes/

Fichiers cachés

Il suffit d'ajouter un point au début du nom d'un fichier pour le cacher.

$ mv foo.txt .foo.txt
$ cp ~/.bashrc /tmp/bashrc

Autres commandes utiles

  1. Afficher l'espace restant sur toutes les partitions:
    $ df -h
  2. Calculer la taille de chaque sous-répertoire et fichier:
    $ du -sh *
  3. Chercher récursivement par le nom:
    $ find . -name "*.txt"
  4. Créer un lien symbolique:
    $ ln -s /machin/chose/truc/ ~/truc

Everything is a file

  • Plusieurs concepts sont représentés par des fichiers synthétiques.
  • Par exemple:
    • Les périphériques sont visibles dans /dev/
    • Les processus (et certaines info système) sont visibles dans /proc/
    • Informations sur les périphériques dans /sys/

Exemples d'utilisation de /dev/

Faire une image ISO à partir d'un CD
$ dd if=/dev/cdrom of=~/image.iso
Remplir une partition de données pseudo-aléatoires
$ dd if=/dev/urandom of=/dev/sdb1 bs=1M

Flux et redirections

Flux de Sortie Standard

  • La plupart des commandes (des processus) ont un flux de sortie.
  • Par défaut ce flux est dirigé vers le shell.
  • On peut le rediriger vers un fichier avec >:
    • commande arguments > fichier

Concaténer (cat)

On peut concaténer plusieurs fichiers avec cat

cat [options]... [fichiers]...

Le résultat est envoyé sur le flux de sortie

Options:

-nnumérote les lignes
-bnumérote les lignes non-vides
$ cat foo.txt
$ cat foo.txt bar.txt
$ cat foo.txt bar.txt > all.txt  # ecrit le resultat dans all.txt au lieu su shell
$ cat episode1.avi episode2.avi episode3.avi > full.avi  # est-ce que ca marche ?

Sauver le résultat d'une commande

On peut sauver le résultat de toute commande utilisant le flux de sortie:

$ ls -lh > content.txt
$ df -h > disk_usage.txt
$ w > users.txt

Flux d'entrée standard

  • La plupart des commandes (des processus) ont un flux d'entrée.
  • Par défaut ce flux est est issu du clavier
  • On peut le rediriger vers un fichier avec <:
    • commande arguments < fichier

Compter (wc)

On peut compter les caractères/mots/lignes avec wc

wc [options]... [fichiers]...
  • Le résultat est envoyé sur le flux de sortie
  • Par défaut, l'entrée standard est utilisée

Options:

-ccompte les caractères
-wcompte les mots
-lcompte les lignes
$ wc -w foo.txt
$ wc -w < foo.txt
$ wc -w < foo.txt > words.dat
$ wc -w

Entrée standard

On peut interrompre le flux avec ctrl+D.

$ cat > foo.txt

Ajout (>>)

  • La redirection > écrase la destination si elle existe
  • On peut utiliser >> pour ajouter à un fichier existant
$ wc -l < foo.txt >> stats.dat
$ wc -l < bar.txt >> stats.dat
$ wc -l < baz.txt >> stats.dat

Pipes (tubes)

On veut concaténer des fichiers et compter les lignes du résultat:

$ cat foo.txt bar.txt baz.txt > all.txt
$ wc -l < all.txt > stats.dat

On peut utiliser les pipes (|) pour rediriger la sortie d'une commande vers l'entrée de la suivante:

$ cat foo.txt bar.txt baz.txt | wc -l > stats.dat

Trier les lignes (sort)

sort [options]...

Options:

-rtrie "à l'envers"
-ntri numérique
-htri des représentations "humaines"
$ du -sh * | sort -h
$ du -sh * | sort -rh
$ sort < words.txt > sorted.txt

Garder les premières lignes (head)

head [options]... [fichiers]...

Options:

Par défaut garde les 10 premières lignes

-n kgarde les k permières lignes
-c kgarde les k premiers bytes
$ head -n 5 < foo.txt
$ du -sh * | sort -rh | head -n 5 > biggest.txt

Flux d'erreur standard

  • La plupart des commandes (des processus) ont un flux d'erreur.
  • Par défaut ce flux est dirigé vers la console.
  • On peut le rediriger vers un fichier avec 2>:
    • commande arguments 2> fichier
  • On peut rediriger le flux d'erreur vers le flux de sortie avec 2>&1:
    • commande arguments > fichier 2>&1

Flux Standard dans les langages de programmation

CC++JavaPythonRuby
Entréestdinstd::cinSystem.insys.stdin$stdin
Sortiestdoutstd::coutSystem.outsys.stdout$stdout
Erreurstderrstd::cerrSystem.errsys.stderr$stderr
Exemple
System.out.println( "Hello world!" );
Redirection
$ java HelloWorld > hello.txt

Processus

Processus (1)

  • Instance d'un programme en cours d'execution
  • Possède:
    • Son code en langage machine
    • Des Segments de mémoire
    • Des descripteurs de fichiers
    • Un propriétaire et un ensemble de permissions
    • Un état à un moment donné
  • Un coeur de processeur ne peut exécuter qu'un processus à la fois
  • Le système d'exploitation peut alterner l'execution de plusieurs processus (multi-tasking)

Processus (2)

Sous unix, tous les processus ont:

  • un identifiant numérique (PID)
  • un processus parent (sauf le processus 0)
  • une priorité

Afficher les processus (ps)

ps [options]...

Exemples d'options:

-eFVoir tous les processus
-ejHVoir l'arbre des processus
-u falconeVoir tous les processus de l'utilisateur falcone

Interlude: grep

La commande grep est extremement utile car elle permet de filtrer les lignes qui contiennent un certain motif

grep [options]... <motif> [fichiers]...

Options utiles:

-iignore les majuscules
-vexclus les lignes qui contiennent le motif
-rcherche recursivement (sous-répertoires)
$ grep falcone /etc/passwd
$ ps -eF | grep java

Utilisation du CPU (top)

La commande top permet de voir quels processus occupent le(s) CPU(s).

Signaux

  • Les signaux permettent une communication limitée entre les processus.
  • La commande kill -l permet d'afficher les différent signaux
  • Quelques signaux utiles:
NomActionNumero
SIGINTInterrompt le processus2
SIGKILLTue le processus immédiatement9
SIGTERMDemande la terminaison (propre)15
SIGTSTPSuspension20
SIGCONTActive un processus suspendu18
SIGUSR1Signal utilisateur 110
SIGUSR2Signal utilisateur 212

Envoyer un signal (kill)

kill -signal [pids]...

kill permet d'envoyer un signal à un processus

$ kill -SIGKILL 2111 2120
$ kill -15 2111

Gestion des signaux par les processus

  • Tous les processus peuvent gérer (intercepter) un signal.
  • Par exemple:
    • Sauver l'état avant de quitter lorsque SIGTERM est reçu
    • Redémarer le processus lorsque SIGINT est reçu
  • Le signal SIGKILL ne peut être intercepté

Signaux depuis le shell

Les raccourcis claviers suivant permettent de lancer un signal à un processus du shell:

ctrl+CEnvoie SIGINT
ctrl+ZEnvoie SIGTSTP

Attention ctl+D n'est pas un signal mais envoie "End-Of-File" (EOF) sur l'entrée standard

Jobs

  • Par défaut, tout processus lancé depuis le shell tourne à l'avant-plan (foreground)
  • Un processus en avant-plan bloque le shell tant qu'il n'est pas fini.
  • On peu aussi lancer un processus en arrière-plan (background):
    • Ajouter un & après la commande:
      $ gedit &
    • Interrompre un processus:
      • Utilisez ctrl-Z pour interrompre le processus
      • Utilisez la commande bg pour relancer un processus interrompu en arrière-plan
      • On peut aussi utiliser fg pour remettre le dernier processus interrompu en avant-plan