第三章:使用MBR分区表

对于新的但很小的硬件,或者特别挑剔的旧硬件,可能需要使用基于MBR的分区。

对于新手,可使用gpart创建、销毁和管理MBR分区。

对于老鸟,可以使用fdisk和disklabel工具。但这些程序可能会被弃用。

得益于切片和磁盘标签分区,MBR分区的管理比GPT分区稍微复杂一些。

切片和磁盘标签

最初的UNIX和BSD运行在不使用MBR等基于硬件的分区的硬件上。BSD使用自己的磁盘分区方案,称为disklabels(磁盘标签)。BSD系统有几个分区,包括至少/、/usr、/var、/tmp和swap空间,以及系统所做的任何工作的分区。

当BSD移植到当今常见的x86硬件及其后代时,他们本可以转而使用MBR分区。

扩展的MBR分区可以支持多达24个分区。然后,磁盘标签分区被嵌入到内核的大部分中,通常在没有人想触碰的讨厌的地方。

移植小组决定将MBR切片视为BSD磁盘,并用BSD磁盘标签对这些磁盘进行分区。

系统管理员需要在磁盘上创建MBR分区,然后将BSD分区嵌套在MBR分区内。

这奏效了,但使“partition”这个词变得含糊不清。

“partition”是指MBR分区还是磁盘标签分区?

FreeBSD通过调用MBR分区切片(slices)来消除“partition”一词的歧义。

每个切片都有自己的磁盘标签,列出了切片中包含的BSD分区。

无法为切片或分区添加标签。这些格式没有标签空间。相反,可以标记驻留在分区上的文件系统。

MBR 设备节点

正如每个磁盘都有一个设备节点一样,每个分区和切片也都有设备节点。

切片设备节点是底层磁盘的扩展,分区设备节点名称是切片节点的扩展。

以下是一个基于MBR的系统上的设备节点示例:

磁盘的第一个细分是切片。FreeBSD用字母s和1到4之间的数字表示切片。第一个切片是s1,第二个切片是s2,依此类推。

因此/dev/ada0s1表示第一个磁盘上的第一个切片。

FreeBSD不会为未使用的MBR分区创建设备节点,所有这些分区都在切片1上。

磁盘细节的第二层是切片内的磁盘标签分区。每个分区都有一个唯一的设备节点名称,该名称是通过在设备节点上添加一个字母创建的。

这里我们看到五个磁盘标签分区,从ada0s1a开始,到ada0s1f结束。

传统上讲,以a结尾的节点(如/dev/ada0s1a)是根分区,以b结尾的节点(如/dev/ada0s1b)是交换空间。

设备节点不包括字母c,c分区代表整个切片。如果磁盘只有一个切片,则c分区代表整个磁盘。

如今,c分区的使用并不多——你可以在切片条目上运行磁盘分区工具,而不是在切片的磁盘标签上运行。

一个切片上的默认磁盘标签最多可以有8个分区(其中7个可用),每个驱动器最多可以有4个切片,这样一个驱动器上最多可以有28个分区。一个磁盘标签最多可以支持20分区,但在创建标签时必须说明你需要额外的分区。

把一切放在一起;设备节点描述了一个分区。设备ada0s1a是第一个驱动器的第一个切片上的第一个分区。考虑到将第一个分区设置为跟去的传统,它可能(但不一定)是根文件系统。

同样,设备节点/dev/ad4s3b可能是磁盘5上切片3上的交换空间。要了解/dev/ad1s1e包含什么类型的数据,可能需要挂载分区并查看内部。

切片磁盘

与GPT分区一样,需要能擦除磁盘、创建切片和删除切片。使用gpart管理切片与使用gpart管理GPT分区有很多相似之处。

MBR 对齐

切片有自己的一组对齐问题。

传统上,MBR分区在柱面边界上结束。柱面边界对现代硬件没有任何意义。但旧硬件认为它们是必不可少的。

如果你在期望切片尊重柱面边界的机器上使用一个切片不在柱面边界上结束磁盘,及其将出现某种崩溃。

理论上,今天切片的磁盘可以进入旧系统。因此,FreeBSD会排列切片,使其在柱面边界上结束。

柱面边界可能根4K扇区大小冲突。

如果没有别的,MBR本身会占用第一个柱面,即63个512自己的扇区。

幸运的是,很少写切片表,而且当写切片时,性能也不是问题。

切片表的对齐并不重要,只要将切片内的磁盘标签分区与4K扇区边界对齐即可。

再次擦除磁盘

无论使用哪种分区方案,从磁盘中擦除所有分区的命令都是相同的:

为磁盘创建MBR方案

在可以创建切片之前,需要告诉磁盘将要使用切片。给磁盘分配MBR分区方案:

