web-dev-qa-db-ja.com

LXD / LXCBtrfsループファイルストレージプールのサイズを増やす

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

1年前にこれを設定したとき、なじみのないもので80GBで十分かと聞かれましたが、「コンテナのディスクサイズ」とは書かれておらず、他のことを言っていたので、デフォルトを信頼したほうがいいと思いました。オプション。これで、isディスク容量の制限であることがわかりました。どうすればこの制限を今すぐ増やすことができますか?

現時点では、緊急にスペースを掃除しました。ホストマシンには、実際にはテラバイトのディスク容量があります。

P.S.不満を言って申し訳ありませんが、LXCのドキュメントは私が今まで見た中で最悪のものの1つです。私のようなユーザーにとっては意味がありません。

P.P.S.実際にLXDを使っているのを忘れてしまいました。何かをするためにlxcと入力したという事実は、私を混乱させました。

PDATE:直感的に、このコマンドでストレージプールのサイズを変更できると思いました。

# lxc storage set default size 200GB

しかし、それは失敗します:

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

何か案は?

1
exebook

バージョン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

説明

  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')"
    
3
Deltik