Clonage de FreeBSD

Note : cet article inaugure un nouveau tag, « BSD », pour mes geekeries qui concernent un système d'exploitation de type BSD. Comme tous les autres postes avec le tag « Geek », j'ai bien conscience qu'une (grande ?) partie de mon lectorat n'y comprend rien. Je leur présente mes plus sincères excuses, et je comprends tout à fait qu'ils s'arrêtent là.

Imaginez que vous soyez perdu dans le désert, sans disquette ni support optique ni clef USB, et que vous vouliez installer FreeBSD sur un ordinateur n'ayant qu'un système d'exploitation propriétaire (en l'occurrence, Yulai, récemment remis de ses soucis, je vous raconterai). Comment vous y prendriez-vous ?

Bon c'est un désert presque civilisé, on a quand même de l'électricité, un accès internet, une installation de FreeBSD existante (sur Manabiya), et du chocolat. Même avec ça, ça n'est pas évident, du moins vu d'ici.

Et pour ne rien arranger, j'ai en plus envie de faire une installation en ZFS pur. La technique présentée ici fonctionne aussi bien avec un système de fichiers plus traditionnel, mais ce sont mes aventures en « ZFSRoot » qui m'ont principalement inspirée (et plus particulièrement les deux articles sur lesquels je me suis basée pour installer Manabiya, GPTZFSBoot et Migrer sur du full ZFS).

J'imagine qu'une des premières solutions venant à l'esprit est de faire une installation par PXE, mais ça veut dire mettre en place au moins du DHCP, TFTP et NFS spécialement pour ça, ce qui ne me tente pas vraiment.

Je m'en suis sortie en clonant mon système existant, comme pour installer une nouvelle jail, sauf avec tout ce qu'il faut pour que ça fonctionne en tant qu'hôte.

Transplantation de disque dur

Comme le disque dur de destination contient, par hypothèse, un système d'exploitation inutilisable, la première chose à faire est de le transplanter vers le système source.

J'ai donc dû utiliser un ingrédient que je n'ai pas encore listé : un boîtier disque dur USB. J'aurais pu le brancher en interne, mais j'avais la flemme de tout démonter.

Je me suis donc retrouvée avec mon disque dur de destination sur /dev/da0, à côté des deux volumes du zmirroir /dev/ad4 et /dev/ad8.

Création du système de fichiers

Avant de stocker quelque donnée que ce soit sur le disque dur de destination, il faut construire dessus un système de fichiers civilisé. J'ai utilisé un découpage ZFS très basique, mais tant que ça marche…

zpool create zyulai /dev/da0
zfs create zyulai/base
zfs create zyulai/base/tmp
zfs create zyulai/base/usr
zfs create zyulai/base/usr/ports
zfs create zyulai/base/usr/src
zfs create zyulai/base/var
zfs create zyulai/base/var/log
zfs create zyulai/base/var/tmp
zfs set compression=gzip-9 zyulai/base/usr/ports
zfs set compression=gzip-9 zyulai/base/usr/src
zfs set compression=gzip-9 zyulai/base/var/log
ln -s /usr/home /zyulai/base/home

Normalement à ce stade il serait judicieux de créer un volume swap. J'ai complètement oublié de le faire, mais les commandes suivantes auraient dû être entrées à ce stade :

zfs create -V 1g zyulai/swap
zfs set org.freebsd:swap=on zyulai/swap
zfs set checksum=off zyulai/swap

Compilation, installation et configuration de FreeBSD

Une fois le disque dur prêt, on peut expédier les fichiers d'un FreeBSD compilé sur le système source. En réalité j'en avais déjà une copie compilée, donc je n'ai pas vraiment exécuté la première ligne.

make -C /usr/src buildworld buildkernel
make DESTDIR=/zyulai/base -C /usr/src installkernel installworld
mergemaster -i -D /zyulai/base

Il paraît que la dernière ligne peut être remplacée par un make distribution. Je n'ai jamais essayé donc je ne sais pas trop, je sais juste que mergemaster fonctionne et que make distribution n'apparaît dans aucune page de man que j'ai consultée à ce sujet.

vim /boot/loader.conf /etc/rc.conf /etc/fstab
chroot /zyulai/base
passwd
tzsetup

Rendre le disque dur bootable

Jusque là c'était facile, mais on n'a qu'un tas de fichier sur un disque dur externe. Rendre toute cette affaire bootable est une autre paire de manches.

D'abord, installer le bootloader à sa place :

zpool export zyulai
dd if=/boot/zfsboot of=/dev/da0 bs=512 count=1
dd if=/boot/zfsboot of=/dev/da0 bs=512 skip=1 seek=1024

J'imagine qu'il serait plus approprié d'utiliser le bootloader correspondant à l'installation que l'on vient juste de faire, à savoir /zyulai/base/boot/zfsboot, le problème est que ce fichier est inaccessible après avoir exporté le pool. Chez moi /zyulai/base/boot/zfsboot et /boot/zfsboot étaient identiques, donc je n'avais pas à me poser de question, mais si ce n'est pas le cas, j'imagine qu'il faut copier /zyulai/base/boot/zfsboot quelque part sur le système de fichier source, pour pouvoir le dd ensuite.

Il paraît qu'initialiser le /boot/zfs/zpool.cache est important, mais je ne sais pas trop à quel stade il faut le faire. J'ai donc réimporté le pool pour ça.

zpool import zyulai
cp -i /boot/zfs/zpool.cache /zyulai/base/boot/zfs/
zpool set bootfs=zyulai/base zyulai

L'étape suivante est de donner les points de montage corrects aux systèmes de fichier. Ça ne peut pas être fait comme ça, à chaud, parce que sinon ça écrase le système source. Il faut donc exporter le pool pour pouvoir le réimporter avec une racine alternative :

zpool export zyulai
zpool import -R /zy zyulai

Je me demande dans quelle mesure il n'aurait pas été plus habile d'importer avec une racine alternative à l'étape précédente, je ne sais juste pas si le set bootfs se passe bien dans une racine alternative, mais il aurait de toute façon pu être fait plus tôt, par exemple à la création du pool.

Ensuite, les points de montage peuvent être sereinement spécifiés :

zfs set mountpoint=legacy zyulai/base
zfs set mountpoint=/tmp zyulai/base/tmp
zfs set mountpoint=/usr zyulai/base/usr
zfs set mountpoint=/var zyulai/base/var

Retour vers Yulai

À ce stade, le disque dur de destination est prêt à être utilisé, à un petit détail près : il est accroché à l'ordinateur source, et non à la destination.

C'est ici la partie qui m'a demandé le plus de temps : comment débrancher le disque dur sans exporter le pool ?

Si j'exporte le pool, je peux débrancher le disque et le transplanter sans dégât, mais il ne peut pas booter parce que le système de fichier de base est marqué comme exporté.

Si je n'exporte pas le pool et que j'arrache juste le câble USB, ça se passe très mal.

J'avoue que je cherche encore une solution élégante, si quelqu'un a une idée, merci de la laisser en commentaire, ça m'intéresse beaucoup.

La seule solution que j'ai trouvée consiste simplement à éteindre le système source, débrancher le disque externe, et le rallumer : comme ça le pool de destination n'est pas exporté tout en étant dans un état utilisable.

Epilogue

Une fois le disque dur de destination remis à sa place, on peut gentiment booter sur un FreeBSD tout neuf, et continuer sur ce système vierge la suite habituelle des opérations : installation des ports indispensables (genre tmux, zsh et vim-lite), création des utilisateurs, etc.

Commentaires

1. Le jeudi 21 octobre 2010 à 19:32, par K :

Je te cache pas que j'ai arrêté ma lecture très rapidement (moi pas être très geek) mais je voulais en profiter pour te saluer. Donc ben salut !

2. Le dimanche 24 octobre 2010 à 14:43, par Roman Age :

Perso j'ai arrêté la lecture comme K, mais j'ai quand-même scrollé lentement, pour voir la tête que ça avait, et j'arrive quand-même à être impressionné, pas par le contenu que je ne comprends pas et qui ne m'intéresse pas, mais justement par ce qu'il représente de motivation et certainement de passion (et peut-être d'expertise mais là je ne peux pas juger).

3. Le dimanche 24 octobre 2010 à 18:48, par _FrnchFrgg_ :

Perso ça m'intéresse de savoir pour le "démontage du disque sans export" parce que ça m'étonnerait qu'un truc aussi bien conçu que ZFS (et destiné à une utilisation pro) ne sache pas faire ça.

Sinon, salut, comment vas-tu ?

Et comment ça se passe tes débuts à Binoocles ? Au passage je viens de m'acheter un Samsung Galaxy S et Android ça arrache sur un téléphone un peu couillu.

4. Le lundi 25 octobre 2010 à 21:39, par Natacha :

K, toutes mes salutations :-) Ça me fait toujours très chaud au cœur de voir que tu hantes encore ces pages \o/

Roman Age, s'il y a bien de la motivation et de la volonté derrière cet article, je ne crois pas qu'il y ait réellement de passion. Cependant ce n'est pas la peine d'en discuter ici, j'ai dans mon four un article spécialement dédié, intitulé « Je ne suis pas une geekette » (son principal argument est justement que je ne fais pas tout ça par passion).

_FrnchFrgg_, je n'ai toujours pas trouvé la solution, ni quelqu'un qui pourrait savoir. De mémoire j'avais `zfs unmount` avant d'arracher la prise USB, mais je n'en suis plus complètement convaincue, je rééssayerai quand je passerai Aiur sous FreeBSD (il me semble qu'il n'a qu'un gig' de RAM, ce qui est un peu léger pour ZFS, mais je pourrai toujours faire le test et ensuite reformater en UFS).

Mais ce n'est pas si surprenant que ça si cette fonctionnalité n'existe pas : son seul intérêt est de pouvoir boot sur un support directement transplanté depuis un autre système. J'ai tendance à penser qu'une « utilisation pro » passerait généralement par un CD/DVD ou un PXE (suivant le nombre de machines à installer). S'il faut vraiment préparer le système de fichiers sur une autre machine, un CD/DVD ou un PXE permet au moins de l'importer pour ensuite redémarrer dessus.

Poster un commentaire

Mise en forme historique : pour mettre en valeur un mot ou un groupe de mot, tapez une étoile de part et d'autre, sans mettre d'espace entre l'étoile et le mot, comme ceci : *mise en valeur*. Pour insérer un lien, mettez le entre crochets, comme ceci : [http://instinctive.eu/].

Mise en forme markdown : voir le guide détaillé, en résumé c'est le Markdown traditionnel, sans HTML ni titres, mais avec les tables PHP-Markdown-Extra.

Attention : les balises HTML entrées dans les commentaires seront affichées telles quelles, et non pas interprétées.

Autour de cette page

 

Autour de cet article

  • Publié le 21 octobre 2010 à 18h58
  • État de la bête : les mains pleines de camboui numérique
  • 4 commentaire(s)
  • Tag : BSD
  • Tag : Geek

Derniers commentaires

Tags

Archives

Site-level navigation and features

 

Instinctive.eu

Contact

Sections

Validation

Copyright © 2008-2017 Natacha Kerensikova

Butterfly images are copyright © 2008 Shoofly