ฉันจะติดตั้งเคอร์เนลโมดูลในเครื่องเกสต์ของ LXC ได้อย่างไร?


13

ฉันพยายามติดตั้ง OpenStack DevStack บนเครื่องแขก LXC หนึ่งในแพ็คเกจของ DevStack ต้องการโมดูลเคอร์เนลใหม่ แต่เมื่อฉันพยายามรัน modprobe กับแขก LXC ฉันได้รับข้อผิดพลาด:

ubuntu@lxc$ sudo modprobe scsi_transport_iscsi
FATAL: Could not load /lib/modules/3.2.0-48-generic/modules.dep: No such file or directory

ฉันจะติดตั้งโมดูลนี้สำหรับเครื่อง LXC ของฉันได้อย่างไร

คำตอบ:


13

คำตอบสั้น ๆ คือคุณทำไม่ได้ คอนเทนเนอร์ LXC แบ่งปันเคอร์เนลของพวกเขากับโฮสต์และโดยค่าเริ่มต้นไม่ได้รับอนุญาตให้โหลดโมดูล (เช่นนี้จะค่อนข้างอันตราย)

คำแนะนำมาตรฐานคือให้โหลดโมดูลใด ๆ บนโฮสต์ก่อนเริ่มคอนเทนเนอร์ คุณสามารถทำได้ด้วยสคริปต์เริ่มต้นที่ดีหรือใช้ lxc hook (ดูโพสต์ล่าสุดของฉันที่นี่เพื่อดูรายละเอียด: https://www.stgraber.org/2013/12/23/lxc-1-0-some- เพิ่มเติมขั้นสูงคอนเทนเนอร์การใช้งาน / )


1

สำหรับจุดประสงค์ของคำตอบนี้สมมติว่าคอนเทนเนอร์ของคุณชื่อ "foo"

ส่วนที่

  1. จากโฮสต์ให้บันทึกสำเนา/var/lib/lxc/foo/configไว้ในกรณีที่คำแนะนำของฉันผิดพลาด

  2. คุณจะต้องกำหนดค่าคอนเทนเนอร์ของคุณเพื่อรักษาSYS_MODULE ความสามารถ

    โปรดทราบว่าเช่นการกำหนดค่าให้ภาชนะที่ความสามารถในการใช้เวลามากกว่าเคอร์เนลและจึงโฮสต์

    ในการทำเช่นนี้คุณจะต้องเปลี่ยน"lxc.cap.drop"หรือ"lxc.cap.keep"กำหนดค่าสาย

    หากคุณใช้งานแขก Ubuntu 19.04 ที่สร้างขึ้นด้วย"lxc-create --name foo --template download -- ...":

    • /var/lib/lxc/foo/config จะมีบรรทัด

      lxc.include = /usr/share/lxc/ubuntu.common.conf
      
    • /usr/share/lxc/ubuntu.common.conf จะมีบรรทัด

      lxc.include = /usr/share/lxc/config/common.conf
      
    • /usr/share/lxc/config/common.conf จะมีบรรทัดเช่นนี้

      lxc.cap.drop = mac_admin mac_override sys_time sys_module sys_rawio
      

คุณควรคัดลอกบรรทัดสุดท้ายนั้นไปยังจุดสิ้นสุดของ/var/lib/lxc/foo/config(หรือสถานที่ใด ๆ หลังจากนั้น"include /usr/share/lxc/ubuntu.common.conf") แล้วลบออก"sys_module"จากรายการ

ส่วน B

คุณต้องคัดลอกโมดูลเคอร์เนลของคุณในภาชนะ

หากโฮสต์ของคุณกำลังใช้งานเคอร์เนล Ubuntu คุณอาจทำสิ่งที่ต้องการได้"sudo apt install kernel-image-$(uname -r)"จากแขก

มิฉะนั้นจากโฮสต์คุณอาจต้องทำสิ่งนี้ (สมมติว่าคอนเทนเนอร์ของคุณชื่อ "foo"):

mkdir -p /var/lib/lxc/foo/rootfs/lib/modules
cp -apr /lib/modules/$(uname -r) /var/lib/lxc/foo/rootfs/lib/modules/

หลังจากที่ปิดตัวลง foo "lxc-start --name foo"แขกถ้าคุณกำลังทำงานแล้วเริ่มต้นใหม่กับสิ่งที่ต้องการ

คอนเทนเนอร์ LXC ควรสามารถโหลดและยกเลิกการโหลดโมดูลเคอร์เนลได้ในขณะนี้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.