如上所述, 我们了解了 MBR(扇区 0)的结构:引导加载程序代码,后跟 4 个各 16 字节的分区表项,再后跟 AA55 签名。类型为 5 或 F 或 85(十六进制)的分区表项具有特殊意义:它们描述了扩展分区:即被进一步划分为逻辑分区的空间块。(因此,扩展分区只是一个容器,它本身不能使用,用户使用的是里面的逻辑分区。)只有扩展分区第一个扇区的位置是重要的。这个扇区包含一个分区表,其中有四个条目:一个逻辑分区,一个扩展分区,以及两个未使用的。这样就形成了一个分区表扇区链,分散在磁盘上,其中第一个描述了三个主分区和一个扩展分区,而随后的每个分区表扇区描述一个逻辑分区和下一个分区表扇区的位置。
重要的是要理解这一点:当人们在磁盘分区时做了一些愚蠢的事情后,他们想知道:我的数据还在吗?答案通常是:是的。但是,如果创建了逻辑分区,那么描述它们的分区表扇区将被写入这些逻辑分区的开头,并且之前存在的数据将丢失。
程序 sfdisk 将显示完整的链。例如,
# sfdisk -l -x /dev/hda
Disk /dev/hda: 16 heads, 63 sectors, 33483 cylinders
Units = cylinders of 516096 bytes, blocks of 1024 bytes, counting from 0
Device Boot Start End #cyls #blocks Id System
/dev/hda1 0+ 101 102- 51376+ 83 Linux
/dev/hda2 102 2133 2032 1024128 83 Linux
/dev/hda3 2134 33482 31349 15799896 5 Extended
/dev/hda4 0 - 0 0 0 Empty
/dev/hda5 2134+ 6197 4064- 2048224+ 83 Linux
- 6198 10261 4064 2048256 5 Extended
- 2134 2133 0 0 0 Empty
- 2134 2133 0 0 0 Empty
/dev/hda6 6198+ 10261 4064- 2048224+ 83 Linux
- 10262 16357 6096 3072384 5 Extended
- 6198 6197 0 0 0 Empty
- 6198 6197 0 0 0 Empty
...
/dev/hda10 30581+ 33482 2902- 1462576+ 83 Linux
- 30581 30580 0 0 0 Empty
- 30581 30580 0 0 0 Empty
- 30581 30580 0 0 0 Empty
#
构造错误的分区表是可能的。如果某个扩展分区指回自身或链中较早的分区,许多内核会进入循环。在这些分区表扇区之一中可能有两个扩展分区,从而导致分区表链分支。(例如,当 fdisk 未能将 5、F、85 识别为扩展分区,并在 F 旁边创建了一个 5 时,可能会发生这种情况。)没有标准的 fdisk 类型程序可以处理这种情况,需要一些手工操作来修复它们。Linux 内核将接受最外层级别的分支。也就是说,您可以拥有两条逻辑分区链。有时这很有用 - 例如,可以使用类型 5 并且可以被 DOS 看到,而另一种类型 85 对 DOS 不可见,这样 DOS FDISK 就不会因为柱面 1024 之后的逻辑分区而崩溃。通常需要 sfdisk
来创建这样的设置。