LXD
LXD はコンテナの『ハイパーバイザ』であり Linux Containers の新しいユーザー体験です。
目次
セットアップ
必要なソフトウェア
LXC と lxdAUR パッケージをインストールして、lxd.service
を起動してください。
実行しているカーネルがコンテナを起動できることを確認:
$ lxc-checkconfig
LXD で作成できる最も安全なコンテナは非特権です。Linux カーネルのユーザー名前空間機能を使うことで非特権コンテナを作成できます。しかしながらセキュリティ上の理由で、デフォルトの Arch カーネルでは非特権ユーザーでコンテナを実行できるようにはなっていません (カーネルコンパイル時に CONFIG_USER_NS
が有効になっていません)。CONFIG_USER_NS
が有効になっているカーネルを使用して非特権コンテナを作成する方法は3つあります:
- デフォルトの linux カーネルパッケージの他に linux-hardened カーネルパッケージをインストールする。非特権の LXD コンテナを起動したいときは、ブートローダーで linux-hardened を選択して起動する。linux-hardened は
CONFIG_USER_NS
が有効になっています。それ以外の場合は、通常の linux で起動します。 - AUR の linux-usernsAUR または linux-lts-usernsAUR パッケージをインストールする。どちらも
CONFIG_USER_NS
を有効にしてコンパイルされています。後者のパッケージは長期サポート版です。 CONFIG_USER_NS
を有効にして自分でカスタムカーネルをコンパイル・インストールする。
Sub{u,g}id の設定
root の sub{u,g}ids を設定して、LXD が非特権のコンテナを作成できるようにします:
# echo "root:1000000:65536" | tee -a /etc/subuid /etc/subgid
非特権ユーザーとして LXD にアクセス
デフォルトでは LXD デーモンは lxd
グループのユーザーからのアクセスを許可するので、ユーザーをグループに追加してください:
# usermod -a -G lxd <user>
LXD のネットワーク
LXD は LXC のネットワーク機能を使います。デフォルトではコンテナを lxcbr0
ネットワークデバイスに接続します。コンテナのブリッジを設定する方法は LXC のネットワーク設定のドキュメントを読んでください。
lxcbr0
以外のインターフェイスを使いたい場合、lxc のコマンドラインツールを使ってデフォルト設定を編集してください:
$ lxc profile edit default
エディタで設定ファイルが開きます。デフォルトでは以下の内容になっています:
name: default config: {} devices: eth0: name: eth0 nictype: bridged parent: lxcbr0 type: nic
parent
パラメータを設定することで LXD でコンテナに接続するブリッジを決めることができます。
ネットワーク設定例
LXD パッケージにはネットワークの設定例が付属しており /usr/share/lxd/
に保存されます。設定を使用するには以下のコマンドを実行してください:
$ ln -s /usr/share/lxd/dnsmasq-lxd.conf /etc/dnsmasq-lxd.conf $ ln -s /usr/share/lxd/systemd/system/dnsmasq@lxd.service /etc/systemd/system/dnsmasq@lxd.service $ ln -s /usr/share/lxd/netctl/lxd /etc/netctl/lxd $ ln -s /usr/share/lxd/dbus-1/system.d/dnsmasq-lxd.conf /etc/dbus-1/system.d/dnsmasq-lxd.conf
NetworkManager を使用する場合、以下のようにシンボリックリンクを作成してください:
$ ln -s /usr/share/lxd/NetworkManager/dnsmasq.d/lxd.conf /etc/NetworkManager/dnsmasq.d/lxd.conf
parent: lxcbr0
を parent: lxd
に変更してください:
$ lxc profile edit default
最後に、dnsmasq@lxd.service
と netctl@lxd.service
を起動・有効化してください。
上記のサンプル設定で問題が発生する場合、lxdAUR のページにコメントを投稿してください。
基本的な使い方
LXD はデーモン (lxd バイナリ) とクライアント (lxc バイナリ) の2つに分かれています。デーモンを設定して実行したら、コンテナを作成できます:
$ lxc launch ubuntu:14.04
もしくは、リモートの LXD ホストをイメージソースとして使うこともできます。LXD で設定済みのイメージを使用するには (images.linuxcontainers.org):
$ lxc launch images:centos/7/amd64 centos
ヒントとテクニック
プロセスやファイルの制限を変更する
ファイル記述子の制限やユーザーが使用できる最大プロセス数の制限を増やしたい場合、以下のコマンドを実行 (Arch Linux ではデフォルトで1024になっています):
# systemctl edit lxd
以下のように設定してください:
[Service] LimitNOFILE=infinity LimitNPROC=infinity TasksMax=infinity
設定できたら lxd を再起動してください:
# systemctl restart lxd
トラブルシューティング
CONFIG_USER_NS 無しでコンテナを起動する
イメージを起動するにはイメージの生成時に security.privileged=true
が必要です:
$ lxc launch ubuntu:16.04 ubuntu -c security.privileged=true
もしくは既存のイメージを使う場合は設定を編集してください:
$ lxc config edit ubuntu
name: test_ubuntu profiles: - default config: ... security.privileged: "true" ... devices: root: path: / type: disk ephemeral: false
新しいコンテナで security.privileged=true
を有効にしたい場合、デフォルトプロファイルの設定を編集してください:
$ lxc profile edit default
非特権の Arch コンテナ で IPv4 アドレスが取得できない
LXD v2.20 ではコンテナが systemd-networkd
サービスを起動できずに IPv4 アドレスが取得できません。LXD ホストで以下のコマンドを実行してからコンテナを再起動することで解決できます (Github Issue):
$ lxc profile set default security.syscalls.blacklist "keyctl errno 38"
原因は systemd の networkd ユニットが利用しているカーネルキーリングが非特権コンテナで機能しないためです。上記のコマンドを使うことでシステムコールは未実装を返すようになります。