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 devicesaffiche 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 defdisk
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 degdisk
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
: montedevice
sur le répertoiredir
umount device|dir
: démontedevice
oudir
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
, ouLABEL=<nom>
, ouUUID=<numéro uuid>
(leUUID
est un numéro unique de partition, stocké dans le disque)mountpoint
: le point de montagefstype
: 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 pourfsck
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 lefstype
d'une partitiondf
: 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 :
-
autofs
:man automount
-
Bureau Gnome :
man gvfs
; voir https://en.wikipedia.org/wiki/GVfs ; démongvfs-udisks2-volume-monitor
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,...)
...