Debian

無法在 Debian 11 Bullseye 上自動啟動非特權 LXC 容器

  • March 18, 2022

lxc-autostart不會在 Debian 11 Bullseye 中啟動非特權容器。

Debian 11 Bullseye 中非特權容器的啟動 通過使用代替解決了這個答案,但我在使用.lxc-unpriv-start``lxc-start``lxc-autostart

基本解決方案

好的,經過幾個不眠之夜,我最終為每個容器創建了一個簡單的 systemd 單元文件。一個範例可能如下所示:

[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 模板

感謝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

由於我命名了文件lxc@.service並將其放置到/etc/systemd/system/我可以使用控制我的所有容器systemctl COMMAND lxc@my-container-name.service

(請注意,lxc.service是原創者,負責lxc-autostart

歡迎對單元文件等進行任何改進!- 因為我不是專家,我基本上使用了官方文件這個很好的答案

調整 - Systemd 使用者服務

向前邁出的另一步是使用 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改為使用。

這次必須啟用使用者延遲,以便服務在啟動時而不是在使用者登錄時啟動。可以使用以下命令從 root 帳戶啟用延遲:loginctl enable-linger <my-lxc-user>

我將服務文件保存到.config/systemd/user/lxc@.service並使用systemctl --user enable lxc@my-container-name.service

引用自:https://unix.stackexchange.com/questions/684209