Also gut, im Grunde versuche ich, Gentoo auf ähnliche Weise wie WUBI zu starten. Ich habe eine Installation auf einer ext4-formatierten Loopback-Datei, BURG unter dem Windows Bootloader installiert und den Kernel / Initramfs zum Booten verfügbar. Das Booten hat noch einige Probleme (die, von denen ich denke, dass ich sie lösen kann, sind hauptsächlich auf kleine Probleme mit den Programmen selbst zurückzuführen), aber ich habe die Grundidee:
- Richten Sie die Busybox ein und holen Sie sich Geräte mit mdev
- Analysieren Sie die Befehlszeilenoptionen, um festzustellen, ob Sie nach einem echten Root oder einem Loop-Root fragen
- Wenn es sich um eine echte Wurzel handelt, mounten Sie sie
/root
und wechseln Sie die Wurzel, führen Sie sie aus/sbin/init
. - Wenn Loop-Root, mounten Sie die Host-Partition auf
/host
. - Loopback (
/host/${LOOP}
) montieren/root
- Verschieben Sie den Mountpunkt des Hosts (
mount -o move /host /root/host
für Busybox) - Root wechseln zu
/root
und ausführen/sbin/init
Ich habe das init
Skript hier:
#!/bin/sh
# Rescue shell in case of error.
rescue_shell() {
echo "Something went wrong. Dropping you to a shell."
exec /bin/sh
}
parse_opt() {
case "$1" in
*\=*)
echo "$1" | cut -d= -f2-
;;
esac
}
# Set up BusyBox...
busybox --install -s
# Mount the /proc and /sys filesystems.
mount -t proc none /proc
mount -t sysfs none /sys
# Populate /dev
echo ":: Populating /dev..."
echo /sbin/mdev > /proc/sys/kernel/hotplug
mdev -s
# Get command line options...
for x in ${CMDLINE}
do
case "${x}" in
root\=*)
ROOT=`parse_opt "${x}"`
;;
# Loadloop
loop\=*)
LOOP=`parse_opt "${x}"`
;;
ntfsroot)
NTFSROOT=1
;;
esac
done
if [ "${NTFSROOT}" != 1 ]
then
# Mount the root filesystem, plain and simple.
echo ":: Mounting real root..."
mount -o ro "${ROOT}" /mnt/root || rescue_shell
else
# Load up an NTFS-based root.
echo ":: NTFS Root mount requested. Mounting..."
ntfs-3g "${ROOT}" /host
if [ -f "/host/${LOOP}" ]
then
mount -o loop,ro "/host/${LOOP}" /root || rescue_shell
echo ":: Mounted. Moving host..."
mount -o move /host /root/host || rescue_shell
echo ":: Mounted."
else
"!! ERROR: Invalid/nonexistant loop given!"
rescue_shell
fi
fi
# Clean up.
umount /proc
umount /sys
# Boot the real thing.
echo ":: Switching to root and calling init..."
exec switch_root /root /sbin/init
Eigentlich nichts Kompliziertes. NTFS-3G stimmt anscheinend nicht mit der Busybox-Implementierung von mount
und so überein (es fügt aus irgendeinem Grund den Parameter -i hinzu und ntfs-3g
scheißt aus), daher denke ich darüber nach, nur über die coreutils
Implementierung oder so etwas zu kopieren . Das und ich muss untersuchen, was zum Mounten von Loopback-Partitionen benötigt wird (es gibt einen Fehler wie "Datei nicht gefunden", wenn ich versuche, den Loopback manuell zu mounten). Trotzdem denke ich, dass dies einfach genug ist, um es selbst herauszufinden.
Was ich mich jedoch wundere, ist das Herunterfahren. Sobald der switch_root
Vorgang abgeschlossen ist, bleibt auf dem System eine /
Loopback-Datei und /dev/sda2
(dies ist eine Windows 7-Installation) aktiviert /host
. Jetzt gibt es keine Möglichkeit zum Aushängen /host
, da es verwendet wird. Sie können die Bereitstellung jedoch nicht aufheben, /
während im Root Dateisysteme in einem Unterverzeichnis bereitgestellt sind. WUBI-basierte Ubuntu-Installationen müssen sich demselben Dilemma stellen. Wie überwindet man dieses Problem? Es ist ein Henne-Ei-Problem und es nervt mich wirklich.
Ich habe etwas in der Art eines Boot-Skripts in Betracht gezogen, das einen temporären Cache von Dateien für ein grundlegendes, grundlegendes Stammverzeichnis enthält (wie ein Initramfs, aber umgekehrt). Es würde zuletzt ausgeführt, die Dateien in ein tmpfs kopiert, das Stammverzeichnis geschwenkt und möglicherweise wieder in das ursprüngliche Layout der initramfs zurückversetzt. Ich würde im Wesentlichen Folgendes tun:
- Montiere ein
tmpfs
at/tmp/shutdown/
oder so. - Kopieren Sie die heruntergefahrenen Dateien (vielleicht
/usr/share/shutdown/
oder so) pivot_root
um die Wurzel zu verschieben/loop
und in die tmpfs zu chroot.mount --move
das/loop/host
zu/host
- Abmontage
/loop
- Abmontage
/host
- Fahren Sie sauber herunter, da alle Partitionen nicht gemountet wurden.
Ich habe Gentoo jedoch noch nie so stark modifiziert. Ist das mit einem Initscript möglich? Ich möchte nicht, dass dies durch Aktualisierungen des Basislayouts oder eines anderen Ebuilds überschrieben wird, da dies zu einer Funktionsstörung beim Herunterfahren führen würde (und ich möchte die Hostpartition wirklich nicht verlieren). Es gibt auch das Problem herauszufinden, ob das Init-System von Gentoo so etwas überhaupt unterstützt. Es scheint sauber genug zu sein (wenn auch etwas hackisch), aber ich bin mir nicht sicher. Ich möchte wissen, ob Ubuntu es anders macht und wenn ja, wie? Anregungen wären hilfreich.
EDIT :
Ich habe den Stiefel zum Laufen gebracht. Nur eine Frage der Verwendung der coreutils
Version von mount
, wie ich dachte. Ich habe jedoch die Fehler, die ich beim Herunterfahren erwartet hatte. Fehler, weil Dateisysteme nicht ausgehängt werden können, und Fehler beim Aufzeichnen mit dem Loopback-FS. Ich habe noch keine Ahnung, wie ich das beheben soll.
EDIT 2:
Okay, nun, ich habe etwas in Gang gebracht, das ... irgendwie funktioniert. Ich habe im Grunde genommen /etc/init.d/{halt.sh,reboot.sh,shutdown.sh}
Folgendes bearbeitet und getan:
/host
ZurRC_NO_UMOUNTS
Variablen hinzugefügt , die verhindert , dass das EXT4-Modul wegen eines Journaling-Fehlers verstopft- Zu
-o `pidof ntfs-3g`
den Optionen für hinzugefügtkillall5
(um sicherzustellen, dass ntfs-3g nicht getötet wurde) - Die Datei shutdown.sh und restart.sh wurde geändert, um ein tmpfs in / boot / shutdownfs zu mounten und einige initramfs-Dateien dort zu kopieren, das Stammverzeichnis zu schwenken und dann darin zu chrootieren und entweder / down oder / restart aufzurufen.
- Diese beiden Skripte führen im Wesentlichen eine schnelle und schmutzige Einrichtung von / proc und / sys durch, verschieben das Verzeichnis / root / host nach / host und führen dann die verzögerte Bereitstellung durch. Ich konnte keine regelmäßigen Abmeldungen zum Laufen bringen (das Dateisystem wäre immer noch ausgelastet), aber zumindest scheint dies das Erbrechen der Dateisysteme vollständig zu verhindern.
Diese Lösung ist immer noch unterdurchschnittlich, daher wäre jede Hilfe willkommen.
Antworten:
Hier kein Experte, aber nach dem Lesen der
umount
Manpage sehe ich ein Flag, das speziell für Geräte mit Schleifenmontage gilt:Lesen Sie auch weiter in
losetup
(noch in Manpages), ich würde Ihnen empfehlen, es möglicherweise zum Debuggen zu verwenden, da es verwendet werden kann, um den Status von Loop-Geräten anzuzeigen.Der Link zu der Manpage, auf die ich mich beziehe, ist hier . Diese Option:
Möglicherweise erhalten Sie einen Hinweis, und einige andere Flags können beim Aufheben der Bereitstellung der geloopten Geräte hilfreich sein.
Da ich Ihre Situation nicht wiederholen kann, kann ich Ihnen nur Möglichkeiten vorschlagen, wie Sie Ihre Antwort selbst finden können. Es tut mir leid, dass ich Ihnen nicht weiterhelfen kann.
quelle
man 8 umount
::quelle