Se o btrfs for compilado como um módulo do kernel, você precisará criar um initramfs para carregar o módulo na inicialização. No Raspian (e em outros derivados do debian), update-initramfs
é o método mais fácil de fazer isso.
Se initramfs-tools
estiver instalado, a qualquer momento que apt-get
instalar um novo kernel, ele deve ser acionado update-initramfs
automaticamente.
sudo apt-get update
sudo apt-get install initramfs-tools
No entanto, se você usa rpi-update
para instalar um novo kernel, precisará executar update-initramfs
manualmente antes de reiniciar no novo kernel:
sudo update-initramfs -u -k <kernel-version>
Isso criará ou atualizará o initramfs no /boot/initrd.img-<kernel-version>
.
A etapa final é adicioná-lo à sua configuração de inicialização: adicione a seguinte linha em /boot/config.txt
:
initramfs initrd.img-<kernel-version> followkernel
initrd-<kernel-version>
deve corresponder exatamente ao nome do arquivo /boot
.
Você precisará repetir essas etapas sempre que executar rpi-update
.
Para encontrar minha partição raiz BTRFS externa, eu precisava especificar explicitamente o UUID da partição raiz na partição de inicialização
cmdline.txt
. Por exemplo:Você pode determinar o UUID da partição BTRFS usando
lsblk -f
.fonte
O kernel Raspbian não inclui suporte
btrfs
por padrão; os estágios iniciais de inicialização são executados normalmente, mas quando o kernel carrega, ele não vê nenhum sistema de arquivos que possa montar - e entra em pânico. Existe uma solução: adicione btrfs como um módulo do kernel, no initramfs. Em grande parte graças a três artigos diferentes , eu o configurei assim: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
) o novo initramfs para a versão atual do kernel (uname -r) - se você estiver atualizando uma versão existente, precisará usar update (-u
). Isso criará um arquivo chamado /boot/initrd.img-*, onde * é a versão atual do kernel. Observe o nome gerado (o script o exibirá), nós o usaremos na próxima etapa.update-initramfs -c -k $(uname -r)
/boot/config.txt
para usar este initramfs, adicionandoinitramfs initrd.img-3.11.0+ followkernel
O nome do arquivo está sem caminho, é o gerado na etapa anterior; "followkernel" controla a localização na memória ( documentação config.txt ).Isso resolve o kernel atual, mas como o @Ingo apontou, a atualização do kernel quebraria o sistema. Para corrigir isso, usei seus scripts de gancho de instalação do kernel :
INITRD=Yes
/etc/kernel/postinst.d/initramfs-tools
chmod +x
eleNeste ponto, temos um sistema que poderia usar o btrfs como dispositivo raiz. Teste reinicializando: o sistema ainda será inicializado a partir da partição ext4 (ou o que estiver no seu / boot / cmdline.txt ), mas
dmesg | grep -i btrfs
agora deve mostrar uma linha contendo "Btrfs carregado". Agora precisamos criar e usar uma partição btrfs.Faça um backup da
/
partição (ext4) - assumindo que seja / dev / mmcblk0p2 - normalmente: desligue o RPi, retire o cartão SD, monte-o em outro lugar (neste exemplo,sudo mount /dev/mmcblk0p2 /mnt
em um computador Linux) e arquive o conteúdo; observe que você precisa usar uma ferramenta que preserva a propriedade e as permissões, por exemplo, tar:cd /mnt; sudo tar -czvf ~/rpi-rootfs-backup.tgz *
(e desmonte o cartão SD novamente)mkfs.btrfs /dev/mmcblk0p2
sudo partprobe; sudo mount /dev/mmcblk0p2 /mnt; cd /mnt; tar -xzvf ~/rpi-rootfs-backup.tgz
sudo nano /mnt/etc/fstab
Deve haver uma linha semelhante a esta:
Altere para este (o novo tipo FS é btrfs e usa as opções padrão):
sudo umount /mnt
Encontre o UUID da sua nova partição btrfs - encontre a linha com / dev / mmcblk0p2 e copie a parte UUID =, com o (não UUID_SUB, não PARTUUID! Isso provocaria um bug no gerenciador de inicialização e o kernel não inicializaria .):
sudo blkid
/ dev / mmcblk0p2: UUID = "cafebeef-0000-1234-aaaa-12346589" UUID_SUB = "ababccdd-2345-cafe-beee-587989991110" TYPE = "btrfs" PARTUUID = "beef0bee-02"
Monte a partição de inicialização (FAT32):
sudo mount /dev/mmcblk0p1 /mnt
sudo nano /mnt/cmdline.txt
Encontre estes dois parâmetros
E substitua por
Observe que o UUID é o que copiamos anteriormente, apenas sem aspas.
sudo umount /mnt
No RPi, veja se você está realmente executando a partir de uma montagem raiz btrfs:
mount
/ dev / mmcblk0p2 em / digite btrfs (rw, space_cache, subvol = /)
Et voilà! Não é só apontar e clicar, mas ao ficar nos ombros de gigantes, eu poderia fazê-lo funcionar. (Transforme isso em um repositório também.)
fonte
sudo apt upgrade
caso, se ele também atualizar o kernel, essa configuração falhará drasticamente na inicialização, porque o novo kernel tenta carregar o initramfs antigo que falhará e o kernel não pode carregar os drivers btrfs. E não é uma maneira fácil de consertá-lo, pelo menos com umchroot
sistema armhf.apt upgrade
está fazendo e gerar um initramfs manualmente, se necessário - antes de inicializar o novo kernel. Não é uma tarefa factível para um iniciante, porque falhar é dramática. Você pode dar uma olhada em Como posso usar um init ramdisk (initramfs) na inicialização do Raspberry Pi?4.14.98+
e4.14.98-v7+
. Se update-initramfs for acionado por uma atualização do kernel, ele gerará dois initrd.img *, um para cada modelo. Isso não cabe na/boot
partição (erro sem espaço) e a geração não termina.MODULES=list
.