使用 sfdisk 進行近似分區表備份
我想將一些邏輯分區轉換為擴展分區,所以我遵循了這個接受的答案。但是,在備份我目前的分區表的步驟中,我搞砸了並輸入了以下內容而不是寫入的內容。
sfdisk -f /dev/sda > /mnt/parts.txt
結果是這樣的:
Disk /dev/sda: 30401 cylinders, 255 heads, 63 sectors/track Old situation: Units = cylinders of 8225280 bytes, blocks of 1024 bytes, counting from 0 Device Boot Start End #cyls #blocks Id System /dev/sda1 0+ 304- 304- 2441214+ 82 Linux swap / Solaris /dev/sda2 * 304+ 565- 262- 2097152 83 Linux /dev/sda3 565+ 4486- 3921- 31495168 83 Linux /dev/sda4 4486+ 30401- 25916- 208163840 5 Extended /dev/sda5 4486+ 24026- 19540- 156954624 83 Linux
如您所見,單位是圓柱體和塊體,與正確導出扇區相比,這可能會降低精度。
問題是,我已經破壞了我的分區表,現在我必須利用這個不完整的(或者是嗎?)備份。
到目前為止,我已經嘗試使用扇區為單位重寫分區表(柱面不會導致任何地方)知道一個塊是兩個扇區(我不知道它是否通用,但是以扇區為單位導出分區表告訴你那 1 個扇區 = 512 字節,而 1 個塊 = 1024 字節……)。
root@debian:/home/user# sfdisk -u S /dev/sda Checking that no-one is using this disk right now ... OK Disk /dev/sda: 30401 cylinders, 255 heads, 63 sectors/track Old situation: Units = sectors of 512 bytes, counting from 0 Device Boot Start End #sectors Id System /dev/sda1 1 4882429 4882429 82 Linux swap / Solaris /dev/sda2 4882430 9076733 4194304 83 Linux /dev/sda3 9076734 72067069 62990336 83 Linux /dev/sda4 72067070 488394749 416327680 83 Linux Input in the following format; absent fields get a default value. <start> <size> <type [E,S,L,X,hex]> <bootable [-,*]> <c,h,s> <c,h,s> Usually you only need to specify <start> and <size> (and perhaps <type>). /dev/sda1 :1 4882429 S /dev/sda1 1 4882429 4882429 82 Linux swap / Solaris /dev/sda2 :4882430 4194304 L * /dev/sda2 * 4882430 9076733 4194304 83 Linux /dev/sda3 :9076734 62990336 /dev/sda3 9076734 72067069 62990336 83 Linux /dev/sda4 :72067070 416327680 E /dev/sda4 72067070 488394749 416327680 5 Extended /dev/sda5 :72067071 313909248 /dev/sda5 72067071 385976318 313909248 83 Linux /dev/sda6 : /dev/sda6 385976320 488394749 102418430 83 Linux /dev/sda7 : No room for more New situation: Units = sectors of 512 bytes, counting from 0 Device Boot Start End #sectors Id System /dev/sda1 1 4882429 4882429 82 Linux swap / Solaris /dev/sda2 * 4882430 9076733 4194304 83 Linux /dev/sda3 9076734 72067069 62990336 83 Linux /dev/sda4 72067070 488394749 416327680 5 Extended /dev/sda5 72067071 385976318 313909248 83 Linux /dev/sda6 385976320 488394749 102418430 83 Linux Warning: partition 1 does not end at a cylinder boundary Warning: partition 2 does not start at a cylinder boundary Warning: partition 2 does not end at a cylinder boundary Warning: partition 3 does not start at a cylinder boundary Warning: partition 3 does not end at a cylinder boundary Warning: partition 4 does not start at a cylinder boundary Warning: partition 4 does not end at a cylinder boundary Warning: partition 5 does not end at a cylinder boundary Warning: partition [6] does not start at a cylinder boundary Warning: partition [6] does not end at a cylinder boundary Warning: partition 6 does not end at a cylinder boundary Do you want to write this to disk? [ynq] y Successfully wrote the new partition table Re-reading the partition table ... If you created or changed a DOS partition, /dev/foo7, say, then use dd(1) to zero the first 512 bytes: dd if=/dev/zero of=/dev/foo7 bs=512 count=1 (See fdisk(8).)
它說:柱面邊界上沒有分區開始/停止。我不知道這是什麼意思,但是由於有**+和-**,這意味著數字已經四捨五入,在原始導出時,我認為這是正常的。
我還發出了同樣的錯誤命令,看看輸出是否相同:
Disk /dev/sda: 30401 cylinders, 255 heads, 63 sectors/track Old situation: Units = cylinders of 8225280 bytes, blocks of 1024 bytes, counting from 0 Device Boot Start End #cyls #blocks Id System /dev/sda1 0+ 303- 304- 2441214+ 82 Linux swap / Solaris /dev/sda2 * 303+ 565- 262- 2097152 83 Linux /dev/sda3 565+ 4485- 3921- 31495168 83 Linux /dev/sda4 4485+ 30401- 25916- 208163840 5 Extended /dev/sda5 4485+ 24025- 19540- 156954624 83 Linux /dev/sda6 24025+ 30401- 6376- 51209215 83 Linux
它很接近,但並不完全相同。此外, gparted 似乎無法辨識任何分區文件系統(一切都是“未知的”)。
此外,/dev/sda1 怎麼可能是 304- 柱面大,但以 303- 柱面結束?
我想我已經接近解決方案,但我無法獲得所需的確切數字,可能是因為我計算錯誤或我做錯了。但是我無法一一更改它們以查看哪種組合有效(我可以,但它需要一些 bash 編碼和處理時間,而且我不知道出了什麼問題)。
我最近備份了這個磁碟最重要的部分,但如果我可以在不重新安裝和復製文件的情況下修復它,那就太好了。
這將很難手動修復。我希望你沒有修改這個磁碟上的任何數據,除了你寫給它的損壞的分區表。
使用 sfdisk、fdisk 等來創建分區表的備份是個好主意(當您不小心輸入錯誤的命令時 :))。但為了額外的保險,我喜歡使用 dd 備份驅動器的引導扇區。
您確定sda1 從第 1 塊開始,還是猜測?過去通常在磁碟的開頭只使用 1 個塊,因為這就是保存 MBR 和(主)分區表所需的全部內容,但近年來,分區軟體通常會保留更多空間,例如第一個分區的起始扇區為 63 並不罕見。我還看到分區軟體(gparted,IIRC)在驅動器的開頭保留一個兆字節,然後將所有後續分區強製到兆字節邊界。
在舊系統上,分區在柱面邊界上啟動和停止很重要。IOW,磁碟開頭的未分區區域應該是柱面的整數,每個後續的主分區也應該是;磁碟末尾通常還會有未分配的空間。但這通常多年來都不是問題,但很多分區軟體仍然提到它,以防萬一你感興趣。:)
但是,分區確實必須在扇區邊界上開始和停止。這使得在第一個清單中分析面向塊的數據變得更加容易。因此 2441214+ 個塊只能引用 2441214.5 個塊 = 4882429 個扇區 = 2499803648 個字節。
但是,與其嘗試手動解決此問題,不如認真考慮使用像testdisk這樣的工具。你甚至可能已經在你的發行版上安裝了它,如果沒有,它應該在你的儲存庫中。