Partitioning (简体中文)
分区指将硬盘的可用空间划分为多个可以独立访问的区块,从而可对每个区块分别管理。
一个硬盘可以被划分为一个或者多个分区。一些场景需要使用多个分区,例如双重或多重启动、使用 swap 分区等。此外,分区也可以从逻辑上隔离数据,例如为音频和视频数据创建单独的分区。分区方案存储于#分区表中,例如主引导记录(MBR)或 GUID 分区表(GPT)。
分区表由分区工具创建和维护。#分区工具列出了 Arch Linux 所用的分区工具。
分区通常直接包含一个文件系统,这是在分区上直接创建的(即格式化)。或者,分区可能包含LVM(逻辑分卷管理器)、加密块设备、RAID(独立磁盘冗余阵列),它们最终提供可存放文件系统的设备文件。
直接包含可挂载文件系统的块设备(硬盘、分区、LUKS 设备、LVM 逻辑卷、RAID 阵列等)称为卷(也有卷标、宗卷等称谓)。
分区表
分区信息被存放在分区表中。目前有两种主流的模式:传统的#主引导记录(MBR)和新的#GUID 分区表(GPT)。后者功能更强大,解决了许多 MBR 的限制。
parted /dev/sda print
或 fdisk -l /dev/sda
查看当前分区信息。
/dev/sdX
是块设备,依不同物理设备有不同的格式:
-
/dev/sda
是 SATA 设备 -
/dev/nvme0n1
是 NVMe 设备 -
/dev/mmcblk0
是 eMMC 设备
更多信息请参看块设备名称
主引导记录
主引导记录(Master boot record,MBR)是存储设备最开始的 512 字节。其包含操作系统启动加载器和分区表,在 BIOS 系统的启动流程中扮演重要角色。可参阅上述维基页面了解 MBR 的结构。
MBR(引导代码)
MBR 的前 440 字节是引导(bootstrap)代码。在 BIOS 系统上,它通常包含引导程序的第一阶段。可以用 dd 备份、恢复、抹除引导代码。
MBR(分区表)
MBR 分区表(或称为 DOS 分区表、MS-DOS 分区表)有三种分区类型:
- 主分区(Primary)
- 扩展分区(Extended)
- 逻辑分区(Logical)
主分区每个磁盘或者 RAID 卷上不能超过 4 个,可设置为可启动状态。如果分区方案要求使用多于 4 个的分区,就需将至少一个分区设置为扩展分区,并在上面建立逻辑分区。
扩展分区可以被看作是容纳逻辑分区的容器。硬盘上最多只能有1个扩展分区。如果磁盘上有 1 个扩展分区,它也被看作是 1 个主分区。因此只能另外再建立 3 个主分区(例如 3 个主分区加 1 个扩展分区)。扩展分区内所包含的逻辑分区数量没有限制。如果在双重启动中有 Windows,Windows 需要占据一个主分区。
通常习惯是创建主分区 sda1 到 sda3,然后建立一个扩展分区 sda4。sda4 中包含的逻辑分区编号为 sda5、sda6 等。
GUID 分区表
全局唯一标识分区表(GUID Partition Table,GPT)是 UEFI 标准定义的分区规范。使用通用唯一识别码(globally unique identifier,GUID;又称为 universally unique identifier,UUID)定义分区和分区类型。设计上是为了替换#主引导记录。
GUID 分区表的磁盘开始位置有一个保护 MBR(protective Master Boot Record,PMBR),用以处理不支持 GPT 软件的访问。这段 MBR 和真正的 MBR 一样,具备一段#引导代码,后者可以用在支持的启动管理器中进行 BIOS/GPT 启动。
选择 GPT 还是 MBR
#GUID 分区表(GPT)是一种更灵活的分区方式。它正在逐步取代#主引导记录(MBR)系统。GPT 相对于诞生于 MS-DOS 时代的 MBR 而言,有许多优点。新版的分区工具可以让 GPT 和 MBR 都获得不错的可靠性和性能。
在做出选择前,需要考虑如下内容:
- 如果使用 GRUB legacy 作为引导程序,必须使用 MBR。
- 如果使用传统的 BIOS,并且双启动中包含 Windows (无论是 32位版还是 64 位版),必须使用 MBR。
- 如果使用 UEFI 而不是 BIOS,并且双启动中包含 Windows 64 位版,必须使用 GPT。
- 非常老的机器需要使用 MBR,因为 BIOS 可能不支持 GPT。
- 如果不属于上述任何一种情况,可以随意选择使用 GPT 还是 MBR。由于 GPT 更先进,建议选择 GPT。
- 建议在使用 UEFI 的情况下选择 GPT,因为有些 UEFI 固件不支持从 MBR 启动。
GPT 相对于 MBR 的一些优势:
- 为每个磁盘和每个分区提供相应的磁盘 UUID 和分区 UUID(partuuid),这样对分区和磁盘的命名就与其文件系统无关。UUID 同时是 systemd 的可发现分区规范的前提,可以用于启用了 systemd 的 initramfs。
- 提供与文件系统无关的分区名(partlabel)。
- 任意多个分区(取决于为分区表本身分配的空间)使扩展分区和逻辑分区不再必要。GPT 表的默认空间可供 128 个分区使用,但若需要更多分区,也可为分区表分配更多空间。目前仅 gdisk 支持该功能。
- 使用 64 位逻辑块地址(logical block address),可寻址的最大硬盘空间是 2 ZiB。MBR 只支持 2 TiB 的最大硬盘。
- 在磁盘末尾储存头部和分区表,有助于恢复分区表。
- CRC32 校验码可用于侦测头部或分区表的错误。
#分区工具一节列出了用于创建和修改 GPT 或 MBR 表的工具。
Btrfs 分区
Btrfs可以独占整个存储设备并替代 #MBR 和 #GPT 分区方案。请参考创建 Btrfs 文件系统以获取更多信息。
分区方案
虽然有一些关于分区方案的通用建议,但没有严格的准则。有许多影响分区方案的因素,例如对灵活性的期望、访问速度、安全性以及可用磁盘空间的硬性限制。实际上就是个人取舍的问题。
如果你想双启动 Arch Linux 和 Windows,请参考 Dual boot with Windows。
- UEFI 系统需要有 EFI 系统分区。
- 在 BIOS 系统上使用 #GPT 进行分区后,安装 GRUB 时会需要一个额外的 BIOS 启动分区。
- 如果使用的是 Btrfs,可以用子卷模拟分区,请参考 Btrfs 子卷。
单root分区
这种是最简单,同时也能满足大部分应用场景的方案。如果需要的话,可以建立一个交换文件。通常刚开始的时候建议一个单独的 /
分区,然后根据应用场景的需要,例如 RAID,加密,独立的多媒体分区等建立其他的分区。
多分区
将某个路径挂载为独立分区可以使其拥有不同的文件系统和挂载参数。某些情况下(例如多媒体文件分区),可以被多个操作系统共享。
下面这些路径可以作为独立分区的挂载点,你也可以根据实际需要做出其他决定。file-hierarchy(7) 介绍了各个目录的作用。
根分区
根目录是目录树的顶层,这里是主文件系统挂载和其他文件系统挂靠的地方。所有文件和目录都在根目录 /
显示,即使它们实际上存储在其他的物理设备上。根文件系统中的内容必须足以启动、恢复、修复系统。因此 /
目录下的特定目录是不能作为独立分区的。
/
分区或叫根分区是最重要而且必需的,需要最先挂载,其他其他分区可以被它取代。
因为它通常包括 /usr
目录,根据安装的软件数量,会产生非常明显的增长。15-20 GiB 对于大多数用户来说是一个比较合适的取值。如果你打算在这里放一个交换文件的话,需要适当调大取值。
/boot
/boot
分区包含内核、ramdisk 镜像以及引导加载程序配置文件和引导加载程序阶段。它也可以存放内核在执行用户态程序之前所使用的其他数据。/boot
在日常系统运行中并不需要,只在启动和内核升级(重建 initial ramdisk 时)的时候用到。
- 仅当你的引导加载程序不能访问
/
下的/boot
目录时才需要单独的/boot
分区。例如,当引导加载程序不支持文件系统,或是/
位于堆叠块设备(如软 RAID、加密卷或 LVM 卷)上且引导加载程序没有相应的驱动程序。更多关于引导加载程序的需求和能力的信息可参见引导加载程序。 - 如果使用的 UEFI 引导加载程序没有其他文件系统的驱动程序,建议将 EFI 系统分区挂载到
/boot
。
不使用 EFI 系统分区 时,/boot
的建议大小为 200 MiB;否则需要至少 300 MiB 空间。
/boot
分区。/home
/home
目录包含用户定义的配置文件、缓存、应用程序数据和媒体文件。
将/home
目录独立使得/
分区可以单独重新划分。但是请注意,在 /home
没有独立分区的情况下,仍然可以在不修改 /home
目录内容的情况下重装 Arch —— 删除其他顶级目录,然后执行 pacstrap。
不能与使用其他发行版的用户共享同一个 home 目录,因为不同的发行版可能使用不兼容的软件版本和补丁。可以共享媒体目录,或至少使用 /home
分区下的不同 home 目录。分区大小跟着存储的内容而定。
/var
/var
目录存储变量数据例如 spool 目录和文件,管理和登录数据,pacman 的缓存,ABS 树等等。它通常被用作缓存或者日志记录,因此读写频繁。将它独立出来可以避免由于大量日志写入造成的磁盘空间耗尽等问题。
它的存在是方便将 /usr
设置为只读挂载。所有在操作系统运行过程(而非安装或软件维护)中,从前要写入 /usr
的东西,放到 /var
下。
/var
包含许多小文件。如果将其作为独立分区,在文件系统的选择上需要考虑这一点。值得一提的是,/var
包含 pacman 缓存。保留缓存的包提供了软件包降级的能力,因此非常有用。也正因为这样,/var
的大小会随着时间推移而增长。尤其是 pacman 缓存将会随着新软件的安装、系统的升级而增长。在磁盘空间不足的时候,可以安全地清理这个目录。/var
分配 8~12 GiB 对于桌面系统来说是比较合适的取值,具体取值取决于安装的软件数量。
/data
可以为需要多用户共享的文件建立一个“data”分区。也可以使用 /home
分区用于这一目的。
Swap
交换文件或分区提供的硬盘空间作为虚拟内存使用。它们有同样的功能,没有明显的性能区别,但是后者更易于根据需要调整大小。如果没有使用休眠特性的话,交换分区可以被多个系统共享。
以前,在拥有不足 512 MiB 内存的机器上,通常为交换分区分配两倍内存大小的空间。如果有更大的内存(大于 1024 MiB),可以分配较少的空间,甚至不需要交换空间。
要使用休眠(挂起到硬盘)功能,最好分配与内存同样大的交换分区。虽然内核会尝试压缩休眠文件到交换分区的大小,但如果交换空间过于小则不一定成功。请参见休眠。
布局示例
- UEFI/GPT 并没有真正的“boot”标志。启动仅依赖于设备上的相应记录。某些 GPT 分区工具标记的“boot”仅意味着它是一个 EFI 系统分区。
- 不要求所有的分区都在同一个硬盘上。
- 不要求所有的硬盘使用相同的分区表类型。
UEFI/GPT 示例
Mount point | Partition | Partition type GUID | Partition attributes | Suggested size |
---|---|---|---|---|
/boot or /efi
|
/dev/sda1
|
C12A7328-F81F-11D2-BA4B-00A0C93EC93B : EFI system partition
|
550 MiB | |
/
|
/dev/sda2
|
4F68BCE3-E8CD-4DB1-96E7-FBCAF984B709 : Linux x86-64 root (/)
|
23 - 32 GiB | |
[SWAP]
|
/dev/sda3
|
0657FD6D-A4AB-43C4-84E5-0933C84B4F4F : Linux swap
|
More than 512 MiB | |
/home
|
/dev/sda4
|
933AC7E1-2EB4-4F13-B844-0E14E2AEF915 : Linux /home
|
Remainder of the device |
MBR/BIOS 示例
Mount point | Partition | Partition type ID | Boot flag | Suggested size |
---|---|---|---|---|
/
|
/dev/sda1
|
83 : Linux
|
是 | 23 - 32 GiB |
[SWAP]
|
/dev/sda2
|
82 : Linux swap
|
否 | More than 512 MiB |
/home
|
/dev/sda3
|
83 : Linux
|
否 | Remainder of the device |
UEFI 带单独的 /home
Mount point | Partition | Partition type GUID | Partition attributes | Suggested size |
---|---|---|---|---|
None |
/dev/sda1
|
21686148-6449-6E6F-744E-656564454649 : BIOS boot partition
|
1 MiB | |
/
|
/dev/sda2
|
4F68BCE3-E8CD-4DB1-96E7-FBCAF984B709 : Linux x86-64 root (/)
|
2 : Legacy BIOS bootable
|
23 - 32 GiB |
[SWAP]
|
/dev/sda3
|
0657FD6D-A4AB-43C4-84E5-0933C84B4F4F : Linux swap
|
More than 512 MiB | |
/home
|
/dev/sda4
|
933AC7E1-2EB4-4F13-B844-0E14E2AEF915 : Linux /home
|
Remainder of the device |
分区工具
下面表格可以帮助选择。
MBR | GPT | |
---|---|---|
对话框 | fdisk parted |
fdisk gdisk parted |
模拟图形界面 | cfdisk | cfdisk cgdisk |
非交互 | sfdisk parted |
sfdisk sgdisk parted |
图形界面 | gparted gnome-disk-utility partitionmanager |
gparted gnome-disk-utility partitionmanager |
fdisk/gdisk
请参考 fdisk。
- fdisk — Linux 自带的命令行分区工具。
- cfdisk — 使用 ncurses 库编写的具有伪图形界面的命令行分区工具。
- sfdisk — 支持脚本的 fdisk.
- cgdisk — GPT 版的 cfdisk。
- sgdisk — Scriptable version of gdisk.
GNU Parted
下面工具在 GNU Parted 中有介绍。
- GNU Parted — 命令行分区工具。
- GParted — GTK 图形界面的分区工具。
- GNOME Disks — GTK 写的图形分区工具.
- Partitionmanager — QT 图形界面的分区工具。
备份
请参阅 fdisk#Backup and restore partition table 或 gdisk#Backup and restore partition table.
恢复
- GPT fdisk — 该工具可从副 GPT 分区表(存储于磁盘末尾)恢复主 GPT 分区表(存储于磁盘开头),或是反过来。
- TestDisk — 该工具可恢复 MBR 或 GPT 丢失分区。
分区对齐
恰当的分区对齐有助于提升性能和使用寿命。这是由硬件层面和文件系统层面的每次块 I/O 操作特性决定的。对齐的关健是分区大小(至少)是块大小的倍数,块大小取决于选用的硬件设备。如果分区没有以块大小的整数倍对齐,对齐文件系统就失去意义了,因为从分区的起始偏移开始就是有偏差的。
fdisk/gdisk 和 parted 会自动处理分区对齐。GNU Parted#Check alignment 介绍了如何验证分区是否对齐。
有些硬盘使用 高级格式 会提供更好的读写效率。
提示与技巧
MBR 转换为 GPT
参阅 GPT fdisk#Convert between MBR and GPT.
GPT 内核支持
Linux 内核中 CONFIG_EFI_PARTITION
选项配置是否启用内核 GPT 支持(即使名称为 EFI PARTITION)。此选项必须内置于内核,不能作为可加载模块。即使 GPT 磁盘只用作数据存储而不作为启动盘,此选项也是必须的。在 Arch [core] 仓库中的 linux 和 linux-lts 内核默认启用此选项。如果自定内核,设置 CONFIG_EFI_PARTITION=y
启用此选项。
参考资料
- Wikipedia:Disk partitioning
- Wikipedia:Binary prefix
- Understanding Disk Drive Terminology
- What is a Master Boot Record (MBR)?
- Rod Smith's page on What's a GPT? and Booting OSes from GPT
- Make the most of large drives with GPT and Linux - IBM Developer Works
- Microsoft's Windows and GPT FAQ
- Partition Alignment (with examples)