Der Bootvorgang funktioniert nicht richtig, nachdem alle Dateien von meinem VM-Laufwerk verschoben und dann wieder darauf zurück verschoben wurden.

Der Bootvorgang funktioniert nicht richtig, nachdem alle Dateien von meinem VM-Laufwerk verschoben und dann wieder darauf zurück verschoben wurden.

Ich habe eine Ubuntu 12.04 32-Bit-VM in VirtualBox mit einer .vdi-Festplatte erstellt. Dann mounte ich diese Festplatte mit qemu-nbd und verschiebe alle Dateien von ihr und dann wieder zurück auf sie. Wenn ich die VM erneut starte, erhalte ich unterschiedliche Ergebnisse:

  1. Ubuntu teilt mir mit, dass ein Fehler aufgetreten ist, und fragt, ob ich ihn beheben/überspringen/ignorieren/manuell beheben möchte. Wenn ich ihn behebe, wird es neu gestartet und in ein TTY gebootet. Wenn ich ihn ignoriere, wird es in ein TTY gebootet. Überspringen/manuell beheben habe ich noch nicht versucht.
  2. Beim Booten erscheint ein leerer violetter Bildschirm. Einfrieren. Bei nachfolgenden Resets erscheint beim Booten ein blinkender Textcursor.
  3. Booten Sie mit dem Ubuntu-Begrüßungsbildschirm und lassen Sie es einfrieren. Beim Zurücksetzen siehe Nummer 1 in dieser Liste.

Meine Frage ist: Warum passiert das? Gibt es in Grub eine Festplattenhardwareadresse, die auf /boot verweist? Gibt es eine Möglichkeit, Dateien in der VHD zu entfernen und zu ersetzen, ohne dass dieses Problem auftritt?

So reproduzieren Sie dieses Ergebnis (hoffe ich):

  1. Erstellen Sie eine VM in VirtualBox mit einer 8 GB großen virtuellen VDI-Festplatte (im weiteren Verlauf der Frage „ub.vdi“ genannt).
  2. Booten Sie mit der Ubuntu 12.04.3 32-Bit-Installations-ISO
  3. „Probieren Sie Ubuntu aus“.
  4. Richten Sie eine MS-DOS-Partitionstabelle und zwei primäre Partitionen ein, einen 2048-MiB-Swap-Speicherplatz und den Rest eine Ext4-Partition. (Gparted verwendet).
  5. Installieren Sie Ubuntu auf der ext4-Partition
  6. Fahren Sie die VM herunter
  7. Navigieren Sie zu Ihrem VM-Verzeichnis und führen Sie das folgende Skript aus:

#!bin/bash
# load the nbd module
sudo modprobe nbd
# make a folder for our virtual disk files
mkdir os_files
# load the virtual disk as a device (nbd0)
sudo qemu-nbd -c /dev/nbd0 ub.vdi
sleep 1
# create a directory and mount the os partition to it
MNT_DIR=$(mktemp -d)
sudo mount /dev/nbd0p2 $MNT_DIR
# move the os files off, then back onto the virtual disk
find $MNT_DIR -maxdepth 1 -mindepth 1 | xargs -I{} sudo mv {} os_files/
find os_files/ -maxdepth 1 -mindepth 1 | xargs -I{} sudo mv {} $MNT_DIR
# clean up
sudo umount $MNT_DIR
sudo qemu-nbd -d /dev/nbd0
rm os_files/ $MNT_DIR -r
unset MNT_DIR

Warum tust du das?

Im Rahmen einer vertraglichen Anforderung muss ich die virtuelle Festplatte in der Versionskontrolle speichern. Ein riesiger Binärblob (virtuelle Festplatte) in der Versionskontrolle ist ein Ärgernis, vor allem für Klonen (Git)/Auschecken (SVN), aber auch für Diffs. Ich habe überlegt, es in mehrere Dateien aufzuteilen, aber ich muss in der Lage sein, das in (5) oben extrahierte Betriebssystem/die extrahierten Daten zu bearbeiten. Beachten Sie, dass mein VCS-Repository immer noch alle Informationen benötigt, die zum Erstellen einer vollständigen VM erforderlich sind.

Siehe auch:https://superuser.com/questions/641971/manual-clone-recreate-virtual-disk. Entschuldigen Sie, wenn es Ihnen unpassend/undankbar/unredlich/unhöflich erscheint, noch einmal zu posten. Die Antworten, die ich bei SU erhalten habe, waren zwar hilfreich, aber es fehlte einfach die Fachkompetenz, um mein Problem tatsächlich zu lösen. Bitte beachten Sie, dass die Frage, die ich hier gestellt habe, etwas spezifischer ist als die verlinkte, aber alle Ideen, die das Problem vollständig umgehen, sind mehr als willkommen.

Antwort1

Der Bootloader muss eine Datei an einem bestimmten Ort finden. Ubuntu verwendet Grub als Standard-Bootloader und Grub enthält einen Dateisystemtreiber, mit dem es den Linux-Kernel lädt, aber Grub muss seinen Dateisystemtreiber finden. Darüber hinaus muss der

Wenn Sie versuchen, die VM von Grund auf neu zu erstellen, indem Sie eine leere Festplatte erstellen und partitionieren, ist es sogar noch schlimmer: Die Festplatte enthält keinen Bootloader.

Als zusätzlichen Wiederherstellungsschritt müssen Sie den Bootloader neu installieren. Ich denke, der folgende Befehl sollte dafür ausreichen (Sie benötigen möglicherweise noch ein paar andere Optionen, um sicherzustellen, dass Grub die erforderlichen Gerätetreiber enthält):

/usr/sbin/grub-install --root-directory="$MNT_DIR" /dev/nbd

und stellen Sie sicher, dass es /boot/grub/device.mapenthält

(hd0) /dev/nbd

Beachten Sie, dass dies device.mapnicht funktioniert, wenn Sie es grub-installin der VM ausführen. Wenn das wichtig ist, speichern und stellen Sie entweder device.maprund um den grub-installAufruf wieder her oder rufen Sie den Low-Level-Befehl, der grub-installschließlich ausgeführt wird, manuell auf.

Ein alternativer Ansatz besteht darin, Ihre VM mit einer winzigen Bootdiskette einzurichten, die nur den Bootloader enthält, den Sie ohne Probleme jedes Mal von Grund auf neu erstellen müssen (oder Sie können bei jeder Änderung des Bootloaders, die selten vorkommen sollte, eine erstellte Kopie zwischenspeichern).

verwandte Informationen