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-autostart
như 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.service
trong 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 ý, --user
tù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,
$user
tê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 $user
khi 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_DIR
biế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, $name
tê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ó --wait
systemd-run sẽ không chặn cho đến khi container bị dừng.)