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
Autour de cette page
Autour de cet article
Weblog
Derniers commentaires
- Natacha dans Désolarisation
- Natacha dans Ricing
- Damien dans Ricing
- Damien dans Désolarisation
- Damien dans Désolarisation
- Natacha dans Blogoversaire
- Jean Abou Samra dans Blogoversaire
- Jean Abou Samra dans Blogoversaire
- Natacha dans Blogoversaire
- Gro-Tsen dans Blogoversaire
Tags
- (Sans tag) (6)
- Appel au public (17)
- Autoexploration (60)
- BSD (6)
- Boulot (30)
- Création (12)
- En vrac (11)
- Évènement (59)
- Geek (48)
- Goûts (10)
- Humeur (18)
- Inventaire (9)
- Jeux (7)
- Jouets (36)
- Lecture (10)
- Réflexion (23)
- Site (22)
- Social (26)
- Société (14)
- Suite (15)
- Vision atypique (30)
- Vœux (8)
Archives
- 2024 (12)
- 2023 (14)
- 2022 (14)
- 2021 (15)
- 2020 (14)
- 2019 (12)
- 2018 (12)
- 2017 (13)
- 2016 (16)
- 2015 (12)
- 2014 (13)
- 2013 (15)
- 2012 (18)
- 2011 (18)
- 2010 (20)
- Décembre 2010 (1)
- Octobre 2010 (2)
- Septembre 2010 (1)
- Août 2010 (1)
- Juillet 2010 (4)
- Juin 2010 (4)
- Mai 2010 (2)
- Avril 2010 (3)
- Février 2010 (1)
- Janvier 2010 (1)
- 2009 (45)