Avvio in un chroot?


13

Ho Linux (Debian Jessie) installato su un disco rigido. Drive - sda1, ext4fs e sda2- swap

Ho una /chrootcartella C'è un altro sistema installato, nella /chrootcartella.

Domanda:

Come dire al bootmanager di avviare non il sistema principale (main, Debian Jessie), ma il sistema in / chroot ? Probabilmente, cambia /menu.lste /chroot/etc/fstab? ( vmlinuz root=/dev/sda1/chroot?)

O un'altra variante della domanda: è possibile avere Linux installato non nella directory principale della partizione, ma nella cartella? ( /another_linux/bin, /another_linux/home, /another_linux/etc, ...)


1
vmlinuz root=/dev/sda1/chrootnon funzionerà. Probabilmente si potrebbe simulare questo con un metodo simile a quello utilizzato in initrd. Vedi ad esempio qui . Montate /new_rootcome descritto lì, quindi invece di cd /new_rootfare cd /new_root/chroote continuare.
n. 'pronomi' m.

Risposte:


7

Questo non può essere fatto dal bootloader o dal kernel. Il parametro per l' rootopzione del kernel come in root=/dev/sda1appare come un percorso standard Unix, ma tali nomi di percorso sono interpretati secondo il filesystem attualmente montato. Al momento dell'interpretazione rootdell'opzione, non ci sono filesystem montati. Bene, quasi nessuno. Al momento dell'inizializzazione del kernel c'è un'istanza di un ramfsfilesystem minimo chiamato rootfsmontato come root per il processo iniziale in esecuzione start_kernel(). L'interpretazione effettiva del rootparametro opzione viene eseguita in una routine chiamata name_to_dev_t(). Una delle sintassi supportate è il /dev/nameformato, in cui il nome viene interpretato eseguendo un montaggio temporaneo del sysfsfilesystem nelrootfsroot e alla ricerca di una voce del dispositivo a blocchi che corrisponda al nome in /sys/block. Questo processo è spiegato in modo più dettagliato qui .

L'installazione come descritta dovrebbe essere eseguita avviando prima in un ambiente minimo come quello fornito da un initrd, montare il filesystem di root reale da /dev/sda1un mountpoint temporaneo, ad esempio /mnt/rootfs, quindi cambiare la directory di root in /mnt/rootfs/chrootusing pivot_root(8).

Questo è in qualche modo simile a come sono installati i filesystem di root per LinuX Containers ( LXC ). LXC è un'implementazione della virtualizzazione a livello di sistema operativo per Linux. La virtualizzazione a livello di sistema operativo viene comunemente utilizzata negli ambienti di hosting virtuale come alternativa leggera alla virtualizzazione completa gestita da un hypervisor. Nella virtualizzazione a livello di sistema operativo, un singolo kernel del sistema operativo è condiviso tra più istanze isolate dello spazio utente. Ogni istanza, spesso chiamata container, jail, Virtual Private Server (VPE) o Virtual Environment (VE), è essenzialmente un'installazione separata del sistema operativo alloggiata in una propria directory sul sistema host.


6

Mi sono imbattuto nello stesso problema e ho finito per scriverlo per farlo funzionare indolore su diversi sistemi (debian, Ubuntu attualmente):

Esegui lo make_chroot_initrdscript per creare una nuova immagine initrd abilitata per chroot da quella esistente:

#  ./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

La nuova immagine sarà esattamente la stessa, tranne ora che può gestire un chroot=parametro di avvio.

Con grub2 come bootloader puoi aggiungere una voce a /boot/grub/grub.cfg:
(o forse meglio /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
}

(cambia file / partizioni in modo che corrispondano ai tuoi)

Installazione a livello di sistema

Una volta che sei soddisfatto, puoi rendere permanenti le modifiche
(fino a quando il pacchetto initramfs-tools non viene aggiornato).
Nel 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

D'ora in poi l'immagine initrd regolare supporterà l'avvio chroot.
Non è necessario utilizzare un initrd.chroot separato che potrebbe non essere sincronizzato con esso.

Vedi boot_chroot per i dettagli.


3

Sì, puoi fare il trucco usando i sottovolumi Btrfs .

Per prima cosa devi convertire ext4 in btrfs come descritto qui .

Converti il ​​tuo chroot in subvilume se non lo è ancora:

 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

Ora hai un sottovolume chiamato path / to / chroot . Puoi verificarlo consudo btrfs subvol list /

Ora puoi creare l'avvio per sottovolume il record in grub. Basta aggiungere rootflags=subvol=path/to/chrootalla stringa di caricare il kernel Linux in voce di menu GRUB o utilizzare questo per sondare automaticamente.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.