ユーザーコンテナの起動に失敗しました。理由を見つける方法は?

ユーザーコンテナの起動に失敗しました。理由を見つける方法は?

次のコマンドラインを使用してUbuntu 14.04でユーザー(無許可)LXCコンテナを作成する場合:

lxc-create -n test1 -t download -- -d $(lsb_release -si|tr 'A-Z' 'a-z') -r $(lsb_release -sc) -a $(dpkg --print-architecture)

そして、(生成された設定ファイルに触れることなく)次のように始めてみてください。

lxc-start -n test1 -l DEBUG

失敗します。ログファイルには以下が表示されます。

lxc-start 1420149317.700 INFO     lxc_start_ui - using rcfile /home/user/.local/share/lxc/test1/config
lxc-start 1420149317.700 INFO     lxc_utils - XDG_RUNTIME_DIR isn't set in the environment.
lxc-start 1420149317.701 INFO     lxc_confile - read uid map: type u nsid 0 hostid 100000 range 65536
lxc-start 1420149317.701 INFO     lxc_confile - read uid map: type g nsid 0 hostid 100000 range 65536
lxc-start 1420149317.701 WARN     lxc_log - lxc_log_init called with log already initialized
lxc-start 1420149317.701 INFO     lxc_lsm - LSM security driver AppArmor
lxc-start 1420149317.701 INFO     lxc_utils - XDG_RUNTIME_DIR isn't set in the environment.
lxc-start 1420149317.702 DEBUG    lxc_conf - allocated pty '/dev/pts/2' (5/6)
lxc-start 1420149317.702 DEBUG    lxc_conf - allocated pty '/dev/pts/7' (7/8)
lxc-start 1420149317.702 DEBUG    lxc_conf - allocated pty '/dev/pts/8' (9/10)
lxc-start 1420149317.702 DEBUG    lxc_conf - allocated pty '/dev/pts/10' (11/12)
lxc-start 1420149317.702 INFO     lxc_conf - tty's configured
lxc-start 1420149317.702 DEBUG    lxc_start - sigchild handler set
lxc-start 1420149317.702 DEBUG    lxc_console - opening /dev/tty for console peer
lxc-start 1420149317.702 DEBUG    lxc_console - using '/dev/tty' as console
lxc-start 1420149317.702 DEBUG    lxc_console - 14946 got SIGWINCH fd 17
lxc-start 1420149317.702 DEBUG    lxc_console - set winsz dstfd:14 cols:118 rows:61
lxc-start 1420149317.905 INFO     lxc_start - 'test1' is initialized
lxc-start 1420149317.906 DEBUG    lxc_start - Not dropping cap_sys_boot or watching utmp
lxc-start 1420149317.906 INFO     lxc_start - Cloning a new user namespace
lxc-start 1420149317.906 INFO     lxc_cgroup - cgroup driver cgmanager initing for test1
lxc-start 1420149317.907 ERROR    lxc_cgmanager - call to cgmanager_create_sync failed: invalid request
lxc-start 1420149317.907 ERROR    lxc_cgmanager - Failed to create hugetlb:test1
lxc-start 1420149317.907 ERROR    lxc_cgmanager - Error creating cgroup hugetlb:test1
lxc-start 1420149317.907 INFO     lxc_cgmanager - cgroup removal attempt: hugetlb:test1 did not exist
lxc-start 1420149317.908 INFO     lxc_cgmanager - cgroup removal attempt: perf_event:test1 did not exist
lxc-start 1420149317.908 INFO     lxc_cgmanager - cgroup removal attempt: blkio:test1 did not exist
lxc-start 1420149317.908 INFO     lxc_cgmanager - cgroup removal attempt: freezer:test1 did not exist
lxc-start 1420149317.909 INFO     lxc_cgmanager - cgroup removal attempt: devices:test1 did not exist
lxc-start 1420149317.909 INFO     lxc_cgmanager - cgroup removal attempt: memory:test1 did not exist
lxc-start 1420149317.909 INFO     lxc_cgmanager - cgroup removal attempt: cpuacct:test1 did not exist
lxc-start 1420149317.909 INFO     lxc_cgmanager - cgroup removal attempt: cpu:test1 did not exist
lxc-start 1420149317.910 INFO     lxc_cgmanager - cgroup removal attempt: cpuset:test1 did not exist
lxc-start 1420149317.910 INFO     lxc_cgmanager - cgroup removal attempt: name=systemd:test1 did not exist
lxc-start 1420149317.910 ERROR    lxc_start - failed creating cgroups
lxc-start 1420149317.910 INFO     lxc_utils - XDG_RUNTIME_DIR isn't set in the environment.
lxc-start 1420149317.910 ERROR    lxc_start - failed to spawn 'test1'
lxc-start 1420149317.910 INFO     lxc_utils - XDG_RUNTIME_DIR isn't set in the environment.
lxc-start 1420149317.910 INFO     lxc_utils - XDG_RUNTIME_DIR isn't set in the environment.
lxc-start 1420149317.910 ERROR    lxc_start_ui - The container failed to start.
lxc-start 1420149317.910 ERROR    lxc_start_ui - Additional information can be obtained by setting the --logfile and --logpriority options.

