# Partitioning (简体中文)

相关文章

- fstab
- LVM
- Swap
- Format a device
- File Systems (简体中文)

翻译状态： 本文是英文页面 Partitioning 的翻译，最后翻译时间：2014-01-29，点击这里可以查看翻译后英文页面的改动。

分区 硬盘的可用空间可以划分为多个逻辑区块，区块之间的访问是相互独立的。

可以为一个硬盘划分一个或者多个分区。一些场景需要使用多个分区：例如双重或多重启动，或使用 swap 分区。此外，分区也可以从逻辑上隔离数据，例如为音频和视频数据创建单独的分区。下面将会讨论通用的分区方案。

每个分区在使用前需要格式化为 文件系统 。

## 分区表

分区信息被存放在分区表中。目前有两种主流的模式：传统的 Master Boot Record，和新的 GUID Partition Table。后者功能更强大，解决了许多MBR的限制。

### Master Boot Record

MBR原本只支持最多4个分区。后来加入了扩展分区和逻辑分区以绕过这个限制。

目前有三中分区类型：

- 主分区（Primary）
- 扩展分区（Extended）
  - 逻辑分区（Logical）

主分区每个磁盘或者RAID卷上只能有4个，可设置为可启动状态。如果分区方案要求使用4个以上的分区，就需要使用一个包含逻辑分区的扩展分区。扩展分区可以被看作是容纳逻辑分区的容器。硬盘上最多只能有1个扩展分区。如果磁盘上有1个扩展分区，它也被看作是1个主分区。因此只能另外再建立3个主分区（例如3个主分区加1个扩展分区）。扩展分区内所包含的逻辑分区数量没有限制。如果在双重启动中有Windows，Windows需要占据一个主分区。

通常习惯是创建主分区sda1到sda3，然后建立一个扩展分区sda4。sda4中包含sda5，sda6等逻辑分区。

### GUID 分区表

GPT方案中只有一种分区类型，主分区。磁盘和RAID卷中包含的分区数量没有限制。

### Btrfs 分区

Btrfs可以独占整个存储设备并替代 MBR 和 GPT 分区方案。请参考Btrfs Partitioning以获取更多信息。

### 选择GPT 还是 MBR

GUID Partition Table （GPT）是一种更灵活的分区方式。它正在逐步取代Master Boot Record （MBR）系统。GPT相对于诞生于MS-DOS时代的MBR而言，有许多优点。新版的fdisk（MBR）和gdisk（GPT）使得使用GPT或者MBR在性能最大化上都非常容易。

最终决定选择的理由如下：

- 如果使用GRUB legacy作为bootloader，必须使用MBR。
- 如果使用传统的BIOS，并且双启动中包含 Windows （无论是32位版还是64位版），必须使用MBR。
- 如果使用 UEFI 而不是BIOS，并且双启动中包含 Windows 64位版，必须使用GPT。
- 如果不属于上述任何一种情况，可以随意选择使用 GPT 还是 MBR。由于 GPT 更先进，建议选择 GPT。
- 建议在使用 UEFI 的情况下选择 GPT，因为有些 UEFI firmware 不支持从 MBR 启动。

## 分区方案

虽然有一些关于分区方案的通用建议，但没有严格的准则。有许多影响分区方案的因素，例如对灵活性的期望，访问速度，安全性以及可用磁盘空间的硬性限制。实际上就是个人取舍的问题。如果你想双启动 Arch Linux 和 Windows，请参考 Windows and Arch Dual Boot。

警告: 请别忘记为boot-loader预留空间。这对于 MBR 和 GRUB-Legacy 来说不是问题，但是许多新方案可能要求占用一个特殊的小分区。

### 单root分区

这种是最简单，同时也能满足大部分应用场景的方案。如果需要的话，可以建立一个 swapfile。通常刚开始的时候建议一个单独的 `/` 分区，然后根据应用场景的需要，例如 RAID，加密，独立的多媒体分区等建立其他的分区。注意，在一个 BIOS 系统上使用 GPT 进行分区后，安装 GRUB 时会需要一个额外的 BIOS 启动分区。

