> For the complete documentation index, see [llms.txt](https://handbook.bsdcn.org/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://handbook.bsdcn.org/di-21-zhang-cun-chu/21.3.-tiao-zheng-he-zeng-jia-ci-pan-da-xiao.md).

# 21.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` 修复备份分区表：
>
> ```sh
> # 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
```

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

```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 安全功能后调整已挂载的文件系统：
>
> ```sh
> # 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
```

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