Stockage
Stockage local
Matériel
Au fil du temps, plusieurs types de matériels se sont développés dans le but de stocker des données.
Les bandes magnétiques
Une des plus anciennes méthodes de stockage "amovible", nous sommes successivement passés de bandes magnétiques simples, au cassettes type "cassette audio", jusqu'au LTO 3/4 (Linear Tape-Open : une technique de stockage sur bande magnétique, au format ouvert développé par HP, IBM et Seagate à la fin des années 90). Leur temps d'accès étant supérieur à 1 seconde, elles servent de nos jours à des sauvegardes, par accès séquentiels.
Médias magnétique rotatifs
Cela inclut les disquettes (aujourd'hui bien dépassées : bien qu'ayant un temps d'accès court, le débit est limité et la fiabilité douteuse) et les disques durs à plateaux, dont les temps d'accès est supếrieur à 20 ms. Le débit étant important, ils servent en général de stockage principal.
Médias optiques
Cela inclut les CD-Rom (en lecture seule), et les CD-R, RW, DVD-R/R+/RAM, disque opto-magnétiques... Ces derniers ne pouvant rivaliser avec les disques durs pour ce qui est du débit et du temps d'accès, ils servent en général à l'archivage.
Médias électroniques
Cela inclut la RAM, très rapide mais volatile, et la mémoire flash, plus lente mais non volatile. Le SSD, un assemblage de mémoires flash, constitue un véritable disque dur. Celui-ci inclue :
- Un processeur SOC,
- Une interface de DD standard,
- De la RAM pour la mémoire cache
- Des modules de mémoire flash
Il a de nombreux avantages : pas de pièces mobiles, consomme et chauffe peu, est assez fiable et performant, et est un matériel standard. En revanche, il coûte cher !
Bus et Interfaces
Ils servent à assurer la connexion entre la carte mère et le périphérique. Dans la catégorie "Desktop", les moins chers, qui mettent l'intelligence sur le poste et favorisent les connexions internes, on a:
- IDE, le plus vieux
- ATA (Parrallèle), ou PATA
- ATA (Série), ou SATA
- Moins coûteux, ils montent à 7200 RPM, et en général dans les 2 To. Les vitesses sont de 1.5 (Sata 1), 3 Gbps (Sata 2), et 6 GBps (Sata 3), et ils fonctionnent en half-duplex ! On ne peut en brancher qu'un seul par interface.
Les interfaces serveur sont plus chères, mais elles mettent l'intelligence dans le périphérique, et peuvent proposer des connexions internes ou externes. On utilise en général :
- Le SCSI (Parrallèle)
- Le SAS (série), qui se rapporte au SATA
- On peut en brancher jusqu'à 128 par interface, ils montent à 15000 RPM, et font en général dans les 450 Go. Ils coûtent cher, mais fonctionnent en full-duplex et vont de 3Gbps (SAS) à 6 Gbps (SAS 2.0).
- Le Fibre Channel en série.
Différence série / parallèle
La transmission en série (norme RS-232) se fait de façon asynchrone (sans signal d'horloge), le périphérique devant être capable de distinguer les différents cractères de 8 bits (on utilise pour cela des bits start et stop, qui utilisent 20% de la bande passante). La transmission en parallèle consiste à envoyer simultanément des données sur plusieurs canaux. Différents types de ports parallèles permettent différents débits (EPP permet 8 à 16 Mbps, et ECP y ajoute du plug-and-play). Les connecteurs DB25 permettent de connecter un élements extérieur à l'ordinateur en parallèle.
Universal Serial Bus
L'USB (Port Série Universel, qu'on peut aussi appliquer au FireWire) est universel, aussi on peut y brancher n'importe quoi (y compris du stockage). Dans le raccordement, le protocole USB Mass Storage est utilisé. Peut s'appliquer au disques SATA.
Si les disques/clefs USB sont plug and play, ils sont aussi unplug and pray : des données non contrôlées et non sécurisées sont en danger. Il faut mettre en place une politique de stockage pour limiter la prolifération des données !
Politique de stockage
Chaque disque dur est découpé en partitions, chacune de ces partitions utilisant un FS (File Système), soit une façon d'organiser les fichiers sur le disque. Certains sont Multi-système. On compte différents FS :
- ext4
- swapFS
- XFS
- btrfs
- NTFS
- etc...
Une politique de stockage a pour but de ne pas laisser les données éparpillées, mais de les sécuriser (en les mutualisant, et en effectuant des contrôles et des sauvegardes). Le support de cette politique est le réseau de stockage.
Sécuriser
Une baie de stockage est un périphérique intelligent, qui contient un CPU, de la mémoire cache, des contrôleurs... La sécurité se fait de plusieurs façons :
- En sécurisant l'environnement de la salle machines
- En ayant des élements redondants et échangeables à chaud, sans perte de données ni arrêts
- En utilisant le RAID
- Les accès possibles (généralement indépendants des disques internes utilisés) sont:
- e-SATA
- SAS
- Fibre Channel
- Ethernet
Le RAID
Le RAID (Redundant Array of Independent Disks), permet de dupliquer automatiquement les données sur plusieurs disques, pour que celles-ci restent accessibles en cas de panne d'un disque. Le RAID agit au niveau bloc, et il n'as donc rien à faire du FS en place, à moins de travailler sur du RAID logiciel à l'ancienne.Les recopies de données peuvent être faites de 2 façons :
- Raid Software : effectué par l'OS ou par un pilote spécifique
- Raid Hardware : effectué par un contrôleur spécifique.
Il existe plusieurs niveaux de RAID :
Niveau de RAID | Description | Nombre min. de disques | Capacité utile (Nbre de disques) | Particularités |
0 | Striping/Concaténation | 2 | N | Zéro RAID : pas de duplication ! |
1 | Miroir | 2 | N/2 | Chaque donnée est dupliquée sur un autre disque. |
1+0 | Miroir puis striping | 4 | N/2 | |
5 | Stripes avec parité distribuée et E/S aléatoires | 3 | N-1 | Chaque disque fait la parité d'un/plusieurs autres : la reconstruction est longue et stressante |
6 | Stripes avec deux calculs de parité différents distribués et E/S aléatoires |
4 | N-2 | La double parité rend le processus plus complexe. |
Augmenter l'espace de stockage
On peut étendre via des JBOD, on a alors pas d'intelligence intégrée. On augmente la capacité de stockage mais pas la puissance de traitement. On peut aussi ajouter des baies, pour augmenter la puissance de traitement; certains constructeurs permettent d'augmentation de la puissance de traitement en ajoutant des contrôleurs. Les fonctions dépendent de l'intelligence de la baie : il faut faire le rapport prix/fonctions.
Partitionnement d'une baie
Sur une baie de 24 To, on peut partitionner comme suit :
- Un volume utile de 12 TO en RAID6, de 8*2To (prendre en compte les disques de parité !)
- Un volume de 12To en RAID5, de 7*2 To (toujours avec les disques de parité), en gardant un emplacement "Hot spare".
Performance des baies
Pour choisir le constructeur, le mieux est de tester en conditions réelles. Le choix SAS/SATA peut se faire comme suit :
- SAS : BDD, E/S aléatoires
- SATA : Le Reste
- SAS SSD : Est-ce raisonnable?
Le cache est important : la baie embarque beaucoup de cache, les différences sont lissées mais elles existent. SATA suffit dans beaucoup de cas.
Mise en place d'un serveur de sauvegardes
<pdf>Fichier:Stockagetp1.pdf</pdf>
Le but du TP est, à partir d'une VM sous Debian dotée de trois disques additionnels d'un 1 Go chacun, de mettre en place du RAID1. On utilise pour cela mdadm : il s'agira de faire du RAID logiciel. Mdadm est l'utilitaire standard sous Linux pour gérer ce genre de RAIDs, qui permet non seulement de monter des grappes RAID mais également de les monitorer.
Machine de départ
Je part d'une Debian 9, dotée de 2 Gbo de RAM et de 2 processeurs (on peut certainement être moins généreux, mais j'ai les ressources disponibles alors je préfère gagner un peu de temps les allouant). Elle est contrôlée par SSH.
Installation des outils
Je commence par une installation de sudo et vim (par habitude), avant de mettre à jour les paquets.
su apt update && apt install sudo vim visudo #Je rajoute mon utilisateur exit sudo apt full-upgrade sudo apt install mdadm
Mise en place du RAID à proprement parler
Nous avons bel et bien nos trois disques (au total) : un disque système, et trois qui serviront dans le cadre du RAID. On peut les voir ainsi que leur nom à l'aide d'un fdisk -l:
justine@serveurlvmraid:~$ sudo fdisk -l Disque /dev/sdd : 1 GiB, 1073741824 octets, 2097152 secteurs 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 Disque /dev/sdc : 1 GiB, 1073741824 octets, 2097152 secteurs 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 Disque /dev/sdb : 1 GiB, 1073741824 octets, 2097152 secteurs 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 Disque /dev/sda : 8 GiB, 8589934592 octets, 16777216 secteurs 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 : 0x468ddc7c Périphérique Amorçage Début Fin Secteurs Taille Id Type /dev/sda1 * 2048 12582911 12580864 6G 83 Linux /dev/sda2 12584958 16775167 4190210 2G 5 Étendue /dev/sda5 12584960 16775167 4190208 2G 82 partition d'échange Linux / Solaris
Mon disque système est sda, mes disques additionnels sont sdb, sdc et sdd.
On choisit de faire un RAID 1 (miroir - cf le tableau un peu plus haut):
justine@serveurlvmraid:~$ sudo mdadm --create /dev/md0 --level=1 --raid-devices=2 /dev/sdb /dev/sdc mdadm: Note: this array has metadata at the start and may not be suitable as a boot device. If you plan to store '/boot' on this device please ensure that your boot-loader understands md/v1.x metadata, or use --metadata=0.90 Continue creating array? Continue creating array? (y/n) y mdadm: Defaulting to version 1.2 metadata mdadm: array /dev/md0 started.
Le détail de la commande :
- --level=1 correspond à du RAID1
- --raid-devices sert à choisir les disques à mettre en RAID
- --create /dev/md0 sert à préciser le disque dur virtuel qui sera constitué de nos deux disques.
On vérifie que cela s'est bien passé :
justine@serveurlvmraid:~$ sudo mdadm -D /dev/md0 /dev/md0: Version : 1.2 Creation Time : Tue Jan 8 22:42:29 2019 Raid Level : raid1 Array Size : 1047552 (1023.00 MiB 1072.69 MB) Used Dev Size : 1047552 (1023.00 MiB 1072.69 MB) Raid Devices : 2 Total Devices : 2 Persistence : Superblock is persistent Update Time : Tue Jan 8 22:42:36 2019 State : clean Active Devices : 2 Working Devices : 2 Failed Devices : 0 Spare Devices : 0 Name : serveurlvmraid:0 (local to host serveurlvmraid) UUID : a0045f45:6ad1c193:fe374a5b:fb7a654b Events : 17 Number Major Minor RaidDevice State 0 8 16 0 active sync /dev/sdb 1 8 32 1 active sync /dev/sdc
Notre création s'est bien passée, un fdisk -l nous informe même de la création de /dev/md0, reconnu comme étant un disque d'1 Go :
Disque /dev/md0 : 1023 MiB, 1072693248 octets, 2095104 secteurs 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
Ajout d'un disque en spare
Notre troisième disque sera ajouté en spare au RAID, c'est-à-dire qu'il servira de disque de remplacement en cas de problème:
justine@serveurlvmraid:~$ sudo mdadm --manage /dev/md0 --add /dev/sdd mdadm: added /dev/sdd
On peut vérifier comme tout à l'heure:
justine@serveurlvmraid:~$ sudo mdadm -D /dev/md0 /dev/md0: Version : 1.2 Creation Time : Tue Jan 8 22:42:29 2019 Raid Level : raid1 Array Size : 1047552 (1023.00 MiB 1072.69 MB) Used Dev Size : 1047552 (1023.00 MiB 1072.69 MB) Raid Devices : 2 Total Devices : 3 Persistence : Superblock is persistent Update Time : Tue Jan 8 22:48:50 2019 State : clean Active Devices : 2 Working Devices : 3 Failed Devices : 0 Spare Devices : 1 Name : serveurlvmraid:0 (local to host serveurlvmraid) UUID : a0045f45:6ad1c193:fe374a5b:fb7a654b Events : 18 Number Major Minor RaidDevice State 0 8 16 0 active sync /dev/sdb 1 8 32 1 active sync /dev/sdc 2 8 48 - spare /dev/sdd
On voit que le disque en spare a été ajouté.
Que faire avec un système qui ne boote plus et deux disques en RAID?
La procédure donnée dans le TP est la suivante :
- Booter sur un liveCD (genre systemrescuecd)
- mdadm --examine -scan >> /etc/mdadm/mdadm.conf #Donne entre autre l'UUID du RAID
- service mdadm-raid restart
- mount /dev/mdX /mnt/raidX
Remplacement d'un disque dur à chaud
Mise en panne (simulée) d'un disque
Pour tester l'efficacité de notre RAID, on va simuler la panne d'un disque physique, afin de montrer l'utilité du RAID :
justine@serveurlvmraid:~$ sudo mdadm --fail /dev/md0 /dev/sdc mdadm: set /dev/sdc faulty in /dev/md0
On suit ensuite les différentes étapes de reconstruction :
watch -n 1 'cat /proc/mdstat' #Ou, plus clair : watch -n 1 'sudo mdadm --detail /dev/md0'
Sur nos disques vides, c'est très rapide, mais on voit bien que sdd a pris le relais :
Number Major Minor RaidDevice State 0 8 16 0 active sync /dev/sdb 2 8 48 1 active sync /dev/sdd 1 8 32 - faulty /dev/sdc
Remplacement (simulé) d'un disque
Il suffit d'enlever le disque et de le remettre, comme on le ferait dans une baie :
justine@serveurlvmraid:~$ sudo mdadm --manage --remove /dev/md0 /dev/sdc mdadm: hot removed /dev/sdc from /dev/md0 justine@serveurlvmraid:~$ sudo mdadm --manage --add /dev/md0 /dev/sdc mdadm: added /dev/sdc
Une dernière vérification avec mdadm -D /dev/md0
nous donne :
Number Major Minor RaidDevice State 0 8 16 0 active sync /dev/sdb 2 8 48 1 active sync /dev/sdd 3 8 32 - spare /dev/sdc
sdc est bel et bien de retour, cette fois-ci en tant que spare.
Rendre la config définitive
C'est simple :
root@serveurlvmraid:/etc/mdadm# mdadm --detail -scan >> /etc/mdadm/mdadm.conf
(Pour une raison étrange, cela ne fonctionne pas avec sudo, il faut se logger en tant que root).
LVM
NB : Des notes plus anciennes concernant LVM (un peu plus "noob-friendly") sont disponibles là : Filesystems
<pdf>Fichier:02-lvm.pdf</pdf>
LVM signifie "Logical Volume Manager". Il permet différents type d'opérations:
- Ajout et retrait d'unités de disques : cela permet de la maintenance et l'utilisation temporaire de disques
- Augmentation / diminution de la capacité de stockage, avec des transferts entre volumes logiques sur un même système
- Redimensionnement dynamique : Permet l'extension d'un système de fichiers en ligne
- Déplacement des données entre les unités de disques, avec une préparation à l'extraction d'unités de disques
- Des snapshots des volumes logiques
- De la réplication, via des copies entre les volumes logiques.
On a trois solutions pour faire du RAID :
- Du LVM, sur lequel viennent se greffer dmsetup / mdadm pour le RAID et ext4
- ZFS
- btrfs
LVM est un gestionnaire de périphérique en mode bloc, qui fonctionne au niveau système : il prend en charge des partitions ou n'importe quel autre périphérique de stockage. La vue système est homogène, les périphériques étant vus comme un seul périphérique logique par le système. On peut donc faire l'analogie entre volume et partition, puisqu'on peut tous les deux les formater, mais ils sont bel et bien DIFFÉRENTS ! La configuration peut changer de façon dynamique, avec des snapshots, du redimensionnement, extensions, déplacements... Pour reprendre le schéma de mes précédentes notes, qui met en valeur Volume Physique, Groupe de Volumes et Volume Logique :
LVM2 sur Linux
LVM2 sur Linux est pris en charge au niveau Kernel par Device mapper module et au niveau utilisateur par le paquet lvm2, avec le striping en option.
À chacune de nos unités semble correspondre une commande:
- pvcreate pour Physical Volume
- vgcreate pour Volume Group
- lvcreate pour Logical Volume
LVM : mise en place
<pdf>Fichier:tp2lvm.pdf</pdf>
Pour ce TP, je repars de la machine précédente, telle que je l'avais laissée.
Je commence par installer le paquet lvm2:
sudo apt install lvm2
Création des volumes
Nous avons notre RAID, qui travaille au niveau bloc. LVM travaille lui au niveau "gestionnaire de périphérique". On aura donc trois couches successives (en quelque sorte) sur nos disques:
- mdadm qui gère le RAID au niveau bloc
- LVM qui gère le disque virtuel du RAID (md0) en tant que périphérique
- ext4 qui sera le FS utilisé par le système.
On va devoir créer nos trois "unités" LVM.
Création du volume physique
justine@serveurlvmraid:/etc/mdadm$ sudo pvcreate /dev/md0 Physical volume "/dev/md0" successfully created.
Création du groupe de volumes
justine@serveurlvmraid:/etc/mdadm$ sudo vgcreate groupevol /dev/md0 Volume group "groupevol" successfully created
Notre groupe de volumes est créé, il porte le nom "groupevol".
Création de deux volumes logiques
On va créer deux volumes logiques (qui fonctionneront donc un peu comme disques traditionnels directement formatés en ext4) de 256 Mo chacun, vol1 et vol2, à partir de notre groupe groupevol.
justine@serveurlvmraid:~$ sudo lvcreate -n vol1 -L 256M groupevol Logical volume "vol1" created. justine@serveurlvmraid:~$ sudo lvcreate -n vol2 -L 256M groupevol Logical volume "vol2" created.
Ils sont mêmes visibles dans fdisk !
Disque /dev/mapper/groupevol-vol1 : 256 MiB, 268435456 octets, 524288 secteurs 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 Disque /dev/mapper/groupevol-vol2 : 256 MiB, 268435456 octets, 524288 secteurs 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 justine@serveurlvmraid:~$
Formatage et montage des volumes
Il faut désormais les formater en ext4, ici avec mkfs:
justine@serveurlvmraid:~$ sudo mkfs -t ext4 /dev/groupevol/vol1 mke2fs 1.43.4 (31-Jan-2017) En train de créer un système de fichiers avec 262144 1k blocs et 65536 i-noeuds. UUID de système de fichiers=0497b299-d302-4bfa-b2a9-d0fad5c96e0f Superblocs de secours stockés sur les blocs : 8193, 24577, 40961, 57345, 73729, 204801, 221185 Allocation des tables de groupe : complété Écriture des tables d'i-noeuds : complété Création du journal (8192 blocs) : complété Écriture des superblocs et de l'information de comptabilité du système de fichiers : complété justine@serveurlvmraid:~$ sudo mkfs -t ext4 /dev/groupevol/vol2 mke2fs 1.43.4 (31-Jan-2017) En train de créer un système de fichiers avec 262144 1k blocs et 65536 i-noeuds. UUID de système de fichiers=d3663a80-cb8b-42a9-be70-f4b271486735 Superblocs de secours stockés sur les blocs : 8193, 24577, 40961, 57345, 73729, 204801, 221185 Allocation des tables de groupe : complété Écriture des tables d'i-noeuds : complété Création du journal (8192 blocs) : complété Écriture des superblocs et de l'information de comptabilité du système de fichiers : complété
Enfin, on a plus qu'à les monter pour les utiliser (il faut d'abord créer les dossiers qui serviront de point de montage):
justine@serveurlvmraid:~$ sudo mkdir /mnt/lv1 /mnt/lv2 justine@serveurlvmraid:~$ sudo mount /dev/groupevol/vol1 /mnt/lv1 justine@serveurlvmraid:~$ sudo mount /dev/groupevol/vol2 /mnt/lv2
Si à ce stade, mount renvoie une erreur du type "le disque est en lecture seule", il faut vérifier qu'ils ont bien été formatés.
Agrandissement à chaud des volumes logiques
On va ici vouloir agrandir à chaud le système de fichiers vol2 à 512 Mo : c'est possible.
Agrandissement du volume logique
On commence bien sûr par agrandir notre volume logique.
justine@serveurlvmraid:~$ sudo lvresize -L 512M /dev/groupevol/vol2 Size of logical volume groupevol/vol2 changed from 256,00 MiB (64 extents) to 512,00 MiB (128 extents). Logical volume groupevol/vol2 successfully resized.
Agrandissement du système de fichiers
On agrandit le FS afin que les 512 Mo soient utilisables.
justine@serveurlvmraid:~$ sudo resize2fs -p /dev/groupevol/vol2 512M resize2fs 1.43.4 (31-Jan-2017) Le système de fichiers de /dev/groupevol/vol2 est monté sur /mnt/lv2 ; le changement de taille doit être effectué en ligne old_desc_blocks = 2, new_desc_blocks = 4 Le système de fichiers sur /dev/groupevol/vol2 a maintenant une taille de 524288 blocs (1k).
Vérifications
La commande df -h nous montre bel et bien nos deux volumes logiques, parfaitement utilisables :
/dev/mapper/groupevol-vol1 240M 2,1M 222M 1% /mnt/lv1 /dev/mapper/groupevol-vol2 488M 2,3M 459M 1% /mnt/lv2
On constate au passage que les métadonnées prennent une certaine place.