すべてのファイルをVMドライブから移動してから戻した後、正常に起動できない

すべてのファイルをVMドライブから移動してから戻した後、正常に起動できない

私は、VirtualBox で .vdi ディスクを使用して Ubuntu 12.04 32 ビット VM を作成しました。次に、このディスクを qemu-nbd でマウントし、すべてのファイルをディスクから移動してから、ディスクに戻します。VM を再度起動すると、さまざまな結果が得られます。

  1. Ubuntu はエラーが発生したことを通知し、修正/スキップ/無視/手動修正のいずれかを希望するかどうかを尋ねます。修正すると、再起動して tty で起動します。無視すると、tty で起動します。スキップ/手動修正はまだ試していません。
  2. 起動すると空白の紫色の画面が表示されます。フリーズします。その後のリセットでは、起動すると点滅するテキスト カーソルが表示されます。
  3. Ubuntu のスプラッシュ画面を起動し、フリーズします。リセットすると、このリストの 1 番が表示されます。

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

この結果を再現する方法(私はそう願っています):

  1. 8GB の .vdi 仮想ディスク (質問の残りの部分では ub.vdi と呼びます) を使用して VirtualBox で VM を作成します。
  2. Ubuntu 12.04.3 32ビットインストールISOで起動する
  3. 「Ubuntu を試してみる」。
  4. MSDOS パーティション テーブルと 2 つのプライマリ パーティション、2048MiB のスワップ領域、残りは ext4 パーティションをセットアップします (gparted を使用)。
  5. ext4パーティションにUbuntuをインストールする
  6. VMをシャットダウンする
  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) だけでなく、差分も面倒になります。複数のファイルに分割することを検討しましたが、上記 (5) で抽出した OS/データを操作できる必要があります。VCS リポジトリには、完全な VM を構築するために必要なすべての情報がまだ必要であることに注意してください。

参照:https://superuser.com/questions/641971/manual-clone-recreate-virtual-disk再度の投稿が不適切/恩知らず/慣用的でない/失礼に思われる場合はお詫び申し上げます。SU で受け取った回答は役立ちましたが、私の問題を実際に解決する専門知識が欠けていました。ここで尋ねた質問はリンク先の質問よりも少し具体的ですが、問題を完全に回避するアイデアは大歓迎です。

答え1

ブートローダは特定の場所にあるファイルを見つける必要があります。UbuntuはデフォルトのブートローダとしてGrubを使用していますが、GrubにはLinuxカーネルをロードするために使用するファイルシステムドライバが含まれていますが、Grubはファイルシステムドライバを見つける必要があります。さらに、

空のディスクを作成してパーティション分割し、VM を最初から再作成しようとすると、状況はさらに悪くなり、ディスクにブートローダーが含まれなくなります。

追加の復元手順として、ブートローダーを再インストールする必要があります。次のコマンドで実行できると思います (Grub に必要なデバイス ドライバーが含まれていることを確認するために、他のオプションがいくつか必要になる場合があります)。

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

/boot/grub/device.map含まれていることを確認してください

(hd0) /dev/nbd

VM で実行する場合には、これはdevice.map機能しないことに注意してください。これが問題になる場合は、呼び出しの前後を保存して復元するか、最終的に実行される低レベルのコマンドを手動で呼び出します。grub-installdevice.mapgrub-installgrub-install

別の方法としては、ブートローダのみを含む小さなブート ディスクを使用して VM をセットアップし、常にゼロから構築しても問題ないという方法があります (または、ブートローダが変更されるたびに構築されたコピーをキャッシュすることもできますが、これはめったに発生しません)。

関連情報