增加 LXD/LXC Btrfs 循环文件存储池大小

exe*_*ook 2 filesystems btrfs resizing lxc lxd

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

这是dh -h从容器内部:

Filesystem      Size  Used Avail Use% Mounted on
/dev/loop0       82G   78G  2.0G  98% /
Run Code Online (Sandbox Code Playgroud)

这是来自主机系统的相同挂载:

/dev/loop0       82G   78G  2.0G  98% /var/lib/lxd/storage-pools/default
Run Code Online (Sandbox Code Playgroud)

我记得一年前当我设置它时,它问我 80GB 是否适合听起来不熟悉的东西,并且因为它没有说“容器磁盘大小”并说其他的东西,我只是想我最好相信默认值选项。现在我知道这磁盘空间限制。我现在怎样才能增加这个限制?

此刻,我只是紧急清理了一些空间。主机实际上有数 TB 的磁盘空间。

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

PPS 我忘了我实际上使用 LXD,呵呵。我打字lxc做任何事情的事实让我感到困惑。

更新: 直觉上,我认为这个命令可以调整存储池的大小:

# lxc storage set default size 200GB
Run Code Online (Sandbox Code Playgroud)

但它失败了:

Error: The [size] properties cannot be changed for "btrfs" storage pools
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?

Del*_*tik 7

从 3.17 版开始,LXD 没有调整 Btrfs 文件支持的存储池大小的内置方法,但这是我刚刚创建的解决方法:

在线成长

单线

根据需要,替换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
Run Code Online (Sandbox Code Playgroud)

解释

  1. 将该变量设置为$STORAGE_POOL存储池的名称。在你的情况下,它是default

    STORAGE_POOL=default
    
    Run Code Online (Sandbox Code Playgroud)
  2. 将变量设置为$NEW_SIZE您现在希望存储池的大小:

    NEW_SIZE=100G
    
    Run Code Online (Sandbox Code Playgroud)

    该值是一个整数和可选单位(例如: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"
    
    Run Code Online (Sandbox Code Playgroud)
  4. 增长 Btrfs 存储池文件:

    sudo truncate -s "$NEW_SIZE" "$STORAGE_POOL_SOURCE"
    
    Run Code Online (Sandbox Code Playgroud)
  5. 让环回设备知道新的大小:

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

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

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

    sudo btrfs filesystem resize max "/proc/$LXD_PID/root/$NS_MOUNT_POINT"
    
    Run Code Online (Sandbox Code Playgroud)
  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')"
    
    Run Code Online (Sandbox Code Playgroud)