อุปกรณ์ลูปในคอนเทนเนอร์ Linux?


14

ฉันกำลังพยายามใช้อุปกรณ์วนรอบภายในคอนเทนเนอร์เพื่อเมานต์ไฟล์ภาพบางส่วน:

> sudo losetup /dev/loop0 test.img
losetup: /dev/loop0: failed to set up loop device: No such file or directory

/dev/loop0 ไม่มีอยู่จริงและ

> sudo mknod /dev/loop0 b 7 0
mknod: ‘/dev/loop0’: Operation not permitted

ฉันจะทำงานนี้ได้อย่างไร คอนเทนเนอร์ต้องการสิทธิ์ cgroup ที่อาจไม่มีหรือไม่

คำตอบ:


17

หากคุณใช้ systemd-nspawn ให้เริ่มคอนเทนเนอร์ของคุณด้วย--capability=CAP_MKNODสวิตช์บรรทัดคำสั่ง สิ่งนี้จะช่วยให้คุณสร้างโหนดอุปกรณ์ภายในคอนเทนเนอร์ของคุณ จากนั้นสร้างอุปกรณ์ลูปดังนี้:

# mknod /dev/loop0 b 7 0

จำไว้ว่าอุปกรณ์ลูปนี้ถูกแชร์กับโฮสต์และถูกเรียกที่/dev/loop0นั่นด้วย และในตอนนี้คุณสามารถเข้าถึงอุปกรณ์โฮสต์ได้ถ้าคุณรู้จำนวนหลักและรอง อาจมีผลอื่น ๆ ที่ฉันไม่ได้คิด ถูกเตือน


ใครสามารถยืนยันว่า--capability=CAP_MKNODยังใช้งานได้ สำหรับฉันดูเหมือนว่าจะไม่มีผลกระทบฉันได้รับOperation not permittedมันและทำเช่นนี้กับผู้ใช้รายนี้และผู้ใช้รายนี้
nh2

2
ฉันได้มันไปทำงานแล้ว แต่นอกเหนือจากการให้--capability=CAP_MKNODฉันต้องตั้งค่าDeviceAllow=block-loop rwmใน systemd-nspawn unit เพื่อให้มันทำงาน (ได้แนวคิดนั้นจากที่นี่ )
nh2

ฉันต้องเพิ่ม--device-cgroup-rule="b 7:* rmw"เพื่อdocker runให้สามารถเข้าถึงอุปกรณ์ลูปแบ็คได้อย่างเต็มที่ (แต่ไม่มีคนอื่นเนื่องจากไม่มี--privilege) พบได้ที่docs.docker.com/edge/engine/reference/commandline/create/…และทดสอบกับนักเทียบท่า 18.06.1-ce (เอกสารอ้างว่าใช้กับ Docker Edge เท่านั้น)
RobM

9

อุปกรณ์ลูปจัดทำโดยโมดูลเคอร์เนล ดังนั้นคุณต้องมีสิทธิ์พิเศษในการเข้าถึง นอกจากนี้คุณยังต้องให้พวกเขาสัมผัสกับภาชนะของคุณหรือคุณต้องสร้างไฟล์อุปกรณ์ด้วยตนเอง

คำตอบด่วน

docker run --privileged=true ...

ทางเลือกอื่น

sudo losetup /dev/loop0 test.img
mount /dev/loop0 /mnt
docker run -v /mnt:/mnt ...

เกือบจะใช้งานได้แล้ว

docker run --device=/dev/loop-control:/dev/loop-control --device=/dev/loop0:/dev/loop0 --cap-add SYS_ADMIN ...

อย่างไรก็ตามฉันได้รับข้อผิดพลาดนี้:

root@5c033d5f8625:/# sudo mount /dev/loop0 /mnt
mount: block device /dev/loop0 is write-protected, mounting read-only
mount: cannot mount block device /dev/loop0 read-only

ดูที่ลิงค์นี้เพิ่มเติมข้อมูล


หมายเหตุในหน้าคน systemd-nspawn:

systemd-nspawn จำกัด การเข้าถึงเคอร์เนลอินเตอร์เฟสต่าง ๆ ในคอนเทนเนอร์เพื่ออ่านอย่างเดียวเช่น / sys, / proc / sys หรือ / sys / fs / selinux อินเทอร์เฟซเครือข่ายและนาฬิการะบบอาจไม่สามารถเปลี่ยนจากภายในคอนเทนเนอร์ ไม่สามารถสร้างโหนดอุปกรณ์ได้ ไม่สามารถรีบูตระบบโฮสต์และโมดูลเคอร์เนลอาจไม่สามารถโหลดจากภายในคอนเทนเนอร์

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