vendredi 14 septembre 2018

Passer un disque fait pour le BIOS en UEFI avec BTRFS

Ça a pas l'air compliqué comme ça, mais en fait, c'est hyper chiant…

J'ai changé un très vieux PC portable récemment (12 ans !) vers un truc un peu plus neuf (seulement 3 ans) et je ne voulais pas réinstaller le système au complet (flemme). Bon en vérité, j'aurais très bien pu tout réinstaller et je n'aurais pas mis tant de temps que ça mais je n'avais vraiment pas envie de me bouger.

Problème : cette nouvelle machine ne reconnaît pas mon disque. Pour une raison assez simple : il a été formaté avec une table de partitions standard et pas UEFI. Donc pas moyen de démarrer quoique ce soit, je suis obligé de booter sur une clé USB qui contient GRUB.

J'aurais pu en rester là, mais ça n'aurait pas été drôle. Mon disque ne contient même pas de partition en fait : c'est un système BTRFS directement installé sur /dev/sda (c'est moche, mais ça marche).

À partir de ce moment, il y a deux possibilités :

  • soit on possède un autre disque, et on peut tenter un btrfs replace dans un sens, reformater le disque et faire un btrfs replace dans l'autre sens ;
  • soit, et c'est mon cas, on ne dispose pas de second disque auquel cas on va utiliser les snapshots BTRFS et la fonction send/receive pour sauvegarder l'ensemble du disque sur une machine distante.

Et du coup, autant que je documente le processus, ça pourrait toujours servir à d'autres.

Le bon système de fichiers, il snapshot…

Première étape essentiellement : faire des snapshots en lecture seule de l'ensemble des sous-volumes BTRFS. Pour cela rien de plus simple, il suffit de monter le disque BTRFS à la racine (si ton / n'est pas à la racine) ou de créer carrément un sous-volume pour les stocker. Personnellement, mes sous-volumes ressemblent à ça :

# mount -t btrfs -o subvolid=0 /dev/sda /mnt
# btrfs sub list -a /mnt
ID 257 gen 202952 top level 5 path __root
ID 258 gen 202952 top level 5 path __home
ID 300 gen 202932 top level 257 path <FS_TREE>/__root/opt
ID 302 gen 202952 top level 257 path <FS_TREE>/__root/usr
ID 303 gen 202953 top level 257 path <FS_TREE>/__root/var
ID 801 gen 148907 top level 303 path <FS_TREE>/__root/var/lib/machines
ID 999 gen 194266 top level 303 path <FS_TREE>/__root/var/lib/portables

C'est donc pour moi assez simple : il faut créer un sous-volume cliché en lecture seule pour chaque volume (sauf machines et portables qui ne me servent à rien et qui seront recréés par Docker/LXC) :

# btrfs subvolume snapshot -r /mnt/__home /mnt/__ro_home@$(date -I)

Opération à répéter pour chaque sous-volume. À noter qu'il faut impérativement tout mettre à la racine, même pour les sous-volumes usr et var.

À partir de ce moment-là, on peut commencer à le balancer sur une autre machine dans une autre partition BTRFS.

Et un snapshot pour la 12 !

Alors évidemment (ou plutôt malheureusement), il va falloir être root sur les deux machines : impossible de créer un snapshot si l'on n'est pas root sur la machine cible et imposible de lire complètement un snapshot pour la même raison sur la machine source. Pour le reste, c'est relativement facile.

J'ai commencé par créer un sous-volume cible sur une autre machine (baybay-ponay en l'occurence) :

# btrfs subvolume create /home/pinkypie/

Depuis la machine source (pinkypie), j'ai ensuite envoyé chacun des snapshots :

# btrfs send /mnt/__ro_home@2018-09-14/ | ssh root@baybay-ponay btrfs receive /home/pinkypie/
# btrfs send /mnt/__ro_var@2018-09-14/ | ssh root@baybay-ponay btrfs receive /home/pinkypie/
[…]

La date est complètement optionnelle hein, c'est juste pour se repérer plus facilement…

Avec un peu de patience, on obtient donc un transfert binaire absolument parfait de l'ensemble des partitions du système. On peut alors effacer complètement le disque d'origine, la sauvegarde du système est totalement réalisée.

Reformatage du disque

