Partition

從 ext4 分區映像創建可啟動磁碟

  • March 22, 2020

我的目標是在不重新啟動的情況下創建系統的可引導備份,我將使用 qemu-img 將原始 dd 映像轉換為 vhdx 並在 Hyper-V 中執行它。

如果我啟動到 liveCD 並執行:

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,我已經驗證過,因為如果我在哪裡使用 liveCD 和 dd/dev/sda2分區,雜湊是相同的。現在我可以啟動到 liveCD 並複制/dev/sda1,這是 EFI 分區,所以它不會經常更改,除非我更新 grub 或與 Linux 核心相關的東西,我可以重新啟動只是偶爾備份該分區,但是如果有人知道網上的方法請告訴我。

現在我有/dev/sda1兩個/dev/sda2單獨的文件,我的問題是如何將這兩個文件組合成一個文件,該文件基本上提供與dd if=/dev/sda of=/nfs/sda.raw conv=noerror,sync,notrunc在 liveCD 上執行相同的輸出?您只需要完美對齊字節嗎?我到處都在尋找這個,但沒有運氣。很感謝任何形式的幫助!

您可以循環掛載具有分區支持的整個磁碟映像,然後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,第二個分區開始於#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

除非您修改分區表,否則您只需要擷取一次“頭”和“尾”部分:它們不應在系統正常使用期間發生變化。

引用自:https://unix.stackexchange.com/questions/574168