Aller au contenu

Administration Unix - CM séance 14

14. Les systèmes de fichiers

14.1. Les partitions

14.1.1. Adressage en secteurs

Historiquement, les disques durs étant composés de plusieurs plateaux et têtes de lecture, l'adressage d'une zone de données se faisait en numéros de cylindre (piste) / tête / secteur (angulaire) = adressage CHS (Cylinder / Head / Sector).

Le BIOS codait chaque numéro sur un nombre limité de bits, ce qui limitait la taille adressable des disques durs (8 Go avec quelques astuces).

Une nouvelle méthode de numérotation est apparue en 1994 : l'adressage LBA (Logical Block Addressing), d'abord dans la norme SCSI.

L'adressage LBA consiste simplement à diviser un disque en secteurs d'une taille fixe, et à les numéroter à partir de 0. L'électronique du disque se charge ensuite de le retrouver à partir du numéro de secteur.

La taille des secteurs est souvent de 512 (disques durs), 2048 (CD et DVD), ou 4096 octets (Advanced Format Drive), voir 8192 (certains SSD).

Cet adressage a été généralisé à la plupart des mémoires de masse (disques durs, disques SSD, clés USB, disques optiques, disquettes, etc).

14.1.2. Tables de partition

Certaines mémoires de masse possèdent une "table de partition" :

  • les disques durs (HDD), disques SSD, clés USB, ...
  • mais pas : disquettes, disques optiques, cassettes DAT, bandes.

La table de partition contient les informations nécessaires pour diviser le support en 1 ou plusieurs partitions, chacune étant une plage de numéros de secteurs.

Il en existe différents formats de tables de partitions :

  • table MS-DOS du MBR (ordinateurs PC XT avec un BIOS, années 1980)
  • table GPT = GUID Partition Table (PCs plus récent)
  • table APM = Apple Partition MAP
  • et de plus anciens (AIX, AMIGA, BSD, PC98, SUN, BSD, SGI, ...)

Partitions de type MS-DOS :

  • stockée sur 64 bits dans le MBR (Master Boot Record) du disque dur = le premier secteur adressable du disque dur, de taille 512 octets ;
  • chaque partition est décrite dans le MBR par le secteur de début et de fin ;
  • l'espace qui n'est pas alloué dans ces partitions n'est pas utilisable ;
  • la taille des partitions est limitée à 2To (1 Téra-octet = 10^12 octets).