À partir de ce moment-là, la suite des opérations se passent sur un disque de boot (Archlinux en l'occurence mais en théorie n'importe quel disque de boot doit faire l'affaire à condition que BTRFS et UEFI soit supporté dessus).

Comme ma machine cible est une machine UEFI 100%, nous allons utiliser fdisk pour la repartitionner en GPT (ah ah ah ah). Pour cela, on va se servir de l'option g dans le menu principal :

# fdisk /dev/sda

Bienvenue dans fdisk (util-linux 2.32.1).
Les modifications resteront en mémoire jusqu'à écriture.
Soyez prudent avant d'utiliser la commande d'écriture.


Commande (m pour l'aide) : g
Une nouvelle étiquette de disque GPT a été créée (GUID : LOLILOL).
L'ancienne signature iso9660 sera enlevée par une commande d'écriture.

Il suffit donc de créer une partition de type EFI System (256M doivent largement suffire, la bonne pratique recommande environ 100Mio), puis une seconde partition de type Linux filesystem pour le reste du disque.

On valide l'écriture et c'est parti mon kiki.

Recréation d'un système de fichiers BTRFS

Là encore, c'est finalement relativement simple :

# mkfs.btrfs --label GG /dev/sda2
# mount LABEL=GG /mnt

On peut alors aller récupérer les données depuis baybay-ponay où on les avait entreposées bien au chaud :

# ssh root@baybay-ponay btrfs send /home/pinkypie/__ro_home@2018-09-14 | btrfs receive /mnt

On va alors récupérer un sous-volume en lecture seule. Pour le rendre inscriptible, rien de plus simple :

# btrfs subvolume snapshot /mnt/__ro_home@2018-09-14 /mnt/__home
# btrfs subvolume delete /mnt/__ro_home@2018-09-14

Et à ce moment, on récupère bien une partition parfaitement utilisable en écriture ! Il suffit donc de reprendre la même opération pour chaque sous-volume et de réorganiser ça bien gentiment.

Réinstallation de ce qu'il faut sous Archlinux

Jusqu'à présent, nous avons fait des choses relativement universelles : BTRFS, partitionnement GPT (ah ah ah ah) et send/receive. Cette dernière partie est plus spécifique à Archlinux et est surtout là pour me servir de pense-bête.

Après avoir modifié correctement /etc/fstab, et monter toutes les partitions au bon endroit, on peut entamer la modification en profondeur du système pour le rendre compatible UEFI. Il faut donc supprimer le dossier @@/boot@ de la racine du système cible, formater la partition EFI System précédemment créée en FAT32 et la monter au bon endroit :

# rm -rf /mnt/boot
# mkfs.vfat /dev/sda1
# mount /dev/sda1 /mnt/boot

Il faut ensuite balancer une commande grub bien spécifique pour créer tous les fichiers nécessaires au boot UEFI du système :

# grub-install --target=x86_64-efi --efi-directory=/mnt/boot --bootloader-id=GRUB

Voilà, maintenant il devrait y avoir tout ce qu'il faut au niveau de la carte mère pour arriver à booter correctement cette Archlinux. Néanmoins, comme nous avons supprimé la partition /boot, il va quand même falloir penser à réinstaller deux ou trois bricoles :

# for f in sys dev proc; do mount --bind /${f} /mnt/${f}
# chroot /mnt
# pacman -S linux

pacman va s'occuper de tout réinstaller bien gentiment à la bonne place avec les bonnes permissions et tout le toutim.

On redémarre, on va se chercher une bière bien méritée et on peut retourner glander tranquillement devant son PC en UEFI.

jeudi 16 août 2018

LXD/LXC, Docker et autres joyeusetés (partie 2 sur beaucoup potentiellement…)

Où l'on met beaucoup d'ambiance dans cette boîte jaune…

Lire la suite

lundi 6 août 2018

LXD/LXC, Docker et autres joyeusetés (partie 1 sur beaucoup potentiellement…)

Et là, la marmotte, elle met le chocolat dans le papier d'alu.

Lire la suite

samedi 24 mars 2018

Ma République est morte

Plus la peine de tenter une réanimation, c'est juste fini…

Lire la suite

mercredi 4 janvier 2017

uBlock Origin : ne plus filtrer Piwik

Parce qu'autant je chie allègrement sur Google Analytics, autant Piwik, c'est le bien (y)

Lire la suite

lundi 26 décembre 2016

Z-Push, IMAP, sexe et NextCloud

Peut-être pas de sexe finalement, vous n'avez pas été très sage cette année…

Plus sérieusement, je n'ai vu que très peu de ressources en français sur ce sujet, alors que je pense que c'est plutôt utile et rigolo à faire.

Lire la suite

lundi 15 février 2016

Microsoft, je te chie dans la bouche

Tu es le SIDA de l'Internet et j'ai envie de t'enculer le cerveau…

Lire la suite

lundi 28 septembre 2015

mdadm + LVM + ext4 vers BTRFS sans larme

Mais avec un paquet de lubrifiant quand même…

Lire la suite

lundi 2 février 2015

OpenWRT et dhcp6c : la méthode Barrier Breaker

Parce que les tutos obsolètes, ça commence à bien faire !

Lire la suite

vendredi 22 août 2014

Passerelles VPN redondantes avec OpenBSD et BIRD

vpn_redondant_2_operateurs.png

BIRD, c'est bon, mangez-en !

Lire la suite

vendredi 12 juillet 2013

OpenBSD en lecture seule

Parce que de temps en temps, il faut savoir fermer sa gueule…

Lire la suite

vendredi 15 février 2013

DNSSEC : méthode BIND9.9

Nan, parce que la précédente méthode, c'était vraiment _hardcore_

Lire la suite

vendredi 5 octobre 2012

Fabriquer un lecteur de carte mémoire Nintendo 64 (4)

Pour quelques lignes de C de plus…

Lire la suite

vendredi 21 septembre 2012

Fabriquer un lecteur de carte mémoire Nintendo 64 (3)

J'avais jamais vu autant de bits d'un coup…

Oui, je sais, elle est facile.

Lire la suite

vendredi 14 septembre 2012

nginx : ne pas faire de la merde avec PHP

Du pain, du vin, du PHP

Le gars dans la pub là

Lire la suite

vendredi 31 août 2012

Fabriquer un lecteur de carte mémoire Nintendo 64 (2)

Schéma de branchement de la manette N64

Les spécifs un peu détaillés du bordel

Lire la suite

vendredi 24 août 2012

Fabriquer un lecteur de carte mémoire Nintendo 64 (1)

Diantre, mais pourquoi fabriquer une merde pareille ?

Lire la suite

mercredi 9 mai 2012

Dépucelage DNSSEC (2)

Parce qu'il y a des moments où il faut aller péter des culs !

Lire la suite

vendredi 13 janvier 2012

Mes deux centimes : créer des adresses « génériques » avec Postfix

Parce que les adresses normales, c'est pas assez 2.0

Lire la suite

dimanche 4 décembre 2011

Dépucelage DNSSEC (1)

C'est quand quelqu'un t'oblige à faire confiance à un tiers qu'il faut aller lui chier sur son bureau.

Lire la suite

- page 1 de 3