# 20.3.调整和增加磁盘大小

可以在不更改现有数据的情况下增加磁盘容量。这在虚拟机中很常见，当虚拟磁盘空间不足时，通常会扩大磁盘容量。有时，磁盘映像被写入 U 盘，但未使用完整容量。在这里，我们将介绍如何调整或 *扩展* 磁盘内容，以充分利用增加的容量。

通过检查 **/var/run/dmesg.boot** 文件来确定要调整大小的磁盘设备名称。在此示例中，系统中只有一个 SATA 硬盘，因此该硬盘将显示为 **ada0**。

列出磁盘上的分区，以查看当前配置：

```sh
# gpart show ada0
=>      34  83886013  ada0  GPT  (48G) [CORRUPT]
        34       128     1  freebsd-boot  (64k)
       162  79691648     2  freebsd-ufs  (38G)
  79691810   4194236     3  freebsd-swap  (2G)
  83886046         1        - free -  (512B)
```

> **注意**
>
> 如果磁盘使用的是 [GPT](https://en.wikipedia.org/wiki/GUID_Partition_Table) 分区方案，可能会显示为“损坏”，因为 GPT 备份分区表不再位于磁盘末尾。可以使用 `gpart` 修复备份分区表：
>
> ```
> # gpart recover ada0
> ada0 recovered
> ```

现在，磁盘上额外的空间可以用来创建新分区，或者扩展现有分区：

```sh
# gpart show ada0
=>       34  102399933  ada0  GPT  (48G)
         34        128     1  freebsd-boot  (64k)
        162   79691648     2  freebsd-ufs  (38G)
   79691810    4194236     3  freebsd-swap  (2G)
   83886046   18513921        - free -  (8.8G)
```

分区只能调整到连续的空闲空间。在这里，磁盘上的最后一个分区是交换分区，但需要调整的是第二个分区。交换分区只包含临时数据，因此可以安全地卸载、删除，然后在调整第二个分区后重新创建第三个分区。

禁用交换分区：

```sh
# swapoff /dev/ada0p3
```

使用 `-i` 标志从磁盘中删除第三个分区 **ada0**：

```sh
# gpart delete -i 3 ada0
ada0p3 deleted
# gpart show ada0
=>       34  102399933  ada0  GPT  (48G)
         34        128     1  freebsd-boot  (64k)
        162   79691648     2  freebsd-ufs  (38G)
   79691810   22708157        - free -  (10G)
```

> **警告**
>
> 修改已挂载文件系统的分区表存在数据丢失的风险。最好在使用 Live CD-ROM 或 USB 设备运行的情况下，对未挂载的文件系统执行以下步骤。如果必须对已挂载的文件系统进行调整，请禁用 GEOM 安全功能：
>
> ```
> # sysctl kern.geom.debugflags=16
> ```

调整分区大小，留出空间以重新创建所需大小的交换分区。调整的分区通过 `-i` 指定，新的目标大小通过 `-s` 指定。可选地，可以使用 `-a` 控制分区的对齐方式。此操作仅修改分区的大小，文件系统的扩展将在后续步骤中完成。

```sh
# gpart resize -i 2 -s 47G -a 4k ada0
ada0p2 resized
# gpart show ada0
=>       34  102399933  ada0  GPT  (48G)
         34        128     1  freebsd-boot  (64k)
        162   98566144     2  freebsd-ufs  (47G)
   98566306    3833661        - free -  (1.8G)
```

重新创建交换分区并激活它。如果没有使用 `-s` 指定大小，则会使用所有剩余的空间：

```sh
# gpart add -t freebsd-swap -a 4k ada0
ada0p3 added
# gpart show ada0
=>       34  102399933  ada0  GPT  (48G)
         34        128     1  freebsd-boot  (64k)
        162   98566144     2  freebsd-ufs  (47G)
   98566306    3833661     3  freebsd-swap  (1.8G)
# swapon /dev/ada0p3
```

扩展 UFS 文件系统以使用调整大小后的分区的新容量：

```sh
# growfs /dev/ada0p2
Device is mounted read-write; resizing will result in temporary write suspension for /.
It's strongly recommended to make a backup before growing the file system.
OK to grow file system on /dev/ada0p2, mounted on /, from 38GB to 47GB? [Yes/No] Yes
super-block backups (for fsck -b #) at:
 80781312, 82063552, 83345792, 84628032, 85910272, 87192512, 88474752,
 89756992, 91039232, 92321472, 93603712, 94885952, 96168192, 97450432
```

如果文件系统是 ZFS，可以通过运行 `online` 子命令并使用 `-e` 选项来触发调整：

```sh
# zpool online -e zroot /dev/ada0p2
```

现在，分区及其上的文件系统都已调整大小，以利用新增的磁盘空间。


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://handbook.bsdcn.org/di-20-zhang-cun-chu/20.3.-tiao-zheng-he-zeng-jia-ci-pan-da-xiao.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