ここで、2つのエラーが表示されます。後者はおそらく前者の結果です。

lxc_start - cgroupの作成に失敗しました。

しかし、私は/sys/fs/cgroupそれがインストールされているのを見ています。

$ mount|grep cgr
none on /sys/fs/cgroup type tmpfs (rw)

そしてcgmanager以下をインストールしてください:

$ dpkg -l|awk '$1 ~ /^ii$/ && /cgmanager/ {print $2 " " $3 " " $4}'
cgmanager 0.24-0ubuntu7 amd64
libcgmanager0:amd64 0.24-0ubuntu7 amd64

注:私のホストはまだデフォルトでupstart

質問がある場合のカーネルサポートcgroups

$ grep CGROUP /boot/config-$(uname -r)
CONFIG_CGROUPS=y
# CONFIG_CGROUP_DEBUG is not set
CONFIG_CGROUP_FREEZER=y
CONFIG_CGROUP_DEVICE=y
CONFIG_CGROUP_CPUACCT=y
CONFIG_CGROUP_HUGETLB=y
CONFIG_CGROUP_PERF=y
CONFIG_CGROUP_SCHED=y
CONFIG_BLK_CGROUP=y
# CONFIG_DEBUG_BLK_CGROUP is not set
CONFIG_NET_CLS_CGROUP=m
CONFIG_NETPRIO_CGROUP=m

注:私のホストはまだデフォルトでupstart

ベストアンサー1

驚くべきことに、これがUbuntuだけの特徴であることがわかりました。


理由

