Disques et stockage LVM

Disques : commandes à retenir

  • cat /proc/partitions
  • ls /dev/sd* || ls /dev/vd*
  • blkid
  • lsblk
  • findmnt
  • df -h
  • du
  • man du
  • fdisk
  • gdisk
  • mkfs.*
  • cat /etc/fstab
  • cat /etc/mtab
  • mount
  • mount -a
  • mkswap
  • swapon
  • swapoff
  • partprobe
  • fsck.*
  • mkfs mkfs.*
  • dumpe2fs, xfsdump, xfsrestore
  • debugfs
  • tune2fs
  • xfs_info, xfs_check et xfs_repair
  • smartd, smartctl
  • mdadm.conf
  • mdadm
  • /proc/mdstat

Eléments théoriques

  • Partitions
  • Systèmes de fichier EXT3, EXT4, BTRFS, XFS, NFS
  • Structure du système de fichier
  • Le système de fichier EXT4
  • Le système de fichier XFS
  • Le système de fichier NFS
  • Le système de fichier CIFS
  • LVM
  • Opérations LVM
  • RAID
  • Swap
  • Quotas

Partionnement

Un disque est composé d'une ou plusieurs partitions :

  • primaire
  • étendue
  • logique

La table de partition est contenue dans le MBR (Master Boot Record).

Les caractéristiques d'une partition sont :

  • La taille en secteurs
  • Un drapeau qui indique si elle est active
  • Le type de partition

Une partition peut être utilisée pour héberger :

  • un système de fichiers
  • un espace Swap
  • une application

Systèmes de fichiers

Les données sont normalement présentées à l'utilisateur et aux programmes selon une organisation structurée, sous la forme de répertoires et de fichiers. Pour pouvoir stocker ces données structurées sur un périphérique, il faut utiliser un format qui les représente sous la forme d'une succession de blocs de données : c'est ce qu'on appelle un système de fichiers. Un FS est concrètement une arborescence de fichiers stockée typiquement dans une partition ou un LV.

Est associé à chaque système de fichiers :

  • un pilote du noyau
  • des structures de données mémoire et disque
  • des utilitaires qui permettent la création et la maintenance du FS, voire sa sauvegarde

Formater un FS, c'est formater une partition en écrivant sur disque les tables système (Superbloc, table d'inode, répertoire racine, ...) associé à son type.

Un FS contient différentes tables système :

  • Le super-bloc qui contient les données générales (taille, montage, ...)
  • La table des inodes qui contient la table de description et d'allocation des fichiers, chaque fichier étant représenté par un numéro d'inoeuds (inode).
  • Un répertoire est une table de correspondance de fichiers/numéro d'inoeud.

Les fichiers hébergés par un FS ne sont accessibles que s'ils sont montés c'est-à-dire s'il est associé à un répertoire (répertoire de montage).

Types de FS

  • Ext2
  • Journalisés :
    • ext3
    • ext4
    • reiserfs
    • xfs
    • btrfs
  • Microsoft :
    • msdos
    • fat
    • ntfs
  • CD-Rom : iso9660
  • Réseau :
    • nfs
    • cifs
  • Réseau Cluster :
    • ...
  • Système :
    • proc
    • sys
    • udev
    • selinux
    • cgroup
    • cpuset
  • Spéciaux :
    • tmpfs
    • unionfs (persistence live-usb)
    • aufs
    • cachefs
    • cramfs
    • squashfs
    • fuse
  • Loop

FS à journalisation

ext3 est une évolution de ext2 et a pour principale différence l'utilisation d'un fichier journal, lui permettant ainsi d'éviter la longue phase de récupération lors d'un arrêt brutal de la machine.

Bien que ses performances soient moins appréciées que celles de certains de ses compétiteurs, comme ReiserFS ou XFS, il a l'avantage majeur de pouvoir être utilisé à partir d'une partition ext2, sans avoir à sauvegarder et à restaurer des données (un système de fichiers ext3 peut être monté et utilisé comme un système de fichiers ext2). Tous les utilitaires de maintenance pour les systèmes de fichiers ext2, comme fsck, peuvent également être utilisés avec ext3.

Son avantage sur ReiserFS, lui aussi journalisé, est la possibilité de mettre en œuvre le logiciel dump, abondamment utilisé en entreprise pour les sauvegardes.

ext3 alloue les blocs libres juste à côté des autres blocs utilisés par le fichier, ce qui a pour effet de minimiser l'espace physique entre les blocs.

Beaucoup moins assujetti, il est néanmoins par définition fragmenté, c'est pourquoi son successeur ext4 inclut un utilitaire de défragmentation natif travaillant au niveau des bits et gérant la défragmentation à chaud.

ext4 garde une compatibilité avec son prédécesseur et est considéré par ses propres concepteurs comme une étape intermédiaire devant mener à un vrai système de fichiers de nouvelle génération tel que Btrfs. Toutefois, ext4 est une étape utile et non une simple solution temporaire.

Table de comparaison

Inspiré de https://doc.ubuntu-fr.org/systeme_de_fichiers#comparaison_de_systemes_de_fichiers

Nom du système de fichiers Taille maximale d'un fichier Taille maximale d'une partition Journalisée ou non ? Gestion des droits d'accès? Notes
ext2fs (Extended File System) 2 TiB 4 TiB Non Oui Extended File System est le système de fichiers natif de Linux. En ses versions 1 et 2, on peut le considérer comme désuet, car il ne dispose pas de la journalisation. Ext2 peut tout de même s'avérer utile sur des disquettes 3½ et sur les autres périphériques dont l'espace de stockage est restreint, car aucun espace ne doit être réservé à un journal, par de l'embarqué en temps réel.
ext3fs 2 TiB 4 TiB Oui Oui ext3 est essentiellement ext2 avec la gestion de la journalisation. Il est possible de passer une partition formatée en ext2 vers le système de fichiers ext3 (et vice versa) sans formatage.
ext4fs 16 TiB 1 EiB Oui Oui ext4 est le successeur du système de fichiers ext3. Il est cependant considéré par ses propres concepteurs comme une solution intermédiaire en attendant le vrai système de nouvelle génération que sera Btrfs
ReiserFS 8 TiB 16 TiB Oui Oui Développé par Hans Reiser et la société Namesys, ReiserFS est reconnu particulièrement pour bien gérer les fichiers de moins de 4 ko. Un avantage du ReiserFS, par rapport à ext3, est qu'il ne nécessite pas une hiérarchisation aussi poussée: il s'avère intéressant pour le stockage de plusieurs fichiers temporaires provenant d'Internet. Par contre, ReiserFS n'est pas recommandé pour les ordinateurs portables, car le disque dur tourne en permanence, ce qui consomme beaucoup d'énergie.
XFS 8 EiB 16 EiB oui oui Performant et flexible. Attention, il n'est pas possible de réduire une partition xfs
FAT (File Allocation Table) 2 GiB 2 GiB Non Non Développé par Microsoft, ce système de fichiers se rencontre moins fréquemment aujourd'hui. Il reste néanmoins utilisé sur les disquettes 3½ formatées sous Windows et devrait être utilisé sous Linux si une disquette doit aussi être lue sous Windows. Il est aussi utilisé par plusieurs constructeurs comme système de fichiers pour cartes mémoires (memory sticks), car, bien documenté, ce système de fichiers reste le plus universellement utilisé et accessible.
FAT32 4 GiB 8 TiB Non Non Ce système de fichiers, aussi créé par Microsoft, est une évolution de son prédécesseur. Depuis ses versions 2000 SP4 et XP, Windows ne peut pas formater (ou bloque volontairement le formatage) une partition en FAT32 d'une taille supérieure à 32 Go. Cette limitation ne s'applique pas sous Linux, de même qu'avec des versions antérieures de Windows. Une partition FAT32 d'une taille supérieure à 32 Go déjà formatée pourra être lue par Windows, peu importe sa version.
NTFS (New Technology File System) 16 TiB 256 TiB Oui Oui Ce système de fichiers a aussi été développé par Microsoft, et il reste très peu documenté. L'écriture depuis Linux sur ce système de fichiers est stable à l'aide du pilote ntfs-3g. Ce pilote est inclus de base dans Ubuntu, et disponible en paquets dans les dépôts pour les versions antérieures.
exFAT 16 TiB 256 TiB Oui Oui Ce système de fichiers a aussi été développé par Microsoft. L'écriture depuis Linux sur ce système de fichiers est stable à l'aide du pilote exfat-fuse.

