使用 sfdisk 进行近似分区表备份

使用 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 编码和处理时间,而且我不知道出了什么问题)。

我最近备份了该磁盘最重要的内容,但如果我可以在不重新安装和复制文件的情况下修复它,那就太好了。

答案1

用手修复这个问题会很棘手。我希望除了您写入的损坏的分区表之外,您没有再修改该磁盘上的任何数据。

使用 sfdisk、fdisk 等创建分区表的备份是一个好主意(当您不意外地键入错误的命令时:))。但为了额外的保险,我喜欢使用 dd 备份驱动器的引导扇区。

你是当然sda1 从块 1 开始,或者这是一个猜测?过去,磁盘开头仅使用 1 个块是很常见的,因为这就是保存 MBR 和(主)分区表所需的全部内容,但近年来,分区软件通常会保留更多空间,例如第一个分区的起始扇区为 63 并不罕见。我还看到分区软件(gparted、IIRC)在驱动器的开头保留一个兆字节,然后强制所有后续分区进入兆字节边界。

在较旧的系统上,分区在柱面边界上启动和​​停止非常重要。 IOW,磁盘起始处的未分区区域应该是整数个柱面,每个后续的主分区也应该是整数个柱面;磁盘末尾通常还会有未分配的空间。但这通常已经不是一个问题了很多年,但很多分区软件仍然提到它,以防万一您感兴趣。 :)

然而,分区必须在扇区边界上启动和​​停止。这使得第一个列表中面向块的数据的分析变得更加容易。因此 2441214+ 块可以仅有的参考 2441214.5 块 = 4882429 扇区 = 2499803648 字节。

但您应该认真考虑使用像这样的工具,而不是尝试手动解决这个问题测试盘。您甚至可能已经将其安装在您的发行版上,如果没有,它应该在您的存储库中。

相关内容