我在 VirtualBox 中使用 .vdi 磁碟建立了一個 Ubuntu 12.04 32 位元虛擬機器。然後,我使用 qemu-nbd 掛載該磁碟並將所有檔案移出該磁碟;然後回到它。當我再次啟動虛擬機器時,我得到不同的結果:
- Ubuntu 告訴我出現錯誤並詢問我是否要修復/跳過/忽略/手動修復。如果我修復了,它將重新啟動並啟動到 tty。如果我忽略它,它將啟動到 tty。我還沒有嘗試過跳過/手動修復。
- 啟動到空白的紫色螢幕。凍結。在隨後的重置中,啟動到閃爍的文字遊標。
- 啟動至 Ubuntu 初始螢幕,凍結。重設後,請參閱此清單中的第 1 項。
我的問題是: 為什麼會出現這種情況? Grub 中是否有一些磁碟硬體位址引用 /boot/?有沒有辦法刪除和替換 VHD 中的檔案而不會出現此問題?
如何重現這個結果(我希望):
- 使用 8GB .vdi 虛擬磁碟在 VirtualBox 中建立虛擬機器(稱為 ub.vdi,用於問題的其餘部分)
- 使用 Ubuntu 12.04.3 32 位元安裝 ISO 啟動
- 「嘗試Ubuntu」。
- 設定一個MSDOS分割區表和兩個主分割區,一個2048MiB交換空間,其餘一個ext4分割區。 (使用 gparted)。
- 在ext4分割區安裝Ubuntu
- 關閉虛擬機
- 導航至您的 VM 目錄並執行以下腳本:
#!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
為什麼要做這個?
作為合約要求的一部分,我需要將虛擬磁碟儲存在版本控制中。在版本控制中擁有巨大的二進位 blob(虛擬磁碟)是一件痛苦的事情,主要是對於克隆(git)/簽出(svn)來說,但對於差異來說也是如此。我考慮過拆分為多個文件,但我需要能夠操作上面 (5) 中提取的作業系統/資料。請注意,我的 VCS 儲存庫仍然需要建置完整 VM 所需的所有資訊。
也可以看看:https://superuser.com/questions/641971/manual-clone-recreate-virtual-disk。如果再次發文看起來不禮貌/忘恩負義/不慣用/粗魯等等,我們深表歉意;我在 SU 收到的答案雖然有用,但缺乏實際解決我的問題的專業知識。請注意,我在這裡提出的問題比連結的問題更具體一些,但任何完全規避該問題的想法都非常受歡迎。
答案1
引導程式需要在特定位置找到某個檔案。 Ubuntu 使用 Grub 作為其預設引導程序,Grub 包含一個用於載入 Linux 核心的檔案系統驅動程序,但 Grub 需要找到其檔案系統驅動程式。此外,
如果您嘗試透過建立空白磁碟並對其進行分割來從頭開始重新建立虛擬機,情況會更糟:該磁碟將不包含引導程式。
作為額外的復原步驟,您需要重新安裝引導程式。我認為下面的命令應該可以做到這一點(您可能需要一些其他選項來確保 Grub 包含必要的裝置驅動程式):
/usr/sbin/grub-install --root-directory="$MNT_DIR" /dev/nbd
並確保/boot/grub/device.map
包含
(hd0) /dev/nbd
請注意,如果您在虛擬機器中運行,這device.map
將不起作用。grub-install
如果這很重要,請device.map
圍繞呼叫進行保存和恢復,或手動呼叫最終運行的grub-install
低階命令。grub-install
另一種方法是使用僅包含引導程式的小型啟動磁碟來設定虛擬機,您不會介意一直從頭開始建置(或者您可以在引導程式每次更改時快取建置的副本,這應該發生)很少)。