ZFS : Le FileSystem par excellence
Contents
- 1 Introduction
- 2 Localiser ses disques
- 3 Zpool
- 4 ZFS
- 5 Gestion de la Swap sur ZFS
- 6 Utilisation avancée
- 7 FAQ
- 8 Ressources
1 Introduction
ZFS pour Z File System, est un système de fichier open source sous licence CDDL. Le 'Z' ne signifie rien de particulier officiellement mais est connu dans la presse sous différents noms tel Zettabyte de l'unité anglaise zettabyte (zettaoctet en français) concernant le stockage de données informatiques, mais aussi ZFS pour le dernier mot dans les systèmes de fichiers (the last word in filesystems)[1].
Produit par Sun Microsystems pour Solaris 10 et supérieur, il a été conçu par l'équipe de Jeff Bonwick. Annoncé pour septembre 2004, il a été intégré à Solaris le 31 octobre 2005 et le 16 novembre 2005 en tant que feature du build 27 d'OpenSolaris. Sun a annoncé que ZFS était intégré dans la mise à jour de Solaris datée de juin 2006, soit un an après l'ouverture de la communauté OpenSolaris.
Les caractéristiques de ce système de fichier sont sa très haute capacité de stockage, l'intégration de tous les concepts précédents concernant les systèmes de fichiers et la gestion de volume en un seul produit. Il intègre la structure On-Disk, il est léger et permet facilement la mise en place d'une plate-forme de gestion de stockage.
2 Localiser ses disques
Utilisez vos outils habituels pour connaitre vos disques. Par exemple sous Solaris :
3 Zpool
Un Zpool c'est comme un VG (Volume Group) pour ceux qui ont fait du LVM. Le problème c'est qu'a l'heure ou j'écris l'article, on ne peut réduire la taille d'un zpool, parcontre on peut l'agrandir. On peut utiliser directement un zpool en tant que Filesystem car de base il est en ZFS. Cependant, on peut créer des filesystems ZFS (ça s'appelle comme ça, je sais c'est con, mais voyez plutôt ça comme un LV (Logical Volume) ou partition). On peut également créer d'autres filesystems contenant d'autres types de filesystem (NTFS, EXT4, REIZERFS...).
3.1 Création d'un zpool
Pour créer un zpool, voici la démarche a suivre :
zpool |
zpool create zpool_name c0t600A0B80005A2CAA000004104947F51Ed0 |
- zpool_name : mettez le nom qui vous intéresse pour le zpool
- c0t600A0B80005A2CAA000004104947F51Ed0 : c'est le nom du device affiché par la commande format
3.2 Lister les zpool
3.2.1 Simple Zpool
Pour connaitre quels sont les pools existants sur la machine :
zpool |
zpool list |
3.2.2 Raid-Z
Un Raid-Z est comme un Raid 5, mais avec un gros problèmes en moins : pas de resyncro des parités ou de pertes lors d'une coupure de courant. Voici comment faire :
zpool |
zpool create my_raidz raidz c1t0d0 c2t0d0 c3t0d0 c4t0d0 /dev/dsk/c5t0d0 |
3.3 Monter un zpool
Par défaut, les zpool ont comme point de montage /zpool_name. Pour monter un zpool, nous allons utiliser la commande zfs :
zfs |
zfs mount zpool_name |
Il va se rappeller ou il doit se monter, car ce genre d'informations est stocké dans le filesystem.
3.4 Démonter un zpool
Là, c'est super simple, comme d'habitude j'ai envie de dire :
umount |
umount /zpool_name |
Il suffit de faire umount suivit du point e montage
3.5 Suppression d'un zpool
Pour supprimer un zpool :
zpool |
zpool destroy zpool_name |
3.6 Agrandir un zpool
Pour agrandir un zpool, nous utiliserons lenom du zpool, ainsi que le device supplémentaire :
zpool |
zpool add zpool_name device1 device2... |
3.7 Modifier les paramètres du zpool
3.7.1 Modifier le point de montage d'un zpool
Par défaut, les zpool se montent dans /, pour changer ceci :
zfs |
zfs set mountpoint=/mnt/datas my_zpool |
- /mnt/datas : le point de montage souhaité
- my_zpool : nom du zpool
3.8 Importer tous les zpool
Pour importer tous les zpools :
zpool |
zpool import -f -a |
- -f : forcer (facultatif et peut être dangereux dans certains cas)
- -a : va importer tous les zpools
3.9 Renommer un zpool
Renommer un zpool n'est en fait pas très compliquer :
zpool |
zpool export mon_zpool zpool import mon_zpool mon_nouveau_nom_de_zpool |
Et voilà, le zpool est renommer :-).
3.10 Utilisation dans un environnement cluster
En environnement cluster, vous aurez besoin de monter et démonter des zpools assez régulièrement. Si vous utiliser Sun Cluster (à l'heure ou j'écris ceci en version 3.2), on est obliger d'utiliser les zpool pour les montages des partitions. Les filesystems ne peuvent etre montés et démontés d'un noeud a l'autre lorsqu'ils appartiennent au même zpool.
Il va donc falloir démonter le zpool, exporter les infos dans le ZFS, puis l'importer sur l'autre noeud. Imaginons le scénario suivant :
- sun-node1 (noeud 1)
- sun-node2 (noeud 2)
- 1 baie de disque avec 1 LUN de 10 Go
Le LUN est un zpool créer comme décrit plus haut dans cette doc sur sun-node1. Il va donc maintenant falloir basculer ce zpool sur sun-node2. Sachant que ZFS n'est pas un filesystem cluster, nous devons le démonter, exporter les infos, puis l'importer. Le démontage n'est pas obligatoire puisque c'est l'export qui va le faire, mais si on souhaites faire les choses proprement, alors allons y sur sun-node1 :
umount /zpool_name export zpool_name |
Maintenant, listez les zpools disponible, on ne devrait plus le voir. Passons sur sun-node2
zpool |
zpool import zpool_name |
Voilà, vous retrouvez vos fichiers, normalement c'est automatiquement monté, mais si des fois ça n'était pas le cas vous pouvez le faire à la main (voir plus haut).
4 ZFS
4.1 Créer une partition ZFS
Pour créer une partition ZFS, c'est extrêmement simple ! Vous avez évidemment votre Zpool qui est créer, puis vous exécutez :
zfs |
zfs create zpool/partition |
Ensuite vous pouvez spécifier des options avec -o et voir toutes les options disponibles avec un :
zfs |
zfs get all zpool/partition |
4.2 Renommer une partition
Pour renommer une partition ZFS. Si vous souhaitez renommer une partition ZFS, rien de plus simple :
zfs |
zfs rename zpool/partitionold zpool/partitionnew |
5 Gestion de la Swap sur ZFS
Sur solaris, on peut se servir de plusieurs espace de swap combinés (Partitions + fichier indiferement).
pour lister les espace de swap utilisés :
swap |
> swap -l swapfile dev swaplo blocks free /dev/zvol/dsk/rpool/swap1 181,3 8 4194296 4194296 /dev/zvol/dsk/rpool/swap 181,2 8 62914552 62914552 |
pour en savoir un peu plus on peut également utiliser :
swap |
> swap -s total: 283264k bytes allocated + 258412k reserved = 541676k used, 31076108k available |
Ici nous avons deux volumes ZFS qui servent de swap. par defaut lors de la création d'un ZPOOL, un espace de swap est créé "rpool/swap".
5.1 Ajouter de la SWAP
Il suffit d'agrandir la taille du ZFS associé a la swap.
5.1.1 Ajouter une swap
Verifions le nombre de swap attribuées :
swap |
> swap -l swapfile dev swaplo blocks free /dev/dsk/c1t0d0s1 30,65 8 8401984 8401984 |
Maintenant on ajoute un ZFS :
swap |
zfs create -V 30G rpool/swap1 |
Ici nous venons de créer la swap a 30G. Puis nous déclarons cette nouvelle partition comme swap :
swap |
swap -a /dev/zvol/dsk/rpool/swap1 |
Maintenant, lorsque j'affiche la liste des partitions actives, je peux voir la nouvelle :
swap |
> swap -l swapfile dev swaplo blocks free /dev/dsk/c1t0d0s1 30,65 8 8401984 8401984 /dev/dsk/c1t0d0s5 30,69 8 146801960 146801960 |
Si vous avez ce genre de message :
/dev/zvol/dsk/rpool/swap is in use for live upgrade -. Please see ludelete(1M).
Il faudra utiliser la commande suivante pour l'activer :
swapadd |
/sbin/swapadd |
5.1.2 Agrandir une swap
Lorsque la machine tourne et que l'espace de swap est utilisé, on peut agrandir la taille de la swap pour que le système puisse s'en servir. Cela nécessitera une désactivation puis réactivation pour que le nouvel espace soit prise en compte. Pour cela nous allons agrandir le zfs :
zfs |
zfs set volsize=72G rpool/swap zfs set refreservation=72G rpool/swap |
Nous allons maintenant désactiver la swap :
zfs |
swap -d /dev/zvol/dsk/rpool/swap |
Il faut maintenant supprimer ou commenter l'entrée dans /etc/vfstab qui correspond à la swap, car elle sera automatiquement créer dans l'étape suivante :
/etc/vfstab |
#/dev/zvol/dsk/rpool/swap - - swap - no - |
puis la réactiver pour que la nouvelle taille soit prise en compte :
swap |
swap -a /dev/zvol/dsk/rpool/swap |
On peut vérifier la taille du swap :
swap |
> swap -l swapfile dev swaplo blocs libres /dev/zvol/dsk/rpool/swap 181,1 8 150994936 150994936 |
6 Utilisation avancée
6.1 Le cache ARC ZFS
Le problème de ZFS est qu'il est très gourmand en RAM (environ 1/8 de la total + swap). Ce qui peut s'avérer vite gênant sur des machines ayant beaucoup de RAM. voici donc un peu d'explication.
6.1.1 Mémoire disponible mdb -k et le cache I/O ZFS ARC
La commande mdb -k avec l'option ::memstat permet d'avoir une vision globale de la mémoire disponible sur une machine Solaris
Dans l'exemple ci-dessus, il s'agit d'une machine disposant de 32 Gb de mémoire physique.
ZFS utilise un cache noyau (cache kernel) appelé ARC pour les I/Os. Pour connaître la taille du cache I/O à un instant t utilisée par ZFS, utiliser l'option kmastat avec la commande mdb -k et repérer la statistique Total [zio_buf] :
Dans l'exemple ci-dessus, le cache I/O ZFS utilise 1,1 G en mémoire
6.1.2 Limitation du cache ARC zfs (zfs_arc_max et zfs_arc_min)
Pour les machines disposant d'une quantité de mémoire très importante, il est préférable de limiter le cache I/O ZFS pour éviter tout débordement de mémoire sur les autres applications. Dans la pratique ce cache augmente et diminue dynamiquement en fonction des besoins des applications installées sur la machine, mais il est préférable de le limiter pour prévenir tout risque. Le paramètre zfs_arc_max (en bytes) dans le fichier /etc/system permet de limiter la quantité de mémoire au cache I/O ZFS. Ci-dessous un exemple ou le cache I/O ZFS est limité à 4Gb :
/etc/system |
... set zfs:zfs_arc_max = 4294967296 ... |
6.1.3 Statistiques sur le cache ARC ZFS (kstat zfs)
De même il est possible de spécifier la quantité de mémoire minimale à allouer au cache I/O ZFS avec le paramètre zfs_arc_min dans le fichier /etc/system.
La commande kstat avec l'option zfs donne des statistiques détaillées sur le cache ZFS ARC (hits, misses, taille etc...) à un instant t : on retrouve la valeur maximale possible (c_max) pour ce cache, la taille courante (size) dans la sortie de cette commande. Dans l'exemple ci-dessous, le paramètre zfs_arc_max n'a pas encore été appliqué, ce qui explique que la taille maximale possible correspond à la mémoire physique de la machine.
Je vous conseille également le très bon arc_summary qui permet d'obtenir des informations très précise ou encore arcstat.
6.2 Ne pas monter tous les Zpool au boot
Si vous rencontrez des erreurs au boot de votre machine, lors du montage des Zpool (pour mon cas, un reboot en continue de la machine), il y a une solution qui permet de lui faire oublier tous ceux qui étaient importés durant la dernière session (ZFS se rappel des zpool importés et les réimporte automatiquement lors d'un boot, ce qui est pratique mais peut être contraignant dans certains cas).
Pour ce faire, il va falloir booter en mode single user ou multi user (si ça ne fonctionne pas, essayer le mode failsafe pour Solaris (chrooté pour Linux)), puis nous allons enlever le cache ZFS :
mv |
mv /etc/zfs/zpool.cache /etc/zfs/zpool.cache.`date "+%Y-%m-%d"` |
Si votre OS est installé sur du ZFS, que vous êtes en mode failsafe, il va falloir repopuler le cache (le /a correspond sous Solaris au root) :
cd / bootadm update-archive -R /a umount /a |
Ensuite on reboot et on réimporte les Zpool souhaités.
7 FAQ
7.1 FAULTED
Je me suis tapé un petit FAULTED comme on peut le voir plus bas sans trop savoir pourquoi :
zpool |
bash-3.00# zpool list NAME SIZE USED AVAIL CAP HEALTH ALTROOT test1 - - - - FAULTED - |
Et là il faut un peu débugger. Pour ça on utilise la commande suivante :
zpool |
bash-3.00# zpool status -x pool: test1 state: UNAVAIL status: One or more devices could not be opened. There are insufficient replicas for the pool to continue functioning. action: Attach the missing device and online it using 'zpool online'. see: http://www.sun.com/msg/ZFS-8000-3C scrub: none requested config: NAME STATE READ WRITE CKSUM test1 UNAVAIL 0 0 0 insufficient replicas c4t600A0B800048A9B6000005B84A8293C9d0 UNAVAIL 0 0 0 cannot open |
Là c'est pas forcément bon signe hein ! Les messages d'erreur font flipper. Pourtant la solution est simple, il s'uffit d'exporte puis de réimporter (en forçant si nécessaire) les zpools défectueux.
Ensuite, on peut vérifier l'état de son filesystem via un scrub :
zpool |
zpool scrub test1 zpool status |
7.2 How to repair grub after zpool upgrade
It appears that zpool upgrade can break grub bootloader.
To fix this, we need to reinstall grub on the partition. proceed as follow :
- Unplug all fibre cable from the server (or other disks than the OS)
- Boot on Solaris 10 Install DVD
- On boot Select option 6 : "Start Single User Shell"
- It will scan for existing zpool containing os installation then ask you if you want to mount your rpool to /a. answer "yes"
- When you get the prompt, launch this to check the status of the rpool :
zpool |
> zpool status rpool pool: rpool state: ONLINE scrub: none requested config: NAME STATE READ WRITE CKSUM rpool ONLINE 0 0 0 c3t0d0s0 ONLINE 0 0 0 errors: No known data errors |
- This way we can see all the disks involved in the zpool (here c3t0d0s0). We will reinstall grub on all the disk in the zpool with this command :
- Umount the zpool
zpool |
zpool export rpool |
- Plug back the fibre cables
- Reboot
init |
init 6 |
That's it !
8 Ressources
http://fr.wikipedia.org/wiki/ZFS
Documentation ZFS Admin
http://jean-francois.im/2008/04/faulted-argh.html
http://www.sqlpac.com/referentiel/docs/unix-solaris-10-zfs-oracle.htm#L6480