Partition

使用 sfdisk 進行近似分區表備份

  • October 20, 2014

我想將一些邏輯分區轉換為擴展分區,所以我遵循了這個接受的答案。但是,在備份我目前的分區表的步驟中,我搞砸了並輸入了以下內容而不是寫入的內容。

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這樣的工具。你甚至可能已經在你的發行版上安裝了它,如果沒有,它應該在你的儲存庫中。

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