Inicializar em um chroot?

13

Eu tenho o Linux (Debian Jessie) instalado em um disco rígido. Drive - sda1, ext4fs e sda2- swap

Eu tenho uma /chrootpasta Há outro sistema instalado, na /chrootpasta

Questão:

Como saber ao gerenciador de inicialização, para inicializar não o sistema principal (principal, Debian Jessie), mas o sistema em / chroot ? Provavelmente, mudar /menu.lste /chroot/etc/fstab? ( vmlinuz root=/dev/sda1/chroot?)

Ou outra variante de questão: é possível ter o linux instalado não no diretório raiz da partição, mas na pasta? ( /another_linux/bin, /another_linux/home, /another_linux/etc, ...)

skrepki
fonte
1
vmlinuz root=/dev/sda1/chrootnão vai funcionar. Provavelmente, poderia-se simular isso com um método semelhante ao utilizado initrd. Veja, por exemplo, aqui . Você monta /new_rootcomo descrito lá, em vez de cd /new_rootfazer cd /new_root/chroote continuar.
n. 'pronomes' m.

Respostas:

7

Isso não pode ser feito pelo gerenciador de inicialização ou pelo kernel. O parâmetro para a rootopção do kernel , como em, se root=/dev/sda1parece com um nome de caminho padrão do Unix, mas esses nomes de caminho são interpretados de acordo com o sistema de arquivos atualmente montado. No momento em que a rootopção é interpretada, não há sistemas de arquivos montados. Bem, quase nenhum. No momento da inicialização do kernel, há uma instância de um ramfssistema de arquivos mínimo chamado rootfsmontado como raiz do processo inicial em execução start_kernel(). A interpretação real do rootparâmetro option é feita em uma rotina chamada name_to_dev_t(). Uma das sintaxes suportadas é o /dev/nameformato, em que o nome é interpretado fazendo uma montagem temporária do sysfssistema de arquivos no diretóriorootfsraiz e procurando uma entrada de dispositivo de bloco que corresponda ao nome em /sys/block. Este processo é explicado em mais detalhes aqui .

A configuração conforme descrita precisaria ser feita inicializando primeiro em um ambiente mínimo, como o fornecido por um initrd, monte o sistema de arquivos raiz real a partir de /dev/sda1um ponto de montagem temporário, por exemplo /mnt/rootfs, altere o diretório raiz para /mnt/rootfs/chrootuso pivot_root(8).

Isso é semelhante à forma como os sistemas de arquivos raiz para LinuX Containers ( LXC ) são configurados. O LXC é uma implementação de virtualização no nível do sistema operacional para Linux. A virtualização no nível do sistema operacional é comumente usada em ambientes de hospedagem virtual como uma alternativa leve à virtualização completa gerenciada por um hipervisor. Na virtualização no nível do sistema operacional, um único kernel do sistema operacional é compartilhado entre várias instâncias isoladas do espaço do usuário. Cada instância, geralmente chamada de contêiner, prisão, Servidor Virtual Privado (VPE) ou Ambiente Virtual (VE), é essencialmente uma instalação de sistema operacional separada, hospedada em um diretório próprio no sistema host.

Thomas Nyman
fonte
6

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

Execute o make_chroot_initrdscript para criar uma nova imagem initrd ativada 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 lidar com um chroot=parâmetro de inicialização.

Com o grub2 como carregador de inicialização, 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
}

(mude os arquivos / partições para combinar com os 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 com 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

A partir de agora, a imagem regular do initrd suportará a inicialização chroot.
Não é necessário usar um initrd.chroot separado que pode ficar fora de sincronia com ele.

Veja boot_chroot para detalhes.

limões
fonte
3

Sim, você pode executar o truque usando os subvolumes Btrfs .

Primeiro você precisa converter ext4 para btrfs, conforme descrito aqui .

Converta seu chroot em sub-volume, se ainda não estiver:

 sudo mv /path/to/chroot /path/to/chroot-tmp
 sudo btrfs subvol create /path/to/chroot
 sudo mv /path/to/chroot-tmp/* /path/to/chroot
 sudo mv /path/to/chroot-tmp/* /path/to/chroot -r # for directories

Agora você tem o subvolume chamado path / to / chroot . Você pode verificá-lo comsudo btrfs subvol list /

Agora você pode criar a inicialização para subvolume o registro no grub. Basta adicionar rootflags=subvol=path/to/chrootà string de carregamento do kernel do linux no item de menu grub ou usar isso para sondar automaticamente.

Sergei
fonte