一块磁盘(机械硬盘)由多片盘片、一个机械手臂、多个磁头和一个主轴马达组成的。有N个盘片的磁盘则存在2*N个盘面(因为一个盘片正反两面均写有数据),而一个盘面分为可以分为M个磁道,磁道与磁道之间存在间隙,一个磁道分为L个扇区(Sector),一个扇区大小为512Byte。过所有盘面的同一磁道编号的截面称为柱面(通俗的解释)。盘面和磁道都是以0开始编号的,而扇区是以1开始编号的。磁道是一系列同心圆,磁道的编号也是从最外层开始编号。因为磁头从停泊区最开始读磁盘时最先读到最外层的0磁道,所以MBR(Master Boot Record)处于0盘面0磁道1扇区。
广义上的MBR是512字节(即一个扇区) = 446字节的MBR + 64字节的分区表 + 2字节的模数(55AA)。狭义上的MBR是446字节,其中安装引导加载程序,64字节的分区表记录着4个 * 16Byte的分区信息。模数是磁盘有效标志。在DOS中我们可以用int 13H中断读取MBR(B+MBR的具体细节暂不做分析):
MOV AX,7C00H
MOV ES,AX
MOV BX,0
;传参读取硬盘0面0道1扇区开始的的1个扇区到7C00:0H开始的地址
MOV AH,2 ;读扇区,3为写扇区
MOV AL,1 ;读取扇区数:1个Sector
MOV CH,0 ;1柱面(0号磁道)
MOV CL,1 ;1号扇区
MOV DH,0 ;0号磁头即对应0号盘面
MOV DL,80H ;00~7F软盘,80H为硬盘
INT 13H
在Linux中,我们也可以用dd命令和输入输出重定位,来获取磁盘0面0道1扇区的MBR(dd < /dev/sda > MBR.txt bs=512 count=1),获取MBR后我们用vim打开(vim中:%!xxd查看二进制信息,安装了Windows7和Redhat6.4双系统的MBR):
在Linux上不同的传输接口(IDE、SCSI、STAT、USB、U盘),有不同的命名方式,比如:
IDE:/dev/hda~/dev/hdd
SCSI/STAT/USB/U盘:/dev/sda~/dev/sdp
软驱:/dev/fd0、/dev/fd1
CD ROM、DVD ROM:/dev/cdrom
等等。
一个IDE扁平电缆可以连接两个IDE设备,通常主机都会提供两个接口。所以最多可以连接4个IDE设备。这两个接口通常被称为IDE1(primary)和IDE2(secondary),而每条扁平电缆的两个IDE设备,分别为Master(主设备)和Slave(从设备)。四个IDE的设备名在Linux上如下所示:
而IDE的接口如今已经被STAT普遍的取而代之。STAT/USB/SSI接口等都是使用SCSI模块驱动的,因此这些接口的磁盘设备名都是/dev/sda~/dev/sdp格式。到底是a~p中的那一个就需要看具体启动时,磁盘的识别顺序是怎样的,由于USB肯定是开机完成后才被识别,因此USB的序号一般都是在硬盘的后面。
我们知道了磁盘的最小单位扇区,也知道了磁道的概念,接着我们来看看关于磁盘分区的问题,首先分区的最小单位是柱面(cylinder)而不是扇区。在Windwos中我们熟知的C:、D:、E:、F:、G:…的盘符,其实就是一块磁盘的不同分区,但是我们刚刚才看了磁盘分区表(Partition Table)只有64字节,记录了四个分区信息,那个么当分区数多于4个分区,这些信息又是如何存储的呢?我们用下图来详细分析:
磁盘/dev/sda被分为4部分(即4个分区),这四部分均由磁盘分区表索引而来,当分区个数多于4个时就产生了扩展分区和逻辑分区的概念,将原本4个标准分区改为3个标准分区+1个扩展分区的格式(标准分区表中的记录也变为3P+1E(4L)+0空闲,也可以是1P+1E(4L)+2空闲,或者2P+1E(4L)+1空闲的格式,至于是哪种格式都无所谓)。如下图所示:
如下便是一个包含了3个主分区和一个扩展分区(包含4个逻辑分区)的磁盘分区情况(fdisk -l /dev/sda列出/dev/sda的磁盘分区信息,不指定对象则列出所有磁盘,fdisk /dev/sda为磁盘规划分区):
列出的信息中,Start/End是柱面号(也是磁道号)。总共有20886个柱面,只分了7969个,还有1万多个柱面没有分配,也就是说,没有分配的柱面在逻辑分区号还有的情况下可以继续分出/dev/sda9、/dev/sda10……也可以用来安装其他系统。
注意:
①主分区和扩展分区的四个分区占用了1~4的四个分区编号,无论标准分区表有无空闲,逻辑分区都是从5开始的(/dev/sda5、/dev/hda5等),前四个保留给Primary或Extended来使用。
②主分区最多四个,扩展分区最多1个,在Linux中IDE硬盘中最多有59个逻辑分区(5~63),STAT最多有11个逻辑分区(5~15号)。
③由于扩展分区记录了逻辑分区的信息,如果扩展分区被破坏,所有的逻辑分区都将被删除。所以在不影响其他分区的情况下,两个逻辑分区可以合并,但是不能够一个逻辑分区和一个主分区进行合并。
参考资料:《鸟哥的Linux私房菜》