Lxc

如何自動啟動非特權 lxc 容器?

  • February 8, 2021

在 Ubuntu 14.04 上,我創建了一個可以手動啟動和停止的非特權容器。

但我希望它與系統一起啟動和停止。

我已將以下內容添加到容器的配置中: lxc.start.auto = 1 lxc.start.delay = 5

但是,系統腳本似乎沒有選擇非特權容器。

linuxcontainers.org 上有一個與此相關的執行緒,但該解決方案似乎僅限於root使用者。

對於非 root 使用者(在 root 使用者同意的情況下),是否有一種干淨的方法可以做到這一點?

我想我找到了比目前這裡介紹的解決方案更好的解決方案。部分原因是據我所知 cgmanager 已經死了,部分原因是我的解決方案感覺不像是一個 hacky 解決方法,但主要是因為在尋找問題的解決方案時仍然會出現這種討論。其實很簡單:使用 systemd 使用者模式

當然,如果您不使用 systemd,此解決方案將無濟於事。在這種情況下,我建議您弄清楚您的 init 系統是否有某種方式允許無特權的使用者在啟動時執行服務並將其用作起點。

使用 systemd 使用者模式自動啟動非特權 lxc 容器

我假設您有無特權的 lxc 容器正常工作,並且lxc-autostart以容器使用者的身份執行。如果是這樣,請執行以下操作:

  1. ~/.config/systemd/user/lxc-autostart.service在擁有 lxc 容器的任何使用者的家中創建文件:
[Unit]
Description="Lxc-autostart for lxc user"

[Service]
Type=oneshot
ExecStart=/usr/bin/lxc-autostart
ExecStop=/usr/bin/lxc-autostart -s
RemainAfterExit=1

[Install]
WantedBy=default.target
  1. 然後當該使用者執行時:
systemctl --user enable lxc-autostart

(注意,該--user選項告訴 systemctl 您在使用者模式下使用它。我通常使用 systemctl 執行的所有操作,啟動、停止、statuc、啟用等,都與 –user 一起使用。)

  1. 然後執行以下命令,$user擁有 lxc 容器的使用者的名稱在哪裡:
sudo loginctl enable-linger $user

這是 systemd 在啟動時啟動 systemd 使用者實例所必需的$user。否則它只會在$user登錄時啟動一個。

有關更多資訊,我推薦 archlinux wiki systemd/timer page 和systemd man pages

以 root 身份訪問使用者的 systemd 實例

您實際上可以以 root 身份啟動/停止/任何使用者的 systemd 服務,但這需要您設置XDG_RUNTIME_DIR環境變數。假設$user 是您要訪問其實例的使用者並且$uid它是 uid,那麼這就是您啟動上面定義的 lxc-autostart.service 的方式:

sudo -u $user XDG_RUNTIME_DIR=/run/user/$uid systemctl --user start lxc-autostart

您甚至可以使用systemd-run該使用者以不破壞 lxc 的方式執行任意命令。我正在使用以下命令在備份之前/之後停止/啟動我$name的容器,正在備份的 lxc 容器的名稱在哪裡:

sudo -u $user XDG_RUNTIME_DIR=/run/user/$uid systemd-run --user --wait lxc-stop -n $name
sudo -u $user XDG_RUNTIME_DIR=/run/user/$uid systemd-run --user --scope lxc-start -n $name

(請注意,沒有--waitsystemd-run 在容器停止之前不會阻塞。)

引用自:https://serverfault.com/questions/620709