Debian 11 Bullseyeで権限のないLXCコンテナを自動起動できない

Debian 11 Bullseyeで権限のないLXCコンテナを自動起動できない

lxc-autostartDebian 11 Bullseye では、権限のないコンテナは起動しません。

Debian 11 Bullseye で無許可コンテナのリリースが修正されました。 回答lxc-unpriv-start代わりに使用しますが、lxc-start使用する場合はこの方法を利用できませんlxc-autostart

答え1

基本ソリューション

さて、数日の夜を明かりの終わりに各コンテナのための単純なシステム単位ファイルを作成しました。例は次のとおりです。

[Unit]
Description=Linux container my-container-name
After=network.target

[Service]
Type=forking
ExecStart=/usr/bin/lxc-start -n my-container-name
ExecStop=/usr/bin/lxc-stop -n my-container-name
StandardOutput=journal
User=my-lxc-user
Group=my-lxc-user
Delegate=yes

[Install]
WantedBy=multi-user.target

これはDelegate=yes、公開されたアドバイスの簡単なフォローアップです。ここそしてまた回答上にリンクしておきました。

ユーザーがさまよういいえ必須(言及)ここ)。

この解決策の良い副作用は、(無許可の)コンテナをシャットダウンしてもホストシャットダウンが遅れないことです。ここ)信号を送信する代わりに使用法/usr/bin/lxc-stop -n my-container-nameで定義されているからです。ExecStop

チューニング - システムテンプレート

ありがとうsystemd テンプレート単位ファイルすべてのコンテナに単一の unif ファイルを使用できます。私の最終テンプレート単位ファイルは次のとおりです。

[Unit]
Description=Linux container %I
After=network.target

[Service]
Type=forking
ExecStart=/usr/bin/lxc-start -n %i
ExecStop=/usr/bin/lxc-stop -n %i
StandardOutput=journal
User=lxc
Group=lxc
Delegate=yes

[Install]
WantedBy=multi-user.target

ファイル名を指定し[email protected]て配置したので、以下を/etc/systemd/system/使用してすべてのコンテナを制御できます。systemctl COMMAND [email protected]

lxc.service(この内容はオリジナルであり、責任があることをお知らせします。lxc-autostart

ユニットファイルなどの改良を歓迎します! - 専門家ではないので基本的に公式文書そしてこれは素晴らしい答えです

チューニングシステムユーザーサービス

もう1つの進歩は、Systemdユーザーサービスを使用して新しいコンテナを展開するときにrootとして実行する必要がないことです。

単位ファイルは少し異なります。

[Unit]
Description=LXC container %I
After=network.target

[Service]
Type=forking
ExecStart=/usr/bin/lxc-start -n %i
ExecStop=/usr/bin/lxc-stop -n %i
StandardOutput=journal
Delegate=yes

[Install]
WantedBy=default.target

multi-user.targetだからこそ使用不可ユーザーサービスにはこれを使用する必要がありますdefault.target

今回は、ユーザーがログインするのではなく、起動時にサービスが開始されるようにユーザー遅延を有効にする必要があります。次のコマンドを使用して、ルートアカウントで遅延を有効にできます。loginctl enable-linger <my-lxc-user>

サービスファイルを保存し、以下を使用して有効にしました。.config/systemd/user/[email protected]systemctl --user enable [email protected]

答え2

lxcテストパッケージと共にDebian 11.2(バージョン4.0.11-1)を実行しています。使用するときmprudekのシステムユニット()、遅延セッションが有効かどうかにかかわらず、常に次のエラーが発生します。nano /etc/systemd/system/[email protected]

$ journalctl -f -u lxc@container1
Mär 10 20:32:42 vm-debian systemd[1]: [email protected]: Control process exited, code=exited, status=1/FAILURE
Mär 10 20:32:42 vm-debian lxc-unpriv-start[485]: Can't start an unprivileged container on a pure CGroups v2 host without a systemd user session running.
Mär 10 20:32:42 vm-debian lxc-unpriv-start[485]: If you are trying to get a non-interactive user to have unprivileged containers running, you need to
Mär 10 20:32:42 vm-debian lxc-unpriv-start[485]: enable lingering sessions for that user, via loginctl enable-linger lxcuser as root.
Mär 10 20:32:42 vm-debian systemd[1]: [email protected]: Failed with result 'exit-code'.
Mär 10 20:32:42 vm-debian systemd[1]: Failed to start LXC container container1.

以下のようにsystemdユニットを更新しましたが、魅力的に動作します。権限のないLXCコンテナがlxcuserこのアカウントで実行されます。

[Unit]
Description=LXC container %I
Requires=systemd-user-sessions.service
After=systemd-user-sessions.service
Wants=systemd-user-sessions.service

[Service]
Type=forking
ExecStart=/usr/bin/lxc-unpriv-start -n %i
ExecStop=/usr/bin/lxc-stop -n %i
StandardOutput=journal
User=lxcuser
Group=lxcuser
Delegate=yes
RemainAfterExit=1
Restart=on-failure
RestartSec=5
SuccessExitStatus=0
RestartForceExitStatus=1

[Install]
WantedBy=multi-user.target
$ loginctl enable-linger lxcuser
$ systemctl disable lxc@container1
$ systemctl stop lxc@container1
$ systemctl daemon-reload
$ systemctl enable lxc@container1
$ systemctl start lxc@container1

関連情報