ラベル LXD の投稿を表示しています。 すべての投稿を表示
ラベル LXD の投稿を表示しています。 すべての投稿を表示

小規模な利用ならLXDよりLXCが使い勝手がよい

LXDは、大雑把に言えば、LXCに管理機能を強化し大規模な運用にも利用しやすくしたもの。 個人で簡易的な仮想マシンとして使う場合、LXDの機能がやや冗長に感じることがある。 そのため私はLXDでなくLXCを主に使っている。以下にその理由を述べる。

ストレージ(コンテナ内のファイルの格納場所)

LXC

ホストOS上の特定のディレクトリ/var/lib/lxc/[コンテナ名]/rootfsの下に、そのコンテナのファイルシステムがそのまま格納されている。 ホスト側から見ると、デフォルトでファイル共有されているようなもの。

LXD

デフォルトでは、ホストOS上にストレージプール用のループバックマウント用のファイルを作成する。作成時点でそのサイズを決める(例えば100GiB)。

このストレージプール用のファイルは、シンプロビジョニングされるので、最初のサイズは0。使った分だけ増えていく。ただし、コンテナを削除したり、コンテナ内のファイルを削除しても、ストレージプールの容量は減少しない。これがパーソナルユースでは、ストレスになる。ストレージプール用のファイルを拡張できるものの、最初に最大サイズをいくらにするかを決めるのは、なかなか悩みどころである。

ストレージプールのループバックファイル上btrfsなどのパーティションを作れば、スナップショットやコンテナのコピーを高速に取得できるなどのメリットもある。しかし、私の使い方では、動作中にスナップショットをとるような用途もほとんどない。コンテナそのものは、それほど肥大化しないので、コピーすることがあっても、少し待てば終わる。そのため、これらのメリットをほぼ享受できない。

また、LXCでも同様のことは可能である。自前でループバックマウント用ファイルを作ってbtrfsでフォーマットし、rootfsをその上に設定すればよい。

設定

LXC

/var/lib/lxc/[コンテナ名]/configに設定が集約されている。構成を変えたいときは、このテキストファイルを編集すればよい。構成の保存もこのファイルをバックアップすればよい。

LXD

lxc configなどのコマンドで設定する。設定をまとめて保存したり、設定するのがやや面倒。

インストール方法

LXC

DebianでもUbuntuでもaptでインストールできる。

LXD

snapで提供される。snap自体それほどメジャーでもないし、パッケージ管理システムが増えるのは、システムが複雑になりあまり嬉しくない。

loopbackデバイス上のbtrfsパーテションを拡張する

loopback元のファイルを拡張 (ofとseekの右辺を適宜変更)
dd if=/dev/zero of=file_name.img bs=1 count=0 seek=100G
loopbackデバイスのサイズを更新(最後のloopbackデバイスを適宜変更)
losetup -c /dev/loop3
btrfsを拡張(最後のマウントポイントを適宜変更)
btrfs filesystem resize max /mnt/mount_point

LXDでコンテナのUID, GIDをホストと同じにする例

以下の例では、コンテナのUID,GID 1001をホストの2001にマッピングする。
lxc config set CONTAINER_NAME raw.idmap 'both 2001 1001'

LXDで特権コンテナを追加する例

コンテナ作成時に追加

lxc launch -c security.privileged=true ubuntu:20.04 CONTAINER_NAME

コンテナ作成後に追加

 lxc config set CONTAINER_NAME security.privileged true

LXDでubuntu-coreをインストールする例

lxc launch images:ubuntu-core/16 CONTAINER_NAME

LXDでコンテナごとにuser remapする方法

まず、/etc/subuid, subgidのrootとlxdに大きいマップ範囲を設定しておく。以下の例では300,000から1,000,000,000件のマップ範囲を確保。
lxd:300000:1000000000
root:300000:1000000000
以下は、CONTAINERのmapを40000から始める例。この後、コンテナの再起動が必要。
$ lxc config set CONTAINER security.idmap.isolated true
$ lxc config set CONTAINER security.idmap.base 400000

LXDでプロファイルを作成する

作成(ここでPROF_NAMEは任意の名前)
lxc profile create PROF_NAME
一覧表示
lxc profile list
ひとつのプロファイルを表示
lxc profile show PROF_NAME
プロフィールにNICを追加する例
lxc profile device add PROF_NAME eth0 nic nictype=bridged parent=BRIDGE_NAME
プロファイルをコンテナに追加
lxc profile add CONTAINER_NAME PROF_NAME
コンテナのデバイスに調べ方についてはこちらを参照 lxdのコンテナにNICを増設する例

LXDのコンテナにNICを増設する例

以下で、NIC_NAMEはeth1などに適宜変更。parentにはHost上のBridge名を指定
lxc config device add CONTAINER_NAME NIC_NAME nic nictype=bridged parent=br-exp0
構成の確認方法は次のとおり
lxc info CONTAINER_NAME
設定は次のように表示できる。
lxc config show CONTAINER_NAME
--expandedを加えると更に詳細な情報が表示される
lxc config show --expanded CONTAINER_NAME