
我的目標是在不重新啟動的情況下創建系統的可啟動備份,我將使用 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 並添加分區,則哈希值是相同的/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 上運行相同的輸出?您只需要完美對齊位元組嗎?我到處尋找這個但沒有運氣。很感謝任何形式的幫助!
答案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 結束,第二個分割區以磁區 #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
除非您修改分割表,否則您只需要捕獲“頭”和“尾”部分一次:它們在系統的正常使用期間不應更改。