Tôi nghĩ rằng tôi đã tìm thấy một giải pháp tốt hơn so với những giải pháp hiện đang trình bày ở đây. Một phần vì theo như tôi có thể nói với cgmanager đã chết, một phần vì giải pháp của tôi không cảm thấy như một cách giải quyết khó khăn, nhưng chủ yếu là vì cuộc thảo luận này vẫn xuất hiện khi tìm kiếm giải pháp cho vấn đề. Thực ra nó khá đơn giản: sử dụng chế độ người dùng systemd .
Cấp nếu bạn không sử dụng systemd giải pháp này sẽ không giúp đỡ. Trong trường hợp đó, tôi khuyên bạn nên tìm hiểu xem hệ thống init của bạn có cách nào đó cho phép người dùng không có khả năng chạy các dịch vụ khi khởi động và sử dụng đó làm điểm khởi đầu.
Sử dụng chế độ người dùng systemd để tự động khởi động các thùng chứa lxc không có đặc quyền
Tôi giả sử rằng bạn có các thùng chứa lxc không có đặc quyền hoạt động đúng và hoạt động lxc-autostartnhư người dùng của bộ chứa hoạt động. Nếu vậy, hãy làm như sau:
- Tạo tệp
~/.config/systemd/user/lxc-autostart.servicetrong nhà của bất kỳ người dùng nào có các thùng chứa 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
- Sau đó, khi người dùng đó chạy:
systemctl --user enable lxc-autostart
(Lưu ý, --usertùy chọn cho biết systemctl bạn đang sử dụng nó trong chế độ người dùng. Tất cả những điều tôi thường làm với systemctl, start, stop, statuc, enable, v.v., làm việc với --user.)
- Sau đó chạy như sau,
$usertên của người dùng có các thùng chứa lxc:
sudo loginctl enable-linger $user
Điều này là cần thiết cho systemd để bắt đầu một cá thể người dùng systemd $userkhi khởi động. Nếu không, nó sẽ chỉ bắt đầu một tại thời điểm $userđăng nhập.
Để biết thêm thông tin, tôi muốn giới thiệu trang hệ thống / bộ đếm thời gian wiki archlinux và các trang man systemd .
Truy cập một cá thể systemd của người dùng như root
Bạn thực sự có thể bắt đầu / dừng / bất cứ dịch vụ systemd nào của người dùng làm root, tuy nhiên điều này đòi hỏi bạn phải đặt XDG_RUNTIME_DIRbiến môi trường. Giả sử $user là người dùng có phiên bản bạn muốn truy cập và $uidđó là uid, thì đây là cách bạn bắt đầu lxc-autostart.service được xác định ở trên:
sudo -u $user XDG_RUNTIME_DIR=/run/user/$uid systemctl --user start lxc-autostart
Bạn thậm chí có thể sử dụng systemd-runđể chạy các lệnh tùy ý như người dùng đó theo cách không phá vỡ lxc. Tôi đang sử dụng các lệnh sau để dừng / khởi động các container của mình trước / sau khi sao lưu, $nametên của container lxc đang được sao lưu:
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
(Lưu ý rằng không có --waitsystemd-run sẽ không chặn cho đến khi container bị dừng.)