Légende des unités : EiB = Exbioctets (1024 pébioctets) :: PiB = Pébioctet (1024 tébioctet) :: TiB = Tébioctet (1024 gibioctets) :: GiB = Gibioctet (1024 mibioctets)

Auditer les disques

Lister les disques et les partitions

cat /proc/partitions
fdisk -l

Lister les FS disponibles :

cat /proc/filesystems

Points de montages :

lsblk
blkid
cat /proc/mounts
findmnt --fstab-

Points de montage automatiques :

cat /etc/fstab
cat /etc/mtab
df -Th

Commandes sur les fichiers

du -sh /
stats nomdefichier

Ext3/Ext4

Formatage

La commande mk2fs fait appel à des programmes de plus bas niveau comme mkfs.ext3 ou mkfs.ext4

Pour formater un périphérique en, on retiendra :

EXT2

mk2fs /dev/sdx1

en EXT3

mk2fs -j /dev/sdx1

ou

mkfs.ext3 /dev/sdx1

ou encore

mk2fs -t ext3 /dev/sdx1

en EXT4

mkfs.ext4 /dev/sdx1

On retiendra d'autres commandes EXT comme :

  • tune2fs -l /dev/sdx1 qui affiche les paramètres d'un FS ext3
  • e2fsk /dev/sdx1 qui vérifie ou répare -y un FS
  • dumpe2fs /dev/sdx1 qui affiche des informations sur un FS
  • e2label /dev/sdx1 qui affiche ou modifie l'étiquette d'un FS
  • tune2fs -c mmc qui modifie les paramètres d'un FS (vérification après un nombre maximal de montage
  • resize2fs redimenssione un FS
  • debugfs
  • e2image sauvegarde les métadonnées dans un fichier, lisible avec debugfs -i ou dumpe2fs -i
  • e2freefrag affiche la fragmentation de la place libre
  • e2undo rejoue le journal qui n'a pas été accompli
  • tune2fs -j /dev/sdx1 convertit un FS ext2 en FS ext3
  • tune2fs -O extents,uninit_bg,dir_index /dev/sdx1 convertit un FS ext3 en FS ext4

XFS

...

SWAP

La mémoire swap est un espace de stockage visant à pallier à un manque de mémoire vive du système.

mkswap est la commande qui permet de créer un espace swap. swapon permet d'activer une swap swapon permet de désactiver une swap

Leurs arguments possibles pour désigner l'espace de stockage swap avec ces trois commande est :

  • un fichier
  • un périphérique type bloc, un disque, une partition
  • un LABEL avec l'option -L
  • un UUID avec l'option -U

La commande swapon -s permet de voir la configuration des mémoire SWAP.

Montage

Montage manuel

La commande mount permet de monter un le FS d'un périphérique sous un répertoire local vide. C'est à partir de cet emplacement que le FS sera accessible.

La syntaxe de la commande mount est la suivante :

mount -t type -o options /dev/sdx1 /repertoire_vide

Les options habituelles, parmi d'autres, peuvent être ro, rw, sync (écriture synchrones sans passer par une mémoire cache) ou encore loop pour monter un fichier plutôt q'un périphérique bloc.

La commande umount démonte le périphérique désigné à condition qu'il ne soit plus utilisé.

Montage au démarrage

Les différents FS d'un système seront montés selon indications du fichier /etc/fstab. Ce fichier contient six champs :

# <périphérique> <point de montage> <type> <options> <dump> <fsck>
/dev/sda1 / xfs defaults 0 1
/dev/sda2 /opt xfs defaults 0 0

Si les quatre premiers champs obligatoires sont assez évident, on notera les deux derniers champs optionnels :

  • dump active la sauvegarde
  • fsck réalise la vérification automatique du FS au démarrage. La valeur est toujours 1 pour le répertoire racine /

La commande mount -a va lire le fichier /etc/fstab et monter les FS indiqués.

Le fichier /etc/mtab contient tous les FS que le noyau utilise.

Montage automatique

Le montage automatique (autofs) permet de définir des emplacements du système qui serviront de point de montage de manière opportune. Par exemple, lorsque l'emplacement /data/backup sera accédé un périphérique bloc /dev/sdx1 y sera monté.

Une table principale /etc/auto.master contient les emplacements et la référence pour cet emplacement d'une table secondaire qui contient les directives d'automontage. Le démon autofs vérifie en permanence l'accès à ces dossiers.

Ce mécanisme est utile notamment pour "automonter" des disques distants, des répertoire /home itinérants, etc.

Eventuellement il faudra l'installer via yum -y install autofs et vérifier le démarrage du service via systemctl status autofs

Créer un système de fichier loop

Création d'un fichier de 1Go

# dd if=/dev/zero of=/root/fs_ext4.img bs=1M count=1024
1024+0 records in
1024+0 records out
1073741824 bytes (1,1 GB) copied, 2,94363 s, 365 MB/s

Formatage en ext4

# mkfs.ext4 /root/fs_ext4.img
mke2fs 1.42.9 (4-Feb-2014)
/root/fs_ext4.img is not a block special device.
Proceed anyway? (y,n) y
Discarding device blocks: done
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
65536 inodes, 262144 blocks
13107 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=268435456
8 block groups
32768 blocks per group, 32768 fragments per group
8192 inodes per group
Superblock backups stored on blocks:
    32768, 98304, 163840, 229376

Allocating group tables: done
Writing inode tables: done
Creating journal (8192 blocks): done
Writing superblocks and filesystem accounting information: done

Montage

# mkdir /mnt/ext4
# mount -t ext4 -o loop /root/fs_ext4.img /mnt/ext4
# losetup -a
/dev/loop0: [fc00]:917833 (/root/fs_ext4.img)

Vérification

# df -Th
Filesystem     Type      Size  Used Avail Use% Mounted on
udev           devtmpfs  981M   12K  981M   1% /dev
tmpfs          tmpfs     199M  1,5M  197M   1% /run
/dev/dm-0      ext4       18G  3,8G   13G  23% /
none           tmpfs     4,0K     0  4,0K   0% /sys/fs/cgroup
none           tmpfs     5,0M     0  5,0M   0% /run/lock
none           tmpfs     992M  152K  992M   1% /run/shm
none           tmpfs     100M   68K  100M   1% /run/user
/dev/sda1      ext2      236M   40M  184M  18% /boot
/dev/loop0     ext4      976M  1,3M  908M   1% /mnt/ext4
# echo $(date) > /mnt/ext4/f1
# echo $(date) > /mnt/ext4/f2
# mkdir /mnt/ext4/dir
# ls /mnt/ext4
dir  f1  f2  lost+found

Démontage et vérification du FS :

# umount /root/fs_ext4.img
# fsck /root/fs_ext4.img
fsck from util-linux 2.20.1
e2fsck 1.42.9 (4-Feb-2014)
/root/fs_ext4.img: clean, 14/65536 files, 12638/262144 blocks

Rendre le point de montage automatique au démarrage :

# echo "/root/fs_ext4.img /mnt/ext4 ext4 rw 0 0" >> /etc/fstab
# mount -a
# df -Th

RAID

On se contentera de parler ici des technologies RAID0, RAID1 et RAID5. On peut se référer à la source pour les autres types de RAID notamment combinés (RAID01, RAID10, ...) : https://fr.wikipedia.org/wiki/RAID_(informatique)

Le RAID est un ensemble de techniques de virtualisation du stockage permettant de répartir des données sur plusieurs disques durs afin d'améliorer soit les performances, soit la sécurité ou la tolérance aux pannes de l'ensemble du ou des systèmes.

L'acronyme RAID a été défini en 1987 par l'Université de Berkeley, dans un article nommé A Case for Redundant Arrays of Inexpensive Disks (RAID), soit « regroupement redondant de disques peu onéreux ». Aujourd'hui, le mot est devenu l'acronyme de Redundant Array of Independent Disks, ce qui signifie « regroupement redondant de disques indépendants ».

Le système RAID est :

  • soit un système de redondance qui donne au stockage des données une certaine tolérance aux pannes matérielles (ex : RAID1).
  • soit un système de répartition qui améliore ses performances (ex : RAID0).
  • soit les deux à la fois, mais avec une moins bonne efficacité (ex : RAID5).

Le système RAID est donc capable de gérer d'une manière ou d'une autre la répartition et la cohérence de ces données. Ce système de contrôle peut être purement logiciel ou utiliser un matériel dédié.

RAID 0 : volume agrégé par bandes