Chaque partition a un type, qui indique au système d'exploitation comment l'utiliser :

  • système de fichier NTSF, FAT32, EXT4, ...
  • SWAP (zone d'échange avec la mémoire vive),
  • EFI : pour stocker des informations pour le boot UEFI (petite partition)
  • partition étendue, cf ci-dessous
  • partition LVM pour le redimensionnement
  • ...

Il y a au maximum 4 partitions, dites "primaires", qui sont numérotées de 1 à 4.

Pour dépasser cette limite de 4 partitions, l'une des partitions primaire peut avoir le type "partition étendue", ce qui lui permet d'être subdivisée en d'autres partitions (maximum 63), qui ont elles-même

  • un type (NTFS, FAT32, EXT4, swap, ...) ;
  • un numéro, à partir de 5.

Partitions de type GPT :

  • Apparues avec l'UEFI ;
  • gérées depuis windows server 2003, windows 8, Linux (Fedora 8, Ubuntu 8) ;
  • il n'y a plus de distinction partitions primaire / étendue ;
  • il peut y avoir jusqu'à 128 partitions ;
  • la taille des disques et partitions peut aller jusqu'à 9,4 Zo (1 Zéta-octet = 10^21 octets), c-à-d 9,4 milliards de Téras.

14.1.3. Nommage des disques et partitions

Sous Linux, les mémoires de masse apparaissent dans le répertoire /dev où sont rangés tous les périphériques (devices) :

  • floppy disk :

    /dev/fd0, /dev/fd1          1er lecteur détecté, 2e, ...
    

  • disques durs IDE :

    /dev/hda, /dev/hdb, ...     1er disque détecté, 2e, ...
    /dev/hda1                   1ère partition de hda
    

  • disques durs SATA, SCSI, clés USB :

    /dev/sda, /dev/sdb, ...     1er disque détecté, 2e, ...
    /dev/sda1                   1ère partition de sda
    

  • disques optiques :

    /dev/sr0, /dev/sr1          1er disque détecté, 2e, ...
    

  • disques NVMe (un type de SSD sur bus PCI Express) :

    /dev/nvme0n1                1er block device
    /dev/nvme0n1p1              1ère partition
    

  • cartes mémoires MMC et SD :

    /dev/mmcblk0                1er device
    /dev/mmcblk0p1              1ère partition
    

14.1.4. Outils pour manipuler les partitions

  • Listing étendu : ls -l /dev

    affiche tous les périphériques de masse, mélangés à pleins d'autres choses.

  • lsblk : list block devices

    affiche les disques, partitions, points de montage

    $ lsblk
    NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
    sda      8:0    0   20G  0 disk 
    ├─sda1   8:1    0  512M  0 part /boot/efi
    ├─sda2   8:2    0    1K  0 part 
    └─sda5   8:5    0 19,5G  0 part /
    sr0     11:0    1 58,2M  0 rom  /media/thiel/VBox_GAs_6.1.16
    

Les outils suivants permettent de manipuler les disques et les partitions, avec plus ou moins de possibilités (types de disques, ...) ; il peut y avoir des différences, par exemple dans les calculs de secteurs.

  • fdisk :

    gère les disques en MBR et en GPT ; ne modifie pas le disque tant qu'on a pas demandé d'écrire la nouvelle table de partitions (ce qui permet d'annuler une manipulation).

    Afficher les disques, partitions, secteurs :

    $ sudo fdisk -l
    Disque /dev/sda : 20 GiB, 21474836480 octets, 41943040 secteurs
    Disk model: VBOX HARDDISK
    Unités : secteur de 1 × 512 = 512 octets
    Taille de secteur (logique / physique) : 512 octets / 512 octets
    taille d'E/S (minimale / optimale) : 512 octets / 512 octets
    Type d'étiquette de disque : dos
    Identifiant de disque : 0xf117cd89
    
    Périphérique Amorçage   Début      Fin Secteurs Taille Id Type
    /dev/sda1    *           2048  1050623  1048576   512M  b W95 FAT32
    /dev/sda2             1052670 41940991 40888322  19,5G  5 Étendue
    /dev/sda5             1052672 41940991 40888320  19,5G 83 Linux
    

    Manipulation du disque sda en mode interactif :

    $ sudo fdisk /dev/sda
    
    m   pour afficher l'aide sur les commandes
    p   pour afficher la table de partition courante
    n   pour créer une nouvelle partition (des informations seront
        demandées : primaire ou secondaire, secteurs de début et de fin,
        type de partition)
    d   détruire une partition
    x   mode avancé (pour les spécialistes, r pour revenir)
    q   pour quitter sans sauver
    w   pour écrire la table courante et quitter    /!\ DANGER /!\
    

    La commande sfdisk est la version de fdisk en ligne de commande, pour faire des scripts.

  • gdisk :

    spécialement conçu pour les disques en GPT ; peut convertir un MBR en GPT ;

    comme fdisk, gdisk ne modifie pas le disque tant qu'on n'a pas demandé d'écrire la nouvelle table de partitions.

    commande interactive, ? pour l'aide. Il y a aussi un mode expert (X , M pour revenir).

    La commande sgdisk est la version de gdisk en ligne de commande.

  • parted (utilitaire GNU) :

    gère les disques en MBR et en GPT ; permet de modifier la taille des partitions ; modes interactif ou en ligne de commande.

    En mode interactif :

    • on tape des mots au lieu de lettres ;
    • l'effet est immédiat.
    • aide en ligne : help, help mot-clé
  • gparted (utilitaire GNOME) :

    version graphique de parted. Installation : sudo apt install gparted

  • gnome-disks :

    utilitaire graphique plus "grand public" que gparted. Installation : sudo apt install gnome-disk-utility

    permet en plus de

    • restaurer des disques,
    • faire du monitoring de pannes (SMART),
    • modifier les points de montage.

14.2. Les systèmes de fichiers

Une partition est au départ un espace vierge sur le disque, uniquement repéré par des numéros de secteurs.

Pour qu'une hiérarchie de répertoires et de fichiers puisse être stocké dans une partition, il faut structurer la partition de manière à pouvoir retrouver ou modifier efficacement ces fichier ou répertoires, et toutes les informations associées, telles que les noms, droits, contenus, dates d'accès, etc.

Cette structuration de la partition s'appelle un système de fichier (FS), et sa création sur le disque s'appelle le formatage.

14.2.1. Types de FS

Il existe de nombreux types de FS, qui sont apparus ou ont progressé pour tirer parti du matériel, qui n'a cessé d'évoluer, et pour répondre à différents objectifs (rapidité, tolérance aux pannes, grands disques, ...)

De nombreux FS sont gérés par Linux ; certain peuvent être encore en cours de développement (à éviter en production) ou non inclus dans les sources du noyau (problèmes de licence).

  • EXT2, EXT3, EXT4 : FS natifs de Linux
  • FAT, VFAT, FAT32, NTFS, exFAT : FS de Windows
  • HFS, HFS+, HFSX, APFS : FS de MacOS
  • ReiserFS (Linux) : efficacité, redimensionnement à chaud
  • BTRFS (Linux) : instantanés, copy-on-write, vérification, ...
  • XFS (Silicon Graphix, Linux) : haute performance
  • ZFS (Sun, Oracle) : "Zettabyte FS", 128 bits, très haute capacité de stockage
  • ISO9660, SquashFS : read-only
  • ...

cf https://en.wikipedia.org/wiki/Comparison_of_file_systems

Parmi leurs nombreuses caractéristiques, on peut citer :

  • la mémorisation des droits et ACLs (POSIX) ;

  • la journalisation (EXT3, EXT4, HFS+, NTFS, ReiserFS, XFS,...) : les FS jounalisés mémorisent les transactions dans un journal avant de modifier les fichiers eux-même, de manière à garantir l'intégrité des données en cas d'arrêt brutal.

  • les instantanés, ou snapshots (APFS, BTRFS, ZFS,...) : possibilité d'enregistrer l'état du système de fichiers à un instant donné, dans un état cohérent ; utile pour les sauvegardes à chaud

  • préallocation par "extent" (EXT4, NTFS, HFS+, BTRFS, XFS, ISO9960,...) : réserve un espace plus grand pour chaque fichier, pour limiter la fragmentation

  • la compression intégrée (NTFS, ReiserFS, SquashFS, ZFS, ...)

  • le chiffrement intégré (EXT4, NTFS, APFS, ZFS,...)

  • le redimensionnement à chaud (EXT4, NTFS, HFS+, BTRFS, XFS, ZFS, ...)

14.2.2. Manipulation d'un FS

  • mkfs

    Commande pour créer un FS sur une partition (MaKe File System). Elle est déclinée pour les différents types de FS en : mkfs.fstype

    Exemples : mkfs.ext4, mkfs.ntfs

  • fsck

    Commande pour vérifier l'intégrité d'un FS (File System Check) Elle est également déclinée selon le type de FS en : fsck.fstype

    Exemples : fsck.ext4, fsck.ntfs

Il existe aussi des outils pour changer la taille du FS dans la partition :

  • élargissement :

    d'abord augmenter la taille de la partition (avec fdisk, parted, etc), puis augmenter la taille du FS pour s'adapter à la taille disponible ;

  • rétrécissement :

    d'abord réduire la taille du FS, puis réduire la taille de la partition.

La plupart du temps, ces opérations doivent être faites "à froid", c'est-à-dire lorsque le FS n'est pas "monté" (voir après).

Dans certains cas, elles peuvent être faites "à chaud", c'est-à-dire sur un FS qui est monté.

  • resize2fs :

    • pour les types EXT2, EXT3, EXT4 ;
    • permet d'élargir à chaud le FS dans une partition EXT4 ;
    • peut élargir ou rétrécir le FS d'une partition non montée des trois types.
  • resize_reiserfs :

    • pour les types ReiserFS ;
    • permet d'élargir à chaud le FS dans une partition ;
    • peut élargir ou rétrécir le FS d'une partition non montée.
  • xfs_growfs :

    • pour les types XFS ;
    • permet l'élargissement à chaud ;
    • le rétrécissement n'est normalement pas possible.

14.2.3. Le montage d'un FS

Sur un système Unix, le système de gestion de fichier est vu comme un arbre avec une seule racine, notée /.

Il permet d'accéder de manière uniforme aux dossiers et fichiers qui sont stockés dans différentes partitions, indépendamment de leur type.

Un point de montage est un répertoire (au départ vide) à partir duquel on accède à la base d'un FS situé dans une partition, un périphérique, ou encore en réseau.

Monter une partition (ou un périphérique ou un disque) consiste à rendre accessible le FS via le point de montage.

Exemple :

disque sda, part.1           disque sda, part.5         disque sr0 (CDROM)
    ├─bin                       ├─thiel                     ├─Audio
    ├─usr                       └─dupond                    ├─DirectX
    ├─etc                                                   └─News
    ├─home (vide)
    ├─media
    │   └─cdrom (vide)
    └─var

Si on monte sda1 dans /, sda5 dans /home, et sr0 dans /media/cdrom, on obtient :

/
├─bin
├─usr
├─etc
├─home
│   ├─thiel
│   └─dupond
├─media
│   └─cdrom
│       ├─Audio
│       ├─DirectX
│       └─News
└─var

On peut monter ou démonter manuellement une partition :

  • mount : liste tout ce qui est monté
  • mount [-t fstype] [-o option] device dir : monte device sur le répertoire dir
  • umount device|dir : démonte device ou dir

Pour obtenir notre exemple :

$ sudo mount -t ext4 /dev/sda1 /
$ sudo mount -t ext4 /dev/sda5 /home
$ sudo mount -t iso9660 /dev/sr0 /media/cdrom

$ mount
/dev/sda1 on / type ext4 (rw,relatime,errors=remount-ro,data=ordered)
/dev/sda5 on /home type ext4 (rw,relatime,data=ordered)
/dev/sr0 on /media/cdrom type iso9660 (ro,nosuid,nodev,relatime...)
...

Il y a de nombreux autres points de montages, utilisés par le noyau : /proc, /sysfs, /udev, ...

On peut automatiser le montage des partitions dans /etc/fstab ; chaque ligne non commentée décrit un montage, sous la forme :

device      mountpoint      fstype      options     freq    passno
  • device : /dev/xxx, ou LABEL=<nom>, ou UUID=<numéro uuid> (le UUID est un numéro unique de partition, stocké dans le disque)
  • mountpoint : le point de montage
  • fstype : le type du FS (ext4, ntfs, iso9660, ...)
  • option : une liste d'options de montage séparées par des virgules ; man mount
  • freq : 0 (don't dump)
  • passno : ordre pour fsck au boot ; 1 pour /, 2 pour les autres, 0 jamais

Par exemple :

$ cat /etc/fstab
/dev/sda1   /               ext4      errors=remount-ro     0   1
/dev/sda5   /home           ext4      defaults              0   2
/dev/sr0    /media/cdrom    iso9660   ro,noauto,user,utf8   0   0

Lorsque les points de montage sont enregistrés dans /etc/fstab, on peut monter une partition en faisant : mount device ou mount dir

Par exemple :

$ sudo mount /dev/sda5
$ sudo mount /media/cdrom

Remarque : les points de montage actuellement montés sont listés dans le fichier /etc/mtab, qui est mis-à-jour dynamiquement.

Autres commandes :

  • blkid : pour connaître l'UUID et le fstype d'une partition
  • df : liste les points de montage et la place disponible

Exemple :

$ sudo blkid -p /dev/sda1
/dev/sda1: UUID="83a2c51a-8a14-49ad-8272-c0fb309ffbd5" TYPE="ext4" ...

Auto-montage : il existe différentes méthodes pour que le système détecte un nouveau périphérique et le monte automatiquement :

14.3. Gestion par volume logique LVM

La gestion par volume logique est une manière de s'affranchir des contraintes physiques sous-jacentes.

• Le LVM permet de faire apparaître au système des partitions de taille variable, qui peuvent être à cheval sur plusieurs disques, partitions ou fichiers.

Il repose sur 3 concepts :

  • Volumes Physiques PV : disques durs, partitions, volumes RAID
  • Groupes de Volumes VG : on regroupe des PV dans un VG
  • Volumes Logiques LV : pseudo-partitions, découpées dans des VG

On peut modifier la structure et la taille d'un FS en LVM, et faire des snapshots.

Il existe un certain nombre de logiciels de gestion de LVM. Sous Linux : LVM2, installation : sudo apt install lvm2

Avant d'utiliser LVM, il faut partitionner les disques en type LVM (fdisk, ...) On dispose ensuite d'un ensemble de commandes :

  • PVs : pvcreate, pvresize, pvscan, pvs, pvdisplay, pvremove, pvmove, pvchange
  • VGs : vgcreate, vgdisplay, vgscan, vgs, vgck, vgremove
  • LVs : lvcreate, lvmdiskscan, lvs, lvdisplay, lvremove, lvextend
  • sauvegarde de la structure LVM : vgcfgbackup, vgcfgrestore

• Le RAID est une autre technologie, qui signifie Redundant Array of Independent Disks.

L'idée est que l'on répartit les informations sur plusieurs disques avec une certaine redondance ; si l'un des disques tombe en panne, on peut le "reconstruire" sur un nouveau disque à partir des autres disques.

Il existe différentes sorte de RAID : RAID1, RAID5, ... https://fr.wikipedia.org/wiki/RAID_(informatique)

Le RAID peut être matériel (contrôleur disques RAID) ou logiciel.

On peut mettre du LVM sur du RAID, ou du RAID sur du LVM. Les volumes LVM peuvent aussi offrir certaines fonctionnalités RAID0 ou RAID1.

Exemple : LVM sur le serveur du département (sur RAID5 matériel)

thiel@sol:~ <> lsblk
NAME              MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda                 8:0    0 10,9T  0 disk 
├─sda1              8:1    0  500M  0 part /boot/efi
├─sda2              8:2    0  500M  0 part /boot
└─sda3              8:3    0 10,9T  0 part 
  ├─centos-root   253:0    0  100G  0 lvm  /
  ├─centos-swap   253:1    0   32G  0 lvm  [SWAP]
  ├─centos-extra  253:2    0    2T  0 lvm  /extra
  ├─centos-oracle 253:3    0  300G  0 lvm  /oracle
  ├─centos-var    253:4    0  100G  0 lvm  /var
  └─centos-space  253:5    0  8,4T  0 lvm  /space
sr0                11:0    1 1024M  0 rom  

thiel@sol:~ <> df
Sys. de fichiers          blocs de 1K    Utilisé Disponible Uti% Monté sur
/dev/sda1                      511720       7080     504640   2% /boot/efi
/dev/sda2                      487652     273631     188421  60% /boot
/dev/mapper/centos-root     104806400    8272092   96534308   8% /
/dev/mapper/centos-oracle   314419200      32976  314386224   1% /oracle
/dev/mapper/centos-extra   2146435072      65256 2146369816   1% /extra
/dev/mapper/centos-var      104806400    2582160  102224240   3% /var
/dev/mapper/centos-space   9010968576 1000385696 8010582880  12% /space
...

thiel@sol:~ <> mount
...
/dev/mapper/centos-oracle on /oracle type xfs (rw,relatime,...)
/dev/mapper/centos-extra on /extra type xfs (rw,relatime,...)
/dev/mapper/centos-var on /var type xfs (rw,relatime,...)
/dev/mapper/centos-space on /space type xfs (rw,relatime,...)
/dev/sda2 on /boot type ext3 (rw,relatime)
/dev/sda1 on /boot/efi type vfat (rw,relatime,fmask=0077,dmask=0077,...)
...