ZFS, la forme abrégée de Zettabyte Filesystem est un système de fichiers avancé et hautement évolutif. Il a été initialement développé par Sun Microsystems et fait maintenant partie du projet OpenZFS. Avec autant de systèmes de fichiers disponibles sur Linux, il est tout à fait naturel de se demander quelle est la particularité de ZFS. Contrairement à d'autres systèmes de fichiers, il ne s'agit pas seulement d'un système de fichiers, mais également d'un gestionnaire de volumes logiques. Certaines des fonctionnalités de ZFS qui le rendent populaire sont :
- Intégrité des données :la cohérence et l'intégrité des données sont assurées par des techniques de copie sur écriture et de somme de contrôle
- Mise en commun de l'espace de stockage :les disques de stockage disponibles peuvent être regroupés dans un seul pool appelé zpool
- RAID logiciel :la configuration d'une baie raidz est aussi simple que d'émettre une seule commande.
- Gestionnaire de volume intégré :ZFS agit également en tant que gestionnaire de volume.
- Instantanés, clones, compression :voici quelques-unes des fonctionnalités avancées fournies par ZFS.
ZFS est un système de fichiers 128 bits et a la capacité de stocker 256 zetta octets ! Dans ce guide, nous apprendrons comment installer, configurer et également utiliser certaines commandes ZFS importantes sur un serveur CentOS 7.
REMARQUE :La partie installation est spécifique au serveur CentOS alors que les commandes sont communes à tous les systèmes Linux
Terminologie
Avant de poursuivre, comprenons quelques-unes des terminologies couramment utilisées dans ZFS.
Piscine
Regroupement logique des disques de stockage. C'est le bloc de construction de base de ZFS et c'est à partir de là que l'espace de stockage est alloué aux ensembles de données.
Ensembles de données
Les composants du système de fichiers ZFS, à savoir le système de fichiers, les clones, les instantanés et les volumes, sont appelés ensembles de données.
Miroir
Périphérique virtuel stockant des copies de données identiques sur deux disques ou plus. Dans les situations où un disque tombe en panne, les mêmes données sont disponibles sur d'autres disques de ce miroir.
Réargenture
Processus de copie de données d'un disque à un autre en cas de restauration d'un appareil.
Frotter
Scrub est utilisé pour la vérification de la cohérence dans ZFS comme la façon dont fsck est utilisé dans d'autres systèmes de fichiers
Installer ZFS
Pour installer ZFS sur CentOS, nous devons d'abord configurer le référentiel EPEL pour les packages de prise en charge, puis le référentiel ZFS pour installer les packages ZFS requis.
Remarque :Veuillez préfixer sudo à toutes les commandes si vous n'êtes pas l'utilisateur root.
yum localinstall --nogpgcheck http://epel.mirror.net.in/epel/7/x86_64/e/epel-release-7-5.noarch.rpm
yum localinstall --nogpgcheck http://archive.zfsonlinux.org/epel/zfs-release.el7.noarch.rpm
Installez maintenant les packages de développement du noyau et zfs. Les packages de développement du noyau sont nécessaires car ZFS est construit en tant que module et inséré dans le noyau.
yum install kernel-devel zfs
Vérifiez si le module zfs est inséré dans le noyau à l'aide de la commande 'lsmod' et si ce n'est pas le cas, insérez-le manuellement à l'aide de la commande 'modprobe'.
[root@li1467-130 ~]# lsmod |grep zfs
[root@li1467-130 ~]# modprobe zfs
[root@li1467-130 ~]# lsmod |grep zfs
zfs 2790271 0
zunicode 331170 1 zfs
zavl 15236 1 zfs
zcommon 55411 1 zfs
znvpair 89086 2 zfs,zcommon
spl 92029 3 zfs,zcommon,znvpair
Vérifions si nous sommes capables d'utiliser les commandes zfs :
[root@li1467-130 ~]# zfs list
no datasets available
Administration
ZFS a deux utilitaires principaux, zpool et zfs. Alors que zpool s'occupe de la création et de la maintenance des pools à l'aide de disques, l'utilitaire zfs est responsable de la création et de la maintenance des ensembles de données.
utilitaire zpool
Créer et détruire des pools
Vérifiez d'abord les disques disponibles pour créer un pool de stockage.
[root@li1467-130 ~]# ls -l /dev/sd*
brw-rw---- 1 root disk 8, 0 Mar 16 08:12 /dev/sda
brw-rw---- 1 root disk 8, 16 Mar 16 08:12 /dev/sdb
brw-rw---- 1 root disk 8, 32 Mar 16 08:12 /dev/sdc
brw-rw---- 1 root disk 8, 48 Mar 16 08:12 /dev/sdd
brw-rw---- 1 root disk 8, 64 Mar 16 08:12 /dev/sde
brw-rw---- 1 root disk 8, 80 Mar 16 08:12 /dev/sdf
Créez un pool à partir d'un ensemble de lecteurs.
zpool create <option> <pool name. <drive 1> <drive 2> .... <drive n>
[root@li1467-130 ~]# zpool create -f zfspool sdc sdd sde sdf
La commande 'zpool status' affiche l'état des pools disponibles
[root@li1467-130 ~]# zpool status
pool: zfspool
state: ONLINE
scan: none requested
config:
NAME STATE READ WRITE CKSUM
zfspool ONLINE 0 0 0
sdc ONLINE 0 0 0
sdd ONLINE 0 0 0
sde ONLINE 0 0 0
sdf ONLINE 0 0 0
errors: No known data errors
Vérifiez si la création du pool a réussi.
[root@li1467-130 ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda 19G 1.4G 17G 8% /
devtmpfs 488M 0 488M 0% /dev
tmpfs 497M 0 497M 0% /dev/shm
tmpfs 497M 50M 447M 11% /run
tmpfs 497M 0 497M 0% /sys/fs/cgroup
tmpfs 100M 0 100M 0% /run/user/0
zfspool 3.7G 0 3.7G 0% /zfspool
Comme vous pouvez le voir, zpool a créé un pool nommé 'zfspool' d'une taille de 3,7 Go et l'a également monté dans /zfspool.
Pour détruire un pool, utilisez la commande 'zpool destroy'
zpool destroy <pool name>
[root@li1467-130 ~]# zpool destroy zfspool
[root@li1467-130 ~]# zpool status
no pools available
Essayons maintenant de créer un simple pool de miroirs.
zpool create <option> <pool name> mirror <drive 1> <drive 2>... <drive n>
Nous pouvons également créer plusieurs miroirs en même temps en répétant le mot-clé miroir suivi des lecteurs.
[root@li1467-130 ~]# zpool create -f mpool mirror sdc sdd mirror sde sdf
[root@li1467-130 ~]# zpool status
pool: mpool
state: ONLINE
scan: none requested
config:
NAME STATE READ WRITE CKSUM
mpool ONLINE 0 0 0
mirror-0 ONLINE 0 0 0
sdc ONLINE 0 0 0
sdd ONLINE 0 0 0
mirror-1 ONLINE 0 0 0
sde ONLINE 0 0 0
sdf ONLINE 0 0 0
errors: No known data errors
Dans l'exemple ci-dessus, nous avons créé des pools de miroirs chacun avec deux disques.
De même, nous pouvons créer un pool raidz.
[root@li1467-130 ~]# zpool create -f rpool raidz sdc sdd sde sdf
[root@li1467-130 ~]# zpool status
pool: rpool
state: ONLINE
scan: none requested
config:
NAME STATE READ WRITE CKSUM
rpool ONLINE 0 0 0
raidz1-0 ONLINE 0 0 0
sdc ONLINE 0 0 0
sdd ONLINE 0 0 0
sde ONLINE 0 0 0
sdf ONLINE 0 0 0
errors: No known data errors
Gestion des appareils dans les pools ZFS
Une fois qu'un pool est créé, il est possible d'ajouter ou de supprimer des disques de secours et des périphériques de cache du pool, d'attacher ou de détacher des périphériques des pools en miroir et de remplacer des périphériques. Mais les périphériques non redondants et raidz ne peuvent pas être supprimés d'un pool. Nous verrons comment effectuer certaines de ces opérations dans cette section.
Je crée d'abord un pool appelé "testpool" composé de deux appareils, sdc et sdd. Un autre appareil sde sera alors ajouté à celui-ci.
[root@li1467-130 ~]# zpool create -f testpool sdc sdd
[root@li1467-130 ~]# zpool add testpool sde
[root@li1467-130 ~]# zpool status
pool: testpool
state: ONLINE
scan: none requested
config:
NAME STATE READ WRITE CKSUM
testpool ONLINE 0 0 0
sdc ONLINE 0 0 0
sdd ONLINE 0 0 0
sde ONLINE 0 0 0
errors: No known data errors
Comme mentionné précédemment, je ne peux pas supprimer ce périphérique nouvellement ajouté car il ne s'agit pas d'un pool redondant ou raidz.
[root@li1467-130 ~]# zpool remove testpool sde
cannot remove sde: only inactive hot spares, cache, top-level, or log devices can be removed
Mais je peux ajouter un disque de secours à ce pool et le supprimer.
[root@li1467-130 ~]# zpool add testpool spare sdf
[root@li1467-130 ~]# zpool status
pool: testpool
state: ONLINE
scan: none requested
config:
NAME STATE READ WRITE CKSUM
testpool ONLINE 0 0 0
sdc ONLINE 0 0 0
sdd ONLINE 0 0 0
sde ONLINE 0 0 0
spares
sdf AVAIL
errors: No known data errors
[root@li1467-130 ~]# zpool remove testpool sdf
[root@li1467-130 ~]# zpool status
pool: testpool
state: ONLINE
scan: none requested
config:
NAME STATE READ WRITE CKSUM
testpool ONLINE 0 0 0
sdc ONLINE 0 0 0
sdd ONLINE 0 0 0
sde ONLINE 0 0 0
errors: No known data errors
De même, nous pouvons utiliser la commande attach pour attacher des disques à un pool en miroir ou non et la commande detach pour détacher des disques d'un pool en miroir.
zpool attach <options> <pool name> <device> <new device>
zpool detach <pool name> <device>
Lorsqu'un appareil tombe en panne ou est corrompu, nous pouvons le remplacer à l'aide de la commande "remplacer".
zpool replace <options> <pool name> <device> <new device>
Nous allons tester cela en corrompant de force un appareil dans une configuration en miroir.
[root@li1467-130 ~]# zpool create -f testpool mirror sdd sde
Cela crée un pool miroir composé de disques sdd et sde. Maintenant, corrompons délibérément le lecteur sdd en y écrivant des zéros.
[root@li1467-130 ~]# dd if=/dev/zero of=/dev/sdd
dd: writing to ‘/dev/sdd’: No space left on device
2048001+0 records in
2048000+0 records out
1048576000 bytes (1.0 GB) copied, 22.4804 s, 46.6 MB/s
Nous utiliserons la commande 'scrub' pour détecter cette corruption.
[root@li1467-130 ~]# zpool scrub testpool
[root@li1467-130 ~]# zpool status
pool: testpool
state: ONLINE
status: One or more devices could not be used because the label is missing or
invalid. Sufficient replicas exist for the pool to continue
functioning in a degraded state.
action: Replace the device using 'zpool replace'.
see: http://zfsonlinux.org/msg/ZFS-8000-4J
scan: scrub repaired 0 in 0h0m with 0 errors on Fri Mar 18 09:59:40 2016
config:
NAME STATE READ WRITE CKSUM
testpool ONLINE 0 0 0
mirror-0 ONLINE 0 0 0
sdd UNAVAIL 0 0 0 corrupted data
sde ONLINE 0 0 0
errors: No known data errors
Nous allons maintenant remplacer sdd par sdc.
[root@li1467-130 ~]# zpool replace testpool sdd sdc; zpool status
pool: testpool
state: ONLINE
scan: resilvered 83.5K in 0h0m with 0 errors on Fri Mar 18 10:05:17 2016
config:
NAME STATE READ WRITE CKSUM
testpool ONLINE 0 0 0
mirror-0 ONLINE 0 0 0
replacing-0 UNAVAIL 0 0 0
sdd UNAVAIL 0 0 0 corrupted data
sdc ONLINE 0 0 0
sde ONLINE 0 0 0
errors: No known data errors
[root@li1467-130 ~]# zpool status
pool: testpool
state: ONLINE
scan: resilvered 74.5K in 0h0m with 0 errors on Fri Mar 18 10:00:36 2016
config:
NAME STATE READ WRITE CKSUM
testpool ONLINE 0 0 0
mirror-0 ONLINE 0 0 0
sdc ONLINE 0 0 0
sde ONLINE 0 0 0
errors: No known data errors
Migration des pools
Nous pouvons migrer des pools de stockage entre différents hôtes à l'aide des commandes d'exportation et d'importation. Pour cela, les disques utilisés dans le pool doivent être disponibles sur les deux systèmes.
[root@li1467-130 ~]# zpool export testpool
[root@li1467-130 ~]# zpool status
no pools available
La commande 'zpool import' répertorie tous les pools disponibles pour l'importation. Exécutez cette commande à partir du système sur lequel vous souhaitez importer le pool.
[root@li1467-131 ~]# zpool import
pool: testpool
id: 3823664125009563520
state: ONLINE
action: The pool can be imported using its name or numeric identifier.
config:
testpool ONLINE
sdc ONLINE
sdd ONLINE
sde ONLINE
Importez maintenant le pool requis
[root@li1467-131 ~]# zpool import testpool
[root@li1467-131 ~]# zpool status
pool: testpool
state: ONLINE
scan: none requested
config:
NAME STATE READ WRITE CKSUM
testpool ONLINE 0 0 0
sdc ONLINE 0 0 0
sdd ONLINE 0 0 0
sde ONLINE 0 0 0
errors: No known data errors
iostat
On peut vérifier les statistiques io des périphériques du pool à l'aide de la commande iostat.
[root@li1467-130 ~]# zpool iostat -v testpool
capacity operations bandwidth
pool alloc free read write read write
---------- ----- ----- ----- ----- ----- -----
testpool 1.80M 2.86G 22 27 470K 417K
sdc 598K 975M 8 9 200K 139K
sdd 636K 975M 7 9 135K 139K
sde 610K 975M 6 9 135K 139K
---------- ----- ----- ----- ----- ----- -----
utilitaire zfs
Nous allons maintenant passer à l'utilitaire zfs. Ici, nous verrons comment créer, détruire des ensembles de données, la compression du système de fichiers, les quotas et les instantanés.
Créer et détruire un système de fichiers
Le système de fichiers ZFS peut être créé à l'aide de la commande zfs create
zfs create <filesystem>
[root@li1467-130 ~]# zfs create testpool/students
[root@li1467-130 ~]# zfs create testpool/professors
[root@li1467-130 ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda 19G 1.4G 17G 8% /
devtmpfs 488M 0 488M 0% /dev
tmpfs 497M 0 497M 0% /dev/shm
tmpfs 497M 50M 447M 11% /run
tmpfs 497M 0 497M 0% /sys/fs/cgroup
testpool 2.8G 0 2.8G 0% /testpool
tmpfs 100M 0 100M 0% /run/user/0
testpool/students 2.8G 0 2.8G 0% /testpool/students
testpool/professors 2.8G 0 2.8G 0% /testpool/professors
À partir de la sortie ci-dessus, observez que bien qu'il n'y ait pas de point de montage donné au moment de la création du système de fichiers, le point de montage est créé en utilisant la même relation de chemin que celle du pool.
zfs create permet d'utiliser -o avec lequel nous pouvons spécifier des options telles que point de montage, compression, quota, exec, etc.
On peut lister le système de fichiers disponible en utilisant la liste zfs :
[root@li1467-130 ~]# zfs list
NAME USED AVAIL REFER MOUNTPOINT
testpool 100M 2.67G 19K /testpool
testpool/professors 31K 1024M 20.5K /testpool/professors
testpool/students 1.57M 98.4M 1.57M /testpool/students
Nous pouvons détruire un système de fichiers en utilisant l'option destroy
zfs destroy <filesystem>
Compression
Nous allons maintenant comprendre comment fonctionne la compression dans ZFS. Avant de commencer à utiliser la compression, nous devons l'activer en utilisant 'set compression'
zfs set <compression=value> <filesystem|volume|snapshot>
Une fois cela fait, la compression et la décompression se produisent sur le système de fichiers à la volée de manière transparente.
Dans notre exemple, j'activerai la compression sur le répertoire des étudiants à l'aide de l'algorithme de compression lz4.
[root@li1467-130 ~]# zfs set compression=lz4 testpool/students
Je vais maintenant copier un fichier de taille 15 Mo dans ce système de fichiers et vérifier la taille une fois qu'il est copié.
[root@li1467-130 /]# cd /var/log
[root@li1467-130 log]# du -h secure
15M secure
[root@li1467-130 ~]# cp /var/log/secure /testpool/students/
[root@li1467-130 students]# df -h .
Filesystem Size Used Avail Use% Mounted on
testpool/students 100M 1.7M 99M 2% /testpool/students
Notez que la taille utilisée dans le système de fichiers n'est que de 1,7 Mo alors que la taille du fichier était de 15 Mo. Nous pouvons également vérifier le taux de compression.
[root@li1467-130 ~]# zfs get compressratio testpool
NAME PROPERTY VALUE SOURCE
testpool compressratio 9.03x
-
Quotas et réservation
Permettez-moi d'expliquer les quotas avec un exemple concret. Supposons que nous ayons besoin dans une université de limiter l'espace disque utilisé par le système de fichiers pour les professeurs et les étudiants. Supposons que nous devions allouer 100 Mo aux étudiants et 1 Go aux professeurs. Nous pouvons utiliser des "quotas" dans ZFS pour répondre à cette exigence. Les quotas garantissent que la quantité d'espace disque utilisée par un système de fichiers ne dépasse pas les limites définies. La réservation permet d'allouer et de garantir que la quantité d'espace disque requise est disponible pour le système de fichiers.
zfs set quota=<value> <filesystem|volume|snapshot>
zfs set reservation=<value> <filesystem|volume|snapshot>
[root@li1467-130 ~]# zfs set quota=100M testpool/students
[root@li1467-130 ~]# zfs set reservation=100M testpool/students
[root@li1467-130 ~]# zfs list
NAME USED AVAIL REFER MOUNTPOINT
testpool 100M 2.67G 19K /testpool
testpool/professors 19K 2.67G 19K /testpool/professors
testpool/students 1.57M 98.4M 1.57M /testpool/students
[root@li1467-130 ~]# zfs set quota=1G testpool/professors
[root@li1467-130 ~]# zfs list
NAME USED AVAIL REFER MOUNTPOINT
testpool 100M 2.67G 19K /testpool
testpool/professors 19K 1024M 19K /testpool/professors
testpool/students 1.57M 98.4M 1.57M /testpool/students
Dans l'exemple ci-dessus, nous avons alloué 100 Mo aux étudiants et 1 Go aux professeurs. Observez la colonne 'AVAIL' dans 'zfs list'. Au départ, ils avaient une taille de 2,67 Go chacun et après avoir défini le quota, les valeurs ont changé en conséquence.
Instantanés
Les instantanés sont une copie en lecture seule du système de fichiers ZFS à un moment donné. Ils ne consomment pas d'espace supplémentaire dans le pool zfs. Nous pouvons soit revenir au même état ultérieurement, soit extraire un seul fichier ou un ensemble de fichiers selon les besoins de l'utilisateur.
Je vais maintenant créer des répertoires et un fichier sous '/testpool/professors' à partir de notre exemple précédent, puis prendre un instantané de ce système de fichiers.
[root@li1467-130 ~]# cd /testpool/professors/
[root@li1467-130 professors]# mkdir maths physics chemistry
[root@li1467-130 professors]# cat > qpaper.txt
Question paper for the year 2016-17
[root@li1467-130 professors]# ls -la
total 4
drwxr-xr-x 5 root root 6 Mar 19 10:34 .
drwxr-xr-x 4 root root 4 Mar 19 09:59 ..
drwxr-xr-x 2 root root 2 Mar 19 10:33 chemistry
drwxr-xr-x 2 root root 2 Mar 19 10:32 maths
drwxr-xr-x 2 root root 2 Mar 19 10:32 physics
-rw-r--r-- 1 root root 36 Mar 19 10:35 qpaper.txt
Pour prendre un instantané, utilisez la syntaxe suivante :
zfs snapshot <filesystem|volume@<snap>>
[root@li1467-130 professors]# zfs snapshot testpool/professors@03-2016
[root@li1467-130 professors]# zfs list -t snapshot
NAME USED AVAIL REFER MOUNTPOINT
testpool/professors@03-2016 0 - 20.5K -
Je vais maintenant supprimer le fichier qui a été créé et l'extraire des instantanés
[root@li1467-130 professors]# rm -rf qpaper.txt
[root@li1467-130 professors]# ls
chemistry maths physics
[root@li1467-130 professors]# cd .zfs
[root@li1467-130 .zfs]# cd snapshot/03-2016/
[root@li1467-130 03-2016]# ls
chemistry maths physics qpaper.txt
[root@li1467-130 03-2016]# cp -a qpaper.txt /testpool/professors/
[root@li1467-130 03-2016]# cd /testpool/professors/
[root@li1467-130 professors]# ls
chemistry maths physics qpaper.txt
Le fichier supprimé est de retour à sa place.
Nous pouvons répertorier tous les instantanés disponibles à l'aide de la liste zfs :
[root@li1467-130 ~]# zfs list -t snapshot
NAME USED AVAIL REFER MOUNTPOINT
testpool/professors@03-2016 10.5K - 20.5K -
Enfin, détruisons l'instantané à l'aide de la commande zfs destroy :
zfs destroy <filesystem|volume@<snap>>
[root@li1467-130 ~]# zfs destroy testpool/professors@03-2016
[root@li1467-130 ~]# zfs list -t snapshot
no datasets available
Conclusion
Dans cet article, vous avez appris à installer ZFS sur CentOS 7 et à utiliser certaines commandes de base et importantes des utilitaires zpool et zfs. Cette liste n'est pas exhaustive. ZFS a beaucoup plus de fonctionnalités et vous pouvez les explorer plus en détail à partir de sa page officielle.