Le RAID 0, également connu sous le nom d'« entrelacement de disques » ou de « volume agrégé par bandes » (striping en anglais), est une configuration RAID permettant d'augmenter significativement les performances de la grappe en faisant travailler n disques durs en parallèle (avec n > ou = 2).

La capacité totale est égale à celle du plus petit élément de la grappe multiplié par le nombre d'éléments présent dans la grappe, car le système d'agrégation par bandes se retrouvera bloqué une fois que le plus petit disque sera rempli (voir schéma). L'espace excédentaire des autres éléments de la grappe restera inutilisé. Il est donc conseillé d'utiliser des disques de même capacité.

Le défaut de cette solution est que la perte d'un seul disque entraîne la perte de toutes ses données. Coût

Dans un RAID 0, qui n'apporte aucune redondance, tout l'espace disque disponible est utilisé (tant que tous les disques ont la même capacité).

Dans cette configuration, les données sont réparties par bandes (stripes en anglais) d'une taille fixe. Cette taille est appelée granularité.

RAID 1 : Disques en miroir

Le RAID 1 consiste en l'utilisation de n disques redondants (avec n > ou = 2), chaque disque de la grappe contenant à tout moment exactement les mêmes données, d'où l'utilisation du mot « miroir » (mirroring en anglais).

La capacité totale est égale à celle du plus petit élément de la grappe. L'espace excédentaire des autres éléments de la grappe restera inutilisé. Il est donc conseillé d'utiliser des éléments identiques.

Cette solution offre un excellent niveau de protection des données. Elle accepte une défaillance de n-1 éléments.

Les coûts de stockage sont élevés et directement proportionnels au nombre de miroirs utilisés alors que la capacité utile reste inchangée. Plus le nombre de miroirs est élevé, et plus la sécurité augmente, mais plus son coût devient prohibitif.

Les accès en lecture du système d'exploitation se font sur le disque le plus facilement accessible à ce moment-là. Les écritures sur la grappe se font de manière simultanée sur tous les disques, de façon à ce que n'importe quel disque soit interchangeable à tout moment.

Lors de la défaillance de l'un des disques, le contrôleur RAID désactive (de manière transparente pour l'accès aux données) le disque incriminé. Une fois le disque défectueux remplacé, le contrôleur RAID reconstitue, soit automatiquement, soit sur intervention manuelle, le miroir. Une fois la synchronisation effectuée, le RAID retrouve son niveau initial de redondance.

La migration du RAID1 vers RAID0, RAID5, RAID6 est presque toujours envisageable, ce qui fait du RAID1 une bonne solution de départ si on n'a pas un besoin de performance important.

RAID 5 : volume agrégé par bandes à parité répartie

Le RAID 5 combine la méthode du volume agrégé par bandes (striping) à une parité répartie. Il s'agit là d'un ensemble à redondance N+1. La parité, qui est incluse avec chaque écriture se retrouve répartie circulairement sur les différents disques. Chaque bande est donc constituée de N blocs de données et d'un bloc de parité. Ainsi, en cas de défaillance de l'un des disques de la grappe, pour chaque bande il manquera soit un bloc de données soit le bloc de parité. Si c'est le bloc de parité, ce n'est pas grave, car aucune donnée ne manque. Si c'est un bloc de données, on peut calculer son contenu à partir des N-1 autres blocs de données et du bloc de parité. L'intégrité des données de chaque bande est préservée. Donc non seulement la grappe est toujours en état de fonctionner, mais il est de plus possible de reconstruire le disque une fois échangé à partir des données et des informations de parité contenues sur les autres disques.

On voit donc que le RAID 5 ne supporte la perte que d'un seul disque à la fois. Ce qui devient un problème depuis que les disques qui composent une grappe sont de plus en plus gros (1 To et plus). Le temps de reconstruction de la parité en cas de disque défaillant est allongé. Il est généralement de 2 h pour des disques de 300 Go contre une dizaine d'heures pour 1 To. Pour limiter le risque il est courant de dédier un disque dit de spare. En régime normal il est inutilisé. En cas de panne d'un disque, il prendra automatiquement la place du disque défaillant. Cela nécessite une phase communément appelée "recalcul de parité". Elle consiste pour chaque bande à recréer sur le nouveau disque le bloc manquant (données ou parité).

Bien sûr pendant tout le temps du recalcul de la parité le disque est disponible normalement pour l'ordinateur qui se trouve juste un peu ralenti.

Ce système nécessite impérativement un minimum de trois disques durs. Ceux-ci doivent généralement être de même taille, mais un grand nombre de cartes RAID modernes autorisent des disques de tailles différentes.

La capacité de stockage utile réelle, pour un système de X disques de capacité c identiques est de (X-1) fois c. En cas d'utilisation de disques de capacités différentes, le système utilisera dans la formule précédente la capacité minimale.

Ainsi par exemple, trois disques de 100 Go en RAID 5 offrent 200 Go utiles ; dix disques, 900 Go utiles.

Ce système allie sécurité (grâce à la parité) et bonne disponibilité (grâce à la répartition de la parité), même en cas de défaillance d'un des périphériques de stockage.

Logical Volume Manager LVM

LVM est un ensemble d'outils de l'espace utilisateur Linux pour fournir des commodités de gestion du stockage (volumes).

LVM (Logical Volume Manager) répond principalement au besoin

  • d'évolutivité des capacités de stockage
  • tout en assurant la disponibilité du service.

Plus simplement il s'agit de redimensionner un système de fichiers (FS) dynamiquement (en augmentant ou en réduisant le nombre de disques physiques disponibles) avec un minimum d'interruption.

On utilise communément LVM en version 2. Le cas échéant, il s'installe.

Prise d'information

La commande lsblkvous indique la manière dont vos disques sont montés. Aussi, la commande df -hvous donne des informations utiles.

Casus

On peut illustrer la fonctionnalité LVM dans le cas est le suivant.

Traditionnellement, un disque est constitué d'une ou plusieurs partitions :

  • soit montée en racine unique d'un système,
  • soit qui héberge le point de montage d'une application (/home, /var/www/html, /opt/nfs-share/, ...)
  • ou une partition Swap

Comment étendre les capacités d'une partition qui a atteint le seuil d'occupation maximale du disque qui l'héberge ?

Par exemple, les partitions configurées occupent entièrement les 128Go que peut offrir un disque /dev/sda.

La solution sans LVM consisterait à copier les données du système de fichiers saturé sur le système de fichiers d'un nouveau disque de plus grande capacité ajouté. On peut aussi réaliser le redimensionnement avec des outils comme parted ou d'autres biens connus.

Quoi qu'il en soit, dans ce cas, on ne peut qu'imaginer le manque en disponibilité et en évolutivité de la solution de stockage.

Solution LVM

Sous certaines conditions, LVM autorisera un taux de disponibilité proche du maximum lors du redimensionnement du système de fichiers qui consiste souvent en une extension en capacité.

En supplément, LVM supporte deux fonctionnalités qui améliorent ces critères : le mirroring et les snapshots (voir plus bas).

Concepts

Système de fichiers LV VG PV

Avec LVM, le système de fichiers (FS : EXT4, XFS, BTRFS, ...) est supporté par un Logical Volume (LV) au lieu d'être supporté par une partition ou autre périphérique. Un LV est un container de FS.

Les LV appartiennent à un Volume Group (VG). Un VG est une sorte d'entité logique qui représente une capacité de stockage.

Le noyau voit les VG comme des périphériques de type block (commande lsblk) et leurs LV comme leurs partitions. Ces périphériques sont dénommés par UUID, selon le schéma /dev/mapper/vg-lv ou encore selon le schéma /dev/vg/lv.

Un VG est constitué d'un ensemble de Physical Volume (PV). Les PV sont les périphériques physiques de stockage. Ils peuvent être :

  • Un disque entier dont on a effacé le secteur d'amorçage (les premiers 512 octects du disque).
  • Une partition d'un disque marquée par fdisk en type 8e.
  • Un fichier de loopback.
  • Un array RAID.

Extents

Un PV est composé d'entités de 4 Mo par défaut que l'on appelle des Physical Extents (PE). Les Extents sont des blocs contigus réservé pour des fichiers sur un FS. Dans un PV de 4 Go, on dispose de 1023 PE par défaut.

Un VG est donc un potentiel, un stock, de PE disponibles. Un LV est composé de Logical Extents (LE) qui sont liés à un (1) voire plusieurs PE. Ces "metadonnées" de correspondance sont écrites et réservées au début de chaque PV. Dans un VG de 8 Go, on dispose de 2046 PE par défaut. Dans un LV de 1 Go, on dispose de 256 LE.

