usernsコンテナが起動に失敗しました。理由を追跡する方法は?


8

次のコマンドラインを使用してUbuntu 14.04でuserns(非特権)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です。

回答:


7

驚いたことに、これはUbuntu固有のものです。


原因

問題:カーネルがcgroups有効になっていて(で確認grep CGROUP /boot/config-$(uname -r))、cgmanager実行されていますが、ユーザー固有のcgroupがありません。あなたはそれをチェックすることができます:

$ cat / proc / self / cgroup
11:hugetlb:/
10:perf_event:/
9:blkio:/
8:冷凍庫:/
7:デバイス:/
6:メモリ:/
5:cpuacct:/
4:cpu:/
3:name = systemd:/
2:cpuset:/

該当する各行でUIDが指定されている場合は問題ありませんが、cgroupが定義されていない場合は、各行の2番目のコロンの後にスラッシュしかありません。

私の問題は、特権のないコンテナを起動することに固有でした。私は特権付きコンテナをうまく起動できました。

私の問題はメーリングリストのこのスレッドにlxc-users密接に関連していることがわかりました

療法

Ubuntu 14.04 upstartでは、デフォルトではありませんsystemd。したがって、systemdベースのディストリビューションにインストールされる特定のコンポーネントは、デフォルトではインストールされません。

そこに加えて、二つのパッケージだったcgmanager私は私の質問に示す誤差を超えて取得するためにインストールする必要がありましたこれは:cgroup-binlibpam-systemd。率直に言って、前者が厳密に必要であると私は100%確信していません。

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

$ cat / 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:デバイス:/ユーザー/ 1000。ユーザー/ 1。セッション
6:memory:/user/1000.user/1.session
5:cpuacct:/user/1000.user/1.session
4:cpu:/user/1000.user/1.session
3:name = systemd:/user/1000.user/1.session
2:cpuset:/user/1000.user/1.session

その後、ゲストコンテナーを起動しようとしたときのエラーは(簡潔にするためにトリミングされています):

lxc-start 1420160065.383 INFO 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つのコントローラに言及していない:net_clsnet_priodebug。私にとっては最後のものだけが欠けていました。ただし、変更後は、ログインセッションの作成時に変更が有効になるため、再ログインする必要があります。

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

ユーザーは、それがuid 0であり、その名前空間に関連付けられているリソースに対するrootの特権の一部を持つ新しいユーザー名前空間を作成できますが、ホストに対する追加の特権は明らかに付与されません。

そのようなことの1つは、ホスト上に新しいネットワークデバイスを作成するか、ブリッジ構成を変更することです。これを回避するために、LXC 1.0の唯一のSETUIDバイナリ部分であり、1つの簡単なタスクを実行する「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 INFO lxc_start-新しいユーザー名前空間の複製
lxc-start 1420192192.775 INFO 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 ERROR lxc_sync-無効なシーケンス番号1。2が必要です。
lxc-start 1420192192.954エラーlxc_start-'test1'の生成に失敗しました
lxc-start 1420192192.959 ERROR lxc_start_ui-コンテナの起動に失敗しました。

すばらしい、それは修正できます。最初のスレッドと同じ主人公による別のlxc-usersスレッドが道を開きます。

今のところ簡単なテストsudo chmod -R o+X $HOMEが必要ですが、ここでもACLは実行可能なオプションです。YMMV。


それでも、userns LXCコンテナを別のユーザーとして実行したい場合、失敗するという事実に行き詰まっています。作成は機能します(1つの警告:)WARN: could not reopen tty: Permission denied。しかしsudo -H -i -u database lxc-start -n mysql -d、あなたの質問のように開始は失敗します。同じエラー。ただし、修正はで機能しませんsudo。私がしなければsudo -H -i -u database cat /proc/self/cgroup私は私を呼び出すユーザーとして、それを実行した場合とまったく同じ出力を得ます。ですから、sudoを使用してコンテナーを起動しようとすると、他のユーザーがcgroupに書き込みを試みて失敗します... :-(洞察は何か?
Huygens
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.