分区
来自 Wikipedia
- 磁盘分区或磁盘切片是在二级存储上创建的一个或多个区域,以便每个区域可以单独管理。
整个磁盘可以分配给一个分区,或者多个分区,以应对双引导、维护交换分区,或者逻辑上分离音频和视频文件等数据。分区方案存储在分区表中,例如主引导记录 (MBR) 或GUID分区表 (GPT)。
分区表是使用众多分区工具之一创建和修改的。Arch Linux可用的工具列在#分区工具章节。
分区通常直接包含一个文件系统,这是通过在分区上创建文件系统(也称为格式化)来实现的。或者,分区可以包含LVM、块设备加密或RAID,这些最终提供设备文件,可以在其上放置文件系统(或进一步堆叠设备)。
任何直接包含可挂载文件系统的块设备(例如磁盘、分区、LUKS设备、LVM逻辑卷或RAID阵列)都称为卷。
分区表
目前有两种主要的分区表类型。这些在下面的#主引导记录 (MBR) 和 #GUID分区表 (GPT) 部分进行描述,并讨论了如何选择两者。第三种不太常见的替代方案是使用无分区磁盘,这也将进行讨论。
parted /dev/sdX print 或 fdisk -l /dev/sdX,其中 /dev/sdX 是块设备,例如 SATA 磁盘的 /dev/sda,NVMe 磁盘的 /dev/nvme0n1,或 eMMC 磁盘的 /dev/mmcblk0。更多关于块设备命名的信息请参阅 设备文件#块设备名称。主引导记录
主引导记录 (MBR) 是存储设备的第一个 512 字节。它包含操作系统的引导加载程序和存储设备的分区表。它在BIOS系统下的引导过程中起着重要作用。有关MBR结构,请参阅 Wikipedia:Master boot record#Disk partitioning。
- MBR不位于分区中;它位于设备的第一扇区(物理偏移量0),位于第一个分区之前。
- 无分区设备上或单个分区内的引导扇区被称为卷引导记录 (VBR)。
主引导记录 (引导代码)
MBR的前 440 字节是引导代码区域。在BIOS系统上,它通常包含引导加载程序的第一阶段。引导代码可以使用 `dd` 进行备份、从备份恢复或擦除。
主引导记录 (分区表)
在MBR分区表(也称为DOS或MS-DOS分区表)中,有3种类型的分区
- 主分区
- 扩展分区
- 逻辑分区
主分区可以引导,每个磁盘或RAID卷最多有四个分区。如果MBR分区表需要超过四个分区,则需要将一个主分区替换为扩展分区,其中包含逻辑分区。
扩展分区可以被视为逻辑分区的容器。一个硬盘最多可以包含一个扩展分区。扩展分区也被计为一个主分区,因此如果磁盘有一个扩展分区,则最多只能有三个额外的主分区(即三个主分区和一个扩展分区)。逻辑分区在扩展分区中的数量是无限的。与Windows双引导的系统将要求Windows位于主分区中。
惯用的编号方案是创建主分区 sda1 到 sda3,然后是一个扩展分区 sda4。sda4 上的逻辑分区编号为 sda5、sda6 等。
GUID 分区表
GUID分区表 (GPT) 是统一可扩展固件接口规范的一部分;它使用全局唯一标识符 (GUID),在Linux世界中也称为UUID,来定义分区和分区类型。它旨在取代主引导记录分区方案方法。
在GUID分区表磁盘的开头有一个保护性主引导记录 (PMBR),以防止GPT不兼容的软件。这个保护性MBR就像普通MBR一样有一个引导代码区域,可用于支持它的引导加载程序的BIOS/GPT启动。
GPT与MBR的选择
GUID分区表 (GPT) 是一种替代的、现代的分区样式;它旨在取代旧的主引导记录 (MBR) 系统。GPT相比MBR有几个优点,MBR的怪癖可以追溯到MS-DOS时代。随着格式化工具的最新发展,GPT或MBR都可以同样轻松地获得良好的可靠性和性能。
选择时需要考虑的一些要点
- 要使用Legacy BIOS与Windows(32位和64位)双引导,需要MBR方案。
- 要使用UEFI模式而不是BIOS与Windows 64位双引导,需要GPT方案。
- 如果您要安装在旧硬件上,特别是旧笔记本电脑上,请考虑选择MBR,因为它的BIOS可能不支持GPT(但见下文如何解决)。
- 如果您要分区一个大于2 TiB(约2.2 TB)的磁盘,则必须使用GPT。
- 建议始终对UEFI启动使用GPT,因为某些UEFI实现不支持在UEFI模式下启动到MBR。
- 如果以上都不适用,请自由选择GPT或MBR。由于GPT更现代,在这种情况下推荐使用GPT。
GPT相对于MBR的一些优势是
- 为每个分区提供唯一的磁盘GUID和唯一的分区GUID(PARTUUID)——一种良好的独立于文件系统的引用分区和磁盘的方式。GUID是可发现分区规范的先决条件,该规范可在启用了systemd的initramfs中使用。
- 提供独立于文件系统的分区名称(PARTLABEL)。
- 任意数量的分区——取决于为分区表分配的空间——无需扩展和逻辑分区。默认情况下,GPT表包含定义128个分区的空间。然而,如果您想定义更多分区,可以为分区表分配更多空间(目前已知只有gdisk支持此功能)。
- 使用64位LBA存储扇区号——最大可寻址磁盘大小为2 ZiB。MBR仅限于寻址每个驱动器2 TiB的空间。[1]
- 在磁盘末尾存储备份头和分区表,有助于在主头和分区表损坏时进行恢复。
- CRC32校验和,用于检测头和分区表的错误和损坏。
#分区工具部分包含一个表格,指示哪些工具可用于创建和修改GPT和MBR表。
无分区磁盘
无分区磁盘,也称为超级软盘,是指没有分区表的存储设备,一个文件系统占据整个存储设备。无分区设备上存在的引导扇区称为卷引导记录 (VBR)。
Btrfs分区
Btrfs 可以占据整个数据存储设备,并取代MBR或GPT分区方案。有关详细信息,请参阅 Btrfs#无分区Btrfs磁盘说明。
分区方案
对硬盘进行分区没有严格的规则,尽管可以遵循下面给出的通用指南。磁盘分区方案由所需的灵活性、速度、安全性以及可用磁盘空间带来的限制等各种问题决定。这本质上是个人偏好。如果您想双引导Arch Linux和Windows操作系统,请参阅 与Windows双引导。
单一根分区
这种方案最简单、最灵活,并且考虑到消费级设备存储容量的增加,足以应对大多数用例。可以创建一个交换文件,并根据需要轻松调整大小。通常,建议从考虑单一 / 分区开始,然后根据RAID、加密、共享媒体分区等特定用例分离出其他分区。请参阅 #独立分区 以了解一些常见到不常见的专用分区的描述。
对于单一根分区,建议的最小尺寸为 23–32 GiB。用户文件和使用交换文件时可能需要更多空间。一个完全最小化的安装需要大约 2 GiB。例如,一个简单的服务器可以容纳在 4 GiB 以下,而一个完整的KDE Plasma安装使用 10 GiB。这两个例子都需要频繁清理包缓存。
/ 的 /boot 目录,否则需要一个单独的物理(在磁盘的主分区表中,不在LVM、软件RAID或文件系统子卷等之下)/boot分区。这意味着引导加载程序必须支持从块设备、堆叠块设备(LVM、RAID、dm-crypt、LUKS等)开始,到内核和initramfs镜像所在的最后一个文件系统。GPT分区应具有“Linux root (x86-64)”类型GUID 4F68BCE3-E8CD-4DB1-96E7-FBCAF984B709(对于gdisk为8304类型)。MBR分区应具有默认的“Linux”类型ID 83。
独立分区
将一个路径分离为一个分区,允许选择不同的文件系统和挂载选项。在某些情况下,例如媒体分区,它们也可以在操作系统之间共享。
下面是一些分区时可以使用的示例布局,以下子节详细介绍了可以放在自己的独立分区并挂载到 / 下的挂载点的目录。有关这些目录内容的完整描述,请参阅 file-hierarchy(7)。
/
根目录是层次结构的顶部,是主文件系统挂载点,所有其他文件系统都从此开始。所有文件和目录都出现在根目录 / 下,即使它们存储在不同的物理设备上。根文件系统的内容必须足以引导、恢复、修复和/或修补系统。因此,/ 下的某些目录不适合作为独立分区。
/分区或根分区是必需的,并且是最重要的。其他分区可以被它取代。
/传统上包含 /usr 目录,该目录根据安装的软件量会显著增长。对于大多数使用现代硬盘的用户来说,15–20 GiB 应该足够了。如果您计划在此存储交换文件并且不计划使用单独的/var,则可能需要更大的分区大小(即,加上您RAM的大小以便休眠,以及额外的 8–12 GiB 用于/var)。
GPT分区应具有“Linux root (x86-64)”类型GUID 4F68BCE3-E8CD-4DB1-96E7-FBCAF984B709(对于gdisk为8304)。MBR分区应具有默认的“Linux”类型ID 83。
/boot
/boot目录包含vmlinuz和initramfs镜像,以及引导加载程序配置文件和引导加载程序阶段。它还存储内核开始执行用户空间程序之前使用的数据。/boot对于正常的系统运行不是必需的,仅在引导和内核升级时(生成初始ramdisk时)必需。
- 您的引导加载程序必须能够访问
/boot分区。这意味着引导加载程序必须支持从块设备、堆叠块设备(LVM、RAID、dm-crypt、LUKS等)开始,到内核和initramfs镜像所在的最后一个文件系统。 - 文件系统可以获得引导加载程序(boot loaders)尚未支持的新功能(例如,archlinux/packaging/packages/grub#7, FS#79857, FS#59047, FS#58137, FS#51879, FS#46856, FS#38750, FS#21733 和 fscrypt 加密目录),使其不适合用作
/boot分区,除非禁用不兼容的功能。这通常可以通过使用 FAT32 来避免,因为它几乎得到所有系统的支持,并且不会获得任何新功能。
有关引导加载程序的更多要求和功能,请参阅 Arch引导过程#引导加载程序。
当使用EFI系统分区作为/boot时,要求与EFI系统分区文章中描述的要求相同——必须设置正确的分区类型。
在其他情况下,建议将分区类型设置为扩展引导加载程序 (XBOOTLDR) 分区,即GPT分区类型GUID BC13C2FF-59E6-4262-A352-B275FD6F7172(对于gdisk为ea00类型,对于fdisk为xbootldr类型),或者MBR分区类型ID ea。
在这两种情况下,分区建议大小为1 GiB,这足以容纳多个内核。如果不确定,4 GiB应该足够了。
/home
/home目录包含用户特定的配置文件、缓存、应用程序数据和媒体文件。
将/home分离出来允许单独重新分区/,但请注意,即使/home不独立,您仍然可以重新安装Arch而保留/home——只需删除其他顶级目录,然后运行pacstrap。
您不应该在不同发行版的用户之间共享主目录,因为它们使用不兼容的软件版本和补丁。相反,考虑共享一个媒体分区,或者至少在同一个/home分区上使用不同的主目录。此分区的大小各不相同。
GPT分区应具有“Linux home”类型GUID 933AC7E1-2EB4-4F13-B844-0E14E2AEF915(对于gdisk为8302类型,对于fdisk为home类型)。MBR分区应具有默认的“Linux”类型ID 83。
Swap
Swap是一个文件或分区,它提供用作虚拟内存的磁盘空间。交换文件和交换分区性能相当,但交换文件更容易根据需要调整大小。交换分区可能可以在操作系统之间共享,但如果使用休眠则不行。
由于计算机的内存容量已远超 Gibibit,之前的“物理RAM两倍”的规则已过时。一个合理的默认大小为 4 GiB。
要使用休眠(也称为挂起到磁盘),建议创建大小与RAM相同的交换分区。虽然内核会尝试将挂起到磁盘的映像压缩以适应交换空间,但如果已用交换空间远小于RAM,则不能保证成功。更多信息请参阅 电源管理/挂起和休眠#休眠。
GPT分区应具有“Linux swap”类型,GUID为 0657FD6D-A4AB-43C4-84E5-0933C84B4F4F(对于gdisk为8200类型,对于fdisk为swap类型)。MBR分区应具有“Linux swap”类型ID 82。
/data
可以考虑挂载一个“data”分区来包含所有用户共享的各种文件。将/home分区用于此目的也是可以的。此分区的大小各不相同。
GPT分区应具有默认的“Linux filesystem”类型GUID 0FC63DAF-8483-4772-8E79-3D69D8477DE4。MBR分区应具有默认的“Linux”类型ID 83。
/var
/var目录存储可变数据,例如假脱机目录和文件、管理和日志数据、pacman的缓存等。它用于缓存和日志记录,因此经常被读写。将其放在一个单独的分区中可以避免由于不良日志等原因导致磁盘空间不足。
它的存在是为了让/usr可以挂载为只读。所有历史上存放在/usr中在系统运行期间(而非安装和软件维护期间)写入的数据必须存放在/var下。
/var包含许多小文件。如果使用独立分区,文件系统的类型选择应考虑此因素。- 由于
/var经常被读写,建议考虑将此分区放置在旋转磁盘上的位置。
/var将包含pacman缓存等数据。保留这些软件包有助于在软件包升级导致不稳定时,需要降级到旧的存档包。随着系统的扩展和更新,pacman缓存会增长,但如果空间成为问题,可以安全地清除。
在桌面系统上,8–12 GiB对于/var应该足够了,具体取决于安装的软件数量。对于使用NVIDIA、Wayland和GDM的用户,请考虑增加此分区大小,以确保有足够的可用空间容纳您的全部视频内存。
GPT分区应具有“Linux variable data”或“Linux /var”类型GUID 4D21B016-B534-45C2-A9FB-5C16E091FD2D(对于gdisk为8310类型)。MBR分区应具有默认的“Linux”类型ID 83。
分区方案示例
以下示例使用/dev/sda作为示例磁盘,/dev/sda1作为第一个分区。如果您正在分区NVMe磁盘(例如,/dev/nvme0n1,分区从/dev/nvme0n1p1开始)或SD卡或eMMC磁盘(例如,/dev/mmcblk0,分区从/dev/mmcblk0p1开始),块设备命名方案会有所不同。有关更多信息,请参阅 设备文件#块设备名称。
- UEFI 启动不涉及任何“boot”标志,启动仅依赖于 NVRAM 中的启动条目。 Parted 及其前端使用 GPT 上的“boot”标志来指示分区是 EFI 系统分区。
- 没有要求将所有必需/想要的 \*\*分区\*\* 放在同一磁盘上,或者对所有磁盘使用相同类型的分区表。
UEFI/GPT 布局示例
| 已安装系统上的挂载点 | 分区 | 分区类型 GUID | 建议大小 |
|---|---|---|---|
/boot 或 /efi1 |
/dev/sda1
|
C12A7328-F81F-11D2-BA4B-00A0C93EC93B: EFI 系统分区 |
1 GiB |
[SWAP]
|
/dev/sda2
|
0657FD6D-A4AB-43C4-84E5-0933C84B4F4F: Linux Swap |
至少 4 GiB 或 RAM 的大小以使用 休眠 |
/
|
/dev/sda3
|
4F68BCE3-E8CD-4DB1-96E7-FBCAF984B709: Linux x86-64 root (/) |
设备剩余部分。至少 23–32 GiB。 |
BIOS/MBR 布局示例
| 已安装系统上的挂载点 | 分区 | 分区类型 ID | 引导标志 | 建议大小 |
|---|---|---|---|---|
[SWAP]
|
/dev/sda1
|
82: Linux Swap |
否 | 至少 4 GiB 或 RAM 的大小以使用 休眠 |
/
|
/dev/sda2
|
83: Linux |
是 | 设备剩余部分。至少 23–32 GiB。 |
| N/A | 未分配空间2 | N/A | N/A | 磁盘末尾至少 16.5 KiB |
BIOS/GPT 布局示例
| 已安装系统上的挂载点 | 分区 | 分区类型 GUID | 建议大小 |
|---|---|---|---|
| 无 | /dev/sda1
|
21686148-6449-6E6F-744E-656564454649: BIOS 引导分区3 |
1 MiB |
[SWAP]
|
/dev/sda2
|
0657FD6D-A4AB-43C4-84E5-0933C84B4F4F: Linux Swap |
至少 4 GiB 或 RAM 的大小以使用 休眠 |
/
|
/dev/sda3
|
4F68BCE3-E8CD-4DB1-96E7-FBCAF984B709: Linux x86-64 root (/) |
设备剩余部分。至少 23–32 GiB。 |
- 如果使用的引导加载程序能够访问内核和 initramfs 镜像所在的 文件系统(以及其上所有内容),则 ESP 可以挂载到
/efi。有关详细信息,请参阅 EFI 系统分区#典型挂载点 和 Arch 引导过程#引导加载程序 中的警告。 - 磁盘末尾至少 33 个 512 字节扇区(16.5 KiB)的未分区空间,以便将来 转换为 GPT。此空间将用于备份 GPT 头部。保留未分区空间的建议适用于所有 MBR 分区的磁盘。
- 当使用 GRUB 或 Limine 在 GPT 磁盘上进行 BIOS 启动时,需要 BIOS 引导分区,当使用其他引导加载程序时则不需要。该分区与
/boot无关,并且不能用文件系统格式化或挂载。
工具
Partitioning tools
以下程序用于创建和/或操作设备分区表和分区。有关使用的确切命令,请参阅链接的文章。
此表将帮助您选择适合您需求的实用程序
| 名称 | 软件包 (Package) | MBR | GPT | CLI | TUI | 脚本实用程序 |
|---|---|---|---|---|---|---|
| fdisk | util-linux | 是 | 是 | fdisk(8) | cfdisk(8) | sfdisk(8) |
| GPT Fdisk | gptfdisk | 否 | 是 | gdisk(8) | cgdisk(8) | sgdisk(8) |
| Parted | parted | 是 | 是 | parted(8) | 否 | parted(8) |
图形化前端
- blivet-gui — 用于存储配置的图形化工具。它通过 python-blivetAUR 和 libblockdev 使用 *parted* 作为后端。
- GNOME Disks — 一个用于处理存储设备的 GNOME 实用程序。它通过 udisks2 和 libblockdev 使用 *parted* 作为后端。是 gnome 的一部分。
- GParted — 用于图形化管理磁盘分区的分区编辑器。它可用于在不丢失数据的情况下调整、复制和移动分区。它使用 *parted* 作为后端。
- KDE Partition Manager — 用于帮助您管理计算机上的磁盘、分区和文件系统的实用程序。它通过 kpmcore 使用 *sfdisk* 作为后端。是 kde-system 的一部分。
备份
- fdisk 可以创建分区表的备份。请参阅 fdisk#备份和恢复分区表。
- GPT fdisk 可以创建二进制备份,包括保护性 MBR、主 GPT 头、备份 GPT 头以及分区表的一个副本。请参阅 GPT fdisk#备份和恢复分区表。
恢复
- GPT fdisk — 一个分区工具,可以从备份 GPT 头(位于磁盘末尾)恢复主 GPT 头(位于磁盘开头)或反之亦然。
- TestDisk — 一个支持在 MBR 和 GPT 上恢复丢失分区的实用程序。
分区对齐
经验法则是将分区的起始和大小对齐到 mebibyte。请参阅 高级格式#分区对齐。
GPT 内核支持
内核配置中的 CONFIG_EFI_PARTITION 选项在内核中启用 GPT 支持(尽管名称看起来像 EFI 系统分区)。此选项必须内置到内核中,而不是编译为可加载模块。即使 GPT 磁盘仅用于数据存储而非引导,此选项也是必需的。此选项在所有 Arch 的 官方支持的内核 中默认启用。对于自定义内核,请通过设置 CONFIG_EFI_PARTITION=y 来启用此选项。
故障排除
欺骗旧 BIOS 从 GPT 引导
一些旧的 BIOS(2010 年之前)会尝试解析引导扇区,如果它不包含可引导的 MBR 分区,则会拒绝引导。如果想在此磁盘上使用 GPT,这会成为一个问题,因为从 BIOS 的角度来看,它只包含一个不可引导的、类型为 ee 的 MBR 分区(即保护性 MBR 分区)。可以使用 fdisk -t mbr /dev/sda 将保护性 MBR 条目标记为可引导,这在某些 BIOS 上会起作用。然而,UEFI 规范禁止将保护性 MBR 分区条目标记为可引导,并且基于 UEFI 的主板会关注这一点,即使在传统引导模式下也是如此。因此,如果您想创建一个能够同时在现代基于 UEFI 的主板和坚持寻找可引导 MBR 分区的旧 BIOS 上启动的基于 GPT 的 USB 闪存驱动器,这一点就很重要。使用 fdisk 或 gdisk 等传统工具无法解决此问题,但可以通过手动创建字节序列来创建适用于这两种 BIOS 的虚假 MBR 分区条目。
下面的命令将覆盖第二个 MBR 分区槽,并在该处添加一个类型为 0(即未使用)的可引导分区,仅覆盖设备的第一扇区。它不会干扰 GPT 或通常包含保护性 MBR 分区的第一个 MBR 分区条目。
# printf '\200\0\0\0\0\0\0\0\0\0\0\0\001\0\0\0' | dd of=/dev/sda bs=1 seek=462
最终结果如下所示
# fdisk -t mbr -l /dev/sda
Disk /dev/sda: 232.9 GiB, 250059350016 bytes, 488397168 sectors Disk model: ST3250820AS Units: sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disklabel type: dos Disk identifier: 0x00000000 Device Boot Start End Sectors Size Id Type /dev/sda1 1 488397167 488397167 232.9G ee GPT /dev/sda2 * 0 0 1 512B 0 Empty Partition table entries are not in disk order.
启用固件 RAID 时,驱动器不可见
如果 SATA 或 NVMe 驱动器在固件设置中可见,但在 Linux 中不可见(例如 fdisk -l 未列出它),则控制器可能处于固件 RAID 模式。
对于 NVMe,日志应显示类似以下内容
kernel: ahci 0000:00:17.0: Found 1 remapped NVMe devices. kernel: ahci 0000:00:17.0: Switch your BIOS from RAID to AHCI mode to use them.
解决方法是进入固件设置,禁用 NVMe RAID 模式,并将 SATA 控制器操作模式从 *RAID* 更改为 *AHCI*。请注意,该设置可能有不同的名称(例如,“Intel Rapid Storage Technology”,“Intel RST”,“Intel VMD controller”或“VMD”),并且它也可以是每个控制器或每个端口的。