問題:カーネルがcgroups有効になって(を使用して確認grep CGROUP /boot/config-$(uname -r)cgmanager実行中ですが、私のユーザーには特定のcgroupがありません。以下で確認できます。

$猫/proc/self/cgroup
11: 巨大:/
10:パフォーマンスイベント:/
9:BLKIO://
8: フリーザー: /
7:装置:/
6: メモリ:/
5: CPUAcct://
4:CPU:/
3: 名前=システム:/
2:CPUグループ:/

関連するすべての行にUIDが指定されていても大丈夫ですが、cgroupが定義されていない場合は、各行の2番目のコロンの後にスラッシュが表示されます。

私の質問は、権限のないコンテナを起動することに関するものです。特権コンテナを起動できます。

私の問題は以下に関連していることがわかりました。lxc-usersメーリングリストのこのトピック

治療

これはUbuntu 14.04のupstartデフォルト値ではありませんsystemd。そのため、systemdUbuntuベースのディストリビューションにインストールされている一部のコンポーネントはデフォルトでインストールされません。

これに加えて、cgmanager私の質問に示されているエラーを解決するには、2つのパッケージをインストールする必要がありましたcgroup-binlibpam-systemd正直なところ、電子が必ず必要かどうか100%確信できないので、省略してここにコメントを残すこともできます。

パッケージをインストールして再起動すると、id -u出力にUID(、ここでは1000)が表示されます。

$猫/proc/self/cgroup
11:hugetlb:/user/1000.user/1.session
10:perf_event:/user/1000.user/1.session
9:blkio:/user/1000.user/1.session
8: フリーザー:/user/1000.user/1.session
7: デバイス:/user/1000.user/1.session
6: メモリ:/user/1000.user/1.session
5:cpuacct:/user/1000.user/1.session
4:cpu:/user/1000.user/1.session
3: 名前=systemd:/user/1000.user/1.session
2: CPU セット:/user/1000.user/1.session

その後、ゲストコンテナを起動しようとするとエラーが発生します(簡単にクリーンアップ)。

lxc-start 1420160065.383 情報 lxc_cgroup - test1 の cgroup ドライバ cgmanager 初期化中
lxc-start 1420160065.419エラーlxc_start - 設定されたネットワークを作成できません。
lxc-start 1420160065.446エラーlxc_start - 'test1'を生成できません。
lxc-start 1420160065.451 エラー lxc_start_ui - コンテナの起動に失敗しました。

まだ成功していませんが、成功に一歩近づきました。

上記リンクされたlxc-usersスレッドでは、および/etc/systemd/logind.conf3つのコントローラが言及されていないことを指摘します。私には最後の1つだけが落ちました。ただし、ログインセッションが作成されると変更が適用されるため、変更後に再度ログインする必要があります。net_clsnet_priodebug

LXCの作成者の1人によって作成されたこのブログ投稿は、次のステップを提供します。

ユーザーはuid 0で新しいユーザー名前空間を作成し、その名前空間にバインドされているリソースに対するいくつかのルート権限を持つことができますが、明らかにホストに対する追加権限は付与されません。

そのうちの1つは、新しいネットワークデバイスを作成するか、ホストのブリッジ構成を変更することです。この問題を解決するために、LXC 1.0の唯一のSETUIDバイナリ部分であり、簡単なタスクを実行するための「lxc-user-nic」というツールを作成しました。構成ファイルを解析し、その内容に基づいてユーザー用のネットワークデバイスを作成して接続します。悪用を防ぐために、ユーザーが要求できるデバイスの数とユーザーが追加できるブリッジを制限できます。

たとえば、私自身の/etc/lxc/lxc-usernetファイルがあります:

stgraber veth lxcbr0 10

これは、ユーザー「stgraber」が最大10個のveth型デバイスを作成し、それをlxcbr0というブリッジに追加できることを示します。

カーネルのユーザーネームスペースとsetuidツールによって提供される機能の間には、ほとんどのディストリビューションを無許可の方法で実行するために必要なものがすべてあります。

ユーザーにsudo権限があり、Bash を使用している場合は、次のコマンドを使用します。

echo "$(whoami) veth lxcbr0 10"|sudo tee -a /etc/lxc/lxc-usernet

そして、タイプ(veth)がコンテナ構成のタイプと一致していること、ブリッジ(lxcbr0)が構成および開始されていることを確認してください。

これで別のエラーセットが発生します。

lxc-start 1420192192.775 情報 lxc_start - 新しいユーザー名前空間の複製
lxc-start 1420192192.775 情報 lxc_cgroup - test1 の cgroup ドライバ cgmanager 初期化中
lxc-start 1420192192.923 注 lxc_start - 新しいユーザーの名前空間から gid/uid 0 に切り替えます。
lxc-start 1420192192.923エラーlxc_start - 許可が拒否されました - /home/userにアクセスできません。 「x」アクセス権を付与するか、コンテナルートにACLを追加してください。
lxc-start 1420192192.923エラーlxc_sync - 無効なシーケンス番号1。
lxc-start 1420192192.954エラーlxc_start - 'test1'を生成できません。
lxc-start 1420192192.959 エラー lxc_start_ui - コンテナの起動に失敗しました。

いいですね。この問題は解決できます。他のlxc-usersスレッド最初のスレッドと同じ主人公が道を磨きます。

現在、クイックテストがsudo chmod -R o+X $HOME必要ですが、ACLも実行可能なオプションです。 YMMV。

おすすめ記事