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)
有任何想法吗?
从 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)
将该变量设置为$STORAGE_POOL存储池的名称。在你的情况下,它是default:
STORAGE_POOL=default
Run Code Online (Sandbox Code Playgroud)将变量设置为$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 文件系统大小。如果大小较小,您将丢失存储池中的所有数据。
在主机上,找到 Btrfs 存储池文件的路径:
STORAGE_POOL_SOURCE="$(lxc storage get "$STORAGE_POOL" source)"
# Verify
echo "$STORAGE_POOL_SOURCE"
Run Code Online (Sandbox Code Playgroud)增长 Btrfs 存储池文件:
sudo truncate -s "$NEW_SIZE" "$STORAGE_POOL_SOURCE"
Run Code Online (Sandbox Code Playgroud)让环回设备知道新的大小:
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)获取一个 LXD 进程 ID,以便我们稍后可以进入它的挂载命名空间:
LXD_PID=$(pgrep lxd | head -1)
# Verify
echo "$LXD_PID"
Run Code Online (Sandbox Code Playgroud)获取在线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)最后,将 Btrfs 文件系统调整为最大可能大小:
sudo btrfs filesystem resize max "/proc/$LXD_PID/root/$NS_MOUNT_POINT"
Run Code Online (Sandbox Code Playgroud)为了保持一致性,使用新的存储池大小更新 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)