我们的生产容器崩溃了,因为其 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
解释
将变量设置
$STORAGE_POOL
为存储池的名称。 就您而言,它是default
:STORAGE_POOL=default
将变量设置
$NEW_SIZE
为您现在想要的存储池大小:NEW_SIZE=100G
该值是一个整数和可选单位(例如:10K 是 10*1024)。单位为 K、M、G、T、P、E、Z、Y(1024 的幂)或 KB、MB、...(1000 的幂)。
重要的:新大小必须大于当前 Btrfs 文件系统大小。如果大小较小,您将丢失存储池中的所有数据。
在主机上,找到 Btrfs 存储池文件的路径:
STORAGE_POOL_SOURCE="$(lxc storage get "$STORAGE_POOL" source)" # Verify echo "$STORAGE_POOL_SOURCE"
增加 Btrfs 存储池文件:
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 进程 ID,以便我们稍后可以进入其挂载命名空间:
LXD_PID=$(pgrep lxd | head -1) # Verify echo "$LXD_PID"
获取在线 Btrfs 挂载点:
NS_MOUNT_POINT=$(sudo nsenter -t "$LXD_PID" -m -- \ findmnt -no target "$STORAGE_POOL_LOOP_DEVICE") # Verify echo "$NS_MOUNT_POINT"
最后,将 Btrfs 文件系统的大小调整为最大可能大小:
sudo btrfs filesystem resize max "/proc/$LXD_PID/root/$NS_MOUNT_POINT"
为了保持一致性,请使用存储池的新大小更新 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 命令,而不是单独安装的命令,因此你需要使用此命令