Linux-System von Chroot booten: Gibt es dafür eine bessere Möglichkeit?

Linux-System von Chroot booten: Gibt es dafür eine bessere Möglichkeit?

Ich möchte den Grub-Menüeintrag so einrichten, dass in ein chroot-System gebootet werden kann (habe chroot-Debootstrap installiert, um eine zu starke Beeinträchtigung des bestehenden Systems zu vermeiden).

Derzeit gehe ich folgendermaßen vor, um dies zu erreichen:

  1. Installieren Sie Linux-Image und Freunde in einer Chroot-Umgebung

  2. Remastern Sie initramfs manuell, um anstelle des üblichen Verhaltens ein Chroot-Verfahren in das System durchzuführen:

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.. Eintrag zu /boot/grub.cfg hinzufügen:

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

Es funktioniert, ist aber nicht einfach einzurichten und erfordert jedes Mal manuelles Hacken, wenn initrd geändert werden soll. Wie kann man es besser machen?

Antwort1

Ich bin auf dasselbe Problem gestoßen und bindies zu schreibendamit es problemlos auf verschiedenen Systemen (derzeit Debian, Ubuntu) funktioniert:

Führen Sie make_chroot_initrddas Skript aus, um aus dem vorhandenen ein neues chroot-fähiges Initrd-Image zu erstellen:

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

Das neue Image ist genau dasselbe, außer dass es jetzt einen chroot=Boot-Parameter verarbeiten kann.

Mit grub2 als Bootloader können Sie einen Eintrag hinzufügen zu /boot/grub/grub.cfg:
(oder vielleicht besser /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
}

(ändern Sie Dateien/Partitionen so, dass sie Ihren entsprechen)

Systemweite Installation

Wenn Sie damit zufrieden sind, können Sie die Änderungen dauerhaft machen
(bis das Paket initramfs-tools aktualisiert wird).
Im Chroot-System:

# 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

Von nun an wird das reguläre initrd-Image Chroot-Booten unterstützen.
Es ist nicht mehr nötig, ein separates initrd.chroot zu verwenden, das dann möglicherweise nicht mehr synchron ist.

Sehenboot_chrootfür Details.

Antwort2

Warum sind Sie von run-init zu chroot gewechselt? Das sollten Sie nicht tun. run-init löscht alles im Initramfs-Stamm und führt dann einen chroot zu $rootmnt durch. Dieses Verhalten möchten Sie beibehalten.

Um zu vermeiden, dass Sie Ihr initramfs jedes Mal manuell neu erstellen müssen, bearbeiten Sie die Masterkopie des Init-Skripts in /usr/share/initramfs-tools. Das sollte zumindest funktionieren, bis Sie das initramfs-tools-Paket aktualisieren.

Eine dauerhafte Lösung wäre, das Init-Skript so zu patchen, dass es ein Boot-Argument erkennt, um etwas an rootmnt anzuhängen, und diesen Patch zur Aufnahme in Debian einzureichen. Dann können Sie das Argument zu Grub für Einträge hinzufügen, die auf diese Weise gebootet werden sollen.

verwandte Informationen