### 多分区

将某个路径挂载为独立分区可以使其拥有不同的文件系统和挂载参数。某些情况下（例如多媒体文件分区），可以被多个操作系统共享。

### 挂载点

下面这些路径可以作为独立分区的挂载点，你也可以根据实际需要做出其他决定。

#### 根分区

根目录是目录树的顶层，这里是主文件系统挂载和其他文件系统挂靠的地方。所有文件和目录都在根目录 `/` 显示，即使它们实际上存储在其他的物理设备上。根文件系统中的内容应该足以启动、恢复、修复系统。因此 `/` 目录下的特定目录是不能作为独立分区的。

`/` 分区或叫根分区是最重要而且必需的。其他其他分区可以被它取代。

警告: 与系统启动相关的特定目录（除了 `/boot`） 必须 与 `/` 在同一个分区，或在系统刚进入用户态的时候通过 initramfs 挂载。这些特定的目录包括：`/etc` 和 `/usr` [1] 。

#### /boot

`/boot` 分区包含内核、ramdisk 镜像以及 bootloader 配置文件和 bootloader stage。它也可以存放内核在执行用户态程序之前所使用的其他数据。`/boot` 在日常系统运行中并不需要，只在启动和内核升级（包括重建initial ramdisk）的时候用到。

如果使用软RAID0（条带化）系统的话，必须有一个独立的 `/boot` 分区。

#### /home

`/home`目录包含用户定义的配置文件、缓存、应用程序数据和媒体文件。

将`/home`目录独立使得`/`分区可以单独重新划分，但是请注意你可以在 `/home` 没有独立分区的情况下你仍然可以在不修改 `/home` 目录内容的情况下重装 Arch —— 删除其他顶级目录，然后执行pacstrap。

不能与使用其他发行版的用户共享同一个home目录，因为不同的发行版可能使用不兼容的软件版本和补丁。可以共享媒体目录，或至少使用 `/home` 分区下的不同home目录。

#### /var

`/var` 目录存储变量数据例如 spool 目录和文件，管理和登录数据，pacman 的缓存，ABS 树等等。它通常被用作缓存或者日志记录，因此读写频繁。将它独立出来可以避免由于大量日志写入造成的磁盘空间耗尽等问题。

可以将 `/usr` 设置为只读挂载。所有在操作系统运行过程中（例如安装或软件维护）写入 `/usr` 的东西放到 `/var` 下。

注意: `/var`包含许多小文件。如果将其作为独立分区，在文件系统的选择上需要考虑这一点。

#### /tmp

默认情况下这个目录已经是一个独立分区，systemd 将其挂载问tmpfs。

#### Swap

swap 分区提供能够被作为虚拟内存的内存空间。swap file 也可以实现同样的功能，并且它们之间没有明显的性能区别，但是后者更易于根据需要调整大小。如果没有使用休眠特性的话，swap 分区可以被多个系统共享。

#### 分区应该设置多大？

注意: 以下只是简单的建议，分区大小没有严格的准则。如果可能的话，为每个文件系统保留 25% 的额外空间以应对今后的变化，还可以避免文件系统碎片。

分区的大小主要取决于个人的选择，以下内容可能会有一定帮助：

/boot - 200 MB
  实际需求大约 100 MB，如果有多个内核/启动镜像同时存在，建议分配 200 或者 300 MB。
/ - 15-20 GB
  传统上包括 `/usr` 目录，根据安装的软件数量，会产生非常明显的增长。15-20 GB 对于大多数用户来说是一个比较合适的取值。
/var - 8-12 GB
  除了其他数据以外，还包括ABS 树和 pacman 缓存。保留缓存的包提供了包降级的能力，因此非常有用。也正因为这样，`/var` 的大小会随着时间推移而增长。尤其是 pacman 缓存将会随着新软件的安装、系统的升级而增长。在磁盘空间不足的时候，可以安全的清理这个目录。`/var` 分配 8-12 GB 对于桌面系统来说是比较合适的取值，具体取值取决于安装的软件数量。
/home - [不定]
  通常用于存放用户数据，下载的文件和媒体文件。在桌面系统中，`/home` 通常是最大的文件系统。
