如何缩小 LXD 存储使用的 btrfs 映像文件?

如何缩小 LXD 存储使用的 btrfs 映像文件?

我将 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,并且只需要一个循环文件​​。

  1. 确保您已一些可用磁盘空间——大约 200MB
  2. 停止 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
    
  3. 以字节为单位设置所需的大小:
    NEWSIZE=12000000000  # 12GB
    
  4. 缩小池子:
    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
    
  5. 验证新的大小并恢复 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

相关内容