1、现在为什么还是分区重叠?逻辑分区为什么能跑到扩展分区之外?
主分区表可以有四个表项,如果其中一个是扩展分区,那么在扩展分区的起始处有第一个逻辑分区表,构造和主分区表相同,也有4个位置,但是只使用2个,第一项标明了第一个逻辑分区sda5,第二项仍标示为扩展分区,但是是一个缩小了的扩展分区,起始点是下一张逻辑分区表的位置,终点不变。然后在新扩展分区的起始去读下一个逻辑分区的信息,链式地进行直到最后一张逻辑分区表里不再标示新的扩展分区为止。OS X 下的 fdisk 信息,可以清晰看见每一张逻辑分区表:(它是给出 start - size 而非 start - end)
代码: 全选
bill-beardemacbook:~ billbear$ fdisk /dev/rdisk1
Disk: /dev/rdisk1 geometry: 19457/255/63 [312581808 sectors]
Signature: 0xAA55
Starting Ending
#: id cyl hd sec - cyl hd sec [ start - size]
------------------------------------------------------------------------
*1: AF 0 1 1 - 1023 254 63 [ 63 - 17039360] HFS+
2: AF 1023 254 63 - 1023 254 63 [ 17039484 - 63176704] HFS+
3: 0B 1023 254 63 - 1023 254 63 [ 80216199 - 167772160] Win95 FAT-32
4: 05 1023 254 63 - 1023 254 63 [ 247995405 - 64581300] Extended DOS
Signature: 0xAA55
Starting Ending
#: id cyl hd sec - cyl hd sec [ start - size]
------------------------------------------------------------------------
1: 83 1023 254 63 - 1023 254 63 [ 247995468 - 29286432] Linux files*
2: 05 1023 254 63 - 1023 254 63 [ 277281900 - 33206355] Extended DOS
3: 00 0 0 0 - 0 0 0 [ 0 - 0] unused
4: 00 0 0 0 - 0 0 0 [ 0 - 0] unused
Signature: 0xAA55
Starting Ending
#: id cyl hd sec - cyl hd sec [ start - size]
------------------------------------------------------------------------
1: 83 1023 254 63 - 1023 254 63 [ 277281963 - 33206292] Linux files*
2: 05 1023 254 63 - 1023 254 63 [ 310488255 - 2088450] Extended DOS
3: 00 0 0 0 - 0 0 0 [ 0 - 0] unused
4: 00 0 0 0 - 0 0 0 [ 0 - 0] unused
Signature: 0xAA55
Starting Ending
#: id cyl hd sec - cyl hd sec [ start - size]
------------------------------------------------------------------------
1: 82 1023 254 63 - 1023 254 63 [ 310488318 - 2088387] Linux swap
2: 00 0 0 0 - 0 0 0 [ 0 - 0] unused
3: 00 0 0 0 - 0 0 0 [ 0 - 0] unused
4: 00 0 0 0 - 0 0 0 [ 0 - 0] unused
正常的分区表,每一张逻辑分区表里标示的扩展分区的终点都和主分区表里标示的扩展分区的终点相同。你的分区表在某一个逻辑分区表处扩展分区终点被扩大以包含超出主表里扩展分区范围外的逻辑分区。这就无法通过分区表合法性的检查,这种扩展分区们终点不一致的错误,大概也被 parted 归为分区重叠。
产生这样错误的原因,很可能是原先的扩展分区乱序,而后使用了 windows 下的分区工具。linux 允许乱序的分区并且经常这么做,比如缩小sda6,在 sda6 和 sda7 之间创建新分区,那么新的 sda8 会位于 6 和 7 之间,这样做是为了保证老分区的设备名不变以免影响原有 grub 的引导。而 windows 通常会把原来的 sda7 改为 sda8,新插入的分区作为 sda7。windows 保证分区的顺序排列而 linux 保证老分区设备名不变。乱序的主分区 windows 分区工具在调整时通常能够处理而不致搞坏分区表(但是它一定会重排分区而可能导致 linux 的引导问题),乱序的逻辑分区比较麻烦,因为链式的扩展分区的起点忽前忽后而不是递增,windows下很多分区工具设计时就不曾预料分区表可以是这样而无法正确处理。所以在安装之前尽量在 linux 下先把分区顺序整理一下以避免留下隐患。fdisk 里面有个 Expert command ,里面可以 fix partition order。
2、现在从sda8往后的逻辑分区跑到了扩展分区的后面。我有一个想法:把从sda2开始往后的全都删掉,新建sda2,起始分别为 6376,38913.然后一步步新建sda5之后的分区,各分区起始位置保持以上不变,这样是不是就可以恢复了,而且一般情况下各分区数据还在?(我已经以防万一把数据备份了,就算不在了也不要紧,只是问下从原理上讲是不是这样?)
想法是可行的,不过 fdisk -l 给出的是不够精细的结果,必须要根据 fdisk -lu 的精确结果来做。删除的时候要先删逻辑分区,然后删扩展分区。如果先删 sda2,逻辑分区瞬间就全部消失,再建立 sda2 时原来的逻辑分区又全部出现。
新建分区的时候注意设置正确的分区 id。你在 13 楼新建的 sda12 id 不对。(而且你没有原先的 fdisk -lu 信息, sda12 的起止不一定正确)
如果没能成功,testdisk 应该可以挽救。