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-initramfs
est la méthode la plus simple pour ce faire.
Si initramfs-tools
est installé, chaque fois que vous apt-get
installez un nouveau noyau, il devrait se déclencher update-initramfs
automatiquement.
sudo apt-get update
sudo apt-get install initramfs-tools
Cependant, si vous utilisez rpi-update
pour installer un nouveau noyau, vous devrez exécuter update-initramfs
manuellement 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
.
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:Vous pouvez déterminer l'UUID de la partition BTRFS à l'aide de
lsblk -f
.la source
Le noyau Raspbian n'inclut pas le support
btrfs
par 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:sudo apt install btrfs-tools initramfs-tools
echo 'btrfs' | sudo tee -a /etc/initramfs-tools/modules
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
-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)
/boot/config.txt
pour utiliser cet initramfs, en ajoutantinitramfs initrd.img-3.11.0+ followkernel
Le 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 :
INITRD=Yes
/etc/kernel/postinst.d/initramfs-tools
chmod +x
ilÀ 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 btrfs
devrait 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 exemplesudo mount /dev/mmcblk0p2 /mnt
sur 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)mkfs.btrfs /dev/mmcblk0p2
sudo partprobe; sudo mount /dev/mmcblk0p2 /mnt; cd /mnt; tar -xzvf ~/rpi-rootfs-backup.tgz
sudo nano /mnt/etc/fstab
Il devrait y avoir une ligne similaire à celle-ci:
Changez-le en ceci (le nouveau type FS est btrfs, et il utilise les options par défaut):
sudo umount /mnt
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
sudo nano /mnt/cmdline.txt
Trouvez ces deux paramètres
Et remplacer par
Notez que l'UUID est celui que nous avons copié plus tôt, juste sans guillemets.
sudo umount /mnt
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 .)
la source
sudo apt upgrade
s'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 unchroot
système armhf.apt upgrade
se 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?4.14.98+
et4.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/boot
partition (erreur - manque d'espace) et la génération ne se termine pas.MODULES=list
.