Ich möchte versuchen, einen Computer so einzurichten, dass mehrere Linux-Installationen alle im selben Dateisystem installiert sind. Zum Beispiel würde die Dateisystem - 3 Ordner: /Ubuntu_Precise
, /Ubuntu_Oneiric
, und /Ubuntu_Natty
.
(Ich weiß, dass Sie dies mit BTRFS und Subvolumes tun können, aber ich möchte EXT4 für die Geschwindigkeit verwenden).
Ich habe einmal mehrere Installationen verschiedener Distributionen mit BTRFS eingerichtet, und nachdem dies funktioniert hat, weiß ich, dass Grub das vmlinuz- und initrd-Image gut von "nicht standardmäßigen" Pfaden booten kann. Aber als ich das BTRFS-Ding machte, gab es das rootflags=subvol=@<subvolume_name>
, was dem Kernel sagte, dass er dieses Subvolume als / im Dateisystem mounten soll. Gibt es ein Argument dafür, dass Sie den Kernel übergeben könnten, der dazu führen würde, dass ein Unterordner in einer Partition als / gebunden und dann gestartet wird?
Ich denke für die anderen Teile bin ich ziemlich nah. Ich weiß, wie man ein Bind-Mount spezifiziert /etc/fstab
. Wenn ich mein System mit mehreren Linux-Installationen in BTRFS-Subvolumes einrichte, bin ich es gewohnt, eine Distribution in einer VM zu installieren und sie dann mit rsync zu migrieren, sodass ich mir keine Sorgen darüber mache, was ich tun müsste Holen Sie sich die richtige Konfiguration, ich versuche nur herauszufinden, was die richtige Konfiguration wäre. Sobald ich das weiß, sollte ich in der Lage sein, die Migration in die Unterordner und die Dateibearbeitung einfach genug durchzuführen.
Ich weiß bereits über Virtualisierung und Partitionen Bescheid, aber das ist nicht das, wonach ich suche. Der Zielcomputer verfügt nicht über genügend Strom für die Virtualisierung, und Partitionen teilen sich keinen freien Speicherplatz. Ich möchte ein System einrichten, das Dual / Triple / Quad / etc Linux-Distributionen bootet, aber das tut es mit einem Dateisystem, so dass es keinen Fall von "Ich habe freien Speicherplatz, aber es ist in der falschen Partition!" Gibt.
Wenn jemand Vorschläge hat, wie ich meine Frage oder ihren Titel klarer bearbeiten kann, bin ich ganz Ohr.
quelle
Antworten:
Kurze Antwort - Soweit ich weiß, gibt es keine sofort einsatzbereite Arbeitslösung für Ihre spezifischen Anforderungen. Sie müssen jedes Initramfs jeder Distribution anpassen, um Ihre spezifischen Anforderungen zu erfüllen.
Lange Antwort - ja, das ist möglich. Heutzutage verwenden die meisten Linux-Distributionen ein initramfs, das vom Bootloader in den Speicher geladen und dann vom Kernel entpackt wird. Dort wird es ausgeführt,
/sbin/init
das für das Einrichten des frühen Benutzerbereichs verantwortlich ist (Ausführen von udev, Laden von Modulen, Starten von Plymouth, Abfragen der Krypto-Passphrase, Einrichten des Netzwerks für Netzwerk-Mounts, ... Sie nennen es). Da können Sie Ihre eigenen Skripte ausführen und benutzerdefinierte Boot-Parmater auswerten.Beispiel für Debian
Wenn Sie Debian verwenden (sollte mit Ubuntu identisch sein), sollten Sie in der Lage sein, ein Skript zu platzieren,
/etc/initramfs-tools/scripts/init-bottom/
das ausgeführt wird, bevor init gestartet wird. Weitere Informationen zum Skript, den verschiedenen Verzeichnissen und dem Layout finden Sie unter man initramfs-tools . Sie müssenrootmnt
das Zielverzeichnis anpassen und hinzufügen.Beispielskript (ungetestet), das entweder als
/etc/initramfs-tools/scripts/local-bottom/00-myroot
oder installiert werden sollte/usr/share/initramfs-tools/scripts/init-top/00-myroot
:Die Idee ist, anzupassen,
rootmnt
welche im initramfs-init
Skript verwendet wird, um die echte Init zu starten / auszuführen. Da das Root-Gerät bereits in derinit-bootom
Phase bereitgestellt ist, können Sie das Zielverzeichnis einfach anpassen / ändern.Um dieses Skript zu verwenden, fügen Sie einfach einen neuen Boot-Parameter hinzu, kopieren Sie das Skript, machen Sie es ausführbar, generieren Sie Ihre initramfs neu und fügen Sie einen Boot-Parameter für Ihre Linux-Distribution hinzu, z
rootdir=/Ubuntu_Precise
.quelle
mount /dev/rootdevice /mountpoint
nach dem Ausführen des Systems tunHier sind zwei Möglichkeiten, die in Ubuntu Bionic (und möglicherweise anderswo) funktionieren. Ich habe nicht genug Repräsentanten, um zu kommentieren, aber bionisch: / usr / share / initramfs-tools / init sucht in / etc / fstab nach / usr direkt nach dem Aufruf von mountroot und vor dem Aufrufen der * -bottom-Skripte. Das untere Skript (wie in einer anderen Antwort hier vorgeschlagen) ist "zu spät". stattdessen empfehle ich diese:
quelle
Das Booten verschiedener Linux-Versionen ohne Probleme mit der Partitionstabelle ist für verschiedene Zwecke interessant. Eine alternative Lösung für ein freigegebenes Dateisystem besteht darin, Loop-Volumes zu verwenden. Hier sind die wenigen erforderlichen Änderungen erforderlich, vorausgesetzt, Sie haben eine / debian-Loop-Datei / volume im Dateisystem / dev / sdb1 (Ich verwende die aktuelle GNU / Debian-Seite / unstable für Haupt- und Loop-Betriebssysteme).
In grub als Linux-Befehlszeile definierte Argumente werden von initrd / init auf env gesetzt, also:
Schleife erlauben, das Volume über "sich selbst" zu mounten, der Standard-Skript-Flow führt eine
mount /dev/sdb1 /root
Option aus, indem wir nur / dev / sdb1 als rw neu mounten, wenn es ro war, und dann immer a anhängenmount -o loop /root/debian /root
.Sie müssen auch ein Modul in das Initram vorladen (dann vergessen Sie nicht, update-initramfs auszuführen).
Ich weiß nicht, inwieweit die Verwendung von Schleifen die Leistung beeinflusst oder Ressourcen verschwendet. Ich frage mich, ob das Mounten von ext4 über ext4 die Wahrscheinlichkeit eines Dateisystemfehlers verdoppelt, aber ich vermute, dass eine Optimierung durchgeführt werden könnte. Vielleicht gibt es eine bessere Möglichkeit, Loop zu verwenden, weniger hackisch, wenn es eine gibt, lassen Sie es mich bitte wissen, weil ich nicht gefunden habe.
quelle
Dies ist keine Antwort, aber ich möchte einen Punkt über Ulrichs Antwort und Kommentare klarstellen (ich kann oben keinen Kommentar abgeben).
Die von Ulrich vorgeschlagene Lösung "funktioniert" (noch nicht getestet), aber dann erhalten Sie ein nicht wieder montierbares Dateisystem . Um dieses Problem zu umgehen (meiner Meinung nach hässlich), können Sie die fs vor dem Chrooten als rw bereitstellen ( wie hier vorgeschlagen ). Achten Sie jedoch auf fehlerhafte Init-Skripte. Ich denke, diese Problemumgehung hat mehr Nebenwirkungen (wie kaputte fs, die versuchen, ro erneut zu montieren und fehlschlagen).
Ich verwende Kernel 3.2 mit ext4 und das Mounten eines bereits gemounteten Entwicklers in der Chroot gibt EBUSY immer noch, wie Psusi kommentierte.
quelle