かなり手動で仮想ディスクイメージのクローンを作成しようとしています。これまでの私の方法論の概要は次のとおりです。
- VirtualBoxで120GBのHDDを使用して仮想マシンを作成します(ハイパーバイザーとHDDのサイズは関係ありません。ほとんどの場合、パーティションサイズなどの残りの質問との完全性と一貫性のために含まれます)
- Ubuntu 12.04.3を仮想マシンにインストールします
- 仮想マシンを閉じる
- 仮想マシンに関連付けられた仮想ハードディスクをマウントする
- オペレーティングシステムファイルとデータを抽出してディレクトリに保存する
- 仮想ハードディスクのメタデータを保存する
- 新しい仮想ディスクを作成し、(6)からパーティションとブート情報を復元します
- (5)から正しいパーティションにデータを復元します
問題
複製したVMが完全に起動しません。GRUBはコピーするようだ、と表示されます(Ubuntuがそれにインストールされている)私のルートパーティションを確認します。Ubuntuが読み込まれそうになっているように、Grubを一度通過すると紫色の画面が表示されます。その後、停止します。その後、Grubを起動してOSを選択すると、コマンドラインカーソルが点滅します。入力できません。クローン作成プロセスで不足しているものがあると思われます(詳細については以下を参照)。注:私はレガシーではなくgrub2を使用しています。
なぜあなたはこれをやっている?
契約上の要件の一部として、仮想ディスクをバージョン管理に保存する必要があります。バージョン管理で巨大なバイナリBLOB(仮想ディスク)を使用することは、主にclone(git)/ checkout(svn)だけでなく、diffにとっても苦痛です。複数のファイルに圧縮することを検討しましたが、上記の(5)で抽出したOS /データを操作できる必要があります。VCSリポジトリには、完全なVMを構築するために必要なすべての情報が必要です。
詳細
説明した内容を再現するための詳細な手順:
- VMを作成し、Ubuntu Live CDを起動します
- 「Ubuntuを試す」を選択します
- ターミナルを開く
- msdosパーティションを作成します:sudo parted / dev / sda mklabel msdos
- 2GBのスワップファイルを作成します。sudoparted / dev / sda mkpart primary linux-swap 2048s 4198399s
- ルートパーティションに残りのドライブを使用します。sudo parted / dev / sda mkpart primary ext4 4198400s 100%
- マシンを再起動し、「Ubuntuのインストール」を選択します
- 高度なパーティションオプションを選択します
- スワップパーティションをダブルクリックして、スワップとして使用することを選択します
- ルートパーティションをダブルクリックし、フォーマットを選択して、ルート(/)マウントポイントに使用します
次に、以下を実行してディスクのクローンを作成します。
# Set up some parameters
ORIG_DEV="/dev/nbd0"
ORIG_MNT=$(mktemp -d)
ORIG_IMG="orig.vdi"
CLONE_DEV="/dev/nbd1"
CLONE_MNT=$(mktemp -d)
CLONE_IMG="clone.vdi"
qemu-img info $ORIG_IMG # save the "virtual size" output (in bytes) in the
# VIRT_SIZE variable in the next command
VIRT_SIZE="128849018880"
# Create the clone disk
qemu-img create -f vdi $CLONE_IMG $VIRT_SIZE
# Use qemu to make both disks accessible
modprobe nbd
qemu-nbd -c $ORIG_DEV $ORIG_IMG
qemu-nbd -c $CLONE_DEV $CLONE_IMG
# Set up the clone disk partition table and partitions
parted $CLONE_DEV mklabel msdos
parted $CLONE_DEV mkpart primary linux-swap 2048s 4198399s
parted $CLONE_DEV mkpart primary ext4 4198400s 100%
# Format the clone disk partitions and clone the UUIDs
mkswap $CLONE_DEVp1 -U $(blkid $ORIG_DEVp1 -s UUID -o value)
mkfs.ext4 $CLONE_DEVp2 -U $(blkid $ORIG_DEVp2 -s UUID -o value)
# Mount both disks and copy root from the original to the clone
mount $CLONE_DEVp2 $CLONE_MNT
mount $ORIG_DEVp2 $ORIG_MNT
find $ORIG_MNT -maxdepth 1 -mindepth 1 | xargs -I{} cp -ar {} $CLONE_MNT
umount $ORIG_MNT
umount $CLONE_MNT
# Copy the boot sector and partition table from the original
dd if=$ORIG_DEV of=$CLONE_DEV bs=$((2048*512)) count=1
# Disconnect the disks
qemu-nbd -d $CLONE_DEV
qemu-nbd -d $ORIG_DEV
他に何を試しましたか?
- grub-install --root-directory = / path / to / clone / device / boot / / dev / clone_device。これにより、正しいデバイスにGrubがインストールされましたが、ホストのデバイスの詳細が含まれています。VMは起動しません。
- クローンディスクにchrootしてから、grub-install。64ビットホストを使用して32ビットゲストを複製できる必要があるため、トラブルが発生しました。これは調査するための有望な手段のように思えますが、私はこれをどのように達成するかについて立ち往生しています。
- 仮想ディスクをマウントし、を使用してすべてのファイルをデータパーティションから移動し、データを
mv
ゼロにし、パーティションをスワップし(dd if=/dev/zero of=/dev/nbd0p2
)、仮想ディスクを圧縮します(を使用VBoxManage modifyhd clone.vdi --compress
)。ディスクが空のスペースでいっぱいになると、ホストファイルシステム上でディスクが拡張し始めました(ハァッ!)。dd
これが起こっていることに気付いたときに停止し、ディスクイメージを圧縮しました。まだ3GBを超えていました。(gzip / bzipを使用したことはありません。今晩から始めます。ddワイプを最後まで実行させようとしますが、それが機能しても時間のかからないソリューションを好むでしょう) 。 - e2image。私の他の質問:e2image restore file system metadataをご覧ください。私はこれを解決していません。詳細セクションで提供する、パーティションの作成、フォーマット、ブートセクターコピーなどの手順は、ルートパーティションをコピーする前に、e2imageによって作成されたものと非常に似たサイズのイメージファイルを生成することに注意してください。
- 別の仮想マシンを起動して、この仮想マシンにchrootしてgrub-installを実行します。実際にこれを行ったことはありませんが、誰かが提案した場合に備えて、ここに含めました。ユーザーの場合、スクリプトを実行できるように仮想マシンの再結合が必要です。これにより、関連するセットアッププロセスが排除されます。
- Grubの代わりにextlinuxをインストールします。成功していませんが、この演習では、ブートローダーがパーティションからRAMディスクを正常にロードしているが、この時点でスタックしていることを示しています(と思います!)。
ここまで来てくれたら、ありがとう!調査の方法についての提案は、詳細ではありませんが、大歓迎です。前もって感謝します。
e2image -r
私の経験では、Windowsはまばらなファイルを保存するのに非常に良い仕事をしていないため、使用を検討していませんでした。つまり、開発者がWindowsを使用したい場合、リポジトリのチェックアウトには多くのスペースが必要になります。ただし、Windowsでスパースファイルを使用した前述の「経験」は非常に限られているため、ほとんど追求していません。提案に感謝します、私はそれを見て、それがどうなるかお知らせします。