無法在 Debian 11 Bullseye 上自動啟動非特權 LXC 容器
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