पिछली बार जब मैंने जाँच की थी, डॉकटर के पास होस्ट सीरियल या यूएसबी पोर्ट के लिए कंटेनर एक्सेस देने का कोई साधन नहीं था । वहाँ एक चाल है जो ऐसा करने की अनुमति देता है?
पिछली बार जब मैंने जाँच की थी, डॉकटर के पास होस्ट सीरियल या यूएसबी पोर्ट के लिए कंटेनर एक्सेस देने का कोई साधन नहीं था । वहाँ एक चाल है जो ऐसा करने की अनुमति देता है?
जवाबों:
विकल्प के एक जोड़े हैं। आप उस --deviceध्वज का उपयोग कर सकते हैं जिसका उपयोग बिना किसी --privilegedमोड के यूएसबी उपकरणों का उपयोग करने के लिए कर सकते हैं :
docker run -t -i --device=/dev/ttyUSB0 ubuntu bash
वैकल्पिक रूप से, यह मानकर कि आपका USB डिवाइस होस्ट में काम कर रहे ड्राइवरों आदि के साथ उपलब्ध है /dev/bus/usb, आप इसे विशेषाधिकार मोड और वॉल्यूम विकल्प का उपयोग करके कंटेनर में माउंट कर सकते हैं । उदाहरण के लिए:
docker run -t -i --privileged -v /dev/bus/usb:/dev/bus/usb ubuntu bash
ध्यान दें कि के रूप में नाम का तात्पर्य, --privilegedहै असुरक्षित और देखभाल के साथ संभाला जाना चाहिए।
डॉकर के वर्तमान संस्करणों के साथ, आप --deviceसभी USB डिवाइसों को एक्सेस देने की आवश्यकता के बिना झंडे का उपयोग कर सकते हैं ।
उदाहरण के लिए, यदि आप /dev/ttyUSB0अपने डॉकटर कंटेनर में केवल सुलभ बनाना चाहते हैं, तो आप कुछ ऐसा कर सकते हैं:
docker run -t -i --device=/dev/ttyUSB0 ubuntu bash
--deviceध्वज का उपयोग करते हुए , मैं यह कैसे निर्धारित करूं /dev/<device>कि मेजबान मशीन पर कौन सा संबद्ध एंड्रॉइड डिवाइस है, खासकर विंडोज या मैक के लिए डॉकर क्विकार्ट टर्मिनल (वर्चुअलबॉक्स होस्ट) का उपयोग करते समय?
--deviceतब तक काम करता है जब तक आपका USB डिवाइस अनप्लग / रिप्लेस नहीं हो जाता है और तब यह काम करना बंद कर देता है। आपको cgroup devices.allow का इस् तेमाल करना है।
आप बस का उपयोग कर सकते हैं -v /dev:/devलेकिन यह असुरक्षित है क्योंकि यह आपके होस्ट से सभी डिवाइसों को मैप करता है, जिसमें कच्चे डिस्क डिवाइस और इसके आगे भी शामिल हैं। मूल रूप से यह कंटेनर को मेजबान पर जड़ हासिल करने की अनुमति देता है, जो आमतौर पर वह नहीं है जो आप चाहते हैं।
Cgroups दृष्टिकोण का उपयोग करना उस संबंध में बेहतर है और उन उपकरणों पर काम करता है जो कंटेनर के शुरू होने के बाद जुड़ जाते हैं।
यहां देखें विवरण: - बिना स्वीकृत का उपयोग किए डॉकटर में यूएसबी डिवाइस तक पहुंच
इसे चिपकाना थोड़ा कठिन है, लेकिन संक्षेप में, आपको अपने चरित्र उपकरण के लिए प्रमुख संख्या प्राप्त करने की आवश्यकता है और इसे cgp पर भेजें।
189 / देव / ttyUSB * की प्रमुख संख्या है, जिसे आप 'ls -l' के साथ प्राप्त कर सकते हैं। यह आपके सिस्टम पर खान से अलग हो सकता है:
root@server:~# echo 'c 189:* rwm' > /sys/fs/cgroup/devices/docker/$A*/devices.allow
(A contains the docker containerID)
फिर अपना कंटेनर इस तरह शुरू करें:
docker run -v /dev/bus:/dev/bus:ro -v /dev/serial:/dev/serial:ro -i -t --entrypoint /bin/bash debian:amd64
ऐसा किए बिना, कंटेनर चालू होने के बाद कोई भी नया प्लग या रिबूट करने वाला उपकरण, एक नई बस आईडी प्राप्त करेगा और कंटेनर में प्रवेश की अनुमति नहीं दी जाएगी।
189कैसे बदला जाना चाहिए, यह दिखा कर उत्तर को बेहतर बनाया जा सकता है । यहाँ क्या भेजा devices.allowजा सकता है , इसका एक विवरण : kernel.org/doc/Documentation/cgroup-v1/devices.txt
मैं पहले से दिए गए जवाबों को गतिशील रूप से जुड़े उपकरणों के लिए समर्थन शामिल करना चाहता था, जिनके साथ कब्जा नहीं किया गया है /dev/bus/usbऔर बूट 2docker VM के साथ विंडोज होस्ट का उपयोग करते समय यह कैसे काम कर सकता है।
यदि आप विंडोज के साथ काम कर रहे हैं, तो आपको उन डिवाइसों के लिए कोई USB नियम जोड़ने की आवश्यकता होगी, जो आप चाहते हैं कि Docker वर्चुअलबॉक्स प्रबंधक के भीतर पहुंच सके। ऐसा करने के लिए आप VM को चलाकर रोक सकते हैं:
host:~$ docker-machine stop default
वर्चुअलबॉक्स प्रबंधक खोलें और आवश्यकतानुसार फ़िल्टर के साथ USB समर्थन जोड़ें।
Boot2docker VM शुरू करें:
host:~$ docker-machine start default
चूंकि USB उपकरण boot2docker VM से जुड़े हैं, इसलिए कमांड को उस मशीन से चलाने की जरूरत है। VM के साथ एक टर्मिनल खोलें और docker रन कमांड चलाएँ:
host:~$ docker-machine ssh
docker@default:~$ docker run -it --privileged ubuntu bash
ध्यान दें, जब कमांड इस तरह से चलाया जाता है, तो केवल पहले से जुड़े यूएसबी डिवाइस कैप्चर होंगे। यदि आप कंटेनर चालू करने के बाद कनेक्ट किए गए उपकरणों के साथ काम करना चाहते हैं तो वॉल्यूम ध्वज की आवश्यकता है। उस स्थिति में, आप उपयोग कर सकते हैं:
docker@default:~$ docker run -it --privileged -v /dev:/dev ubuntu bash
ध्यान दें, मुझे कुछ मामलों के /devबजाय /dev/bus/usbएक डिवाइस को पकड़ने के लिए उपयोग करना था /dev/sg2। मैं केवल यह मान सकता हूं कि डिवाइस जैसे /dev/ttyACM0या के लिए सच होगा /dev/ttyUSB0।
Docker run कमांड लिनक्स होस्ट के साथ ही काम करेगा।
एक अन्य विकल्प udev को समायोजित करना है, जो नियंत्रित करता है कि डिवाइस कैसे माउंट किए जाते हैं और किस विशेषाधिकार के साथ हैं। धारावाहिक उपकरणों तक गैर-रूट पहुंच की अनुमति देने के लिए उपयोगी। यदि आपके पास स्थायी रूप से संलग्न उपकरण हैं, तो --deviceविकल्प जाने का सबसे अच्छा तरीका है। यदि आपके पास अल्पकालिक उपकरण हैं, तो यहां मैं उपयोग कर रहा हूं:
डिफ़ॉल्ट रूप से, सीरियल डिवाइस माउंट किए जाते हैं ताकि केवल रूट उपयोगकर्ता डिवाइस तक पहुंच सकें। हमें गैर-रूट उपयोगकर्ताओं द्वारा पठनीय बनाने के लिए एक udv नियम जोड़ने की आवश्यकता है।
/Etc/udev/rules.d/99-serial.rules नामक फ़ाइल बनाएँ। उस फ़ाइल में निम्न पंक्ति जोड़ें:
KERNEL=="ttyUSB[0-9]*",MODE="0666"
MODE = "0666" सभी उपयोगकर्ताओं को आपके ttyUSB उपकरणों को पढ़ने / लिखने (लेकिन निष्पादित नहीं करने) की अनुमति देगा। यह सबसे अधिक अनुमति वाला विकल्प है, और आप इसे अपनी सुरक्षा आवश्यकताओं के आधार पर आगे प्रतिबंधित करना चाह सकते हैं। लिनक्स डिवाइस में प्लग इन होने पर क्या होता है, इसे नियंत्रित करने के बारे में अधिक जानने के लिए आप udev पर पढ़ सकते हैं।
सीरियल डिवाइस अक्सर अल्पकालिक होते हैं (किसी भी समय प्लग और अनप्लग किए जा सकते हैं)। इस वजह से, हम प्रत्यक्ष डिवाइस या यहां तक कि / dev / सीरियल फ़ोल्डर में माउंट नहीं कर सकते, क्योंकि जब चीजें अनप्लग होती हैं, तो वे गायब हो सकते हैं। यहां तक कि अगर आप उन्हें वापस प्लग इन करते हैं और डिवाइस फिर से दिखाता है, तो यह तकनीकी रूप से एक अलग फ़ाइल है जो इसमें मुहिम शुरू की गई थी, इसलिए डॉकर इसे नहीं करेंगे। इस कारण से, हम होस्ट से कंटेनर तक पूरे / देव फ़ोल्डर को माउंट करते हैं। आप अपने Docker रन कमांड में निम्न वॉल्यूम कमांड जोड़कर ऐसा कर सकते हैं:
-v /dev:/dev
यदि आपका डिवाइस स्थायी रूप से जुड़ा हुआ है, तो - andice विकल्प या अधिक विशिष्ट वॉल्यूम माउंट का उपयोग करना सुरक्षा दृष्टिकोण से बेहतर विकल्प है।
- यदि आपने thedevice विकल्प का उपयोग नहीं किया है और पूरे / dev फ़ोल्डर में माउंट किया गया है, तो आपको कंटेनर चलाने की आवश्यकता होगी विशेषाधिकार प्राप्त मोड है (मैं ऊपर उल्लिखित cgroup सामान की जांच करने जा रहा हूं यह देखने के लिए कि क्या इसे हटाया जा सकता है )। आप इसे अपने डॉकर रन कमांड में निम्नलिखित जोड़कर कर सकते हैं:
--privileged
यदि आपका डिवाइस प्लग और अनप्लग किया जा सकता है, तो लिनक्स इसकी गारंटी नहीं देता है कि इसे हमेशा एक ही ttyUSBxxx स्थान पर रखा जाएगा (विशेषकर यदि आपके पास कई डिवाइस हैं)। सौभाग्य से, लिनक्स डिवाइस में / देव / धारावाहिक / बाय-आईडी फ़ोल्डर में स्वचालित रूप से एक सिमलिंक बना देगा। इस फ़ोल्डर में फ़ाइल को हमेशा एक ही नाम दिया जाएगा।
यह त्वरित रंडाउन है, मेरे पास एक ब्लॉग लेख है जो अधिक विवरण में जाता है।
हमारे लिए एक विशिष्ट USB डिवाइस को एक डॉकटर कंटेनर से बांधना कठिन है जो विशिष्ट भी है। जैसा कि आप देख सकते हैं, प्राप्त करने का अनुशंसित तरीका है:
docker run -t -i --privileged -v /dev/bus/usb:/dev/bus/usb ubuntu bash
यह सभी उपकरणों को इस कंटेनर में बांध देगा। यह असुरक्षित है। सभी कंटेनरों को उन सभी को संचालित करने की अनुमति दी गई थी।
दूसरा तरीका देवपथ द्वारा उपकरणों को बांधना है। ऐसा लग सकता है:
docker run -t -i --privileged -v /dev/bus/usb/001/002:/dev/bus/usb/001/002 ubuntu bash
या --device(बेहतर, नहीं privileged):
docker run -t -i --device /dev/bus/usb/001/002 ubuntu bash
कहीं ज्यादा सुरक्षित। लेकिन वास्तव में यह जानना कठिन है कि एक विशिष्ट उपकरण का देवपथ क्या है।
मैंने इस समस्या को हल करने के लिए इस रेपो को लिखा है।
https://github.com/williamfzc/usb2container
इस सर्वर को तैनात करने के बाद, आप आसानी से HTTP अनुरोध के माध्यम से सभी जुड़े उपकरणों की जानकारी प्राप्त कर सकते हैं:
curl 127.0.0.1:9410/api/device
और पाओ:
{
"/devices/pci0000:00/0000:00:14.0/usb1/1-13": {
"ACTION": "add",
"DEVPATH": "/devices/pci0000:00/0000:00:14.0/usb1/1-13",
"DEVTYPE": "usb_device",
"DRIVER": "usb",
"ID_BUS": "usb",
"ID_FOR_SEAT": "xxxxx",
"ID_MODEL": "xxxxx",
"ID_MODEL_ID": "xxxxx",
"ID_PATH": "xxxxx",
"ID_PATH_TAG": "xxxxx",
"ID_REVISION": "xxxxx",
"ID_SERIAL": "xxxxx",
"ID_SERIAL_SHORT": "xxxxx",
"ID_USB_INTERFACES": "xxxxx",
"ID_VENDOR": "xxxxx",
"ID_VENDOR_ENC": "xxxxx",
"ID_VENDOR_FROM_DATABASE": "",
"ID_VENDOR_ID": "xxxxx",
"INTERFACE": "",
"MAJOR": "189",
"MINOR": "119",
"MODALIAS": "",
"PRODUCT": "xxxxx",
"SEQNUM": "xxxxx",
"SUBSYSTEM": "usb",
"TAGS": "",
"TYPE": "0/0/0",
"USEC_INITIALIZED": "xxxxx",
"adb_user": "",
"_empty": false,
"DEVNAME": "/dev/bus/usb/001/120",
"BUSNUM": "001",
"DEVNUM": "120",
"ID_MODEL_ENC": "xxxxx"
},
...
}
और उन्हें अपने कंटेनरों में बांधें। उदाहरण के लिए, आप देख सकते हैं इस डिवाइस का DEVNAME है /dev/bus/usb/001/120:
docker run -t -i --device /dev/bus/usb/001/120 ubuntu bash
शायद यह मदद करेगा।
डॉकटर के नवीनतम संस्करणों के साथ, यह पर्याप्त है:
docker run -ti --privileged ubuntu bash
यह सभी सिस्टम संसाधनों (उदाहरण के लिए / dev) को एक्सेस देगा।
ऊपर दिए गए उत्तरों को जोड़ना, उन लोगों के लिए जो डॉकटर के अंदर काम करने वाले बाहरी USB डिवाइस (HDD, फ्लैश ड्राइव) का उपयोग करने का त्वरित तरीका चाहते हैं और निजीकृत मोड का उपयोग नहीं कर रहे हैं:
होस्ट पर अपने डिवाइस के लिए देवपथ खोजें:
sudo fdisk -l
आप सूची से काफी आसानी से अपनी ड्राइव को पहचान सकते हैं। इस पथ की प्रतिलिपि बनाएँ (निम्न उदाहरण के लिए /dev/sda2)।
Disque /dev/sda2 : 554,5 Go, 57151488 octets, 111624 secteurs
Unités : secteur de 1 × 512 = 512 octets
Taille de secteur (logique / physique) : 512 octets / 512 octets
taille d'E/S (minimale / optimale) : 512 octets / 512 octets
इस देवपथ को माउंट करें (बेहतर /media):
sudo mount <drive path> /media/<mount folder name>
फिर आप इसे docker runपसंद करने के लिए एक परम के रूप में उपयोग कर सकते हैं:
docker run -it -v /media/<mount folder name>:/media/<mount folder name>
या वॉल्यूम में वॉल्यूम के अंतर्गत लिखें:
services:
whatevermyserviceis:
volumes:
- /media/<mount folder name>:/media/<mount folder name>
और अब जब आप अपने कंटेनर को चलाते हैं और प्रवेश करते हैं, तो आपको कंटेनर के अंदर ड्राइव तक पहुंचने में सक्षम होना चाहिए /media/<mount folder name>
अस्वीकरण:
यदि आप डायनेमिक रूप से उन USB उपकरणों का उपयोग करना चाहते हैं जिन्हें प्लग किया जा सकता है, जबकि docker कंटेनर पहले से चल रहा है, उदाहरण के लिए / dev / video0 पर एक बस संलग्न usb वेब कैमरा एक्सेस करें, आप कंटेनर शुरू करते समय एक cgroup नियम जोड़ सकते हैं। इस विकल्प के लिए एक आवश्यक कंटेनर की आवश्यकता नहीं है और केवल विशिष्ट प्रकार के हार्डवेयर तक पहुंच की अनुमति देता है।
जिस डिवाइस को आप जोड़ना चाहते हैं, उस डिवाइस की प्रमुख संख्या की जाँच करें। आप इसे लिनक्स कर्नेल प्रलेखन में देख सकते हैं । या आप इसे अपने डिवाइस के लिए जांच सकते हैं। उदाहरण के लिए / dev / video0 से जुड़े वेबकेम के लिए डिवाइस की बड़ी संख्या की जांच करने के लिए, आप एक कर सकते हैं ls -la /dev/video0। इसका परिणाम कुछ इस प्रकार है:
crw-rw----+ 1 root video 81, 0 Jul 6 10:22 /dev/video0
जहां पहला नंबर (81) डिवाइस मेजर नंबर है। कुछ सामान्य उपकरण प्रमुख संख्या:
जब आप डॉकटर कंटेनर शुरू करते हैं तो नियम जोड़ें:
--device-cgroup-rule='c major_number:* rmw'हर उस डिवाइस के लिए एक नियम जोड़ें, जिस तक आप पहुंचना चाहते हैं-v /run/udev:/run/udev:ro-v /dev:/devतो अपने docker कंटेनर में सभी usb वेबकैम और serial2usb उपकरणों को जोड़ने के लिए ऐसा करें:
docker run -it -v /dev:/dev --device-cgroup-rule='c 188:* rmw' --device-cgroup-rule='c 81:* rmw' ubuntu bash