¿Arrancar en un chroot?

13

Tengo Linux (Debian Jessie) instalado en un disco duro. Drive - sda1, ext4fs y sda2- swap

Tengo una /chrootcarpeta Hay instalado otro sistema, en la /chrootcarpeta.

Pregunta:

¿Cómo decirle al administrador de arranque que arranque no el sistema primario (principal, Debian Jessie), sino el sistema en / chroot ? Probablemente, cambio /menu.lsty /chroot/etc/fstab? ( vmlinuz root=/dev/sda1/chroot?)

O otra variante de la pregunta: ¿es posible tener Linux instalado no en el directorio raíz de la partición, sino en la carpeta? ( /another_linux/bin` /another_linux/home` /another_linux/etc, ...)

skrepki
fuente
1
vmlinuz root=/dev/sda1/chrootno funciona Probablemente se podría simular esto con un método similar al que se usa initrd. Ver, por ejemplo, aquí . Se monta /new_rootcomo se describe allí, luego en lugar de cd /new_roothacer cd /new_root/chrooty continuar.
n. 'pronombres' m.

Respuestas:

7

Esto no lo puede hacer el gestor de arranque o el kernel. El parámetro de la rootopción del núcleo , como en, root=/dev/sda1parece un nombre de ruta estándar de Unix, pero dichos nombres de ruta se interpretan de acuerdo con el sistema de archivos actualmente montado. En el momento en que rootse interpreta la opción, no hay sistemas de archivos montados. Bueno, casi ninguno. En el momento de la inicialización del núcleo hay una instancia de un ramfssistema de archivos mínimo llamado rootfsmontado como la raíz del proceso inicial en ejecución start_kernel(). La interpretación real del rootparámetro de opción se realiza en una rutina llamada name_to_dev_t(). Una de las sintaxis compatibles es el /dev/nameformato, donde el nombre se interpreta haciendo un montaje temporal del sysfssistema de archivos en elrootfsroot, y buscando una entrada de dispositivo de bloque que coincida con el nombre debajo /sys/block. Este proceso se explica con más detalle aquí .

La configuración, tal como se describe, deberá realizarse iniciando primero en un entorno mínimo, como el proporcionado por un initrd, monte el sistema de archivos raíz real desde /dev/sda1un punto de montaje temporal, por ejemplo /mnt/rootfs, luego cambie el directorio raíz para /mnt/rootfs/chrootusar pivot_root(8).

Esto es algo similar a cómo se configuran los sistemas de archivos raíz para LinuX Containers ( LXC ). LXC es una implementación de virtualización a nivel de sistema operativo para Linux. La virtualización a nivel de sistema operativo se usa comúnmente en entornos de alojamiento virtual como una alternativa ligera a la virtualización completa administrada por un hipervisor. En la virtualización a nivel del sistema operativo, un solo núcleo del sistema operativo se comparte entre varias instancias aisladas de espacio de usuario. Cada instancia, a menudo llamada contenedor, cárcel, Servidor Privado Virtual (VPE) o Entorno Virtual (VE), es esencialmente una instalación de sistema operativo separada alojada en un directorio propio en el sistema host.

Thomas Nyman
fuente
6

Encontré el mismo problema y terminé escribiendo esto para que funcione sin problemas en diferentes sistemas (debian, ubuntu actualmente):

Ejecute el make_chroot_initrdscript para crear una nueva imagen initrd habilitada para chroot a partir de la 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

La nueva imagen será exactamente la misma, excepto que ahora puede manejar un chroot=parámetro de arranque.

Con grub2 como gestor de arranque puede agregar una entrada a /boot/grub/grub.cfg:
(o tal vez mejor /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
}

(cambie archivos / particiones para que coincidan con los suyos)

Instalación en todo el sistema

Una vez que esté satisfecho con él, puede hacer que los cambios sean permanentes
(hasta que se actualice el paquete initramfs-tools).
En el sistema chrooteado:

# 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 ahora en adelante, la imagen initrd regular admitirá el arranque chroot.
No es necesario usar un initrd.chroot separado que puede no estar sincronizado con él.

Ver boot_chroot para más detalles.

exprimir
fuente
3

Sí, puedes hacer el truco usando subvolúmenes Btrfs .

Primero necesita convertir ext4 a btrfs como se describe aquí .

Convierta su chroot a subvilume si aún no lo está:

 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

Ahora tiene un subvolumen llamado ruta / a / chroot . Puedes consultarlo consudo btrfs subvol list /

Ahora puede crear un registro de arranque a subvolumen en grub. Simplemente agregue rootflags=subvol=path/to/chroota la cadena de carga del kernel de Linux en el elemento del menú grub o use esto para sondear automáticamente.

Sergei
fuente