एक लिनक्स कंटेनर में लूप डिवाइस?


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इसे काम करने के लिए सिस्टमड-एनएसपीएन यूनिट में सेट करने के लिए देने के अलावा ( यहां से यह विचार मिला )।
nh2

मैं जोड़ने के लिए किया था --device-cgroup-rule="b 7:* rmw"के लिए docker run(, लेकिन कोई अन्य नहीं है क्योंकि कोई लूपबैक उपकरणों के लिए पूरा उपयोग की अनुमति के लिए --privilege)। Docs.docker.com/edge/engine/reference/commandline/create/… के माध्यम से मिला और docker 18.06.1-Ce पर परीक्षण किया गया (दस्तावेज़ केवल डॉकर एज पर लागू होने का दावा करता है)
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। कंटेनर के भीतर से नेटवर्क इंटरफेस और सिस्टम क्लॉक को नहीं बदला जा सकता है। डिवाइस नोड नहीं बनाए जा सकते हैं। होस्ट सिस्टम को रिबूट नहीं किया जा सकता है और कर्नेल मॉड्यूल कंटेनर के भीतर से लोड नहीं किया जा सकता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.