ฉันคิดว่าฉันได้พบวิธีแก้ปัญหาที่ดีกว่าที่เสนอในปัจจุบัน ในส่วนหนึ่งเพราะเท่าที่ฉันสามารถบอกได้ว่า cgmanager นั้นตายไปแล้วส่วนหนึ่งเป็นเพราะวิธีแก้ปัญหาของฉันไม่รู้สึกเหมือนวิธีแก้ปัญหาที่แฮ็ก แต่ส่วนใหญ่เป็นเพราะการสนทนานี้ยังปรากฏขึ้นเมื่อค้นหาวิธีการแก้ไขปัญหา มันสวยเรียบง่ายจริง: ใช้โหมดผู้ใช้ systemd
ได้รับถ้าคุณไม่ได้ใช้ systemd วิธีนี้จะไม่ช่วย ในกรณีนี้ฉันแนะนำให้คุณทราบว่าระบบเริ่มต้นของคุณมีวิธีการอนุญาตให้ผู้ใช้ที่ไม่ได้รับสิทธิพิเศษสามารถใช้บริการตอนบู๊ตและใช้เป็นจุดเริ่มต้นได้หรือไม่
การใช้โหมดผู้ใช้ systemd เพื่อเริ่มต้นคอนเทนเนอร์ lxc ที่ไม่มีสิทธิพิเศษโดยอัตโนมัติ
ฉันสมมติว่าคุณมีคอนเทนเนอร์ lxc ที่ไม่มีสิทธิพิเศษทำงานอย่างถูกต้องและทำงานlxc-autostart
ในฐานะผู้ใช้ของคอนเทนเนอร์ ถ้าเป็นเช่นนั้นทำต่อไปนี้:
- สร้างไฟล์
~/.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
- จากนั้นเป็นผู้ใช้ที่ทำงาน:
systemctl --user enable lxc-autostart
(หมายเหตุ--user
ตัวเลือกบอก systemctl ที่คุณใช้ในโหมดผู้ใช้ทุกสิ่งที่ฉันทำกับ systemctl, start, stop, statuc, enable, etc ทำงานกับ --user)
- จากนั้นรันต่อไปนี้โดยที่
$user
ชื่อของผู้ใช้ที่มีคอนเทนเนอร์ lxc อยู่:
sudo loginctl enable-linger $user
นี่เป็นสิ่งจำเป็นสำหรับ systemd เพื่อเริ่มต้นอินสแตนซ์ผู้ใช้ systemd สำหรับ$user
ตอนบูต มิฉะนั้นจะเริ่มต้นเพียงครั้งเดียวในขณะที่$user
เข้าสู่ระบบ
สำหรับข้อมูลเพิ่มเติมฉันขอแนะนำให้วิกิพีเดีย ArchLinux systemd / จับเวลาหน้าและหน้าคน systemd
การเข้าถึงอินสแตนซ์ systemd ของผู้ใช้ในฐานะรูท
คุณสามารถเริ่ม / หยุด / บริการใด ๆ ของ 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
(โปรดทราบว่าหากไม่มี--wait
systemd-run จะไม่บล็อกจนกว่าคอนเทนเนอร์จะหยุดทำงาน)