すべてのファイルを仮想マシンドライブに戻した後、正しく起動できない

すべてのファイルを仮想マシンドライブに戻した後、正しく起動できない

.vdiディスクを使用してVirtualBoxにUbuntu 12.04 32ビット仮想マシンを作成しました。次に、qemu-nbd を使用してディスクをマウントし、すべてのファイルをディスクから移動し、再度ディスクに移動します。仮想マシンを再起動すると、他の結果が表示されます。

  1. Ubuntuはエラーがあることを知らせ、修正/スキップ/無視/手動で修正するかどうかを尋ねます。この問題を解決すると、再起動して tty で起動します。無視すると tty で起動します。まだスキップ/手動編集を試していません。
  2. 空の紫色の画面で起動します。必ずぶら下げさせる。その後、リセット時に点滅するテキストカーソルが起動します。
  3. Ubuntuのようこそ画面から起動すると停止します。リセット後、このリストの項目1を参照してください。

私の質問は:なぜこのようなことが起こるのですか? Grubで/boot/を参照するディスクハードウェアアドレスはありますか?この問題なくVHDのファイルを削除して置き換える方法はありますか?

この結果を再現する方法(希望):

  1. 8GB .vdi仮想ディスク(残りの質問ではub.vdiと呼ばれる)を使用してVirtualBoxに仮想マシンを作成します。
  2. Ubuntu 12.04.3 32ビットインストールISOを使用した起動
  3. 「Ubuntuを使ってみてください」。
  4. MSDOSパーティションテーブルと2つのプライマリパーティション(1つは2048MiBスワップスペースを持ち、残りの1つはext4パーティション)を設定します。 (gpartedを使用)。
  5. ext4パーティションへのUbuntuのインストール
  6. 仮想マシンのシャットダウン
  7. 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)の場合だけでなくdiffの場合にも痛いことです。複数のファイルに分割することを考えましたが、上記(5)で抽出したOS/データを操作できる必要があります。私の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-installgrub-install

もう1つのアプローチは、ブートローダのみを含む小さなブートディスクでVMを設定することです。これは常に最初からビルドしても大丈夫です。または、ブートローダが変更されるたびにビルドコピーをキャッシュできます。 )少し)。

関連情報