2.2 磁盘分区
那Linux系统是安装在计算机元件的磁盘中。
一块磁盘是可以被分区成多个分区的(partition),以旧有的Windows观点来看,你可能会有一颗磁盘并且将他分区成为C:, D:, E:盘对吧!那个C, D, E就是分区(partition)啰。但是Linux的设备都是以文件的型态存在,那分区的文件名又是什么? 如何进行磁盘分区?磁盘分区有哪些限制?目前的 BIOS 与 UEFI分别是啥?MSDOS 与 GPT 又是啥?
2.2.1 磁盘连接的方式与设备文件名的关系
个人计算机常见的磁盘接口有两种, 分别是SATA与SAS接口,目前(2015)的主流是SATA接口。不过更老旧的计算机则有可能是已经不再流行的IDE界面喔!
正常的实体机器大概使用的都是 /dev/sd[a-] 的磁盘文件名,至于虚拟机环境下面,为了加速,可能就会使用 /dev/vd[a-p] 这种设备文件名。
再以SATA接口来说,由于SATA/USB/SAS等磁盘接口都是使用SCSI模块来驱动的, 因此这些接口的磁盘设备文件名都是/dev/sd[a-p]的格式。 所以SATA/USB接口的磁盘根本就没有一定的顺序,那如何决定他的设备文件名呢? 这个时候就得要根据Linux核心侦测到磁盘的顺序了!
例题:如果你的PC上面有两个SATA磁盘以及一个USB磁盘,而主板上面有六个SATA的插槽。这两个SATA磁盘分别安插在主板上的SATA1, SATA5插槽上, 请问这三个磁盘在Linux中的设备文件名为何?
答:由于是使用侦测到的顺序来决定设备文件名,并非与实际插槽代号有关,因此设备的文件名如下:
- SATA1插槽上的文件名:/dev/sda
- SATA5插槽上的文件名:/dev/sdb
- USB磁盘(开机完成后才被系统捉到):/dev/sdc
因为如果你的磁盘被分区成两个分区,那么每个分区的设备文件名又是什么?在了解这个问题之前,我们先来复习一下磁盘的组成, 因为现今磁盘的分区与他物理的组成很有关系!
磁盘的组成主要有盘片、机械手臂、磁头与主轴马达所组成, 而数据的写入其实是在盘片上面。盘片上面又可细分出扇区(Sector)与磁道(Track)两种单位,其中扇区的物理量设计有两种大小,分别是 512Bytes 与 4KBytes。
整颗磁盘的第一个扇区特别的重要,因为他记录了整颗磁盘的重要信息! 早期磁盘第一个扇区里面含有的重要信息我们称为MBR (Master Boot Record)格式,但是由于近年来磁盘的容量不断扩大,造成读写上的一些困扰, 甚至有些大于 2TB 以上的磁盘分区已经让某些操作系统无法存取。因此后来又多了一个新的磁盘分区格式,称为GPT (GUID partition table)!
那么分区表又是啥?其实你刚刚拿到的整颗硬盘就像一根原木,你必须要在这根原木上面切割出你想要的区段, 这个区段才能够再制作成为你想要的家具!如果没有进行切割,那么原木就不能被有效的使用。 同样的道理,你必须要针对你的硬盘进行分区,这样硬盘才可以被你使用!
2.2.2 MSDOS(MBR) 与 GPT 磁盘分区表(partition table)
在前一小节的图示中, 我们有看到“开始与结束磁道”吧?而通常磁盘可能有多个盘片,所有盘片的同一个磁道我们称为柱面 (Cylinder), 通常那是文件系统的最小单位,也就是分区的最小单位啦!为什么说“通常”呢?因为近来有 GPT 这个可达到 64bit 纪录功能的分区表, 现在我们甚至可以使用扇区 (sector) 号码来作为分区单位哩!厉害了! 所以说,我们就是利用参考对照柱面或扇区号码的方式来处理!也就是说,分区表其实目前有两种格式!
➡ MSDOS (MBR) 分区表格式与限制
早期的 Linux 系统为了相容于 Windows 的磁盘,因此使用的是支持 Windows 的MBR(Master Boot Record, 主要开机纪录区) 的方式来处理开机管理程序与分区表!而开机管理程序纪录区与分区表则通通放在磁盘的第一个扇区, 这个扇区通常是 512Bytes 的大小 (旧的磁盘扇区都是 512Bytes 喔!),
所以说,第一个扇区 512Bytes 会有这两个数据:
- 主要开机记录区(Master Boot Record, MBR):可以安装开机管理程序的地方,有446Bytes
- 分区表(partition table):记录整颗硬盘分区的状态,有64 Bytes
由于分区表所在区块仅有64 Bytes容量,因此最多仅能有四组记录区,每组记录区记录了该区段的启始与结束的柱面号码。 若将硬盘以长条形来看,然后将柱面以直条图来看,那么那64Bytes的记录区段有点像下面的图示:
假设上面的硬盘设备文件名为/dev/sda时,那么这四个分区在Linux系统中的设备文件名如下所示, 重点在于文件名后面会再接一个数字,这个数字与该分区所在的位置有关喔!
P1:/dev/sda1
P2:/dev/sda2
P3:/dev/sda3
P4:/dev/sda4
上图中我们假设硬盘只有400个柱面,共分区成为四个分区,第四个分区所在为第301到400号柱面的范围。 当你的操作系统为Windows时,那么第一到第四个分区的代号应该就是C, D, E, F。当你有数据要写入F盘时, 你的数据会被写入这颗磁盘的301~400号柱面之间的意思。
分区表就只有64 Bytes而已,最多只能容纳四笔分区的记录, 这四个分区的记录被称为主要(Primary)分区或延伸(Extended)分区。 根据上面的图示与说明,我们可以得到几个重点信息:
- 其实所谓的“分区”只是针对那个64 Bytes的分区表进行设置而已!
- 硬盘默认的分区表仅能写入四组分区信息
- 这四组分区信息我们称为主要(Primary)或延伸(Extended)分区
- 分区的最小单位“通常”为柱面(cylinder)
- 当系统要写入磁盘时,一定会参考磁盘分区表,才能针对某个分区进行数据的处理
你可以这样思考分区的角度:
- 数据的安全性: 因为每个分区的数据是分开的!所以,当你需要将某个分区的数据重整时,例如你要将计算机中Windows的C 盘重新安装一次系统时, 可以将其他重要数据移动到其他分区,例如将邮件、桌面数据移动到D 盘去,那么C 盘重灌系统并不会影响到D盘! 所以善用分区,可以让你的数据更安全。
- 系统的性能考虑: 由于分区将数据集中在某个柱面的区段,例如上图当中第一个分区位于柱面号码1~100号,如此一来当有数据要读取自该分区时, 磁盘只会搜寻前面1~100的柱面范围,由于数据集中了,将有助于数据读取的速度与性能!所以说,分区是很重要的!
既然分区表只有记录四组数据的空间,那么是否代表我一颗硬盘最多只能分区出四个分区?当然不是啦!有经验的朋友都知道, 你可以将一颗硬盘分区成十个以上的分区的!那又是如何达到的呢?在Windows/Linux系统中, 我们是通过刚刚谈到的延伸分区(Extended)的方式来处理的啦!延伸分区的想法是: 既然第一个扇区所在的分区表只能记录四笔数据, 那我可否利用额外的扇区来记录更多的分区信息?
在上图当中,我们知道硬盘的四个分区记录区仅使用到两个,P1为主要分区,而P2则为延伸分区。请注意, 延伸分区的目的是使用额外的扇区来记录分区信息,延伸分区本身并不能被拿来格式化。 然后我们可以通过延伸分区所指向的那个区块继续作分区的记录。
如上图右下方那个区块有继续分区出五个分区, 这五个由延伸分区继续切出来的分区,就被称为逻辑分区(logical partition)。 同时注意一下,由于逻辑分区是由延伸分区继续分区出来的,所以他可以使用的柱面范围就是延伸分区所设置的范围喔! 也就是图中的101~400啦!
同样的,上述的分区在Linux系统中的设备文件名分别如下:
P1:/dev/sda1
P2:/dev/sda2
L1:/dev/sda5
L2:/dev/sda6
L3:/dev/sda7
L4:/dev/sda8
L5:/dev/sda9
怎么设备文件名没有/dev/sda3与/dev/sda4呢?因为前面四个号码都是保留给Primary或Extended用的! 所以逻辑分区的设备名称号码就由5号开始了!这在 MBR 方式的分区表中是个很重要的特性,不能忘记!
MBR 主要分区、延伸分区与逻辑分区的特性我们作个简单的定义:
- 主要分区与延伸分区最多可以有四笔(硬盘的限制)
- 延伸分区最多只能有一个(操作系统的限制)
- 逻辑分区是由延伸分区持续切割出来的分区;
- 能够被格式化后,作为数据存取的分区为主要分区与逻辑分区。延伸分区无法格式化;
- 逻辑分区的数量依操作系统而不同,在Linux系统中SATA硬盘已经可以突破63个以上的分区限制;
事实上,分区是个很麻烦的东西,因为他是以柱面为单位的“连续”磁盘空间, 且延伸分区又是个类似独立的磁盘空间,所以在分区的时候得要特别注意。
❄ 例题:
在Windows操作系统当中,如果你想要将D与E盘整合成为一个新的分区,而如果有两种分区的情况如下图所示, 图中的特殊颜色区块为D与E盘的示意,请问这两种方式是否均可将D与E整合成为一个新的分区?
答:
- 上图可以整合:D与E同属于延伸分区内的逻辑分区,因此只要将两个分区删除,然后再重新创建一个新的分区,就能够在不影响其他分区的情况下,将两个分区的容量合成为一个。
- 下图不可整合:D与E分属主区与逻辑分区,两者不能够整合在一起。除非将延伸分区破坏掉后再重新分区。但会影响到所有的逻辑分区,要注意的是:如果延伸分区被破坏,所有逻辑分区将会被删除。因为逻辑分区的信息都记录再延伸分区里面。
由于第一个扇区所记录的分区表与MBR很重要,几乎只要读取硬盘都会由这个扇区先读起。因此,如果整个硬盘的第一个扇区(就是MBR与partition table所在的扇区)物理实体坏掉了,硬盘大概就没有用了。
❄ 例题:
如果我想将一颗大硬盘“暂时”分区成为四个partitions,同时还有其他的剩余容量可以让我在未来的时候进行规划, 我能不能分区出四个Primary?若不行,那么你建议该如何分区?
答:
- 由于Primary+Extended最多只能由四个,其中Extended最多只能有一个,因此P+P+P+P的分区方式是不适合的。因为使用到4个P,即使硬盘还有剩余容量,因为无法再继续分区,所以剩余容量就被浪费掉了。
- 假设想将所有四个分区记录都用上,那么P+P+P+E是比较适合的。所以可以用的4个partitions有3个主要及1个逻辑分区,剩余的容量在延伸分区中。
- 如果要分区超过4个以上,一定要有Extended分区,而且必须将所有剩下的空间都分配给Extended,然后再以logical的分区来规划Extended的空间。另外,考虑到磁盘的连续性,一般建议将Extended的柱面号码分配在最后面的柱面内。
❄ 例题:
假如我的PC有两颗SATA硬盘,我想在第二颗硬盘分区出6个可用的分区(可以被格式化来存取数据之用), 那每个分区在Linux系统下的设备文件名为何?且分区类型各为何?至少写出两种不同的分区方式。
答:
由于P(Primary) + E(Extended)最多只能有四个,其中E最多只能有一个。需要分6个分区则不能分出4个P。
假设两种环境:
- P+P+P+E的环境
示意图中可用的是 /dev/sdb1, /dev/sdb2, /dev/sdb3, /dev/sdb4, /dev/sdb5, /dev/sdb6, /dev/sdb7, 至于/dev/sdb4这个延伸分区本身仅是提供来给逻辑分区创建之用。
- P+E的环境
1~4号是保留给主要/延伸分区的,因此第一个逻辑分区一定是由5号开始的! 所以/dev/sdb3, /dev/sdb4 就会保留下来没有用到。
MBR分区表除了上述的主分区、延伸分区、逻辑分区需要注意之外,由于每组分区表仅有16Bytes而已,因此可记录的信息是相当有限的!所以,在过去MBR分区表的限制中经常发现以下问题:
- 操作系统无法抓取到2.2T以上的磁盘容量
- MBR仅有一个区块,若被破坏后,经常无法活很难救援
- MBR内的存放开机管理程序的区块仅446Bytes,无法容纳较多的程序码
早期2.2TB限制现象不是很严重,但是目前单一磁盘容量甚至高达8TB,或者用多颗磁盘搭建出磁盘阵列,可高达70TB甚至更大,如果使用MBR分割就得2TB/2TB的分割下去,这样分区会很繁琐。为了解决这个问题,后来就有了GPT这个磁盘分区格式的出现。
➡ GUID partition table, GPT 磁盘分区表
过去一个扇区大小就是512Bytes,不过目前已经有4K的扇区设计出现!为了相容于所有的磁盘,因此在扇区的定义上面,大多会使用所谓的逻辑区块位址(Logical Block, Address, LBA)来处理。GPT将磁盘所有区块以此LBA(默认为512Bytes)来规划,而第一个LBA成为LBA0(从0开始编号)。
与MBR仅使用第一个512Bytes区块来记录分区信息相比,GPT使用34个LBA区块来记录分区信息!同时,GPT除了前面34个LBA之外,整个磁盘最后33个LBA也拿来作为另一个备份!
LBA0(MBR相容区块)
与MBR模式相似,相容区块也分为两个部分,一个就是跟之前446Bytes相似的区块,存储了第一阶段的开机管理程序!而在原本的分区表的记录区内,这个相容模式仅放入一个特殊标志的分区,用来表示此磁盘为GPT格式之意。而不动GPT分区表的磁盘管理程序,就不会认识这颗磁盘,除非用户有特别要求要处理这颗磁盘,否则该管理软件不能修改此分区信息,进一步保护此磁盘。LBA1(GPT表头记录)
这个部分记录了分区表本身的位置与大小,同时记录了备份用的GPT分区(就是磁盘最后的34个LBA区块)放置的未知,同时放置了分区表的检验机制码(CRC32),操作系统可以根据这个检验码来判断GPT是否正确。若有错误,还可以通过这个记录区来取得备份的GPT(磁盘最后的备份区块)来恢复GPT的正常运行!LBA2-33(实际记录分区信息处)
从LBA2区块开始,每个LBA可以记录4笔分区记录,所以默认情况下,总共可以有432 = 128笔分区记录。因为每个LBA有512Bytes,因此每笔记录用到128Bytes的空间,除了每笔记录所需要的识别码与相关的记录之外,GPT在每笔记录中分别提供了64bits来记载开始/结束的扇区号码,因此,GPT分区表对于单一分区来说,他的最大容量限制就在“264 512Bytes = 263 1KBytes = 233TB = 8ZB”(1ZB = 230TB)。
现在GPT分区默认可提供多达128笔记录,而在Linux本身的核心设备记录中,针对单一磁盘来说,虽然过去最多只能达到15个分区,不过由于 Linux kernel 通过 udev 等方式的处理,现在LInux也没有这个限制在了!此外,GPT分区已没有所谓的主、延伸、逻辑分区的概念,既然每笔记录都可以独立存在,所以每个都可以视为是主分区!每一个分区都可以拿来格式化使用。
server常常需要比较大容量的磁盘,新版的Linux大多认识了GPT分区表。不过,老牌的fdisk磁盘管理工具并不认识GPT,要使用GPT,要操作类似gdisk或者是parted指令才行。另外,开机管理程序方面,grub第一版并不认识GPT,得要grub2以后才会认识。
并不是所有操作系统可以读取到GPT磁盘分区格式,同时也不是所有硬件都可以支持GPT格式。是否能够读写GPT格式又与开机检测程序(BIOS 和 UEFI)有关。
2.2.3 开机流程中的 BIOS 与 UEFI 开机检测程序
主机系统在嵌入硬件驱动方面的程序,主要有早期的BIOS与新的UEFI两种机制
➡ BIOS搭配MBR/GPT的开机流程
BIOS与CMOS,CMOS是记录各项硬件参数且嵌入在主板上面的存储器,BIOS则是一个写入到主板上的一个固件(固件就是写入到硬件上的一个软件程序)。BIOS就是开机适合,计算机系统会主动执行的第一个程序!
BIOS会分析计算机里面有哪些存储设备,以硬盘为例,BIOS会依据使用者的设置去取得能够开机的硬盘,并去读取硬盘里第一个扇区的MBR未知。MBR这个仅有446Bytes的硬盘容量里面会放置最基本的开机管理程序,此时BIOS就功成圆满,接下来就是MBR内开机管理程序的工作了。
这个开机管理程序的目的是在载入(load)核心文件,由于开机管理程序是操作系统在安装时候提供的,所以会认识硬盘内的文件系统格式,因此能够读取核心文件,接下来就是核心文件的工作,开机管理程序与BIOS也功成圆满,之后的工作就交给操作系统。
整个开机流程到操作系统之前的动作应该是这样的:
- BIOS:开机主动执行的固件,会认识第一个可开机设备;
- MBR:第一个可开机设备的第一个扇区内的主要开机记录区块,内含开机管理程序;
- 开机管理程序(boot loader):一支可读取核心文件来执行的软件;
- 核心文件:开始操作系统的功能 ... ...
如果分区表为GPT格式,BIOS也能从LBA0的MBR相容区块读取第一阶段的开机管理程序码,那么BIOS同样可以读取到正确的操作系统核心(当然前提是开机管理程序能够认识GPT,比如Windows XP 就无法识别GPT格式)。
GPT中LBA0仅提供第一阶段的开机管理程序码,因此如果使用类似grub的开机管理程序,那么就得额外分区出一个“BIOS boot”分区来放置其他开机过程所需的程序码。在CentOS中,这个分区通常占用2MB左右。
BIOS与MBR都是硬件本身会支持的功能,Boot loader则是操作系统安装在MBR上面的一套软件。MBR仅有446Bytes,因此这个开机管理程序是非常小而美的。boot loader主要任务有:
- 提供菜单:使用者可以选择不同的开机项目,这也是多重开机的重要功能!
- 载入核心文件:直接指向可开机的程序区段来开始操作系统;
- 转交其他loader:将开机管理功能转交给其他loader负责。
计算机系统可能具有两个以上的开机管理程序!硬盘只有一个MBR,但是开机管理程序除了可以安装在MBR,还可以安装在每个分区的开机扇区(boot sector)。
❄ 例题
假设你的个人计算机只有一个硬盘,里面切成四个分区,其中第一、二分区分别安装了Windows及Linux, 你要如何在开机的时候选择用Windows还是Linux开机呢?假设MBR内安装的是可同时认识Windows/Linux操作系统的开机管理程序, 那么整个流程可以图示如下:
MBR开机管理程序提供两个菜单,菜单一(M1)可以直接载入Windows的核心文件来开机;菜单二(M2)将开机管理工作交给第二个分区的开机扇区(boot sector)。选择M2后,该开机管理程序仅有一个开机菜单,因此能够使用Linux核心文件来开机。
- 每个分区都拥有自己的开机扇区(boot sector)
- 图中的系统盘为第一及第二分区
- 实际可开机的核心文件是放置到个分区内的
- loader只会认识自己的系统盘内的可开机核心文件,以及其他loader
- loader可直接指向或间接将管理权转交给另一个管理程序
如果安装多重开机,最好先安装Windows再安装Linux
- Linux安装时,可以将开机管理程序安装再MBR或个别分区的开机扇区,而且Linux的loader可以手动设置菜单,所以可以在Linux的boot loader里加入Windows的开机选项;
- Windows安装时,会主动覆盖调MBR以及自己所在分区的开机扇区,没有让我们自己选择菜单的功能。
因此,先装Linux再装Windows,MBR的开机管理程序就只会有WIndows项目。(也有处理方法,利用Linux的救援模式来挽救MBR)
➡ UEFI BIOS 搭配 GPT开机的流程
GPT可以提供64bit的寻址,也能使用较大的区块来处理开机管理程序。但是BIOS需要GPT提供相容模式才能够读写这个磁盘设备~ 而且BIOS仅为16位的程序,与现阶段的操作系统接轨方面有点弱!为了解决这个问题,就有了UEFI(Unified Extensible Firmware Interface)可延伸固件界面的产生。
UEFI主要想取代BIOS固件界面,因此也成UEFI 为 UEFI BIOS。
UEFI使用C程序语言,比使用组合语言的BIOS更容易开发!如果开发者够厉害,甚至可以在UEFI开机阶段就让该系统了解TCP/IP而直接上网,根本不需要进入操作系统。
- BIOS与UEFI的差异
比较项目 | 传统BIOS | UEFI |
---|---|---|
使用程序语言 | 组合语言 | C语言 |
硬件资源控制 | 使用中断(IRQ)管理 不可变的内存读取 不可变得 输入/ 输出存取 | 使用驱动程序与协定 |
处理器运行环境 | 16位 | CPU保护模式 |
扩充方式 | 通过IRQ链接 | 直接载入驱动程序 |
第三方厂商支持 | 较差 | 较佳且可支持多平台 |
图形化能力 | 较差 | 较佳 |
内置简化操作系统前环境 | 不支持 | 支持 |
与BIOS不同,UEFI简直像是一个低阶的操作系统~ 甚至主板上硬件资源的管理,也跟操作系统相当类似,只需要载入驱动程序即可控制操作。
2.2.4 Linux安装模式下,磁盘分区的选择(极重要)
windows系统重装之前,都需要事先考虑C盘多少容量?D盘又要给多大容量?实际安装时候,发现C盘之前会有100MB的分区被独立出来(WIN7分两个盘时会预留100MB空间),所以实际上有三个分区。
Linux又该如何设计呢?
➡ 目录树结构(directory tree)
Linux内所有数据都是以文件形态呈现,所以Linux最重要的就在于目录树架构。
目录树架构(directory tree)就是以根目录为主,然后向下呈现分支状的目录结构的一种文件架构。整个目录树架构最重要的就是那个根目录(root directory),这个根目录的表示方法为“/”,所有的文件都与目录树有关。
如图所示,所有的文件都是又根目录(/)衍生来的,而次目录下还能够有其他的数据存在。图中长方形为目录,波浪形则为文件。想取的mydata文件,最终的文件名为:/home/dmstai/mydata。
Linux使用目录树架构,文件放置在磁盘分区中,“如果结合目录树的架构与磁盘内的数据”呢?这就牵涉到“挂载(mount)”问题了。
➡ 文件系统与目录树的关系(挂载)
“挂载”是利用一个目录当成进入点,将磁盘分区数据放置在该目录下;进入该目录就可以读取该分区。这个动作成为“挂载”,进入点的目录我们成为“挂载点”。由于Linux系统最重要的是根目录,因此根目录一定要挂载到某个分区。至于其他目录可依使用者需求来挂载到不同的分区。
如上图,假设硬盘分两个分区,partition 1是挂载到根目录, partition 2挂载到 /home目录。当数据放置在/home内的各次目录时,数据是放置到patition 2的,如果没在/home下,则数据会放置到partition 1。
windows也是挂载的概念,比如USB放置到windows时会侦测到F(或其他盘)盘,那么读取数据去相应盘读取即可。
➡ distributions 安装时,挂载点与磁盘分区的规划
Linux安装时需要规划磁盘分区与目录树的挂载。
Linux安装时提供“自订安装,Custom” - “Expert,专家模式”
- 自订安装“Custom”
A:初次接触Linux:只要分区“/”及“swap”即可:
初次安装Linux,通常直接以一个最大分区“/”来安装系统。这样不怕分区错误造成无法安装的困境!
例如/usr是Linux可执行程序及相关文件摆放的目录,所以他的容量需求蛮大的,玩意/usr分区不够大,由于无法将数据完全写入的问题,就有可能无法安装。因此初次安装,仅分区成两个分区“/”与Swap即可。
B: 建议分区方法:预留一个备用的剩余磁盘容量
Linux的学习,最麻烦的可能就是分区问题,分区是系统管理员很重要得一个任务。
预留的分区可以拿来做备份用。Linux实际使用中,某些script或者重要文件值得备份时,就可以使用剩余容量分出新的分区,来备份重要配置文件或者script。这样做最大的好处就是重装系统时,一些软件或工具程序马上在硬盘中找到。
- Linux安装程序提供的默认硬盘分区方式
通常不建议使用各个distribution所提供默认的Server安装方式,这会让你无法得知Linux在搞什么鬼,也不见得可以符合你的需求!而且需要注意的是,选择Server时候,需要“确定”你的硬盘数据是否不再需要!因为Linux会自动把硬盘旧的数据全部杀掉!