假设在单个磁盘上使用 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。所以诀窍是:
- 将临时磁盘/文件 vdev 添加到较小大小的池中,但足以容纳所有现有数据(包括快照等)
- 删除旧的 vdev
- 可能将旧的 vdev 重新分区为较小的大小,或者用较小的磁盘替换
- 将其添加回来
- 删除临时磁盘。
所有文件应保持完整。
为了说明这些步骤:
- 分配文件
# fallocate -l 3G 3G_1.img
# fallocate -l 3G 3G_2.img
# fallocate -l 2G 2G_1.img
# fallocate -l 2G 2G_2.img
- 使用带有镜像的 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,它位于镜像中。
- 让我们尝试在里面创建虚拟文件。这可以模拟您现有的数据。您可以在练习后验证您的数据是否完好无损。
# echo test > /test3g/test.txt
# cat /test3g/test.txt
test
#
- 现在附加另一个较小尺寸的镜像(例如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 的可用条带镜像。
- 我们把之前的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,而且没有停机,也没有丢失数据。
- 让我们验证一下数据是否还在那里
# cat /test3g/test.txt
test
#
是的当然。
请注意,只有最新版本的 zfs 支持此功能。您的情况可能会有所不同。
谢谢最好的 Shilin
答案2
将磁盘添加到 zfs 池后,默认情况下 zfs 会分配整个磁盘供使用,并使用 EFI 标签格式化磁盘以包含单个大切片。这是推荐的方式。
如果已分配整个磁盘,则无法缩小卷的大小。从技术上讲,您可以通过 gparted 或其他工具强制缩小卷的大小,但这会导致 zfs 池出现问题,并且您会丢失数据,因此完全不建议这样做。
您可以减少特定 zfs 池的大小并从可用空间创建新池。释放一些空间的唯一可能方法是使磁盘脱机(我希望您在 zfs 池中有多个磁盘),重新格式化它,并将一些空间用于所需的分区,将剩余空间分配给 zfs 分区c150d0
。当您将磁盘添加回 zfs 池时,您需要添加 zfs 分区以供使用。这不是推荐的方法,但应算作一种解决方法。请自行承担风险。