分区
根据维基百科:
- 分区是在外存上创建一个或多个区域的过程,分区的目的是单独管理各个部分。
一个硬盘可以被划分为一个或者多个分区。一些场景需要使用多个分区,例如双重或多重启动、使用 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 表的工具。
无分区磁盘[编辑 | 编辑源代码]
无分区磁盘,即superfloppy 是指无分区表的存储设备,一个文件系统占据整个存储空间。无分区设备上的启动扇区被称做 volume boot record (VBR)。
Btrfs 分区[编辑 | 编辑源代码]
Btrfs可以独占整个存储设备并替代 #MBR 和 #GPT 分区方案。请参考创建 Btrfs 文件系统以获取更多信息。
分区方案[编辑 | 编辑源代码]
虽然有一些关于分区方案的通用建议,但没有严格的准则。有许多影响分区方案的因素,例如对灵活性的期望、访问速度、安全性以及可用磁盘空间的硬性限制。实际上就是个人取舍的问题。
如果你想双启动 Arch Linux 和 Windows,请参考 Dual boot with Windows。
- UEFI 系统通常需要有 EFI 系统分区。
- 在 BIOS 系统上使用 #GPT 进行分区后,安装 GRUB 时会需要一个额外的 BIOS 启动分区。
- 如果使用的是 Btrfs,可以用子卷模拟分区,请参考 Btrfs 子卷。
单root分区[编辑 | 编辑源代码]
这种是最简单,同时也能满足大部分应用场景的方案。如果需要的话,可以建立一个交换文件。通常刚开始的时候建议一个单独的 /
分区,然后根据应用场景的需要,例如 RAID,加密,独立的多媒体分区等建立其他的分区。
23–32 GiB is the suggested minimum size for a single root partition. More space may be needed for user files and when using a swap file.
/boot
directory that resides in /
. That means the boot loader must have support for everything starting from the block devices, stacked block devices (LVM, RAID, dm-crypt, LUKS, etc.) and ending with the file system on which the kernel(s) and initramfs image(s) reside.A GPT partition should have the type GUID 4F68BCE3-E8CD-4DB1-96E7-FBCAF984B709
("Linux root (x86-64)", "Linux x86-64 root (/)"). An MBR partition should have the default "Linux" type ID 83
.
多分区[编辑 | 编辑源代码]
将某个路径挂载为独立分区可以使其拥有不同的文件系统和挂载参数。某些情况下(例如多媒体文件分区),可以被多个操作系统共享。
下面这些路径可以作为独立分区的挂载点,你也可以根据实际需要做出其他决定。file-hierarchy(7) 介绍了各个目录的作用。
根分区[编辑 | 编辑源代码]
根目录是目录树的顶层,这里是主文件系统挂载和其他文件系统挂靠的地方。所有文件和目录都在根目录 /
显示,即使它们实际上存储在其他的物理设备上。根文件系统中的内容必须足以启动、恢复、修复系统。因此 /
目录下的特定目录是不能作为独立分区的。
/
分区或叫根分区是最重要而且必需的,需要最先挂载,其他其他分区可以被它取代。
因为它通常包括 /usr
目录,根据安装的软件数量,会产生非常明显的增长。15-20 GiB 对于大多数用户来说是一个比较合适的取值。如果你打算在这里放一个交换文件或者不建立单独的 /var,需要适当调大取值(增加休眠空间和额外的 8–12 GiB 给 /var
)。
A GPT partition should have the type GUID 4F68BCE3-E8CD-4DB1-96E7-FBCAF984B709
("Linux root (x86-64)", "Linux x86-64 root (/)"). An MBR partition should have the default "Linux" type ID 83
.
/boot[编辑 | 编辑源代码]
/boot
分区包含vmlinuz、 initramfs 以及引导加载程序配置文件和引导加载程序阶段。它也可以存放内核在执行用户态程序之前所使用的其他数据。/boot
在日常系统运行中并不需要,只在启动和内核升级(重建 initial ramdisk 时)的时候用到。
- 引导加载程序需要能够访问到
/boot
目录。所以引导加载程序需要视情况,支持块设备、堆叠块设备(如软 RAID、加密卷或 LVM 卷)以及存放内核、initramfs 的文件系统。 - 有些文件系统能包含引导加载程序尚不支持的新特性,除非将不兼容特性禁用,否则不适于
/boot
分区。通常可以使用 FAT32 以避免此问题,因为 FAT32 包含所有需要的功能,而且不会再增加新的功能。
有关启动加载器的需求和能力的更多信息,请参考 Arch boot process#启动加载器。
/boot
,这样就可以省去一个单独的 boot 分区。In other cases, it is recommended to set the partition type to Extended Boot Loader (XBOOTLDR) Partition which is GPT partition type GUID BC13C2FF-59E6-4262-A352-B275FD6F7172
(ea00
type for gdisk) or MBR partition type ID ea
.
在两种情况下,推荐的分区大小都是 1 GiB,这样就可以有足够的空间存放多个内核。如果怕不够,可以分配 4 GiB 空间。
/home[编辑 | 编辑源代码]
/home
目录包含用户定义的配置文件、缓存、应用程序数据和媒体文件。
将/home
目录独立使得/
分区可以单独重新划分。但是请注意,在 /home
没有独立分区的情况下,仍然可以在不修改 /home
目录内容的情况下重装 Arch——删除其他顶级目录,然后执行 pacstrap。
不能与使用其他发行版的用户共享同一个 home 目录,因为不同的发行版可能使用不兼容的软件版本和补丁。可以共享媒体目录,或至少使用 /home
分区下的不同 home 目录。分区大小跟着存储的内容而定。
A GPT partition should have the type GUID 933AC7E1-2EB4-4F13-B844-0E14E2AEF915
("Linux home", "Linux /home"). An MBR partition should have the default "Linux" type ID 83
.
Swap[编辑 | 编辑源代码]
交换文件或分区提供的硬盘空间作为虚拟内存使用。它们有同样的功能,没有明显的性能区别,但是后者更易于根据需要调整大小。如果没有使用休眠特性的话,交换分区可以被多个系统共享。
以前,在拥有不足 512 MiB 内存的机器上,通常为交换分区分配两倍内存大小的空间。如果有更大的内存(大于 1024 MiB),可以分配较少的空间,甚至不需要交换空间。推荐的默认大小是 4 GiB.
要使用休眠(挂起到硬盘)功能,最好分配与内存同样大的交换分区。虽然内核会尝试压缩休眠文件到交换分区的大小,但如果交换空间过于小则不一定成功。请参见休眠。
A GPT partition should have the type GUID 0657FD6D-A4AB-43C4-84E5-0933C84B4F4F
("Linux swap"). An MBR partition should have the type ID 82
("Linux swap").
/data[编辑 | 编辑源代码]
可以为需要多用户共享的文件建立一个“data”分区。也可以使用 /home
分区用于这一目的。
A GPT partition should have the default "Linux filesystem" type GUID 0FC63DAF-8483-4772-8E79-3D69D8477DE4
. An MBR partition should have the default "Linux" type ID 83
.
/var[编辑 | 编辑源代码]
/var
目录存储变量数据例如 spool 目录和文件,管理和登录数据,pacman 的缓存,ABS 树等等。它通常被用作缓存或者日志记录,因此读写频繁。将它独立出来可以避免由于大量日志写入造成的磁盘空间耗尽等问题。
它的存在是方便将 /usr
设置为只读挂载。所有在操作系统运行过程(而非安装或软件维护)中,从前要写入 /usr
的东西,放到 /var
下。
/var
包含许多小文件。如果将其作为独立分区,在文件系统的选择上需要考虑这一点。值得一提的是,/var
包含 pacman 缓存。保留缓存的包提供了软件包降级的能力,因此非常有用。也正因为这样,/var
的大小会随着时间推移而增长。尤其是 pacman 缓存将会随着新软件的安装、系统的升级而增长。在磁盘空间不足的时候,可以安全地清理这个目录。
/var
分配 8~12 GiB 对于桌面系统来说是比较合适的取值,具体取值取决于安装的软件数量。
A GPT partition should have the type GUID 4D21B016-B534-45C2-A9FB-5C16E091FD2D
("Linux variable data", "Linux /var"). An MBR partition should have the default "Linux" type ID 83
.
布局示例[编辑 | 编辑源代码]
The following examples use /dev/sda
as the example disk with /dev/sda1
as the first partition. The block device naming scheme will differ if you are partitioning a NVMe disk (e.g. /dev/nvme0n1
with partitions starting from /dev/nvme0n1p1
) or an SD card or eMMC disk (e.g. /dev/mmcblk0
with partitions starting from /dev/mmcblk0p1
). See Device file#Block device names for more information.
- UEFI/GPT 并没有真正的“boot”标志。启动仅依赖于设备上的相应记录。某些 GPT 分区工具标记的“boot”仅意味着它是一个 EFI 系统分区。
- 不要求所有的分区都在同一个硬盘上。
- 不要求所有的硬盘使用相同的分区表类型。
UEFI/GPT 布局示例[编辑 | 编辑源代码]
挂载点 | 分区 | 分区类型 GUID | 推荐大小 |
---|---|---|---|
/boot or /efi 1
|
/dev/sda1
|
C12A7328-F81F-11D2-BA4B-00A0C93EC93B : EFI system partition
|
1 GiB |
[SWAP]
|
/dev/sda2
|
0657FD6D-A4AB-43C4-84E5-0933C84B4F4F : Linux swap
|
至少 4 GiB,使用 休眠 时等于内存大小 |
/
|
/dev/sda2
|
4F68BCE3-E8CD-4DB1-96E7-FBCAF984B709 : Linux x86-64 root (/)
|
剩余空间,至少 23 - 32 GiB |
MBR/BIOS 示例[编辑 | 编辑源代码]
挂载点 | 分区类型 | 分区类型 ID | Boot flag | Suggested size |
---|---|---|---|---|
[SWAP]
|
/dev/sda1
|
82 : Linux swap
|
否 | 至少 4 GiB,使用 休眠 时等于内存大小 |
/
|
/dev/sda2
|
83 : Linux
|
是 | 剩余空间,至少 23 - 32 GiB |
N/A | Unallocated space2 | N/A | N/A | At least 16.5 KiB at the end of the disk |
BIOS/GPT 布局示例[编辑 | 编辑源代码]
挂载点 | 分区 | 分区类型 GUID | 推荐大小 | |
---|---|---|---|---|
None | /dev/sda1
|
21686148-6449-6E6F-744E-656564454649 : BIOS boot partition 3
|
1 MiB | |
[SWAP]
|
/dev/sda2
|
0657FD6D-A4AB-43C4-84E5-0933C84B4F4F : Linux swap
|
至少 4 GiB,使用 休眠 时等于内存大小 | |
/
|
/dev/sda3
|
4F68BCE3-E8CD-4DB1-96E7-FBCAF984B709 : Linux x86-64 root (/)
|
2 : Legacy BIOS bootable
|
23 - 32 GiB |
- The ESP can be mounted to
/efi
if the used boot loader is capable of accessing the file system (and everything above it) on which the kernel and initramfs images are located. See EFI system partition#Typical mount points and the warning in Arch boot process#Boot loader for details.
- An unpartitioned space of at least 33 512-byte sectors (16.5 KiB) at the end of the disk to allow converting to GPT in the future. The space will be required for the backup GPT header. The recommendation to preserve an unpartitioned space applies to all MBR partitioned disks.
- A BIOS boot partition is only required when using GRUB for BIOS booting from a GPT disk, it is not needed when using other boot loaders. The partition has nothing to do with
/boot
, and it must not be formatted with a file system or mounted.
分区工具[编辑 | 编辑源代码]
下面表格可以帮助选择。
! GPT
! CLI
! TUI
! Scripting utility
|-
| fdisk
| util-linux包
| data-sort-value=5 style="background: #afa; color: inherit; vertical-align: middle; text-align: center; "|是
| data-sort-value=5 style="background: #afa; color: inherit; vertical-align: middle; text-align: center; "|是
| fdisk(8)
| cfdisk(8)
| sfdisk(8)
|-
| GPT fdisk
| gptfdisk包
| data-sort-value=1 style="background: #faa; color: inherit; vertical-align: middle; text-align: center; "|否
| data-sort-value=5 style="background: #afa; color: inherit; vertical-align: middle; text-align: center; "|是
| gdisk(8)
| cgdisk(8)
| sgdisk(8)
|-
| Parted
| parted包
| data-sort-value=5 style="background: #afa; color: inherit; vertical-align: middle; text-align: center; "|是
| data-sort-value=5 style="background: #afa; color: inherit; vertical-align: middle; text-align: center; "|是
| parted(8)
| data-sort-value=1 style="background: #faa; color: inherit; vertical-align: middle; text-align: center; "|否
| parted(8)
|}
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.
恢复[编辑 | 编辑源代码]
- TestDisk — 该工具可恢复 MBR 或 GPT 丢失分区。
分区对齐[编辑 | 编辑源代码]
恰当的分区对齐有助于提升性能和使用寿命。这是由硬件层面和文件系统层面的每次块 I/O 操作特性决定的。对齐的关键是分区大小(至少)是块大小的倍数,块大小取决于选用的硬件设备。如果分区没有以块大小的整数倍对齐,对齐文件系统就失去意义了,因为从分区的起始偏移开始就是有偏差的。
fdisk/gdisk 和 parted 会自动处理分区对齐。GNU Parted#Check alignment 介绍了如何验证分区是否对齐。
有些硬盘使用高级格式会提供更好的读写效率。
GPT 内核支持[编辑 | 编辑源代码]
Linux 内核中 CONFIG_EFI_PARTITION
选项配置是否启用内核 GPT 支持(即使名称为 EFI PARTITION)。此选项必须内置于内核,不能作为可加载模块。即使 GPT 磁盘只用作数据存储而不作为启动盘,此选项也是必须的。在 Arch [core] 仓库中的 linux包 和 linux-lts包 内核默认启用此选项。如果自定内核,设置 CONFIG_EFI_PARTITION=y
启用此选项。
Troubleshooting[编辑 | 编辑源代码]
Tricking old BIOS into booting from GPT[编辑 | 编辑源代码]
Some old BIOSes (from before year 2010) attempt to parse the boot sector and refuse to boot it if it does not contain a bootable MBR partition. This is a problem if one wants to use GPT on this disk, because, from the BIOS viewpoint, it contains only one, non-bootable, MBR partition of type ee
(i.e., the protective MBR partition). One can mark the protective MBR entry as bootable using fdisk -t mbr /dev/sda
, and it will work on some BIOSes. However, the UEFI specification prohibits the protective MBR partition entry from being bootable, and UEFI-based boards do care about this, even in the legacy boot mode. So, this matters if one wants to create a GPT-based USB flash drive that is supposed to boot both on modern UEFI-based boards and also on old BIOSes that insist on finding a bootable MBR partition. It is not possible to solve this problem using traditional tools such as fdisk or gdisk, but it is possible to create a fake MBR partition entry suitable for both kinds of BIOSes manually as a sequence of bytes.
The command below will overwrite the second MBR partition slot and add a bootable partition there of type 0 (i.e. unused), covering only the first sector of the device. It will not interfere with the GPT or with the first MBR partition entry which normally contains a protective MBR partition.
# 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
The end result will look like this:
# 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.
Drives are not visible when firmware RAID is enabled[编辑 | 编辑源代码]
If a SATA or NVMe drive is visible in firmware setup, but not to Linux (e.g. fdisk -l
does not list it), it is possible that the controller is in firmware RAID mode.
For NVMe, the journal should show something like:
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.
The solution is to enter firmware setup and disable NVMe RAID mode and change the SATA controller operation mode from RAID to AHCI. Mind that the setting may have a different name (e.g. "Intel Rapid Storage Technology", "Intel RST", "Intel VMD controller" or "VMD") and it could also be per-controller or per-port.
参考资料[编辑 | 编辑源代码]
- 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)