旧答案

旧答案

我们的生产容器崩溃了,因为其 LXC 存储池空间不足。

以下是dh -h容器内部的情况:

Filesystem      Size  Used Avail Use% Mounted on
/dev/loop0       82G   78G  2.0G  98% /

这里是从主机系统进行相同的挂载:

/dev/loop0       82G   78G  2.0G  98% /var/lib/lxd/storage-pools/default

我记得一年前我设置它的时候,它问我 80GB 是否足够,这个听起来很陌生,因为它没有说“容器磁盘大小”,而是说了别的东西,所以我觉得最好相信默认选项。现在我知道了磁盘空间限制。我现在如何增加此限制?

目前,我刚刚紧急清理了一些空间。主机实际上有数 TB 的磁盘空间。

PS 抱歉抱怨,但 LXC 的文档是我见过的最糟糕的文档之一。对于像我这样的用户来说,它毫无意义。

PPS 我忘了我其实用的是 LXD,哎呀。我打字lxc做任何事情都让我很困惑。

更新: 直观地,我认为此命令可以调整存储池的大小:

# lxc storage set default size 200GB

但它失败了:

Error: The [size] properties cannot be changed for "btrfs" storage pools

有任何想法吗?

答案1

更新至 5.13,于 2023 年 4 月 15 日发布,增加了对扩大现有的循环文件存储池

<pool_name>这是将存储池扩展到以下位置的简单命令的模板<new_size>

lxc storage set <pool_name> size=<new_size>

对于问题中的调整大小,您需要运行以下命令:

lxc storage set default size=200G

旧答案

当这个答案于 2019 年 9 月 17 日首次撰写时,我们有 LXD 3.17,它没有内置方法来调整 Btrfs 文件支持的存储池的大小,因此我想出了这个解决方法,它应该适用于 5.13 以下的 LXD 版本:

在线成长

单行

将其替换default为存储卷的名称和100G新的所需大小:

grow_lxd_btrfs_file() { STORAGE_POOL="$1" ; NEW_SIZE="$2" ; STORAGE_POOL_SOURCE="$(lxc storage get "$STORAGE_POOL" source)" ; sudo truncate -s "$NEW_SIZE" "$STORAGE_POOL_SOURCE" ; STORAGE_POOL_LOOP_DEVICE="$(losetup -j "$STORAGE_POOL_SOURCE" | awk -F': ' '{print $1}' | head -1)" ; sudo losetup -c "$STORAGE_POOL_LOOP_DEVICE" ; LXD_PID=$(pgrep lxd | head -1) ; NS_MOUNT_POINT=$(sudo nsenter -t "$LXD_PID" -m -- findmnt -no target "$STORAGE_POOL_LOOP_DEVICE") ; sudo btrfs filesystem resize max "/proc/$LXD_PID/root/$NS_MOUNT_POINT" ; lxd sql global "UPDATE storage_pools_config SET value = '$NEW_SIZE' WHERE key = 'size' AND storage_pool_id IN (SELECT id FROM storage_pools WHERE name = '$STORAGE_POOL')" ; } \
grow_lxd_btrfs_file default 100G

解释

  1. 将变量设置$STORAGE_POOL为存储池的名称。 就您而言,它是default

    STORAGE_POOL=default
    
  2. 将变量设置$NEW_SIZE为您现在想要的存储池大小:

    NEW_SIZE=100G
    

    该值是一个整数和可选单位(例如:10K 是 10*1024)。单位为 K、M、G、T、P、E、Z、Y(1024 的幂)或 KB、MB、...(1000 的幂)。

    重要的:新大小必须大于当前 Btrfs 文件系统大小。如果大小较小,您将丢失存储池中的所有数据。

  3. 在主机上,找到 Btrfs 存储池文件的路径:

    STORAGE_POOL_SOURCE="$(lxc storage get "$STORAGE_POOL" source)"
    
    # Verify
    echo "$STORAGE_POOL_SOURCE"
    
  4. 增加 Btrfs 存储池文件:

    sudo truncate -s "$NEW_SIZE" "$STORAGE_POOL_SOURCE"
    
  5. 让环回设备知道新的尺寸:

    STORAGE_POOL_LOOP_DEVICE="$(losetup -j "$STORAGE_POOL_SOURCE" |
                                awk -F': ' '{print $1}' |
                                head -1)"
    
    sudo losetup -c "$STORAGE_POOL_LOOP_DEVICE"
    
  6. 获取 LXD 进程 ID,以便我们稍后可以进入其挂载命名空间:

    LXD_PID=$(pgrep lxd | head -1)
    
    # Verify
    echo "$LXD_PID"
    
  7. 获取在线 Btrfs 挂载点:

    NS_MOUNT_POINT=$(sudo nsenter -t "$LXD_PID" -m -- \
                     findmnt -no target "$STORAGE_POOL_LOOP_DEVICE")
    
    # Verify
    echo "$NS_MOUNT_POINT"
    
  8. 最后,将 Btrfs 文件系统的大小调整为最大可能大小:

    sudo btrfs filesystem resize max "/proc/$LXD_PID/root/$NS_MOUNT_POINT"
    
  9. 为了保持一致性,请使用存储池的新大小更新 LXD 数据库:

    lxd sql global "UPDATE storage_pools_config SET value = '$NEW_SIZE'
        WHERE
            key = 'size' AND
            storage_pool_id IN
                (SELECT id FROM storage_pools WHERE name = '$STORAGE_POOL')"
    
    # Verify
    lxd sql global "SELECT * FROM storage_pools_config
        WHERE storage_pool_id IN
            (SELECT id FROM storage_pools WHERE name = '$STORAGE_POOL')"
    

答案2

此链接提供了有关调整 btrfs 池大小的说明,但正如 #lcnittl 所述,最后一个命令失败。

正如 lcnittl 所述,您需要将命令更改为

nsenter --mount=/run/snapd/ns/lxd.mnt /snap/lxd/current/bin/btrfs filesystem resize max /var/snap/lxd/common/lxd/storage-pools/pool1/

其中pool1是所述池。如果您直接尝试“btrfs”命令,它首先会失败,因为找不到该命令,然后如果您通过apt安装,它会指出它不是btrfs池。

上述命令似乎指向 lxd 附带的 brtfs 命令,而不是单独安装的命令,因此你需要使用此命令

相关内容