Inicializa 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 pasta /chroot . Há outro sistema instalado, na pasta /chroot .

Pergunta:

Como dizer ao gerenciador de inicialização, para inicializar não o sistema primário (main, Debian Jessie), mas o sistema em / chroot ? Provavelmente, altere /menu.lst e /chroot/etc/fstab ? ( vmlinuz root=/dev/sda1/chroot ?)

Ou outra variante da pergunta: é 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 , ...)

    
por skrepki 06.08.2013 / 18:19

3 respostas

7

Isto não pode ser feito pelo bootloader ou kernel. O parâmetro para a opção root do kernel, como em root=/dev/sda1 , parece 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 opção root é interpretada, não há sistemas de arquivos montados. Bem, quase nenhum. No momento da inicialização do kernel, há uma instância de um sistema de arquivos ramfs mínimo chamado rootfs montado como a raiz para o processo inicial executando start_kernel() . A interpretação real do parâmetro root da opção é feita em uma rotina chamada name_to_dev_t() . Uma das sintaxes suportadas é o formato /dev/name , em que o nome é interpretado executando uma montagem temporária do sistema de arquivos sysfs na raiz rootfs e procurando uma correspondência de entrada de dispositivo de bloco nome em /sys/block . Este processo é explicado em mais detalhes aqui .

A configuração descrita precisará ser feita primeiro pela inicialização em um ambiente mínimo, como aquele fornecido por um initrd , montar o sistema de arquivos raiz real a partir de /dev/sda1 em um ponto de montagem temporário, por exemplo, /mnt/rootfs e, em seguida, altere o diretório raiz para /mnt/rootfs/chroot usando pivot_root(8) .

Isso é um pouco semelhante a 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 o 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, freqüentemente chamada de container, jail, Virtual Private Server (VPE) ou Virtual Environment (VE), é essencialmente uma instalação separada do sistema operacional hospedada em um diretório próprio no sistema host.

    
por 06.08.2013 / 23:22
4

Eu me deparei com o mesmo problema e terminei escrevendo isto para fazê-lo funcionar sem problemas em diferentes sistemas (debian, ubuntu atualmente) :

Execute o script make_chroot_initrd para criar uma nova imagem initrd ativada pelo chroot a partir da 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 ela pode manipular um parâmetro de inicialização chroot= .

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 coincidir com os seus)

Instalação em todo o sistema

Uma vez que você está feliz com isso, você pode tornar as mudanças permanentes. (até que o pacote initramfs-tools seja atualizado).
No sistema chrooted:

# 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á o arranque por chroot.
Não é necessário usar um initrd.chroot separado, que pode sair de sincronia com ele.

Veja boot_chroot para detalhes.

    
por 06.12.2014 / 15:08
3

Sim, você pode fazer o truque usando subvolumes do Btrfs .

Primeiro você precisa converter ext4 para btrfs como descrito aqui .

Converta seu chroot em subvilume 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 um subvolume chamado path / to / chroot . Você pode verificar com sudo btrfs subvol list /

Agora você pode criar boot para o registro de subvolume no grub. Basta adicionar rootflags=subvol=path/to/chroot à string de carregamento do kernel do Linux no item de menu do grub ou usar este para sondar automaticamente.

    
por 21.04.2016 / 17:41