swap - [不定]
  历史上 swap 分区的大小通常是物理内存的2倍。由于当前的电脑内存容量快速增长，这条规则已经不那么适用。在拥有不足 512 MB 内存的机器上，通常为 swap 分区分配2倍内存大小的空间。如果有更大的内存（大于 1024 MB），可以分配较少的空间甚至不需要swap 分区。在拥有 2 GB 以上物理内存的情况下，不使用 swap 分区可以获得更好的性能。
  注意: 如果你要使用休眠到磁盘功能，你需要参考Suspend and Hibernate#About swap partition/file size。
/data - [不定]
  可以为需要多用户共享的文件建立一个“data”分区。也可以使用 `/home` 分区用于这一目的。

## 分区工具

- fdisk — Linux 自带的命令行分区工具。

  https://www.kernel.org/ || util-linux

- cfdisk — 使用 ncurses 库编写的具有伪图形界面的命令行分区工具。

  https://www.kernel.org/ || util-linux

警告: cfdisk 创建的第一个分区起始位置是63扇区而不是通常的2048扇区。这将会在 SSD 和使用高级格式化（4k 扇区）的设备上造成性能问题。GRUB2 也会受影响。GRUB legacy 和 Syslinux不受影响。

- gdisk — GPT 版的 fdisk。

  http://www.rodsbooks.com/gdisk/ || gptfdisk

- cgdisk — GPT 版的 cfdisk。

  http://www.rodsbooks.com/gdisk/ || gptfdisk

- GNU Parted — 命令行分区工具。

  http://www.gnu.org/software/parted/parted.html || parted

- GParted — GTK 图形界面的分区工具。

  http://gparted.sourceforge.net/ || gparted

- Partitionmanager — QT 图形界面的分区工具。

  http://sourceforge.net/projects/partitionman/ || partitionmanager

- QtParted — 与 Partitionmanager 类似，在 AUR 中可获取。

  http://qtparted.sourceforge.net/ || qtparted

## SSD 分区对齐

恰当的分区对齐对提升性能和使用寿命非常有帮助。对齐的关键是（至少）按照EBS（擦除块大小）分区。

注意:

- EBS 依制造商不同有很大的区别的；在 Google 上搜索一下中意的型号是个好主意！例如 Intel X25-M 被认为 EBS 大小是 512 KiB，但是 Intel 没有官方公开过这个信息。
- 如果你不知道你的固态硬盘的 EBS，你仍然可以使用 512 KiB (或者 1024 KiB 如果你想更保险一点而不在乎损失磁盘的最初的1 MiB)。这个数字大于或等于现有的所有EBS。对于这样一个数字对齐意味着对于更小的数字也是对齐的。这就是 Windows 7 和 Ubuntu 优化固态硬盘分区的方式。

如果分区没有按照EBS的整数倍对齐，对齐文件系统是徒劳无功的，因为在分区的开始就是有偏差的。传统上，硬盘是按照柱面、磁头 和 扇区 来寻址需要读写的数据位置。这代表了相关数据的径向的位置、驱动器磁头和轴向的位置。对于 LBA (逻辑块寻址)，这就不再是这样了。而是整个磁盘被按照连续的数据流寻址。

## 使用 GPT - 推荐方式

### Gdisk 用法

使用 GPT 的话，用于编辑分区表的工具是 gdisk。它可以自动将分区在 2048 扇区对齐（或 1024 KiB）进行对齐，这对于绝大多数主流 SSD 来说都是兼容的。GNU parted 也支持 GPT，但是在分区对齐方面的用户友好性较差。Arch 的安装 ISO 镜像提供的环境是 gdisk 命令。如果你在系统安装完成之后想要使用它，可以在 gptfdisk 包中找到 gdisk。

典型的gdisk使用方式总结如下：

- 以 root 身份启动 gdisk （disk-device 形如 `/dev/sda`）:

    # gdisk disk-device

