Wie geht WUBI beim Herunterfahren mit Partitionen um?


10

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:

  1. Richten Sie die Busybox ein und holen Sie sich Geräte mit mdev
  2. Analysieren Sie die Befehlszeilenoptionen, um festzustellen, ob Sie nach einem echten Root oder einem Loop-Root fragen
  3. Wenn es sich um eine echte Wurzel handelt, mounten Sie sie /rootund wechseln Sie die Wurzel, führen Sie sie aus /sbin/init.
  4. Wenn Loop-Root, mounten Sie die Host-Partition auf /host.
  5. Loopback ( /host/${LOOP}) montieren/root
  6. Verschieben Sie den Mountpunkt des Hosts ( mount -o move /host /root/hostfür Busybox)
  7. Root wechseln zu /rootund ausführen/sbin/init

Ich habe das initSkript 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 mountund so überein (es fügt aus irgendeinem Grund den Parameter -i hinzu und ntfs-3gscheißt aus), daher denke ich darüber nach, nur über die coreutilsImplementierung 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_rootVorgang 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:

  1. Montiere ein tmpfsat /tmp/shutdown/oder so.
  2. Kopieren Sie die heruntergefahrenen Dateien (vielleicht /usr/share/shutdown/oder so)
  3. pivot_rootum die Wurzel zu verschieben /loopund in die tmpfs zu chroot.
  4. mount --movedas /loop/hostzu/host
  5. Abmontage /loop
  6. Abmontage /host
  7. 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 coreutilsVersion 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:

  • /hostZur RC_NO_UMOUNTSVariablen hinzugefügt , die verhindert , dass das EXT4-Modul wegen eines Journaling-Fehlers verstopft
  • Zu -o `pidof ntfs-3g`den Optionen für hinzugefügt killall5(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.


Könnten Sie einfach WUBI installieren und dann die Systemdateien mit Gentoo austauschen, nachdem es funktioniert hat?
Zach

Antworten:


1

Hier kein Experte, aber nach dem Lesen der umountManpage sehe ich ein Flag, das speziell für Geräte mit Schleifenmontage gilt:

-d     In case the unmounted device was a loop device, also free this loop device.

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:

-a     Show status of all loop devices.

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.


0

man 8 umount::

-l

Faul absteigen. Trennen Sie das Dateisystem jetzt von der Dateisystemhierarchie und bereinigen Sie alle Verweise auf das Dateisystem, sobald es nicht mehr ausgelastet ist. (Benötigt Kernel 2.4.11 oder höher.)

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.