Migrer sur du Full ZFS
Depuis peu : les derniers commit en -STABLE ont eu lieu ce WE, il est possible d'avoir un FreeBSD 100% en ZFS, avant il y avait une solution qui consistait à passer ses disques du format MBR au format GPT, mais nous pouvons maintenant le faire directement sur du MBR.
De plus il est possible de booter sur des RAID-Z ou des MIRROR zfs.
Attention : la manipulation suivante doit se faire avec un système 7-STABLE ou 8-CURRENT très récent, de plus il faut rajouter l'option LOADER_ZFS_SUPPORT=YES dans le /etc/src.conf ou /etc/make.conf suivant les goûts afin que le loader sache travailler sur du ZFS.
Dans le cas présent nous allons donc migrer un système FreeBSD-Current tout frais mono-disque d'une installation UFS vers ZFS. Dans mon cas je voulais changer le disque dur au passage donc tout est parfait.
Création du POOL
Après avoir ajouter le disque (ici ad6) dans la machine, et de l'avoir vidé de toutes ses éventuelles partitions, nous allons créer notre zpool, il est donc possible ici de faire du mirror ou des raidz :
$ zpool create tank ad6
$ zpool export tank
Ajout de ZFSBOOT dans le mbr
$ dd if=/boot/zfsboot of=/dev/ad6 bs=512 count=1
$ dd if=/boot/zfsboot of=/dev/ad6 bs=512 skip=1 seek=1024
Si vous voulez booter sur un mirror zfs n'oubliez pas de faire la même chose sur l'autre disque.
Réactivation du pool
$ zpool import tank
Vous pouvez maintenant créer tous les FS que vous voulez dedans. attention si vous décidez de créer des FS spécifique pour /usr ou /var, vous devrez changer le mountpoint après un reboot en mode single sur le nouveau disque ZFS.
dans mon cas j'ai créé un swap de 1G :
$ zfs create -V 1g tank/swap
$ zfs set org.freebsd:swap=on tank/swap
La dernière option permet d'activer le swap automatiquement au boot lors de l'activation du zpool tank.
Et comme les checksum ça sert à rien sur du swap :
$ zfs set checksum=off tank/swap
migration des données
Pour migrer les données vous avez tout le choix des outils habituels, dans mon cas j'ai pris rsync ce coup ci et j'y suis allé gaiement à coup de rsync, par exemple :
$ rsync -av /boot /tank
$ ...
$ rsync -av /var /tank
En ne migrant pas bien entendu /dev ou autre FS "particulier".
Finalisation
pour finir il faut vous assurez que
- /tank/boot/loader.conf contient bien zfs_load="YES"
- /tank/boot/loader.conf contient bien vfs.root.mountfrom="zfs:tank"
- /tank/boot/etc/rc.conf contient bien zfs_enable="YES"
- /tank/boot/etc/fstab est vide ou ne contient que des FS non gérés par ZFS genre le /tmp pour moi en tmpfs, et les FS pour l'émulation linux par exemple.
- Vérifier la présence de /tank/boot/zfs/zpool.cache
si ce dernier n'y est pas ou que vous voulez le recréer par précaution :
$ zpool export tank && zpool import tank
$ zfs mount -a
$ cp /boot/zfs/zpool.cache /tank/boot/zfs/zpool.cache
Si tout ça est bon, il ne nous reste plus qu'à préciser à votre zfs quel est votre FS de boot
$ zpool set bootfs=tank tank
et Enfin de ne pas spécifier de point de montage pour tank :
$ zfs set mountpoint=legacy tank
c'est bon vous pouvez redémarrer sur le nouveau disque en 100% ZFS et supprimer votre disque UFS.
Juste une précision pour les lecteurs : ça ne fonctionnne toujours pas, au jour d'aujourd'hui, sur des partitions de type MBR. Ça fonctionne sur des partitions GPT (avec le code qui va bien pour booter la partition GPT depuis le secteur zéro du disque dur), ou sur un disque en mode "dédié" sans schéma de partitions (comme dans cet article).
Bapt a écrit le 15/06/2009 :
Merci de cette précision :)