Un VG est donc un stock de PE (fournis par les PV) liés à des LE qui constituent le LV.

http://commons.wikimedia.org/wiki/File:LVM1.svg Source : http://commons.wikimedia.org/wiki/File:LVM1.svg

Opérations

Déploiement

Installation

Installation

apt-get install lvm2 || yum install lvm2

Liste des commandes LVM

(rpm -ql lvm2 | grep 'sbin' | sed 's/.*\/sbin\///g') || dpkg -L lvm2

Partition racine unique et /boot

On peut vérifier le système

fdisk -l /dev/sda
lsblk
lvmdiskscan

Création d'un LV initial

Initialisation de PV

pvcreate /dev/sdx

Visualisation

pvs
pvscan
pvdisplay
vgcreate vg1 /dev/sdx /dev/sdy
vgs
vgdisplay
pvs
lvcreate -L 8G -n lv1 vg1
lvs
lvdisplay

Point de montage utilisateur en EXT4

mkfs.ext4 /dev/vg1/lv1 
mount /dev/vg1/lv1 /opt

Point de montage utilisateur en XFS

mkfs.xfs /dev/vg1/lv1 
mount /dev/vg1/lv1 /opt

Miroring

Si les technologies RAID matériel et logiciel sont supportées par LVM et sont conseillées dans leurs meilleures versions selon les bons usages, alors un PV représente un array raid (/dev/md0 par exemple).

LVM offre une sécurité concurrente sinon complémentaire en proposant des fonctions de type RAID logique (linear par défaut, mirroring, stripping).

Les LE sont liés typiquement à deux PE sur des PV distincts, mais on peut créer 2 copies.

La création d'un journal de synchronisation peut consommer un certain temps. On conseille de le stocker sur un autre PV que celui qui abrite les données du miroir.

En cas de perte le PV utilise les PE restants. En cas de miroir simple (lvcreate -m 1), le LV fonctionne en mode linear (lvcreate -m 0 par défaut).

Faut-il aussi que le VG qui supporte des LV en mirroring dispose de suffisamment de ressources.

Redimensionnement dynamique

LVM permet de redimensionner des VG en leur retirant ou en leur ajoutant des PV (stock de PE). On peut alors redimensionner.

La disponibilité dépend des capacités du système de fichiers à se redimensionner dynamiquement sans démontage/montage. En 2015, EXT4, XFS et BTRFS supportent cette fonction.

On prendra certainement garde à réaliser une sauvegarde du FS avant un redimensionnement.

Le plus sûr est de :

  1. démonter le FS
  2. vérifier
  3. redimensionner
  4. vérifier
  5. remonter

Propriétés des système de fichiers

  • EXT4 autorise un redimensionnement à froid (LV démonté) ou à chaud (LV monté).
  • XFS se caractérise par le fait qu'il n'autorise que des extensions à chaud. Aucune réduction n'est possible.
  • BTRFS permet une extension ou une réduction sur des LV montés ou non.

Extension à chaud en EXT4

df -h
lvextend -L +1G /dev/vg1/lv1
resize2fs /dev/vg1/lv1
lvs
df -h

Extension à chaud en XFS

df -h
lvextend -L +1G /dev/vg1/lv1
xfs_growfs /dev/vg1/lv1
lvs
df -h

Réduction en EXT4 : démonté et vérifié

Remplacement d'un espace de stockage (disque SATA, partition) en mode linear

Remplacement d'un espace de stockage (disque SATA, partition) en mode mirorring

Passage en mode linear

lvconvert -m 0
lvs
pvs

Réduction du VG

vgreduce

Retrait du PV

pvremove

