QEMUで起動して実行できるIMGファイルでLinuxシステムをバックアップしようとしています。
メモ:私はLubuntuと小さなコアLinuxでテストしました。
私が従うプロセスは次のとおりです。
sda
ハードドライブが2つありますsdb
- パーティション
sdb1
とマウントsdb1
パーティション/mnt/sdb
dd
sda
マウントされたディレクトリsdb
にあるIMGファイルサイズの空のファイル。dd if=/dev/zero of=/mnt/sdb/disk.img bs=x count=1
- xのサイズsda
- 次に
fdisk
onを使用してsda
ディスクレイアウトをスクリプトファイルに出力し、それをdisk.img
ファイルにロードします。 - 次に、-losetup -P -f disk.img の内容をマウントしてコピーします。
循環機器を探す
たとえば、/dev/loop36 0 0 0 0 /mnt/sdb/disk.img 0 512
ループデバイスの最初のパーティションにファイルシステムを作成します。
mkfs.ext2 /dev/loop36p1
- 分割サイクリング機器の設置 -
mount /dev/loop36p1 /mnt/img
- 次にブートセクタをコピーします。
dd if=/dev/sda of=disk.img bs=512 count=1 conv=notrunc
最後に、rsyncを使用してファイルシステムを
/mnt/img
ディレクトリにコピーしましたが、これはさまざまな成功を収めました。使用:$ rsync -aHxv / \ --exclude={"/dev/*","/proc/*","/sys/*","/tmp/*","/run/*","/mnt/*","/media/*","/lost+found"} \ /mnt/img
Lubuntuを使用して上記の正確なプロセスを試してみましたが、コマンドは機能しrsync
ましたが、QEMUでIMGを実行しようとすると、ハードドライブから起動すると中断されます。
tcl で上記のプロセスを試みるとrsync
コマンドが失敗し、QEMU からブートしようとするとブート可能なデバイスがないことを示すメッセージが表示されます。
誰にもこれについての提案はありますか?それとも、以前に同様のことをしたことがあり、目標を達成するためのより良い方法はありますか?
答え1
ブートセクタをコピーすると、その中にあるパーティションテーブルもコピーされます。 fdiskのバージョンと元のファイル
sda
とイメージファイルを分割するときに使用される正確なオプションによっては、パーティションの制限はまったく同じでも同じでもない場合があります。それ以外の場合...ループマウントはfdisk
作成したパーティションオフセットを使用しますが、起動時にVMは元のパーティションオフセットを使用しますsda
。MBRをコピーしましたが、
dd
内容は次のとおりです。 MBRには、他のブートローダコンポーネント(またはGRUBレガシー)の場所を識別するブロックレベルのオフセットが含まれています。これらのファイルが 。/boot
rsync
<filesystem>_stage1.5
stage2
rsync
ブートローダの一部を完全に見逃した可能性があります。 GRUB Legacyには、パーティションの先頭、つまり領域にその一部を含めることができます。ファイルシステムの外部GRUB2はほとんど常にMBR以降のディスクブロックにほとんどのコアイメージを書き込みますが、最初のパーティションが始まる前。ディスクの最初の512バイトのみをコピーすると、既存のMBRのみが取得されますが、内容は失われます。私はこれがあなたのスタートアップが失敗した最大の理由だと思います。
計画した仮想化方法に応じて、おそらく次のようなものを使用してイメージ環境mount --bind /dev /mnt/img/dev
に/proc
移動し、それを使用して正しいブロックオフセットを持つイメージファイルにブートローダーを正しく再作成する必要があります。/sys
chroot
grub-install
もう1つの可能なアプローチは、シングルユーザーモードでソースシステムを起動するか、ソースシステムでできるだけ多くのデーモンを停止(つまりシステム停止)してから、システムディスク全体を単一のジョブとしてイメージdd
に挿入することです。この方法fsck
では、最初の起動時に結果イメージを実行する必要がありますが、MBRとブートローダのすべての複雑さを回避できます。