实际上内存、u 盘等都可以作为文件系统底层的“存储”设备,但是这里仅用硬盘作为实例来介绍磁盘和分区的关系。
目前 Linux 的分区依然采用第一台PC硬盘所使用的分区原理,下面逐步分析和演示这一分区原理。
磁盘分区基本原理
先来看看几个概念:
- 设备管理和分区
Linux 下,每一个存储设备对应一个系统的设备文件,对于硬盘等
IDE
和SCSI
设备,在系统的/dev
目录下可以找到对应的包含字符hd
和sd
的设备文件。而根据硬盘连接的主板设备接口和数据线接口的不同,在hd
或者sd
字符后面可以添加一个从a
到z
的字符,例如hda
,hdb
,hdc
和sda
,sdb
,sdc
等,另外为了区别同一个硬件设备的不同分区,在后面还可以添加了一个数字,例如hda1
,hda2
,hda3
和sda1
,sda2
,sda3
,所以在/dev
目录下,可以看到很多类似的设备文件。 - 各分区的作用
在分区时常遇到主分区和逻辑分区的问题,这实际上是为了方便扩展分区,正如后面的逻辑卷的引入是为了更好地管理多个硬盘一样,引入主分区和逻辑分区可以方便地进行分区的管理。
Linux 系统中每一个硬盘设备最多由 4 个主分区(包括扩展分区)构成。
主分区的作用是计算机用来进行启动操作系统的,因此每一个操作系统的启动程序或者称作是引导程序,都应该存放在主分区上。 Linux 规定主分区(或者扩展分区)占用分区编号中的前 4 个。所以会看到主分区对应的设备文件为 /dev/hda1-4
或者 /dev/sda1-4
,而不会是 hda5
或者 sda5
。
扩展分区则是为了扩展更多的逻辑分区的,在 Linux 下,逻辑分区占用了 hda5-16
或者 sda5-16
等 12 个编号。
- 分区类型
它规定了这个分区上的文件系统的类型。Linux支持诸如msdoc,vfat,ext2,ext3等诸多的文件系统类型,更多信息在下一小节进行进一步的介绍。
下面通过分析硬盘的前 512 个字节(即 MBR
)来分析和理解分区。
先来看看这张图:
它用来描述 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
下面用 file
,od
,fdisk
等命令来分析这段 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
所在行的第四列对应的块数,同样地,可以对照 fdisk
和 file
的结果分析分区 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 扇区。其他内容可以对照分析。
考虑到时间关系,更多细节请参考下面的资料或者查看看系统的相关手册。
补充:安装系统时,可以用 fdisk
,cfdisk
等命令进行分区。如果要想从某个分区启动,那么需要打上 80H
标记,例如可通过 cfdisk
把某个分区设置为 bootable
来实现。
参考资料: