Un cours (4 h) et un TP (3 h) sur les systèmes de fichiers et ZFS : le support de cours, le sujet des travaux pratiques et les machines virtuelles qui les accompagnent.

Ce navigateur n'affiche pas les PDF dans la page : ouvrir le support de cours (812 Kio).

Supports

Les supports de cours sont téléchargeables ci-dessous. Il est nécessaire de terminer la lecture du cours avant de démarrer le TP. Toutes les informations nécessaires à la réalisation du TP sont intégralement contenues dans le cours.

Les travaux pratiques se font dans une machine virtuelle FreeBSD, disponible aux formats QCOW2 (QEMU, Proxmox) et VMDK (VirtualBox, VMware) ; ses empreintes SHA-256 sont dans le fichier de sommes de contrôle.

L'image est un FreeBSD préconfiguré :

Au premier démarrage, la VM s'initialise (agrandissement du disque système, création des disques simulés) puis redémarre automatiquement une fois : ce double démarrage est normal, attendez la fin du second avant de vous connecter.

Démarrer la machine virtuelle

QEMU

# Accélération possible: -accel kvm|hvf
# Démarrage console    : -display none -serial mon:stdio

qemu-system-x86_64 -m 2048 -smp 2 \
  -drive file=zfs-lab-15.1-amd64.qcow2,format=qcow2,if=virtio \
  -netdev user,id=n0,hostfwd=tcp:127.0.0.1:2222-:22 \
  -device virtio-net,netdev=n0

VirtualBox

# Le .vmdk est distribué compressé (streamOptimized). Il faut d'abord le déployer.

VBoxManage clonemedium zfs-lab-15.1-amd64.vmdk zfs-lab.vmdk --format VMDK
VBoxManage createvm --name zfs-lab --ostype FreeBSD_64 --register
VBoxManage modifyvm zfs-lab --memory 2048 --cpus 2 --nic1 nat \
  --natpf1 "ssh,tcp,127.0.0.1,2222,,22"
VBoxManage storagectl zfs-lab --name SATA --add sata --controller IntelAhci
VBoxManage storageattach zfs-lab --storagectl SATA --port 0 --device 0 \
  --type hdd --medium zfs-lab.vmdk
VBoxManage startvm zfs-lab --type gui # ou --type headless

Proxmox

# En réseau ponté la VM obtient sa propre adresse: ssh root@<adresse de la VM>

vmid=900   # VMID : identifiant libre à choisir (voir : qm list)
qm create $vmid --name zfs-lab --memory 2048 --cores 2 \
  --net0 virtio,bridge=vmbr0 --scsihw virtio-scsi-pci
qm importdisk $vmid zfs-lab-15.1-amd64.qcow2 local-lvm
qm set $vmid --scsi0 local-lvm:vm-$vmid-disk-0 --boot order=scsi0
qm start $vmid

Historique

Historique de ZFS, de 2001 à 2025
Année Événement
2001 Début du projet par deux ingénieurs de Sun Microsystems
2005 Diffusion du code source dans OpenSolaris (licence CDDL)
2006 Début du portage sous Linux via FUSE
incompatibilité déclarée entre la licence CDDL et GPL
2007 Apple commence son portage sous Mac OS X
2007 NetApp attaque Sun pour violation de brevet (WAFL)
2008 ZFS est intégré à FreeBSD 7.0
2008 Début d'un portage natif sous Linux (ZFS-on-Linux)
2009 Rachat de Sun Microsystems par Oracle
2009 Apple arrête l'intégration de ZFS à OS X
le projet MacZFS continue à développer le code
2010 OpenSolaris est arrêté par Oracle
le développement de ZFS continue de façon fermée
2010 Illumos, un fork d'OpenSolaris, est créé par la communauté
le développement continue sous licence CDDL
les portages de ZFS se basent sur la version d'Illumos
2012 Introduction de feature-flags (fin des numéros de version)
facilite l'évolution du format sur-disque
2013 Prototype de ZFS pour Mac OS X, basé sur ZFS-on-Linux
MacZFS va progressivement céder la place
2013 Début du projet OpenZFS
coordonne le développement entre les plateformes
2016 Ubuntu 16.04 inclut par défaut ZFS-on-Linux
2019 Support du chiffrement
2019 FreeBSD rebase son code ZFS d'Illumos vers ZFS-on-Linux
2020 Base commune Linux/FreeBSD
OpenZFS 2.0
2020 zstd, L2ARC persistant
2021 dRAID
2023 Clonage de blocs, BLAKE3, réception corrective
2025 Extension raidz, fast dedup, E/S directes

Exemples

Revenir à un checkpoint

# Import the pool read-only until the checkpoint
zpool import -o readonly=on --rewind-to-checkpoint tank

# Rewind the pool to the checkpoint, destroying data
zpool import --rewind-to-checkpoint tank

Envoi incrémental et reprise après interruption

# Envoi d'un flux incrémental de @yesterday à @today, incluant
# les snapshots intermédiaires, sur la machine 'remote-host'
# En cas d'erreur de transmission les données sont conservées
zfs send -I @yesterday tank/data@today |
  ssh remote-host zfs recv -s pool/backup

# La connexion réseau a été interrompue, récupère
# le jeton permettant de reprendre la transmission
token=$(zfs get -Hp receive_resume_token pool/backup | cut -f3)

# Poursuite de la transmission à partir des informations
# contenues dans le jeton
zfs send -t $token | ssh remote-host zfs recv -s pool/backup

# Ou suppression des données partiellement transférées
# si l'on ne souhaite pas poursuivre
zfs recv -A pool/backup