système de fichiers racine btrfs sur raspbian

11

J'ai pensé que je pourrais expérimenter avec btrfs comme partition racine pour voir comment il gère la corruption de fichiers pendant les coupures de courant. Mais je ne peux pas le faire démarrer.

Ce que j'ai fait:

  1. sur le PI avant de commuter:

    apt-get install btrfs-tools 2. Depuis un ordinateur Linux:

    btrfs-convert / dev / sda2

  2. En /etc/fstabchangement ext4àbtrfs

  3. En /cmdline.txtchangement ext4àbtrfs

Je reçois une panique du noyau si j'essaie de démarrer. Dois-je faire autre chose?

GuySoft
la source

Réponses:

7

Si btrfs est compilé en tant que module du noyau, vous devez créer un initramfs pour charger le module au démarrage. Sur Raspian (et d'autres dérivés de Debian), update-initramfsest la méthode la plus simple pour ce faire.

Si initramfs-toolsest installé, chaque fois que vous apt-getinstallez un nouveau noyau, il devrait se déclencher update-initramfsautomatiquement.

sudo apt-get update
sudo apt-get install initramfs-tools

Cependant, si vous utilisez rpi-updatepour installer un nouveau noyau, vous devrez exécuter update-initramfsmanuellement avant de redémarrer dans le nouveau noyau:

sudo update-initramfs -u -k <kernel-version>

Cela créera ou mettra à jour les initramfs dans /boot/initrd.img-<kernel-version>.

La dernière étape consiste à l'ajouter à votre configuration de démarrage: ajoutez la ligne suivante à /boot/config.txt:

initramfs initrd.img-<kernel-version> followkernel

initrd-<kernel-version>doit correspondre exactement au nom du fichier dans /boot.

Vous devrez répéter ces étapes chaque fois que vous exécutez rpi-update.

bennettp123
la source
2

Mon test rapide montre que le support de btrfs est construit comme un module externe dans raspbian, non directement lié au noyau.

Cela signifie que le noyau doit être capable de charger ce module (qui est stocké sur le système de fichiers racine) avant de savoir comment monter le système de fichiers racine. De toute évidence, cela ne fonctionne pas.

Approche 1:

Construisez votre propre noyau et ajustez sa configuration de construction pour pré-lier les btrfs. Il est facile de modifier la configuration si vous avez compris comment créer et charger votre propre noyau.

Approche 2:

Réajustez les choses pour que le noyau et les modules soient sur un système de fichiers ext4 et que les données que vous souhaitez le plus compresser se trouvent sur une partition btrfs.

Approche 2A:

Laissez la partition racine en ext4 et créez une nouvelle partition basée sur btrfs, mais cela n'aide pas à réduire l'installation du système d'exploitation (si c'est votre objectif).

Approche 2B:

Créez une partition de démarrage qui est petite et contient le noyau et les modules, tout en laissant tout le reste sur les btrfs. Je ne sais pas comment faire cela pour le chargeur de démarrage d'un Pi, ni quelles sont les limitations autour de cela.

DonGar
la source
Qu'en est-il de copier les modules btrfs sur la partition de démarrage et de les charger à partir de là à l'avance?
GuySoft
3
N'est-il pas également possible de commencer avec un initrd.img?
Anders
Oui, et initrd.img semble être le moyen le plus simple de le résoudre! Je ne l'ai jamais utilisé. Recherchez des documents sur "mkinitrd".
DonGar
Hmm semble que CONFIG_BLK_DEV_INITRD n'est pas activé dans la dernière version de Raspbian. Cela signifie que vous devez recompiler le noyau afin d'activer le support initd.
GuySoft
1
Voir paxswill.com/blog/2013/11/04/encrypted-raspberry-pi - Là initramfs est utilisé pour autoriser la racine cryptée. De même, la prise en charge de cryptsetup (ici btrfs) est nécessaire avant que root ne soit disponible.
Rbjz
1

Pour qu'il trouve ma partition racine BTRFS externe, je devais spécifier explicitement l' UUID de la partition racine dans la partition de démarrage cmdline.txt. Par exemple:

dwc_otg.lpm_enable = 0 console = tty1 root = PARTUUID = 123e4567-e89b-12d3-a456-426655440000 rootfstype = btrfs ascenseur = date limite rootwait silence splash

