![使用 sfdisk 进行近似分区表备份](https://linux22.com/image/57890/%E4%BD%BF%E7%94%A8%20sfdisk%20%E8%BF%9B%E8%A1%8C%E8%BF%91%E4%BC%BC%E5%88%86%E5%8C%BA%E8%A1%A8%E5%A4%87%E4%BB%BD.png)
我想将一些逻辑分区转换为扩展分区,所以我遵循这个接受的答案。然而,在备份当前分区表的步骤中,我搞砸了并输入了以下内容而不是所写的内容。
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 字节。
但您应该认真考虑使用像这样的工具,而不是尝试手动解决这个问题测试盘。您甚至可能已经将其安装在您的发行版上,如果没有,它应该在您的存储库中。