我将 btrfs 映像文件设置为 LXD (2.18) 的后端,但我想缩小它的大小。我做了以下操作:
- 将映像挂载到循环设备
losetup /dev/loop1 /home/btrfs.img
- 将设备挂载到 /mnt 目录
mount /dev/loop1 /mnt/brtfs
- 使用以下方法调整 btrfs 分区大小
btrfs filesystem resize -100G /mnt/btrfs
之后df
正确显示分区大小/mnt/btrfs
:
root@host:/mnt/btrfs# df -k .
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/loop1 1614807040 1563273068 48426164 97% /mnt/btrfs
但文件大小仍然相同
root@host:/home# ls -al
total 1848321632
drwx------ 2 root root 4096 Nov 11 10:19 .
drwxr-xr-x 4 root root 4096 Nov 11 10:19 ..
-rw------- 1 root root 1932735283200 Nov 11 06:29 btrfs.img
后来我尝试了一下btrfs filesystem resize -100GB /home/btrfs.img
,但没有成功文档:
警告:如果路径是包含 BTRFS 图像的文件,则调整大小不会按预期工作,也不会调整图像大小。这将调整底层文件系统的大小。
我的问题是:如何才能缩小整个文件而不丢失数据?
答案1
截断-s100G /home/btrfs.img
答案2
在自动调整(缩小)BTRFS 映像文件的大小 #5801, 成员斯特格拉伯注释“无论如何,你都可以使用一些技巧来做到这一点,有效地手动创建第二个循环文件,将其作为镜像设备添加到 btrfs,然后删除原始文件,但这是一个缓慢且非常手动的过程,我们无意在 LXD 中实现自动化。”然而,他没有提供更多细节。
以下步骤在 Ubuntu 20.04 上对我而言效果很好。我在 VPS 上释放了 3GB,并且只需要一个循环文件。
- 确保您已一些可用磁盘空间——大约 200MB
- 停止 LXD,找到您的存储池,并记下其当前大小:
sudo systemctl stop snap.lxd.daemon POOL=$(lxc storage list |grep ^..default |grep -Eo '/var/snap/lxd[^ ]+') && echo "POOL: $POOL" echo BEFORE sudo ls -al $POOL
- 以字节为单位设置所需的大小:
NEWSIZE=12000000000 # 12GB
- 缩小池子:
LOOPDEV=$(sudo losetup --find --show $POOL |grep -Po /dev/loop[0-9]+); echo "LOOPDEV: $LOOPDEV" sudo mount $LOOPDEV /mnt sudo df --block-size=1 /mnt sudo btrfs filesystem resize $NEWSIZE /mnt sudo df --block-size=1 /mnt sudo umount /mnt sudo truncate --size=$NEWSIZE $POOL
- 验证新的大小并恢复 LXD:
echo AFTER sudo ls -al $POOL sudo systemctl start snap.lxd.daemon
如果您在执行任何步骤时遇到错误,尤其是LOOPDEV=...
,请重新启动并从头再试。
答案3
尝试从 GUI 逐步缩小。有时磁盘显示已满 95 GB,但最多可以缩小到 200G!
lsblk
显示已安装的循环设备
loop0 7:0 0 535G 0 loop /var/lib/lxd/storage-pools/gedizsStoragePool
vda 254:0 0 550G 0 disk
├─vda1 254:1 0 512M 0 part /boot/efi
└─vda2 254:2 0 549.5G 0 part /
从 GUI 调整文件系统大小(假设调整到 200G 即可):
sudo gparted /dev/loop0
然后截断(假设所需大小为 200 GB):
sudo truncate --size=200G /var/lib/lxd/disks/<yourdiskimage.img>
并确认您是否需要:
sudo btrfs filesystem resize 200G /var/lib/lxd/storage-pools/gedizsStoragePool