如何在 ubuntu 18.04 上缩小 zfs 卷?

如何在 ubuntu 18.04 上缩小 zfs 卷?

假设在单个磁盘上使用 zfs 进行安装,我该如何缩小 zfs 分区/池,以便可以向磁盘添加新分区?我看到的其他说明表明在池上设置 volsize 属性,但这样做会出现以下错误:cannot set property for 'rpool': 'volsize' does not apply to datasets of this type

$ zpool list
NAME    SIZE  ALLOC   FREE  CKPOINT  EXPANDSZ   FRAG    CAP  DEDUP    HEALTH  ALTROOT
bpool  1.88G   196M  1.68G        -         -      -    10%  1.00x    ONLINE  -
rpool   228G  10.9G   217G        -         -     2%     4%  1.00x    ONLINE  -

答案1

实际上,这是可以做到的。因为如果空间允许,可以从池中删除顶层 vdev。所以诀窍是:

  1. 将临时磁盘/文件 vdev 添加到较小大小的池中,但足以容纳所有现有数据(包括快照等)
  2. 删除旧的 vdev
  3. 可能将旧的 vdev 重新分区为较小的大小,或者用较小的磁盘替换
  4. 将其添加回来
  5. 删除临时磁盘。

所有文件应保持完整。

为了说明这些步骤:

  1. 分配文件
# fallocate -l 3G 3G_1.img
# fallocate -l 3G 3G_2.img
# fallocate -l 2G 2G_1.img
# fallocate -l 2G 2G_2.img
  1. 使用带有镜像的 2 个 3G 文件创建 zfs。(我的目录是 /var/snap/lxd/common/lxd/disks)
# zpool create test3g mirror /var/snap/lxd/common/lxd/disks/3G_1.img /var/snap/lxd/common/lxd/disks/3G_2.img
# zpool status test3g
  pool: test3g
 state: ONLINE
  scan: none requested
config:

    NAME                                         STATE     READ WRITE CKSUM
    test3g                                       ONLINE       0     0     0
      mirror-0                                   ONLINE       0     0     0
        /var/snap/lxd/common/lxd/disks/3G_1.img  ONLINE       0     0     0
        /var/snap/lxd/common/lxd/disks/3G_2.img  ONLINE       0     0     0

errors: No known data errors
# zpool list test3g
NAME     SIZE  ALLOC   FREE  CKPOINT  EXPANDSZ   FRAG    CAP  DEDUP    HEALTH  ALTROOT
test3g  2.75G   111K  2.75G        -         -     0%     0%  1.00x    ONLINE  -

您可以清楚地看到 test3g 池可用空间为 2.75G,它位于镜像中。

  1. 让我们尝试在里面创建虚拟文件。这可以模拟您现有的数据。您可以在练习后验证您的数据是否完好无损。
# echo test > /test3g/test.txt
# cat /test3g/test.txt
test
#
  1. 现在附加另一个较小尺寸的镜像(例如2G)
# zpool add test3g mirror /var/snap/lxd/common/lxd/disks/2G_1.img /var/snap/lxd/common/lxd/disks/2G_2.img
# zpool status test3g
  pool: test3g
 state: ONLINE
  scan: none requested
config:

    NAME                                         STATE     READ WRITE CKSUM
    test3g                                       ONLINE       0     0     0
      mirror-0                                   ONLINE       0     0     0
        /var/snap/lxd/common/lxd/disks/3G_1.img  ONLINE       0     0     0
        /var/snap/lxd/common/lxd/disks/3G_2.img  ONLINE       0     0     0
      mirror-1                                   ONLINE       0     0     0
        /var/snap/lxd/common/lxd/disks/2G_1.img  ONLINE       0     0     0
        /var/snap/lxd/common/lxd/disks/2G_2.img  ONLINE       0     0     0

errors: No known data errors
# zpool list test3g
NAME     SIZE  ALLOC   FREE  CKPOINT  EXPANDSZ   FRAG    CAP  DEDUP    HEALTH  ALTROOT
test3g  4.62G   156K  4.62G        -         -     0%     0%  1.00x    ONLINE  -

现在我们有 4.62GB 的可用条带镜像。

  1. 我们把之前的3G部分删除吧。
# zpool remove test3g mirror-0
# zpool status
  pool: default
 state: ONLINE
  scan: scrub repaired 0B in 0 days 00:06:45 with 0 errors on Fri May 21 15:20:30 2021
config:

    NAME                                            STATE     READ WRITE CKSUM
    default                                         ONLINE       0     0     0
      mirror-0                                      ONLINE       0     0     0
        /opt/lxc_image/default.img                  ONLINE       0     0     0
        /var/snap/lxd/common/lxd/disks/default.img  ONLINE       0     0     0

errors: No known data errors

  pool: tank
 state: ONLINE
  scan: scrub repaired 0B in 0 days 00:00:10 with 0 errors on Tue May 18 19:42:56 2021
config:

    NAME                                         STATE     READ WRITE CKSUM
    tank                                         ONLINE       0     0     0
      mirror-0                                   ONLINE       0     0     0
        /var/snap/lxd/common/lxd/disks/tank.img  ONLINE       0     0     0
        /nfs-dual/zfs-images/tank.img            ONLINE       0     0     0

errors: No known data errors

  pool: test3g
 state: ONLINE
  scan: none requested
remove: Removal of vdev 0 copied 102K in 0h0m, completed on Fri May 21 15:33:19 2021
    72 memory used for removed device mappings
config:

    NAME                                         STATE     READ WRITE CKSUM
    test3g                                       ONLINE       0     0     0
      mirror-1                                   ONLINE       0     0     0
        /var/snap/lxd/common/lxd/disks/2G_1.img  ONLINE       0     0     0
        /var/snap/lxd/common/lxd/disks/2G_2.img  ONLINE       0     0     0

errors: No known data errors
# zpool list test3g
NAME     SIZE  ALLOC   FREE  CKPOINT  EXPANDSZ   FRAG    CAP  DEDUP    HEALTH  ALTROOT
test3g  1.88G   142K  1.87G        -         -     0%     0%  1.00x    ONLINE  -

空间已降至 1.87G。请注意,这可能需要很长时间,具体取决于您的数据大小,但它会顺利完成。检查上面的消息:

Removal of vdev 0 copied 102K in 0h0m, completed on Fri May 21 15:33:19 2021

从技术上讲,您将 zpool 大小从 3G 减少到了 2G,而且没有停机,也没有丢失数据。

  1. 让我们验证一下数据是否还在那里
# cat /test3g/test.txt
test
#

是的当然。

请注意,只有最新版本的 zfs 支持此功能。您的情况可能会有所不同。

谢谢最好的 Shilin

答案2

将磁盘添加到 zfs 池后,默认情况下 zfs 会分配整个磁盘供使用,并使用 EFI 标签格式化磁盘以包含单个大切片。这是推荐的方式。

如果已分配整个磁盘,则无法缩小卷的大小。从技术上讲,您可以通过 gparted 或其他工具强制缩小卷的大小,但这会导致 zfs 池出现问题,并且您会丢失数据,因此完全不建议这样做。

您可以减少特定 zfs 池的大小并从可用空间创建新池。释放一些空间的唯一可能方法是使磁盘脱机(我希望您在 zfs 池中有多个磁盘),重新格式化它,并将一些空间用于所需的分区,将剩余空间分配给 zfs 分区c150d0。当您将磁盘添加回 zfs 池时,您需要添加 zfs 分区以供使用。这不是推荐的方法,但应算作一种解决方法。请自行承担风险。

相关内容