ext4 パーティション イメージから起動可能なディスクを作成する

ext4 パーティション イメージから起動可能なディスクを作成する

私の目標は、再起動せずにシステムの起動可能なバックアップを作成することです。qemu-img を使用して、raw dd イメージを vhdx に変換し、Hyper-V で実行します。

ライブCDを起動して実行する場合:

dd if=/dev/sda of=/nfs/sda.raw conv=noerror,sync,notrunc

それを vhdx に変換し、それほど手間をかけずに Hyper-V で直接実行できます。

fdisk -l 出力:

Disk /dev/sda: 238.5 GiB, 256060514304 bytes, 500118192 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: 7555D04B-D6DC-4ABB-8863-529E874BADAD

Device       Start       End   Sectors   Size Type
/dev/sda1     2048   2000895   1998848   976M EFI System
/dev/sda2  2000896 500117503 498116608 237.5G Linux filesystem

ただし、システムがオンラインの間はそのコマンドを使用できないため、次のように dattobd ドライバーを使用して ext4 ファイルシステム全体をコピーします。

dd if=/dev/datto0 of=/nfs/sda2.raw bs=1M

これにより、すべてのデータが/dev/sda2正しくコピーされます。ライブ CD を使用してパーティションを dd した場合、ハッシュが同じであるため、これを検証しました/dev/sda2。これで、ライブ CD を起動してコピーできます。/dev/sda1これは EFI パーティションなので、grub または Linux カーネル関連の何かを更新しない限り、頻繁に変更されることはありません。時々そのパーティションをバックアップするためだけに再起動しても問題ありませんが、オンラインでそれを実行する方法をご存知の方がいらっしゃいましたら、教えてください。

現在、2 つの別々のファイルがあります/dev/sda1/dev/sda2、質問は、これら 2 つを 1 つのファイルにまとめ、dd if=/dev/sda of=/nfs/sda.raw conv=noerror,sync,notruncライブ CD で実行する場合と基本的に同じ出力を得るにはどうすればよいかということです。バイトを完全に揃えるだけでよいのでしょうか。あらゆる場所で検索しましたが、見つかりません。どなたか助けていただければ幸いです。

答え1

パーティション サポートを使用してディスク全体のイメージをループ マウントし、dd更新されたsda2イメージをその中に配置することができます。

losetup -P /dev/loop0 /nfs/sda.raw  #this will create /dev/loop0p1 and loop0p2
dd if=/nfs/sda2.raw of=/dev/loop0p2
losetup -d /dev/loop0

あるいは、パーティション テーブルには、最初のパーティションがセクター #2048 から始まることが示されているため、ディスクには最初のパーティション (「ヘッド」) の前に 2048 * 512 バイト = 1 MiB のスペースがあり、パーティションの外側の末尾 (「テール」) には 500118192 - 500117503 - 1 = 688 セクター (344 kiB) のスペースがあります。(最初のセクターは #1 ではなく #0 なので -1)

最初のパーティションはセクター #2000895 で終了し、2 番目のパーティションは #2000896 から始まるため、それらの間に未使用の領域はありません。

GPT パーティション テーブルを使用しています。このテーブルには、ディスクの最後にパーティション テーブルのバックアップ コピーが含まれているため、「末尾」部分もキャプチャする必要があります。これは、セクター #500117504 から始まり、ディスクの末尾まで続きます。

したがって、「ヘッド」部分と「テール」部分の内容を別々にキャプチャし、すべてをまとめることができます。

dd if=/dev/sda of=/nfs/head.raw bs=512 count=2048
dd if=/dev/sda of=/nfs/tail.raw bs=512 skip=500117504
cat /nfs/head.raw /nfs/sda1.raw /nfs/sda2.raw /nfs/tail.raw > /nfs/sda.raw

パーティション テーブルを変更しない限り、「ヘッド」と「テール」の部分を 1 回だけキャプチャする必要があります。システムの通常の使用中にこれらの部分が変更されることはありません。

関連情報