Vous pouvez déterminer l'UUID de la partition BTRFS à l'aide de lsblk -f.

Geremia
la source
1

Le noyau Raspbian n'inclut pas le support btrfspar défaut; les étapes de démarrage initiales s'exécutent normalement, mais lorsque le noyau se charge, il ne voit aucun système de fichiers qu'il pourrait monter - et panique. Une solution existe: ajouter btrfs comme module noyau, dans initramfs. En grande partie grâce à trois articles différents , je l'ai mis en place ainsi:

  • Installez les packages requis - le module du noyau et les outils pour mettre à jour initramfs avec: sudo apt install btrfs-tools initramfs-tools
  • Dites à initramfs de charger le module btrfs (devrait se produire automatiquement, pour une raison quelconque, ne fonctionnait pas sur mon RPi1) - ajoutez une ligne avec "btrfs" à la liste des modules requis: echo 'btrfs' | sudo tee -a /etc/initramfs-tools/modules
  • Créez un hook initramfs (pour la construction de l'image) et un script (pour le démarrage) pour btrfs - les valeurs par défaut sont fournies, mais dans mes tests, elles n'ont pas été utilisées de manière automatique, ont dû les copier dans / etc. sudo mkdir -p /etc/initramfs-tools/hooks ; sudo mkdir -p /etc/initramfs-tools/scripts/local-premount ; sudo cp /usr/share/initramfs-tools/hooks/btrfs /etc/initramfs-tools/hooks ; sudo cp /usr/share/initramfs-tools/scripts/local-premount/btrfs /etc/initramfs-tools/scripts/local-premount; sudo chmod +x /etc/initramfs-tools/hooks/btrfs /etc/initramfs-tools/scripts/local-premount/btrfs
  • Create ( -c) les nouveaux initramfs pour la version actuelle du noyau (uname -r) - si vous mettez à jour une version existante, vous devrez utiliser update ( -u) à la place. Cela va créer un fichier nommé comme /boot/initrd.img-*, où * est la version actuelle du noyau. Notez le nom généré (le script le sortira), nous l'utiliserons à l'étape suivante.update-initramfs -c -k $(uname -r)
  • Modifiez /boot/config.txtpour utiliser cet initramfs, en ajoutant initramfs initrd.img-3.11.0+ followkernelLe nom de fichier est sans chemin, c'est celui généré à l'étape précédente; "followkernel" contrôle l'emplacement en mémoire ( documentation config.txt ).
  • Cela résout le noyau actuel, mais comme l'a souligné @Ingo, la mise à niveau du noyau briserait le système. Pour résoudre ce problème, j'ai utilisé ses scripts de hook d'installation du noyau :

    • Modifiez / etc / default / raspberrypi-kernel et décommentez INITRD=Yes
    • supprimer /etc/kernel/postinst.d/initramfs-tools
    • ajouter IPD-initramfs-tools pour /etc/kernel/postinst.d/ et chmod +xil
    • facultativement, téléchargez update-rpi-initramfs pour des mises à jour manuelles plus simples des initramfs.
  • À ce stade, nous avons un système qui pourrait utiliser btrfs comme périphérique racine. Testez par redémarrage: le système démarrera toujours à partir de la partition ext4 (ou de tout ce qui se trouve dans votre /boot/cmdline.txt ), mais dmesg | grep -i btrfsdevrait maintenant afficher une ligne contenant "Btrfs chargé". Maintenant, nous devons réellement créer et utiliser une partition btrfs.

  • Faites une sauvegarde de la /partition (ext4) - en supposant qu'il s'agit de / dev / mmcblk0p2 - généralement: arrêtez le RPi, retirez la carte SD, montez-la ailleurs (dans cet exemple sudo mount /dev/mmcblk0p2 /mntsur un ordinateur Linux) et archivez le contenu; notez que vous devez utiliser un outil qui préserve la propriété et les autorisations, par exemple tar: cd /mnt; sudo tar -czvf ~/rpi-rootfs-backup.tgz *(puis démonter à nouveau la carte SD)

  • Créez une partition btrfs quelque part - J'ai réutilisé la carte SD, en remplaçant la partition ext4 (/ dev / mmcblk0p2); si vous cherchez à créer un tableau btrfs-raid, c'est le moment de le faire ( c'est l'un des arguments de mkfs.btrfs , au-delà de la portée de cette réponse):mkfs.btrfs /dev/mmcblk0p2
  • Montez la partition btrfs et restaurez-y la sauvegarde: sudo partprobe; sudo mount /dev/mmcblk0p2 /mnt; cd /mnt; tar -xzvf ~/rpi-rootfs-backup.tgz
  • Editez fstab sur la partition btrfs :sudo nano /mnt/etc/fstab

Il devrait y avoir une ligne similaire à celle-ci:

/dev/mmcblk0p2  / ext4 foo,bar,baz 0 1

Changez-le en ceci (le nouveau type FS est btrfs, et il utilise les options par défaut):

/dev/mmcblk0p2  / btrfs defaults 0 1
  • Démontez la partition, mais ne retirez pas encore la carte SD! sudo umount /mnt
  • Nous devons dire au RPi qu'il va démarrer à partir de btrfs
  • Trouvez l'UUID de votre nouvelle partition btrfs - trouvez la ligne avec / dev / mmcblk0p2, et copiez la partie UUID =, avec le (pas UUID_SUB, pas PARTUUID! Cela déclencherait un bogue dans le chargeur de démarrage et le noyau ne démarrerait pas .):sudo blkid

    / dev / mmcblk0p2: UUID = "cafebeef-0000-1234-aaaa-12346589" UUID_SUB = "ababccdd-2345-cafe-beee-587989991110" TYPE = "btrfs" PARTUUID = "beef0bee-02"

  • Montez la partition de démarrage (FAT32): sudo mount /dev/mmcblk0p1 /mnt

  • Modifiez cmdline.txt: sudo nano /mnt/cmdline.txt

Trouvez ces deux paramètres

 root=PARTUUID=1234-5678 rootfstype=ext4

Et remplacer par

 root=UUID=cafebeef-0000-1234-aaaa-12346589 rootfstype=btrfs

Notez que l'UUID est celui que nous avons copié plus tôt, juste sans guillemets.

  • Démontez la partition de démarrage RPi: sudo umount /mnt
  • Remplacez la carte SD dans RPi et démarrez.
  • Sur le RPi, voyez que vous exécutez en effet à partir d'un montage racine btrfs: mount

    / dev / mmcblk0p2 sur / type btrfs (rw, space_cache, subvol = /)

  • Et voilà! Pas tout à fait pointer-cliquer, mais en me tenant sur les épaules de géants, je pourrais le faire fonctionner. (Cela en a également fait un repo .)

Piskvor a quitté le bâtiment
la source
1
Avec le premier, sudo apt upgrades'il met également à niveau le noyau, cette configuration échouera considérablement au démarrage car le nouveau noyau essaie de charger les anciens initramfs qui échoueront et le noyau ne peut pas charger les pilotes btrfs. Et ce n'est pas un moyen facile de le réparer, du moins avec un chrootsystème armhf.
Ingo
La mise à jour-initramfs ne serait-elle pas invoquée lors de la mise à niveau du noyau?
Piskvor a quitté le bâtiment le
1
Non, Raspbian par défaut ne parvient pas à générer de nouveaux initramfs. Il n'est pas configuré pour cela. Vous devez toujours surveiller avec vos yeux ce qui apt upgradese passe et faire générer un initramfs à la main si nécessaire - avant de démarrer le nouveau noyau. Pas une tâche réalisable pour un débutant car à défaut, c'est dramatique. Vous pouvez voir comment utiliser un ramdisk init (initramfs) au démarrage du Raspberry Pi?
Ingo
1
Il y a un petit bug que je viens de trouver mais qui n'a pas été corrigé jusqu'à présent. Le noyau prend en charge deux modèles, par exemple 4.14.98+et 4.14.98-v7+. Si update-initramfs est déclenché par une mise à jour du noyau, il générera deux initrd.img *, un pour chaque modèle. Cela ne tient pas sur la /bootpartition (erreur - manque d'espace) et la génération ne se termine pas.
Ingo
1
Je pense utiliser MODULES=list.
Ingo