- 如果是全新的磁盘或你想重新分区，使用 `o` 命令建立一个新的空 GUID 分区表。
- 使用`n` 命令创建一个新的分区（主分区/第一分区）。
- Assuming the partition is new, gdisk will pick the highest possible alignment. Otherwise, it will pick the largest power of two that divides all partition offsets.
- 如果指定使用第 2048 扇区之前的扇区作为起点，gdisk 会自动将分区起点移至第 2048 扇区。这是为了保证 2048 扇区对齐（由于每个扇区大小是 512 字节，这也就是能够保证兼容几乎所有 SSD NAND 擦除块大小的 1024 KiB对齐）。
- 使用 `+x{M,G}` 的格式指定分区大小为 x MB 或 GB。如果指定的大小不是对齐大小（1024KiB）的整数倍，gdisk 会将其缩减到最临近的值。例如，如果你需要创建一个 15 GiB 的分区，你需要输入 `+15G`。
- 选择分区类型 ID。默认值 `Linux filesystem`（代码 `8300`）在大多数情况下适用。输入 `L` 会打印出所有分区类型代码的列表。如果想要使用 LVM，选择`Linux LVM`（`8e00`）。
- 其他分区的处理方式类似。
- 使用 `w` 命令将分区表写入磁盘并退出。
- 将新分区格式化为文件系统。

注意:

- 从一个使用 BIOS 的机器上通过 GRUB 从 GPT 分区启动，你需要建立一个 BIOS boot partition，最好在磁盘起始处建立。这个分区没有文件系统，分区类型是 `BIOS boot` 或者 `bios_grub` （gdisk 代码 `EF02`）。对于 Syslinux，你不需要建立这个 `bios_grub` 分区，但是你需要将 `/boot` 单独分区并且使用 gdisk 开启它的 `Legancy BIOS Bootable partition` 属性。
- GRUB Legacy 不支持 GPT，用户必须使用 BURG，GRUB 或者 Syslinux。

警告: 如果打算以 BIOS 模式双启动 Windows （这是32位版 Windows 和64位版 Windows XP 的唯一选择），不要 使用 GPT，因为 Windows 不支持在使用 BIOS 的机器上从 GPT 分区的磁盘上启动。你需要像下面所说的那样，使用 MBR 分区，并且从 BIOS 模式启动。对于现代在 UEFI 模式下的64位 Windows 版本不存在这个限制。

## 使用 MBR - 传统方式

使用 MBR 的话，可以使用fdisk 工具编辑分区表。新版本的 fdisk 已经废弃使用柱面作为默认显示单位的方式，同时默认也放弃了对MS-DOS的兼容性。最新版本的 fdisk 会自动将所有分区对齐到2048扇区，或1024 KiB，以兼容所有已知的 SSD 制造商的 EBS 大小。即使用默认设置即可获得合适的分区对齐。

注意，在以前 fdisk 使用柱面作为默认显示单位，并且保留了 MS-DOS 兼容性，这使其默认无法进行 SSD 对齐。因此人们需要从网上查找各种资料以保证分区对齐。使用最新版本的 fdisk 简单得多，正如本文档所述那样。

### Fdisk 用法

- 以 root 身份启动 fdisk （disk-device 形如 `/dev/sda`）:

    # fdisk disk-device

- 如果是全新的磁盘或你想重新分区，使用 `o` 命令建立一个新的空 DOS 分区表。
- 使用`n` 命令创建一个新的分区（主分区/第一分区）。
- 使用 `+xG` 的格式指定分区大小为 x GB。例如，如果你需要创建一个 15 GiB 的分区，你需要输入 `+15G`。
- 使用`t` 命令将分区的 ID 从默认值修改为 Linux（`type 83`）。这是一个可选步骤。如果用户想创建其他类型的分区，如swap，NTFS，LVM 等也可以。注意，完整的可用分区类型列表可以通过 `l` 命令获取。
- 其他分区的处理方式类似。
- 使用 `w` 命令将分区表写入磁盘并退出。
- 将新分区格式化为文件系统。

## 参考资料

- Creating ext4 partitions from scratch
- Wikipedia:Disk partitioning
- Manually Partitioning Your Hard Drive with fdisk

Category:

- File systems (简体中文)