Ajout du PV de remplacement (pas nécessairement identique à l'original) et extension du VG

pvcreate
vgextend

Reconstruction et vérification

lvconvert -m 1
lvs

Remplacement d'un disque d'un array RAID logiciel sur PV utilisé

Voir Cas 2.

Destruction d'un LV

lvremove

Destruction d'un VG

vgremove

Destruction d'un PV

pvremove

Snapshots

Un snapshot est l'action de prendre une image figée du LV.

A condition d'être montée, une copie du LV au moment de la capture reste accessible pendant une sauvegarde du système de fichiers. Cette copie est faite instantanément sans interruption.

A condition d'approvisionner en suffisance le VG qui héberge des snapshots, on l'imagine comme solution de clonage liés de machines virtuelles.

Ce n'est pas un sauvegarde exacte. Alors que le LV original continue à être accessible et à être modifié régulièrement, LVM enregistre les différences à partir du moment de la capture jusqu'à sa destruction. La permanence de l'instantané est maintenu par cette différence.

Autrement dit, sa dimension dépend des différences opérées jusqu'à la suppression du snapshot. Pour donner un ordre de grandeur dans la prévision de sa taille, un effacement complet du contenu du FS occuperait 100% du LV original. En général, 5 à 15 % peuvent suffire selon les transactions effectuées jusqu'à la suppression.

Le facteur temps joue aussi dans l'espace occupé par le snapshot.

Un snapshot est censé être temporaire. D'ailleurs, il s'efface lors du redémarrage du service.

lvcreate -s

Exercices

Configuration : distribution de base et 4 disques supplémentaires (sdb, sdc, sdd, sde) minimum voire plus ou à réutiliser.

Cas 1 : Démo LVM

Dans un premier temps, on tentera de comprendre la démo ci-dessous. Création de 4 espaces de stockage de 1 Go à des fins de partage dans un volume de 8 Go (2 disques)

  • PV : 2 X 4 Go
  • VG : 8 Go
  • LV : 50 %
    • /opt/share1 : 1 Go en EXT4
    • /opt/share2 : 1 Go en XFS
    • /opt/share3 : 1 Go en BTRFS
    • /opt/share4 : 1 Go

image alt text

Phase 1 : Physical Volumes

Prise d’information

# lsblk
NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
fd0      2:0    1    4K  0 disk 
sda      8:0    0   80G  0 disk 
├─sda1   8:1    0 23,3G  0 part 
├─sda2   8:2    0    2G  0 part [SWAP]
├─sda3   8:3    0 24,4G  0 part /
├─sda4   8:4    0    1K  0 part 
└─sda5   8:5    0   20G  0 part /home
sdb      8:16   0    4G  0 disk 
sdc      8:32   0    4G  0 disk 
sdd      8:48   0    4G  0 disk 
sde      8:64   0    4G  0 disk 
sr0     11:0    1 1024M  0 rom

Création de PV

# pvcreate /dev/sd[b-c]
  Physical volume "/dev/sdb" successfully created
  Physical volume "/dev/sdc" successfully created

Scan de tous les périphériques LVM

# lvmdiskscan 
  /dev/sda1 [      23,28 GiB] 
  /dev/sda2 [       2,00 GiB] 
  /dev/sda3 [      24,41 GiB] 
  /dev/sda5 [      20,00 GiB] 
  /dev/sdb  [       4,00 GiB] LVM physical volume
  /dev/sdc  [       4,00 GiB] LVM physical volume
  /dev/sdd  [       4,00 GiB] 
  /dev/sde  [       4,00 GiB] 
  2 disks
  4 partitions
  2 LVM physical volume whole disks
  0 LVM physical volumes

Vérification PV

# pvdisplay 
  "/dev/sdc" is a new physical volume of "4,00 GiB"
  --- NEW Physical volume ---
  PV Name               /dev/sdc
  VG Name               
  PV Size               4,00 GiB
  Allocatable           NO
  PE Size               0   
  Total PE              0
  Free PE               0
  Allocated PE          0
  PV UUID               p1NX9t-Q6zI-x93K-x8Zh-eMlB-ZG2j-daJ49X

  "/dev/sdb" is a new physical volume of "4,00 GiB"
  --- NEW Physical volume ---
  PV Name               /dev/sdb
  VG Name               
  PV Size               4,00 GiB
  Allocatable           NO
  PE Size               0   
  Total PE              0
  Free PE               0
  Allocated PE          0
  PV UUID               723B2y-ZwHK-OzZz-Nq3u-fkMc-Xd1I-ZeCPFD
# pvscan
  PV /dev/sdc                      lvm2 [4,00 GiB]
  PV /dev/sdb                      lvm2 [4,00 GiB]
  Total: 2 [8,00 GiB] / in use: 0 [0   ] / in no VG: 2 [8,00 GiB]

Retirer/replacer un PV

# pvremove /dev/sdb
  Labels on physical volume "/dev/sdb" successfully wiped
# pvscan
  PV /dev/sdc                      lvm2 [4,00 GiB]
  Total: 1 [4,00 GiB] / in use: 0 [0   ] / in no VG: 1 [4,00 GiB]
# pvcreate /dev/sdb
  Physical volume "/dev/sdb" successfully created
# pvscan
  PV /dev/sdc                      lvm2 [4,00 GiB]
  PV /dev/sdb                      lvm2 [4,00 GiB]
  Total: 2 [8,00 GiB] / in use: 0 [0   ] / in no VG: 2 [8,00 GiB]

Phase 2 : Volume Group

Création du VG vg1

# vgcreate vg1 /dev/sd[b-c]
  Volume group "vg1" successfully created

Vérification du VG

# vgs
  VG   #PV #LV #SN Attr   VSize VFree
  vg1    2   0   0 wz--n- 7,99g 7,99g
# vgdisplay
  --- Volume group ---
  VG Name               vg1
  System ID             
  Format                lvm2
  Metadata Areas        2
  Metadata Sequence No  1
  VG Access             read/write
  VG Status             resizable
  MAX LV                0
  Cur LV                0
  Open LV               0
  Max PV                0
  Cur PV                2
  Act PV                2
  VG Size               7,99 GiB
  PE Size               4,00 MiB
  Total PE              2046

Phase 3 : Logical Volumes

Création des LV

# lvcreate -L 1G -n share1 vg1
  Logical volume "share1" created
# lvcreate -L 1G -n share2 vg1
  Logical volume "share2" created
# lvcreate -L 1G -n share3 vg1
  Logical volume "share3" created
# lvcreate -L 1G -n share4 vg1
  Logical volume "share4" created

Vérification

# lvscan
  ACTIVE            '/dev/vg1/share1' [1,00 GiB] inherit
  ACTIVE            '/dev/vg1/share2' [1,00 GiB] inherit
  ACTIVE            '/dev/vg1/share3' [1,00 GiB] inherit
  ACTIVE            '/dev/vg1/share4' [1,00 GiB] inherit
# lvdisplay
  --- Logical volume ---
  LV Path                /dev/vg1/share1
  LV Name                share1
  VG Name                vg1
  LV UUID                h4CES1-CK8z-Rusd-PbtY-N2uH-sXFE-IEgWrY
  LV Write Access        read/write
  LV Creation host, time localhost.localdomain, 2015-03-08 15:34:13 +0100
  LV Status              available
  # open                 0
  LV Size                1,00 GiB
  Current LE             256
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     8192
  Block device           253:0

  --- Logical volume ---
  LV Path                /dev/vg1/share2
  LV Name                share2
  VG Name                vg1
  LV UUID                YzrnXb-DUNc-jKuf-RJvx-8P0s-yKdC-ZZ1Jm7
  LV Write Access        read/write
  LV Creation host, time localhost.localdomain, 2015-03-08 15:34:18 +0100
  LV Status              available
  # open                 0
  LV Size                1,00 GiB
  Current LE             256
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     8192
  Block device           253:1

  --- Logical volume ---
  LV Path                /dev/vg1/share3
  LV Name                share3
  VG Name                vg1
  LV UUID                rLoohn-Vwzk-wgv7-GYjc-6jU3-Hc3x-7RdZkP
  LV Write Access        read/write
  LV Creation host, time localhost.localdomain, 2015-03-08 15:34:22 +0100
  LV Status              available
  # open                 0
  LV Size                1,00 GiB
  Current LE             256
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     8192
  Block device           253:2

  --- Logical volume ---
  LV Path                /dev/vg1/share4
  LV Name                share4
  VG Name                vg1
  LV UUID                Yd0L8h-TZ7v-zUvj-6YYP-WBut-D3mn-GAZUaF
  LV Write Access        read/write
  LV Creation host, time localhost.localdomain, 2015-03-08 15:34:25 +0100
  LV Status              available
  # open                 0
  LV Size                1,00 GiB
  Current LE             256
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     8192
  Block device           253:3

Phase 4 : Formatage

# mkfs.ext4 /dev/vg1/share1
mke2fs 1.42.9 (28-Dec-2013)
Étiquette de système de fichiers=
Type de système d'exploitation : Linux
Taille de bloc=4096 (log=2)
Taille de fragment=4096 (log=2)
« Stride » = 0 blocs, « Stripe width » = 0 blocs
65536 i-noeuds, 262144 blocs
13107 blocs (5.00%) réservés pour le super utilisateur
Premier bloc de données=0
Nombre maximum de blocs du système de fichiers=268435456
8 groupes de blocs
32768 blocs par groupe, 32768 fragments par groupe
8192 i-noeuds par groupe
Superblocs de secours stockés sur les blocs : 
    32768, 98304, 163840, 229376

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é
# mkfs.xfs /dev/vg1/share2
meta-data=/dev/vg1/share2        isize=256    agcount=4, agsize=65536 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=0
data     =                       bsize=4096   blocks=262144, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=0
log      =internal log           bsize=4096   blocks=2560, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0
# mkfs.btrfs /dev/vg1/share3

WARNING! - Btrfs v3.12 IS EXPERIMENTAL
WARNING! - see http://btrfs.wiki.kernel.org before using

Turning ON incompat feature 'extref': increased hardlink limit per file to 65536
fs created label (null) on /dev/vg1/share3
    nodesize 16384 leafsize 16384 sectorsize 4096 size 1.00GiB
Btrfs v3.12

Phase 5 : Points de montage

Création des points de montage

# mkdir /opt/share1
# mkdir /opt/share2
# mkdir /opt/share3
# mkdir /opt/share4
# mount -t ext4 /dev/vg1/share1 /opt/share1
# mount -t xfs /dev/vg1/share2 /opt/share2
# mount -t btrfs /dev/vg1/share3 /opt/share3
# tail -n 3 /proc/mounts
/dev/mapper/vg1-share1 /opt/share1 ext4 rw,seclabel,relatime,data=ordered 0 0
/dev/mapper/vg1-share2 /opt/share2 xfs rw,seclabel,relatime,attr2,inode64,noquota 0 0
/dev/mapper/vg1-share3 /opt/share3 btrfs rw,seclabel,relatime,space_cache 0 0
# findmnt 
TARGET                           SOURCE      FSTYPE      OPTIONS
/                                /dev/sda3   xfs         rw,relatime,seclabel,attr2,inode64,noquota
├─/proc                          proc        proc        rw,nosuid,nodev,noexec,relatime
│ ├─/proc/sys/fs/binfmt_misc     systemd-1   autofs      rw,relatime,fd=32,pgrp=1,timeout=300,minproto=5,maxproto=5,d
│ │ └─/proc/sys/fs/binfmt_misc   binfmt_misc binfmt_misc rw,relatime
│ └─/proc/fs/nfsd                sunrpc      nfsd        rw,relatime
├─/sys                           sysfs       sysfs       rw,nosuid,nodev,noexec,relatime,seclabel
│ ├─/sys/kernel/security         securityfs  securityfs  rw,nosuid,nodev,noexec,relatime
│ ├─/sys/fs/cgroup               tmpfs       tmpfs       rw,nosuid,nodev,noexec,seclabel,mode=755
│ │ ├─/sys/fs/cgroup/systemd     cgroup      cgroup      rw,nosuid,nodev,noexec,relatime,xattr,release_agent=/usr/lib
│ │ ├─/sys/fs/cgroup/cpuset      cgroup      cgroup      rw,nosuid,nodev,noexec,relatime,cpuset
│ │ ├─/sys/fs/cgroup/cpu,cpuacct cgroup      cgroup      rw,nosuid,nodev,noexec,relatime,cpuacct,cpu
│ │ ├─/sys/fs/cgroup/memory      cgroup      cgroup      rw,nosuid,nodev,noexec,relatime,memory
│ │ ├─/sys/fs/cgroup/devices     cgroup      cgroup      rw,nosuid,nodev,noexec,relatime,devices
│ │ ├─/sys/fs/cgroup/freezer     cgroup      cgroup      rw,nosuid,nodev,noexec,relatime,freezer
│ │ ├─/sys/fs/cgroup/net_cls     cgroup      cgroup      rw,nosuid,nodev,noexec,relatime,net_cls
│ │ ├─/sys/fs/cgroup/blkio       cgroup      cgroup      rw,nosuid,nodev,noexec,relatime,blkio
│ │ ├─/sys/fs/cgroup/perf_event  cgroup      cgroup      rw,nosuid,nodev,noexec,relatime,perf_event
│ │ └─/sys/fs/cgroup/hugetlb     cgroup      cgroup      rw,nosuid,nodev,noexec,relatime,hugetlb
│ ├─/sys/fs/pstore               pstore      pstore      rw,nosuid,nodev,noexec,relatime
│ ├─/sys/kernel/config           configfs    configfs    rw,relatime
│ ├─/sys/fs/selinux              selinuxfs   selinuxfs   rw,relatime
│ ├─/sys/kernel/debug            debugfs     debugfs     rw,relatime
│ └─/sys/fs/fuse/connections     fusectl     fusectl     rw,relatime
├─/dev                           devtmpfs    devtmpfs    rw,nosuid,seclabel,size=7933072k,nr_inodes=1983268,mode=755
│ ├─/dev/shm                     tmpfs       tmpfs       rw,nosuid,nodev,seclabel
│ ├─/dev/pts                     devpts      devpts      rw,nosuid,noexec,relatime,seclabel,gid=5,mode=620,ptmxmode=0
│ ├─/dev/mqueue                  mqueue      mqueue      rw,relatime,seclabel
│ └─/dev/hugepages               hugetlbfs   hugetlbfs   rw,relatime,seclabel
├─/run                           tmpfs       tmpfs       rw,nosuid,nodev,seclabel,mode=755
│ └─/run/user/1000/gvfs          gvfsd-fuse  fuse.gvfsd- rw,nosuid,nodev,relatime,user_id=1000,group_id=1000
├─/tmp                           tmpfs       tmpfs       rw,seclabel
├─/var/lib/nfs/rpc_pipefs        sunrpc      rpc_pipefs  rw,relatime
├─/home                          /dev/sda5   xfs         rw,relatime,seclabel,attr2,inode64,noquota
├─/opt/share1                    /dev/mapper/vg1-share1
                                             ext4        rw,relatime,seclabel,data=ordered
├─/opt/share2                    /dev/mapper/vg1-share2
                                             xfs         rw,relatime,seclabel,attr2,inode64,noquota
└─/opt/share3                    /dev/mapper/vg1-share3
                                             btrfs       rw,relatime,seclabel,space_cache

Cas 2 : RAID5 et LVM

Dans ce scénario que l’on reprend à titre démonstratif ou comme exercice on utilise des disques en RAID 5 logiciel. On peut utiliser les /dev/sdd et /dev/sde des cas précedents.

Scénario

Pour réaliser ce lab RAID LVM de base, une machine virtuelle Linux et un espace disque libre de 16 Go sur l’ordinateur hôte sont nécessaires.

Le lab consiste à manipuler cinq disques durs de 4Go (de taille égale si vous changez les dimensions) en RAID5 et LVM :

  • soit créés dans le logiciel de virtualisation et attachés à la machine virtuelle

  • soit créés "virtuellement sur le système de fichier de la machine virtuelle (sous condition que son disque dur dispose de suffisamment de capacité.

Le scénario est le suivant :

  1. Le disque sda est réservé pour le système.

  2. Un array RAID5 logiciel avec 3 disques est construit.

  3. Il est considéré comme un Physical Volume

  4. Une partition XFS (LV) est créée dans un Volume Group constitué de cet array. Elle est montée au démarrage dans le système de fichier.

  5. La manipulation suivante consiste à étendre à chaud la partition sur les quatre disques en ajoutant un supplémentaire dans l’array.

  6. On peut créer des instantanés (snapshot) et les monter sur le système de fichier.

  7. Pourquoi ne pas forcer la reconstruction RAID en retirant le premier disque de l’array ?

  8. Enfin, on tentera de monter une stratégie de copies cohérentes instantannées avec LVM à l’aide d’un script.

  9. On imaginerait un scénario de création de partition à la demande (script).

  10. La prochaine étape consisterait à s’intéresser à de solutions d’automation de type cloud (stockage VM / containers).

  11. L’exercice peut aussi s’attarder sur les fonctionnalités riches de XFS (réparation, surveillance, quotas, support des disques SSD).

Schéma

image alt text

1. Configuration de 3 disques de 4Go en RAID5 logiciel

http://fr.wikipedia.org/wiki/RAID_(informatique))

apt-get install mdadm

ls /dev/sd*

Création d’une partion "fd (RAID Linux autodétecté)" pour chaque disque :

fdsik -l 

fdisk /dev/sdb 

fdisk /dev/sdc

fdisk /dev/sdd

mdadm --create /dev/md0 --level=5 --assume-clean --raid-devices=3 /dev/sd[bcd]1

Combien de capacité sur cet array ?

2. Configuration LVM à 4Go

LVM Adminsitration Guide RHEL6 (fr)

apt-get install lvm2 || yum install lvm2
  • PV : Physical Volume ← point de vue physique

  • VG : Volume Group

  • LV : Logical Volume (FS) ← point de vue logique

2.1. Ajout de l’array dans un PV

pvcreate /dev/md0
pvdisplay /dev/md0

  "/dev/md0" is a new physical volume of "7,99 GiB"

  --- NEW Physical volume ---

  PV Name               /dev/md0

  VG Name               

  PV Size               7,99 GiB

  Allocatable           NO

  PE Size               0   

  Total PE              0

  Free PE               0

  Allocated PE          0

  PV UUID               AxIQeZ-W0CB-Fhld-pw9q-UiLR-0b5i-HRP0E3

2.2. Création du VG

vgcreate data1 /dev/md0

  Volume group "data1" successfully created

vgdisplay data1

  --- Volume group ---

  VG Name               data1

  System ID             

  Format                lvm2

  Metadata Areas        1

  Metadata Sequence No  1

  VG Access             read/write

  VG Status             resizable

  MAX LV                0

  Cur LV                0

  Open LV               0

  Max PV                0

  Cur PV                1

  Act PV                1

  VG Size               7,99 GiB

  PE Size               4,00 MiB

  Total PE              2046

  Alloc PE / Size       0 / 0   

  Free  PE / Size       2046 / 7,99 GiB

  VG UUID               u82fND-XNE6-h39B-PPtF-6if3-heYn-Tq3X5n

2.3. Création de la partition de 4G

lvcreate -n Vol1 -L 4g data1

  Logical volume "Vol1" created

lvdisplay /dev/data1/Vol1 

  --- Logical volume ---

  LV Name                /dev/data1/Vol1

  VG Name                data1

  LV UUID                OPfKpH-fEid-1LOS-91Fh-Lp5B-qzs9-spK12n

  LV Write Access        read/write

  LV Status              available

  # open                 0

  LV Size                4,00 GiB

  Current LE             1024

  Segments               1

  Allocation             inherit

  Read ahead sectors     auto

  - currently set to     4096

  Block device           252:2

3. Système de fichier XFS

http://techpubs.sgi.com/library/tpl/cgi-bin/browse.cgi?coll=linux&db=bks&cmd=toc&pth=/SGI_Admin/LX_XFS_AG

apt-get install xfsprogs

Formatage XFS

mkfs.xfs -L data1 /dev/data1/Vol1 

log stripe unit (524288 bytes) is too large (maximum is 256KiB)

log stripe unit adjusted to 32KiB

meta-data=/dev/data1/Vol1        isize=256    agcount=8, agsize=130944 blks

         =                       sectsz=512   attr=2, projid32bit=0

data     =                       bsize=4096   blocks=1047552, imaxpct=25

         =                       sunit=128    swidth=256 blks

naming   =version 2              bsize=4096   ascii-ci=0

log      =internal log           bsize=4096   blocks=2560, version=2

         =                       sectsz=512   sunit=8 blks, lazy-count=1

realtime =aucun                  extsz=4096   blocks=0, rtextents=0

Point de montage

mkdir /mnt/data1
mount /dev/data1/Vol1 /mnt/data1
df -h

Sys. de fichiers        Taille Utilisé Dispo Uti% Monté sur

/dev/mapper/ubuntu-root    19G    1,3G   17G   8% /

udev                      240M    4,0K  240M   1% /dev

tmpfs                     100M    360K   99M   1% /run

none                      5,0M       0  5,0M   0% /run/lock

none                      248M       0  248M   0% /run/shm

/dev/sda1                 228M     26M  190M  13% /boot

/dev/mapper/data1-Vol1    4,0G     33M  4,0G   1% /mnt/data1

Commande lvs

LV     VG        Attr      LSize    Pool Origin Data%  Move Log Copy%  Convert

Vol1   data1     -wi-ao---    4,00g
touch /mnt/data1/test.txt

ou encore

dd if=/dev/urandom bs=1024 count=1000 of=/mnt/data1/fichier.bin

Montage au démarrage

ls -l /mnt/data1/

echo '/dev/data1/Vol1 /mnt/data1 xfs defaults 0 0' >> /etc/fstab

4. Ajout d’un 4e disque de 4Go

4.1. Création d’un partition /dev/sde1

fdisk /dev/sde

4.2. Ajout du disque dans l’array

mdadm --manage /dev/md127 --add /dev/sde1

4.3. Extension l’array sur les partitions

 mdadm --grow /dev/md127 --raid-devices=4

4.4. Extension du PV

pvresize /dev/md127

  Physical volume "/dev/md127" changed

  1 physical volume(s) resized / 0 physical volume(s) not resized

pvdisplay /dev/md127 

  --- Physical volume ---

  PV Name               /dev/md127

  VG Name               data1

  PV Size               11,99 GiB / not usable 512,00 KiB

  Allocatable           yes 

  PE Size               4,00 MiB

  Total PE              3069

  Free PE               2045

  Allocated PE          1024

  PV UUID               AxIQeZ-W0CB-Fhld-pw9q-UiLR-0b5i-HRP0E3

4.5. Extension du VG :

vgresize data1 /dev/md127

4.6. Extension du LV :

lvresize -L 9g /dev/data1/Vol1 

  Extending logical volume Vol1 to 9,00 GiB

  Logical volume Vol1 successfully resized

lvdisplay /dev/data1/Vol1 

  --- Logical volume ---

  LV Name                /dev/data1/Vol1

  VG Name                data1

  LV UUID                OPfKpH-fEid-1LOS-91Fh-Lp5B-qzs9-spK12n

  LV Write Access        read/write

  LV Status              available

  # open                 1

  LV Size                9,00 GiB

  Current LE             2304

  Segments               1

  Allocation             inherit

  Read ahead sectors     auto

  - currently set to     6144

  Block device           252:2
df -h

Sys. de fichiers        Taille Utilisé Dispo Uti% Monté sur

/dev/mapper/ubuntu-root    19G    1,3G   17G   8% /

udev                      240M    4,0K  240M   1% /dev

tmpfs                     100M    368K   99M   1% /run

none                      5,0M       0  5,0M   0% /run/lock

none                      248M       0  248M   0% /run/shm

/dev/sda1                 228M     26M  190M  13% /boot

/dev/mapper/data1-Vol1    4,0G     33M  4,0G   1% /mnt/data1

Commande lvs

4.7. Reformatage dynamique, extension du FS

xfs_growfs /mnt/data1

meta-data=/dev/mapper/data1-Vol1 isize=256    agcount=8, agsize=130944 blks

         =                       sectsz=512   attr=2

data     =                       bsize=4096   blocks=1047552, imaxpct=25

         =                       sunit=128    swidth=256 blks

naming   =version 2              bsize=4096   ascii-ci=0

log      =interne                bsize=4096   blocks=2560, version=2

         =                       sectsz=512   sunit=8 blks, lazy-count=1

realtime =aucun                  extsz=4096   blocks=0, rtextents=0

blocs de données modifiés de 1047552 à 2359296
df -h

Sys. de fichiers        Taille Utilisé Dispo Uti% Monté sur

/dev/mapper/ubuntu-root    19G    1,3G   17G   8% /

udev                      240M    4,0K  240M   1% /dev

tmpfs                     100M    368K   99M   1% /run

none                      5,0M       0  5,0M   0% /run/lock

none                      248M       0  248M   0% /run/shm

/dev/sda1                 228M     26M  190M  13% /boot

/dev/mapper/data1-Vol1    9,0G     33M  9,0G   1% /mnt/data1

5. Snapshot

Instantané d’un LV, se monte comme n’importe quel LV.

5.1. Fichier de test

touch /mnt/data1/pour_voir_snapshot.txt

5.2. Création d’un snapshot de 1Go :

lvcreate -L 1g -s -n lv_snap1 /dev/data1/Vol1

5.3. Suppression du fichier de test :

rm /mnt/data1/pour_voir_snapshot.txt

5.4. Montage du snapshot

mkdir /mnt/lv_snap1/

xfs_admin -U generate /dev/data1/lv_snap1 

Clearing log and setting UUID

writing all SBs

new UUID = 15066bfc-556f-4c9c-a1d9-f0a572fc3e14

mount /dev/data1/lv_snap1 /mnt/lv_snap1/

ls /mnt/lv_snap1/

On peut aussi redimensionner, fusionner un snapshot.

6. Test RAID

mdadm --manage --fail /dev/md127 /dev/sdb1

mdadm: set /dev/sdb1 faulty in /dev/md127
cat /proc/mdstat 

Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10] 