MBR按照旧的圆头扇区(cylinder-head-sector)几何形状使用磁盘的前63个扇区。使用MBR方案的磁盘上的任何切片、分区或文件系统都从扇区63开始。

创建切片

切片是freebsd类型的MBR分区。使用-t指定类型。如果不指定大小,gpart将使用所有可用空间。在新磁盘上,这是覆盖整个磁盘的单个切片。

核对一下:

此磁盘有1953.525105个扇区,不包括MBR使用的扇区。切片1从扇区63开始,填充1953525105个扇区。

如果要为多个切片留出空间,请使用-s指定切片大小。小型嵌入式系统的一种常见配置是在磁盘上放置三个切片。两个较小的切片用于操作系统的不同版本,而第三个切片用于数据。在这里,我将1TB磁盘分为两个150GB的切片,并将磁盘的剩余部分用于第三个切片。

使用gpart show命令可以查看这些切片。

删除切片

使用gpart delete命令删除不需要的切片:

有了切片,就可以在切片内创建BSD分区了。

磁盘标签分区

在切片内创建分区,与在磁盘上创建分区非常相似。

必须告诉磁盘要在磁盘上使用的方案,创建和删除分区,并安装引导加载程序。

创建和删除磁盘标签分区域创建GPT分区非常相似。这就是使用同一个工具进行所有分区操作的意义所在。

创建磁盘标签

使用gpart create命令在切片上创建一个磁盘标签。-s指定方案名称。以下示例在设备节点上为切片da1s1创建磁盘标签,而不是磁盘本身:

这是一个默认的磁盘标签,有8个分区的空间。需要增加分区数量的话,可以用-n选项指定数量:

磁盘标签最多支持20个分区。

创建磁盘标签分区

应先规划如何分区磁盘。在纸上解决问题比在命令行上解决问题要容易得多。

以下是一个分区计划:

注意没有引导分区。MBR磁盘不需要引导分区,因为引导加载程序写在主引导记录中。

要创建每个分区,您必须知道它的类型、大小和要放置它的切片。为了确保磁盘正确对齐,以适应驱动器上4K扇区的可能性,我使用-a标志指定对齐4K。首先创建一个根分区。

在gpart show命令中使用-p选项可以查看每个设备的设备节点:

在切片的最开始,我们有一个512B的空闲块。我要求分区与4K扇区对齐,因此gpart在切片开始时浪费了半个千字节来满足这一要求。1TB中损失了半千字节?我会活下去的。

现在创建8GB交换分区。将类型设置为freebsd-swap:

其他数据分区的类型为freebsd-ufs,但根据其角色大小不同:

不要在最后一个分区上指定大小,这样它就会填满剩余的空间:

查看最终的结果:

现在磁盘可以用了。

指定特定分区字母

传统上,a分区用于根分区,b分区用于交换分区。虽然不是强制性的,但建议不要将a或b分区用于其他用途。

但实际上FreeBSD14在安装系统时默认的第一分区是efi分区,第二分区是freebsd-boot分区,第三分区是freebsd-swap,第四分区是freebsd-zfs分区。

swap放在前面是因应机械硬盘内圈速度快以提高读写速度,对于固态硬盘则没有太大意义。

建议按系统默认安装时的分区做,不要随意打乱,以免其他人维护系统时错误挂载分区。

gpart旨在处理分区号,而不是字母。然而对于磁盘标签创建,gpart将索引号映射到字母上。分区1是a、分区2是b、分区4是d,等等。通过在创建分区时指定分区索引,可以将字母分配给分区。

如果不指定分区索引号,gpart将开始按字母顺序分配分区字母。如果特别想避开使用分区a,则必须为创建的每个分区指定一个分区索引号。以下示例将1TB的切片分为两个100G的分区,剩余的空间在第三个分区中。使用d、e、f作为分区索引字母。

最终的结果如下:

如果没有指定第二和第三各分区的索引,gpart会将其创建为分区a和分区b,并将它们放置于分区d后面。

删除磁盘标签分区

可以像删除GPT分区一样删除磁盘标签分区。使用-i指定分区号。以下示例将上一节创建的分区f删除(其分区号为6):

使MBR磁盘可启动

可引导MBR分区磁盘需要将切片标记为可引导,并在可引导切片本身中安装引导代码。

MBR磁盘可以有一个标记为可引导的切片(slice),称为活动(active)切片。当计算机启动时,BIOS会查找活动切片并在该切片上加载操作系统内核。

在gpart set命令中,使用-a选项将切片标记为活动,使用-i指定切片编号:

然后使用gpart bootcode命令的-b选项将启动代码安装到启动切片中:

磁盘1上的切片1可以启动系统了。