要了解Linux的磁盘分区,首先看看各种硬件设备在Linux中的文件名字。
以旧有的Windows观点来看,你可能会有一块磁盘并且把它分区成C:,D:,E:盘。那个C,D,E就是分区。
但是你了解在Linux是怎么分区的吗?
1
个人计算机常见的磁盘接口有两种,分别是IDE与SATA接口。
我们称可以连接到IDE接口的设备为IDE设备,不论是磁盘或者是光盘设备。
以IDE接口来说,由于一个IDE扁平电缆可以连接两个IDE设备,通常主机又会提供两个IDE接口,因此最多可以连接到四个IDE设备。
也就是说,如果你已经有一个光盘设备了,那么最多就只能再接三块IDE接口的磁盘。
这两个IDE接口通常被称为IDE1(primary)以及IDE2(secondary),而每条扁平电缆上面的IDE设备可以被区分为Master(主设备)与Slave(从设备)。
这四个IDE设备的文件名如下:
例:假设你的主机上仅有一块IDE接口的磁盘,而这一块磁盘接在IDE2的Master上面,请问他在Linux操作系统里面的设备文件名是什么?
答:IDE2的Master设备文件名是/dev/hdc。
再以SATA接口来说,由于SATA、USB、SCSI等磁盘接口都是使用SCSI模块来驱动的,因此这些接口的磁盘设备文件名都是/dev/sd[a-p]的格式。
但是与IDE接口不同的是,SATA、USB接口的磁盘根本就没有一定的顺序,那如何决定它的设备文件名呢?
这个时候就得要根据Linux内核检测到磁盘的顺序了。
例:如果你的PC上面有两个SATA磁盘以及一个USB磁盘,而主板上面有六个SATA的插槽。
这两个SATA磁盘分别安插在主板上的SATA1,SATA5插槽上,请问这三个磁盘在Linux中的设备文件名是什么?
答:由于是使用检测到的顺序来决定设备文件名,并非与实际插槽代号有关,所以设备文件名如下:
现在想想,如果你的磁盘被分成两个分区,那么每个分区的文件名是什么?
在了解这个问题前,我们先了解一下磁盘的组成,因为磁盘的分区与它物理的组成很有关系。
2
磁盘主要组成部件是:盘片,机械手臂,磁头与主轴马达。
盘片上面可以细分出扇区(Sector)与柱面(Cylinder)两种单位,其中扇区为每个512B那么大。
是否每个扇区都一样重要呢?
其实整个磁盘的第一个扇区特别重要,因为磁盘的第一个分区记录了关于磁盘的两个重要信息:
主引导分区(Master Boot Record,MBR):可以安装引导加载程序的地方,有446B。
分区表(partition table):记录整块硬盘分区的状态,有64B。
MBR是很重要的。当系统在开机的时候会主动去读取这个区块的内容,这样系统才会知道你的程序放在哪里且该如何进行开机。
如果安装多重引导的系统,MBR这个区块的管理就非常重要了。
分区表是什么呢?其实你刚才拿到的整块硬盘就像是一根原木,你必须在这根原木上切割出你想要的区段,这个区段在能够再制作成你想要的家具。
如果没有进行切割,那么原木就不能被有效地使用。
同样道理,你必须对硬盘进行分区,这样硬盘才能够被你使用。
3
柱面是文件系统的最小单位,也就是分区的最小单位。
我们就是利用参考柱面号码的方式来处理。
在分区表所在的64bytes容量中,总共分为四组记录区,每组记录区记录了该区段的起始与结束的柱面号码。
若把硬盘以长条形来看,然后把柱面以柱形图来看,那么如下图所示:
假设上面的硬盘设备文件名为/dev/hda时,那么这四个分区在Linux系统中的设备文件名如下所示,
重点在于文件名后面会再接一个数字,这个数字与该分区所在的位置有关。
P1:/dev/hda1
P2:/dev/hda2
P3:/dev/hda3
P4:/dev/hda4
上图中我们假设硬盘只有400个柱面,共分区成为4个分区,第四个分区所在为第301到400号柱面的范围。
当你的操作系统是Windows时,那么第一个到第四个分区的代号应该就是C、D、E、F。
当你有数据要写入F盘时,你的数据会被写入这块磁盘的301~400号柱面之间。
由于分区表就只有64bytes而已,最多只能容纳四个分区,这四个分区被称为主(Primary)或扩展分区(Extended)分区。
我们有以下结论:
当系统要写入磁盘时,一定会参考磁盘分区表,才能针对某个分区进行数据的处理。
考虑一下,为什么要分区啊?
数据的安全性。
每个分区的数据是分开的。
当需要把某个分区的数据重整时,例如重新装Windows的时候,可以把C盘中的其他重要数据移到其他分区,比如把C盘的一些文件移动到D盘,那么对C盘重装系统也不会影响D盘。
系统的性能考虑。
由于分区把数据集中在某个柱面的区段,如上图所示,当中第一个分区位于柱面号码1-100号,
如此一来当有数据要读取该分区的时候,磁盘只会搜索前面1-100的柱面范围,由于数据集中了,将有助于数据读取的速度与性能。
虽然分区表只有四组数据的空间,但是不代表我一块硬盘上最多只能分区出四个分区。
在Windows/Linux系统中,可以通过扩展分区,把一块硬盘分区成十个以上的分区。
扩展分区的想法是,既然第一个扇区所在的分区表只能记录四条数据,那我可否利用额外的扇区来记录更多的分区信息?
如下图所示:
从上图我们知道硬盘的四个分区记录仅仅使用到2个,P1是主分区,P2是扩展分区。
请注意,扩展分区的目的是使用额外的扇区来记录分区信息,扩展分区本身并不能被拿来格式化。
然后我们可以通过扩展分区所指向的那个区块继续做分区的记录。
上图右下方那个区块继续分区出五个分区,这五个由扩展分区继续切出来的分区,就被称为逻辑分区(logical partition)。
上图中表示的分区在Linux中的设备文件名如下:
P1:/dev/hda1
P2:/dev/hda2
L1:/dev/hda5
L2:/dev/hda6
L3:/dev/hda7
L4:/dev/hda8
L5:/dev/hda9
仔细看看,发现设备文件名没有/dev/hda3和/dev/hda4,为什么呢?
因为前四个都是保留的,所以逻辑分区的设备名称一定是从5开始。
关于主分区,扩展分区与逻辑分区的特性我们做个简单的定义。
1. 主分区与扩展分区最多可以有四个(硬盘本身的限制)。
2. 扩展分区最多只能有一个(操作系统的限制)。
3. 逻辑分区是由扩展分区继续切割出来的分区。
4. 能够被格式化后作为数据访问的分区为主分区与逻辑分区。扩展分区无法格式化。
5. 逻辑分区的个数上限与操作系统有关。在Linux中,IDE硬盘最多有59个逻辑分区(5-63),SATA硬盘则有11个逻辑分区(5-15)。
分区是个以柱面为单位的“连续”磁盘空间,且扩展分区又是个类似独立的磁盘空间。
由于第一个扇区所记录的分区表与MBR是这么重要,几乎只要读取硬盘都会先由这个扇区先读取。
所以,如果一个硬盘的第一个扇区物理上坏掉,那个个硬盘也就没什么用了。
例:如果我想把一块大硬盘“暂时”分成四个分区,同时还有其他的剩余容量可以让我在未来的时候进行规划,我能不能分区出四个主分区?
如果不行,那么该怎么办?
答:由于主分区和扩展分区虽多只能有四个,其中扩展分区最多只能有一个,这个题目想要分区出四个分区且还要预留剩余空间,所以P+P+P+P是不合适的。
因为如果使用到四个主分区,即使硬盘还有剩余容量,因为无法继续分区,所以剩余容量就会被浪费掉了。
假设你想要把所有的四条记录都花光,可以P+P+P+E比较合适。
所以可以用的四个分区有三个主分区和一个逻辑分区,剩余的容量在扩展分区里面。
如果你要分区超过四个,一定要有扩展分区,而且必须把所有剩下的空间都分配给扩展分区,然后再以扩展分区来规划扩展分区的空间。
另外,考虑到磁盘的连续性,一般建议把扩展分区的柱面号码分配在最后面的柱面内。
例:我能不能仅分出一个主分区和一个扩展分区?
答:当然可以。这是早起Windows操作系统惯用的手法。
例:假如我的PC有两块SATA硬盘,我想在第二块硬盘分出6个可用的分区(可以被格式化来访问数据之用),
那么每个分区在Linux系统下的设备文件名为什么?分区类型是什么?
答:由于P+E最多只能四个,其中E最多只能一个。
现在题目要求六个可用的分区,所以不可能分出四个P。
one: 将前四号全部用完(P+P+P+E)。
实际可用的是:
/dev/sdb1,/dev/sdb2,/dev/sdb3,/dev/sdb5,/dev/sdb6,/dev/sdb7
/dev/sdb4这个扩展分区本身仅是提供给逻辑分区创建使用。
two:使用前四号中的部分(P+E)。
注意到了吗?
因为1-4是保留给主或扩展分区的,因此第一个逻辑分区一定是由5号开始,
所以/dev/sdb3,/dev/sdb4就会被保留下来没有用到。
4
我们在计算机概论里面提到了,没有执行软件的硬件是没用的,
为了计算机硬件系统的资源合理分配,因此有了操作系统这个系统软件的产生。
由于操作系统会控制所有的硬件并且提供内核功能,因此我们的计算机就能认识硬盘内的文件系统,
并且进一步读取硬盘内的软件文件与执行该软件来完成各项软件的执行目的。
问题是,操作系统也是软件,那么我的计算机又是怎么认识这个操作系统软件并且执行它的?
开机的时候我的计算机还没有任何软件系统,那他要如何读取硬盘内的操作系统文件?这就涉及到计算机的开机程序。
CMOS是记录各项硬件参数且嵌入在主板上的存储器,BIOS则是一个写入到主板上的一个韧体(韧体就是写入到硬件上的一个软件程序)。
这个BIOS就是在开机的时候计算机会主动执行的第一个程序。
接下来BIOS会去分析计算机里面有哪些存储设备,我们以硬盘为例,BIOS会依据用户的设置去取的能开机的硬盘,
并且到该硬盘里第一个扇区的MBR的位置。
MBR这个仅有446bytes的硬盘容量里会放置最基本的引导加载程序,此时BIOS就圆满成功,而接下来就是MBR内的引导加载程序的工作了。
这个引导加载程序的目的是在加载(load)内核文件,由于引导加载程序是“操作系统在安装的时候”所提供的,
所以它会识别硬盘内的文件系统的格式,因此就能够读取内核文件,然后接下来就是内核文件的工作,引导加载程序也功成圆满。
简单地说,整个开机流程到操作系统之前的动作应该是这样的:
BIOS:开机主动执行的韧体,会认识第一个可开机的设备。
MBR:第一个可开机设备的第一个扇区内的主引导分区块,内包含引导加载程序。
引导加载程序(Boot Loader):一支可读取内核文件来执行的软件。
内核文件:开始操作系统的功能。
由上面的说明我们知道,BIOS和MBR都是硬件本身会支持的功能,至于BootLoader是操作系统安装在MBR上的一套软件。
由于MBR仅仅有446bytes,因此这个引导加载程序是十分小而完美的。
这个Boot Loader提供的功能有:
提供菜单:用户可以选择不同的开机选项,这也是多重引导的重要功能。
载入内核文件:直接指向可开机的程序区段来开始操作系统。
转交给其他Loader:将引导加载功能转交给其他Loader负责。
上述第三点说明,你的计算机系统里面可能具有两个以上的引导加载程序。
有可能吗?我们的硬盘不是只有一个MBR吗?
完全有可能,因为引导加载程序除了可以安装在MBR之外,还可以安装在每个分区的引导扇区(boot sector)。
分区还有个别的启动扇区,这个特色才能造就“多重引导”的功能。
我们举一个例子来说,假设你的个人计算机只有一块硬盘,里面分成四个分区,其中第一、二分区分别安装了Windows和Linux,
你要如何在开机的时候选择用Windows还是Linux开机呢?
假设MBR内安装的是可同时识别Windows、Linux操作系统的引导加载程序,那么整个流程如图所示:
在上图中我们可以发现,MBR的引导加载程序提供两个菜单,
菜单一(M1)可以直接加载Windows的内核文件来开机,
菜单二(M2)则是将引导加载工作交给第二个分区的启动扇区(boot sector)。
当用户在开机的时候选择菜单二时,那么整个引导加载工作就会交给第二分区的引导加载程序了。
当第二个引导加载程序启动后,该引导加载程序内仅有一个开机菜单,因此就能够使用Linux的内核文件来开机。
这就是多重引导的工作情况。
我们将上图做个总结:
1) 每个分区都有自己的启动扇区(boot sector)。
2) 图中的系统分区为第一及第二分区。
3) 实际可开机的内核文件是放置到各分区的。
4) Loader只会认识自己的系统分区内的可开机内核文件以及其他loader而已。
5) Loader可以直接指向或者是间接把管理权转交给另一个管理程序。
现在想想,为什么别人说:如果要安装多重引导,最好先安装Windows在安装Linux。
1)
Linux在安装的时候你可以选择将引导加载程序安装在MBR或个别分区的启动扇区,而且Linux的loader可以手动设置菜单,
所以你可以在Linux的boot loader里面加入Windows开机的选项。
2)
Windows在安装的时候,它的安装程序会主动覆盖MBR以及自己所在分区的启动扇区,你没有选择的机会,
而且他没有让我们自己选择菜单的功能。
所以,如果先装Linux在安装Windows的话,那MBR的引导加载程序就只会有Windows的选项,
而不会有Linux的选项(因为原本在MBR内的Linux的引导加载程序就会被覆盖掉)。
那需要重新安装一次Linux吗?
当然不需要,你只需要用各种方法来处理MBR的内容即可,比如spfdisk软件或者Linux的救援模式来挽救MBR即可。
资料来源:
1.《鸟哥的私房菜》
注:部分内容有本人删改。