md127 : active raid5 sde1[3] sdc1[1] sdd1[2] sdb1[0](F)

      12572160 blocks super 1.2 level 5, 512k chunk, algorithm 2 [4/3] [_UUU]



unused devices: <none>

Vous avez du courrier dans /var/mail/root
mdadm --manage --remove /dev/md127 /dev/sdb1

mdadm: hot removed /dev/sdb1 from /dev/md127
mdadm --manage --add /dev/md127 /dev/sdb1

mdadm: added /dev/sdb1
cat /proc/mdstat 

Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10] 

md127 : active raid5 sdb1[4] sde1[3] sdc1[1] sdd1[2]

      12572160 blocks super 1.2 level 5, 512k chunk, algorithm 2 [4/3] [_UUU]

      [=>...................]  recovery =  8.7% (368720/4190720) finish=0.5min speed=122906K/sec



unused devices: <none>

cat /proc/mdstat 

Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10] 

md127 : active raid5 sdb1[4] sde1[3] sdc1[1] sdd1[2]

      12572160 blocks super 1.2 level 5, 512k chunk, algorithm 2 [4/3] [_UUU]

      [=====>...............]  recovery = 27.4% (1152344/4190720) finish=0.3min speed=144043K/sec



unused devices: <none>

cat /proc/mdstat 

Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10] 

md127 : active raid5 sdb1[4] sde1[3] sdc1[1] sdd1[2]

      12572160 blocks super 1.2 level 5, 512k chunk, algorithm 2 [4/3] [_UUU]

      [=======>.............]  recovery = 36.4% (1527132/4190720) finish=0.2min speed=152713K/sec



unused devices: <none>

cat /proc/mdstat 

Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10] 

md127 : active raid5 sdb1[4] sde1[3] sdc1[1] sdd1[2]

      12572160 blocks super 1.2 level 5, 512k chunk, algorithm 2 [4/4] [UUUU]



unused devices: <none>

7. Script de sauvegarde automatique des snapshots

http://www.partage-it.com/backup-lvm/

Cas 3 : Alternative LVM

Cas similaire aux précédents avec de plus grandes capacités et des questions supplémentaires.

  • 4 disques de 10 Go

  • 1 VG 20 Go avec 2 PV : vg1

  • 3 LV de 5 Go

    • /opt/share1 : EXT4

    • /opt/share2 : XFS

    • /opt/share3 : BTRFS

Quelle est l’occupation initiale des partitions ?

Que représente la notion d’extent ?

Comment étendre dynamiquement à chaud ces partitions ?

Comment utiliser la fonction de Snapshot ? Peut-elle servir de backup ?

Solution de mise en place

Création du VG

pvcreate /dev/sd[b-e]

pvs

pvdisplay

vgcreate vg1 /dev/sd[b-c]

vgs

vgdisplay

Création LV vg1/share*

lvcreate -L 5G -n share1 vg1

lvcreate -L 5G -n share2 vg1

lvcreate -L 5G -n share3 vg1

lvscan

lvdisplay

Formatage des LV

apt-get -y install xfsprogs btrfs-tools

mkfs.ext4 /dev/vg1/share1

mkfs.xfs /dev/vg1/share2

mkfs.btrfs /dev/vg1/share3

Points de montage

mkdir /opt/share1

mkdir /opt/share2

mkdir /opt/share3

mount -t ext4 /dev/vg1/share1 /opt/share1

mount -t xfs /dev/vg1/share2 /opt/share2

mount -t btrfs /dev/vg1/share3 /opt/share3

cat /etc/fstab

blkid

df -h

vim /etc/fstab

UUID=e91dbea7-839d-451e-a061-f426110e7064       /opt/share1     ext4    defaults        0 0

/dev/vg1/share2        /opt/share2     xfs     defaults        0 0

/dev/mapper/vg1-share3    /opt/share3     btrfs   defaults        0 0

Cas 4 : Partage

Afin de mettre en oeuvre nos compétences en administration et en automation du système, je vous propose un cas classique lié aux espaces de stockage.

Ces trois partitions vont héberger un partage entre plusieurs utilisateurs du groupe "omega".

Chaque point de montage /opt/share[1-3] appartient au groupe "omega". Ils sont partagés par deux utilisateurs “alfa” et “beta” appartenant au groupe secondaire “omega”.

Chacun de ces points de montage est accessible via le dossier d’accueil personnel de ces utilisateurs en liens symboliques. Par exemple /home/alfa/share1, /home/alfa/share2, /home/alfa/share3 doivent pointer sur les points de montage /opt/share[1-3] correspondants.

Ilspeuvent lire le contenu du dossier et ajouter ou modifier des fichiers.

Il est demandé de fixer le "sticky bit" et le “SGID” sur ce dossier en démontrant leur utilité.

Il est demandé d’automatiser l’ajout d’un utilisateur dans ce partage en vérifiant son existence préalables et en créant les liens symboliques uniquement si nécessaire.

Solution

Partage

groupadd omega
adduser -G omega alpha
adduser -G omega beta
passwd alph
passwd beta
ln -s /opt/share1 /home/alpha/share1
ln -s /opt/share2 /home/alpha/share2
ln -s /opt/share3 /home/alpha/share3
ln -s /opt/share1 /home/beta/share1
ln -s /opt/share2 /home/beta/share2
ln -s /opt/share3 /home/beta/share3
chown alpha:omega /opt/share1
chown alpha:omega /opt/share2
chown alpha:omega /opt/share3
chmod g+ws,+t,o-rx /opt/share1
chmod g+ws,+t,o-rx /opt/share2
chmod g+ws,+t,o-rx /opt/share3

Scripts d’ajout d’un utilisateur

script1.sh
#!/bin/bash -xv
user-add() {
        ret=false
        getent passwd $1 && ret=true
        if $ret; then
                echo "Vérification des liens symboliques"
                ln-verif $1
        else
                adduser -G omega $1
                ln-verif $1
        fi
}

ln-verif () {
        ls -d /home/$1/share1 2> /dev/null || ln -s /opt/share1 /home/$1/share1
        ls -d /home/$1/share2 2> /dev/null || ln -s /opt/share2 /home/$1/share2
        ls -d /home/$1/share3 2> /dev/null || ln -s /opt/share3 /home/$1/share3
}
user-add $1
script2.sh
#/bin/bash -xv
grep -q $1 /etc/passwd || adduser -G omega $1
for x in share1 share2 share3;do ls -d /home/$1/$x 2> /dev/null || ln -s /opt/$x /home/$1/$x; done

Cas 5 : Aller plus loin dans l’automation.

Dans ce scénario l’enjeu consiste à monter le dossier personnel "/home/lambda" des utilisateurs sur un LV personnel. Une solution est nécessaire pour migrer le compte des utilisateurs existants et automatiser la procédure.

On pourra évaluer la qualité de la solution sur base des tests d’exécution, de l’abstraction des cibles, de la logique de déploiement, la conformité aux pratiques d’infrastructure,.

Des fonctions comme :

  • gestion des erreurs,

  • de journalisation,

  • la gestion des quotas,

  • l’extension automatique des volumes,

  • les backups

  • l’archivage des volumes périmés.

ISO9960

Chiffrement des disques et des fichiers

Sauvegarde

Archivage et compression

  • Outils étudiés :
    • gzip/gunzip,
    • bzip2/bunzip2,
    • tar, c
    • pio/pax,
    • zip
  • Définitions
  • Compression gzip/gunzip
  • Compression bzip2/bunzip2
  • Commande tar
  • Commande cpio

  • Création de quelques fichiers à la volée :

    $ for i in 0 1 2 3 4 5 6 7 8 9; do echo "fichier$i" > fichier$i; done
    
  • de manière plus élégante :

    $ for ((i=0;i<10;i=i+1)); do echo "fichier$i" > fichier$i; done
    

Définitions

  • Compression : Réduire la taille d’un fichier par algorithme de compression.
  • Archivage : Placer un ensemble de fichiers et/ou de dossiers dans un seul fichier.
  • Compression sans archivage : gzip/gunzip, bzip2/bunzip2
  • Archivage avec ou sans compression : tar, star

Compression gzip/gunzip

  • gzip est basé sur l'algorithme Deflate (combinaison des algorithmes LZ77 et Huffman). C'est la méthode de compression la plus populaire sous GNU/Linux.
  • Compresser un fichier (le fichier est remplacé par son format compressé) :
    $ gzip mon_fichier
    $ ls -lh
    
  • Décompresser un fichier gzippé :
    $ gunzip mon_fichier_compresse.gz
    ls -lah
    
  • ou
    $ gzip -d mon_fichier_compresse.gz
    
  • Compresser un fichier de façon optimisée :
    $ gzip -9 mon_fichier
    
  • Compresser plusieurs fichiers en un :
    $ gzip -c mon_fichier1 mon_fichier2 > mon_fichier_compresse.gz
    

Compression bzip2

  • bzip2 est une alternative à gzip, plus efficace mais moins rapide.
  • Compresser un fichier :
    $ bzip2 mon_fichier
    
  • Décompresser un fichier bzippé :
    $ bunzip2 mon_fichier_compresse.bz2
    

Commande tar

  • Tar (« tape archiver », en français « archiveur pour bande », son rôle à l'origine) est le programme d'archivage de fichiers le plus populaire sous GNU/Linux et les systèmes Unix. Il est généralement installé par défaut. On peut ajouter à une archive tar différents algorithmes de compression. On notera également que tar préserve les permissions et les propriétaires des fichiers, ainsi que les liens symboliques.
  • Les programmes cpio et pax peuvent aussi créer des archives en utilisant des redirections (< | >).
  • star fonctionne de la manière que taren supportant les ACLs.

tar : archivage sans compression

  • Pour archiver plusieurs fichiers ou un dossier, la commande est la même :
    $ tar cvf mon_archive.tar fichier1 fichier2
    $ tar cvf mon_archive.tar dossier1/
    
  • Pour extraire une archive tar, tapez :
    $ tar xvf mon_archive.tar
    
  • Les principales options de tar sont les suivantes et peuvent se combiner à souhait :
    • c / x : construit / extrait l'archive ;
    • v : mode bavard ;
    • f : utilise le fichier donné en paramètre.

tar : archivage avec compression

  • Tar peut archiver en utilisant des algorithmes de compression, afin d'avoir des archives moins volumineuses. Par habitude, on suffixe les archives avec un . suivi d'une extension de compression.
  • Il suffit pour cela d'ajouter à la commande tar une option de compression :
    • z : compression Gunzip
    • j : compression Bzip2
  • Pour archiver et compresser un dossier avec Gunzip, tapez :
    $ tar cvzf mon_archive.tar.gz dossier1/
    
  • Pour extraire une archive tar.gz, tapez :
    $ tar xvzf mon_archive.tar.gz
    
  • De même pour Bzip2 :
    $ tar cvjf mon_archive.tar.bz2 dossier1/
    $ tar xvjf mon_archive.tar.bz2
    

star

Le logiciel star est l'équivalent de tar avec le support des ACLs.

# yum -y install star

Si l'option -aclest choisie les ACLs sont sauvegardées en mode création et restaurées en mode extraction.

zip

  • ZIP est un vieux format d'archive, mais aussi celui d'une commande pour créer ce type d'archive.

  • On utilise alors les commandes zipet unzip.

Création ZIP

$ zip votre_archive.zip [liste des fichiers]
$ zip -r votre_archive.zip [dossier]
  • Afin de compresser plusieurs sous-dossiers séparément (bash) :
    $ for f in *; do zip "$f.zip" "$f"/*; done
    
  • zip -e votre_archive.zip [liste des fichiers] chiffre le zip et demande un mot de passe.

Extraction unzip

unzip votre_archive.zip -d mon_repertoire
  • Extraction de plusieurs .zip d'un même dossier :
    $ for f in *.zip;do unzip "$f";done
    

Archives zip découpées

  • Quelques fois les archives zip sont découpées comme suit : archive.z01, archive.z02, …, archive.zip
  • Il faut rassembler les fichiers dans une seule archive, puis extraire cette dernière :
    $ cat archive.z* > archive_globale.zip 
    $ unzip archive_globale.zip
    

Autres logiciels

...

Montage NFS

Montage CIFS

iSCSI

results matching ""

    No results matching ""