LXD

提供: ArchWiki
2017年12月10日 (日) 20:04時点におけるKusakata (トーク | 投稿記録)による版 (同期)
ナビゲーションに移動 検索に移動

LXD はコンテナの『ハイパーバイザ』であり Linux Containers の新しいユーザー体験です。

セットアップ

必要なソフトウェア

LXClxdAUR パッケージをインストールして、lxd.service起動してください。

実行しているカーネルがコンテナを起動できることを確認:

$ lxc-checkconfig

LXD で作成できる最も安全なコンテナは非特権です。Linux カーネルのユーザー名前空間機能を使うことで非特権コンテナを作成できます。しかしながらセキュリティ上の理由で、デフォルトの Arch カーネルでは非特権ユーザーでコンテナを実行できるようにはなっていません (カーネルコンパイル時に CONFIG_USER_NS が有効になっていません)。CONFIG_USER_NS が有効になっているカーネルを使用して非特権コンテナを作成する方法は3つあります:

  • デフォルトの linux カーネルパッケージの他に linux-hardened カーネルパッケージをインストールする。非特権の LXD コンテナを起動したいときは、ブートローダーで linux-hardened を選択して起動する。linux-hardenedCONFIG_USER_NS が有効になっています。それ以外の場合は、通常の linux で起動します。
  • AURlinux-usernsAUR または linux-lts-usernsAUR パッケージをインストールする。どちらも CONFIG_USER_NS を有効にしてコンパイルされています。後者のパッケージは長期サポート版です。
  • CONFIG_USER_NS を有効にして自分でカスタムカーネルをコンパイル・インストールする。
ノート: CONFIG_USER_NS 機能がなくてもコンテナを起動することはできます。ただし LXD コンテナは特権になるためプロセスがコンテナを脱獄した場合にリスクがあります。#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: lxcbr0parent: lxd に変更してください:

$ lxc profile edit default

最後に、dnsmasq@lxd.servicenetctl@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 ユニットが利用しているカーネルキーリングが非特権コンテナで機能しないためです。上記のコマンドを使うことでシステムコールは未実装を返すようになります。

参照