Ich habe Linux (Debian Jessie) auf einer Festplatte installiert. Laufwerk - sda1
, ext4fs und sda2
- Swap
Ich habe einen /chroot
Ordner. Im /chroot
Ordner ist ein anderes System installiert .
Frage:
Wie kann der Bootmanager angewiesen werden, nicht das primäre System (main, Debian Jessie), sondern das System in / chroot zu booten ? Wahrscheinlich ändern /menu.lst
und /chroot/etc/fstab
? ( vmlinuz root=/dev/sda1/chroot
?)
Oder eine andere Variante der Frage: Ist es möglich, Linux nicht im Stammverzeichnis der Partition, sondern im Ordner zu installieren? ( /another_linux/bin
, /another_linux/home
, /another_linux/etc
, ...)
vmlinuz root=/dev/sda1/chroot
wird nicht funktionieren. Man könnte dies wahrscheinlich mit einer ähnlichen Methode simulieren wie ininitrd
. Siehe zB hier . Sie mounten/new_root
wie dort beschrieben, dann anstatt zucd /new_root
tuncd /new_root/chroot
und fortzufahren.Antworten:
Dies kann weder vom Bootloader noch vom Kernel ausgeführt werden. Der Parameter für die Kernel-
root
Option wie inroot=/dev/sda1
sieht aus wie ein Standard-Unix-Pfadname, aber solche Pfadnamen werden entsprechend dem aktuell gemounteten Dateisystem interpretiert. Zum Zeitpunkt derroot
Interpretation der Option sind keine Dateisysteme angehängt. Na ja, fast keine. Zur Kernel-Initialisierungszeit gibt es eine Instanz eines minimalenramfs
Dateisystems,rootfs
das als Root für den ersten ausgeführten Prozess bereitgestellt wirdstart_kernel()
. Die eigentliche Interpretation desroot
Optionsparameters erfolgt in einer aufgerufenen Routinename_to_dev_t()
. Eine der unterstützten Syntaxen ist das/dev/name
Format, bei dem der Name interpretiert wird, indem eine temporäre Bereitstellung dessysfs
Dateisystems in der ausgeführt wirdrootfs
root und auf der Suche nach einem Block-Geräteeintrag, der mit dem Namen unter übereinstimmt/sys/block
. Dieser Vorgang wird hier näher erläutert .Das beschriebene Setup müsste durchgeführt werden, indem zuerst in einer minimalen Umgebung gebootet wird, beispielsweise einer, die von a bereitgestellt wird
initrd
. Hängen Sie das echte Root-Dateisystem von/dev/sda1
einem temporären Mount-Punkt aus an/mnt/rootfs
, und ändern Sie dann das Root-Verzeichnis in/mnt/rootfs/chroot
usingpivot_root(8)
.Dies ähnelt in gewisser Weise der Einrichtung der Root-Dateisysteme für LinuX-Container ( LXC ). LXC ist eine Virtualisierungsimplementierung auf Betriebssystemebene für Linux. Die Virtualisierung auf Betriebssystemebene wird häufig in virtuellen Hosting-Umgebungen als einfache Alternative zur vollständigen Virtualisierung verwendet, die von einem Hypervisor verwaltet wird. Bei der Virtualisierung auf Betriebssystemebene wird ein einzelner Betriebssystemkern von mehreren isolierten Benutzerbereichsinstanzen gemeinsam genutzt. Jede Instanz, die häufig als Container, Gefängnis, Virtual Private Server (VPE) oder Virtual Environment (VE) bezeichnet wird, ist im Wesentlichen eine separate Betriebssysteminstallation, die in einem eigenen Verzeichnis auf dem Hostsystem gespeichert ist.
quelle
Ich bin auf dasselbe Problem gestoßen und habe es schließlich so geschrieben , dass es auf verschiedenen Systemen (Debian, Ubuntu derzeit) problemlos funktioniert:
Führen Sie ein
make_chroot_initrd
Skript aus, um aus dem vorhandenen ein neues chroot-fähiges initrd-Image zu erstellen:Das neue Image ist genau das gleiche, 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 besser
/etc/grub.d/40_custom
)(Ändern Sie die Dateien / Partitionen, um sie an Ihre anzupassen.)
Systemweite Installation
Sobald Sie damit zufrieden sind, können Sie die Änderungen dauerhaft vornehmen
(bis das initramfs-tools-Paket aktualisiert wird).
Im Chroot-System:
Von nun an unterstützt das reguläre initrd-Image das chroot-Booten.
Es muss kein separater initrd.chroot verwendet werden, der dann möglicherweise nicht mehr mit ihm synchronisiert ist.
Siehe boot_chroot für Details.
quelle
Ja, Sie können den Trick mit Btrfs-Subvolumes ausführen .
Zuerst müssen Sie ext4 in btrfs konvertieren, wie hier beschrieben .
Konvertieren Sie Ihre Chroot in ein Subvilume, wenn dies noch nicht der Fall ist:
Jetzt haben Sie ein Subvolume namens path / to / chroot . Sie können es mit überprüfen
sudo btrfs subvol list /
Jetzt können Sie einen Boot-to-Subvolume-Datensatz in Grub erstellen.
rootflags=subvol=path/to/chroot
Fügen Sie einfach im Menüpunkt grub eine Zeichenfolge zum Laden des Linux-Kernels hinzu oder verwenden Sie diese , um automatisch zu testen.quelle