3. 理解、查看磁盘分区

实际上内存、u 盘等都可以作为文件系统底层的“存储”设备,但是这里仅用硬盘作为实例来介绍磁盘和分区的关系。

目前 Linux 的分区依然采用第一台PC硬盘所使用的分区原理,下面逐步分析和演示这一分区原理。

磁盘分区基本原理

先来看看几个概念:

  • 设备管理和分区 Linux 下,每一个存储设备对应一个系统的设备文件,对于硬盘等 IDESCSI 设备,在系统的 /dev 目录下可以找到对应的包含字符 hdsd 的设备文件。而根据硬盘连接的主板设备接口和数据线接口的不同,在 hd 或者 sd 字符后面可以添加一个从 az 的字符,例如 hdahdbhdcsdasdbsdc 等,另外为了区别同一个硬件设备的不同分区,在后面还可以添加了一个数字,例如 hda1hda2hda3sda1sda2sda3,所以在 /dev 目录下,可以看到很多类似的设备文件。
  • 各分区的作用

在分区时常遇到主分区和逻辑分区的问题,这实际上是为了方便扩展分区,正如后面的逻辑卷的引入是为了更好地管理多个硬盘一样,引入主分区和逻辑分区可以方便地进行分区的管理。

Linux 系统中每一个硬盘设备最多由 4 个主分区(包括扩展分区)构成。

主分区的作用是计算机用来进行启动操作系统的,因此每一个操作系统的启动程序或者称作是引导程序,都应该存放在主分区上。 Linux 规定主分区(或者扩展分区)占用分区编号中的前 4 个。所以会看到主分区对应的设备文件为 /dev/hda1-4 或者 /dev/sda1-4,而不会是 hda5 或者 sda5

扩展分区则是为了扩展更多的逻辑分区的,在 Linux 下,逻辑分区占用了 hda5-16 或者 sda5-16 等 12 个编号。

  • 分区类型

它规定了这个分区上的文件系统的类型。Linux支持诸如msdoc,vfat,ext2,ext3等诸多的文件系统类型,更多信息在下一小节进行进一步的介绍。

通过分析 MBR 来理解分区原理

下面通过分析硬盘的前 512 个字节(即 MBR)来分析和理解分区。

先来看看这张图:

MBR Architecture

它用来描述 MBR 的结构。 MBR 包括引导部分、分区表、以及结束标记 `(55AAH),分别占用了 512 字节中 446 字节、 64 字节和 2 字节。这里仅仅关注分区表部分,即中间的 64 字节以及图中左边的部分。

由于我用的是 SCSI 的硬盘,下面从 /dev/sda 设备中把硬盘的前 512 个字节拷贝到文件 mbr.bin 中。

$ sudo -s
# dd if=/dev/sda of=mbr.bin bs=512 count=1

下面用 fileodfdisk 等命令来分析这段 MBR 的数据,并对照上图以便加深理解。

$ file mbr.bin
mbr.bin: x86 boot sector, LInux i386 boot LOader; partition 3: ID=0x82, starthead 254, startsector 19535040, 1959930 sectors; partition 4: ID=0x5, starthead 254, startsector 21494970, 56661255 sectors, code offset 0x48
$ od -x mbr.bin | tail -6   #仅关注中间的64字节,所以截取了结果中后6行
0000660 0000 0000 0000 0000 a666 a666 0000 0180
0000700 0001 fe83 ffff 003f 0000 1481 012a 0000
0000720 0000 0000 0000 0000 0000 0000 0000 fe00
0000740 ffff fe82 ffff 14c0 012a e7fa 001d fe00
0000760 ffff fe05 ffff fcba 0147 9507 0360 aa55
$ sudo -s
# fdisk -l | grep ^/  #仅分析MBR相关的部分,不分析逻辑分区部分
/dev/sda1   *           1        1216     9767488+  83  Linux
/dev/sda3            1217        1338      979965   82  Linux swap / Solaris
/dev/sda4            1339        4865    28330627+   5  Extended

file 命令的结果显示,刚拷贝的 512 字节是启动扇区,用分号分开的几个部分分别是 bootloader,分区 3 和分区 4 。分区 3 的类型是 82,即 swap 分区(可以通过 fdisk 命令的 l 命令列出相关信息),它对应 fdisk 的结果中 /dev/sda3 所在行的第 5 列,分区 3 的扇区数是 1959930,转换成字节数是 1959930\*512 (目前,硬盘的默认扇区大小是 512 字节),而 swap 分区的默认块大小是 1024 字节,这样块数就是 :

$ echo 1959930*512/1024 | bc
979965

正好是 fdisk 结果中 /dev/sda3 所在行的第四列对应的块数,同样地,可以对照 fdiskfile 的结果分析分区 4 。

再来看看 od 命令以十六进制显示的结果,同样考虑分区 3,计算一下发现,分区 3 对应的 od 命令的结果为:

fe00 ffff fe82 ffff 14c0 012a e7fa 001d

首先是分区标记,00H,从上图中,看出它就不是引导分区(80H 标记的才是引导分区),而分区类型呢?为 82H,和 file 显示结果一致,现在再来关注一下分区大小,即 file 结果中的扇区数。

$ echo "ibase=10;obase=16;1959930" | bc
1DE7FA

刚好对应 e7fa 001d,同样地考虑引导分区的结果:0180 0001 fe83 ffff 003f 0000 1481 012a

分区标记: 80H,正好反应了这个分区是引导分区,随后是引导分区所在的磁盘扇区情况,010100,即 1 面 0 道 1 扇区。其他内容可以对照分析。

考虑到时间关系,更多细节请参考下面的资料或者查看看系统的相关手册。

补充:安装系统时,可以用 fdiskcfdisk 等命令进行分区。如果要想从某个分区启动,那么需要打上 80H 标记,例如可通过 cfdisk 把某个分区设置为 bootable 来实现。

参考资料: