Inicializando o sistema Linux a partir do chroot: existe uma maneira melhor de fazer isso?

Inicializando o sistema Linux a partir do chroot: existe uma maneira melhor de fazer isso?

Quero configurar a entrada do menu Grub para inicializar no sistema chroot (instalado o debootstrap chroot para evitar tocar demais no sistema existente).

Atualmente eu faço o seguinte para alcançá-lo:

  1. Instale linux-image e amigos dentro do ambiente chroot

  2. Remasterize manualmente o initramfs para fazer chroot no sistema em vez do comportamento normal:

rootmnt=$rootmnt/root/squeeze
...
#exec run-init ${rootmnt} ${init} "$@" <${rootmnt}/dev/console >${rootmnt}/dev/console
exec chroot ${rootmnt} ${init} "$@"  <${rootmnt}/dev/console >${rootmnt}/dev/console

3. Adicione entrada a /boot/grub.cfg:

menuentry 'Chrooted debian Squeeze' {
    ...
    linux   /root/squeeze/boot/vmlinuz root=... rw
    initrd  /root/squeeze/boot/initrd-chroot
}

Ele funciona, mas não é fácil de configurar e precisa de hackeamento manual sempre que o initrd deve ser alterado. Como fazer melhor?

Responder1

Me deparei com o mesmo problema e acabeiescrevendo issopara fazê-lo funcionar sem problemas em diferentes sistemas (debian, ubuntu atualmente):

Execute make_chroot_initrdo script para criar uma nova imagem initrd habilitada para chroot a partir da imagem existente:

#  ./make_chroot_initrd /chroot/trusty/boot/initrd.img-3.13.0-32-generic
making new initrd: /chroot/trusty/boot/initrd.img-3.13.0-32-generic.chroot

A nova imagem será exatamente a mesma, exceto que agora pode manipular um chroot=parâmetro de inicialização.

Com o grub2 como bootloader você pode adicionar uma entrada para /boot/grub/grub.cfg:
(ou talvez melhor /etc/grub.d/40_custom)

menuentry "ubuntu trusty, (linux 3.13.0-32) (chroot)" {
    insmod ext2                       # or whatever you're using ...
    set root='(hd0,7)'                # partition containing the chroot
    set chroot='/chroot/trusty'       # chroot path
    linux   $chroot/boot/vmlinuz-3.13.0-32-generic root=/dev/sda7 chroot=$chroot rw
    initrd  $chroot/boot/initrd.img-3.13.0-32-generic.chroot
}

(altere arquivos/partições para corresponder aos seus)

Instalação em todo o sistema

Quando estiver satisfeito com isso, você poderá tornar as alterações permanentes
(até que o pacote initramfs-tools seja atualizado).
No sistema chroot:

# cd /usr/share/initramfs-tools
# cp -pdrv .  ../initramfs-tools.orig       # backup
# patch -p1 < path_to/boot_chroot/initrd.patch
# rm *.orig */*.orig
# update-initramfs -u

De agora em diante, a imagem initrd regular suportará a inicialização do chroot.
Não há necessidade de usar um initrd.chroot separado, que pode ficar fora de sincronia com ele.

Verboot_chrootpara detalhes.

Responder2

Por que você mudou de run-init para chroot? Você não deveria fazer isso. run-init exclui tudo na raiz do initramfs e depois faz chroot para $rootmnt. Você quer manter esse comportamento.

Quanto a como evitar a necessidade de reconstruir manualmente seu initramfs todas as vezes, edite a cópia mestre do script de inicialização em /usr/share/initramfs-tools. Isso deve funcionar pelo menos até você atualizar o pacote initramfs-tools.

Uma solução permanente seria corrigir o script init para reconhecer um argumento de inicialização para anexar algo ao rootmnt e enviar esse patch para inclusão no debian. Então você pode adicionar o argumento ao grub para entradas que devem ser inicializadas dessa forma.

informação relacionada