গতবার আমি যাচাই করেছি, ডকারের হোস্ট সিরিয়াল বা ইউএসবি পোর্টে ধারক অ্যাক্সেস দেওয়ার কোনও উপায় নেই । এমন কোন কৌশল আছে যা তা করতে দেয়?
গতবার আমি যাচাই করেছি, ডকারের হোস্ট সিরিয়াল বা ইউএসবি পোর্টে ধারক অ্যাক্সেস দেওয়ার কোনও উপায় নেই । এমন কোন কৌশল আছে যা তা করতে দেয়?
উত্তর:
বিকল্প দুটি আছে। আপনি ব্যবহার করতে পারেন --deviceফ্ল্যাগ থাকে, এটি ব্যবহার না করেই অ্যাক্সেস USB ডিভাইসের ব্যবহার করতে পারেন --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এটি নিরাপত্তাহীন এবং যত্ন সহকারে পরিচালনা করা উচিত should
ডকারের বর্তমান সংস্করণগুলির সাথে, আপনি --deviceসমস্ত ইউএসবি ডিভাইসে অ্যাক্সেস দেওয়ার প্রয়োজন ছাড়াই আপনি যা চান তা অর্জন করতে পতাকাটি ব্যবহার করতে পারেন ।
উদাহরণস্বরূপ, আপনি যদি /dev/ttyUSB0নিজের ডকারের ধারক মধ্যে কেবল অ্যাক্সেসযোগ্য করতে চান তবে আপনি এরকম কিছু করতে পারেন:
docker run -t -i --device=/dev/ttyUSB0 ubuntu bash
--deviceপতাকাটি ব্যবহার করে , আমি কীভাবে এটি নির্ধারণ করব যে /dev/<device>হোস্ট মেশিনে সম্পর্কিত অ্যান্ড্রয়েড ডিভাইসটি বিশেষত উইন্ডোজ বা ম্যাকের জন্য ডকার কুইকস্টার্ট টার্মিনাল (ভার্চুয়ালবক্স হোস্ট) ব্যবহার করার সময়?
--deviceআপনার ইউএসবি ডিভাইসটি প্লাগ করা / পুনরায় প্লাগ না করা পর্যন্ত কাজ করে এবং তারপরে এটি কাজ বন্ধ করে দেয়। আপনাকে সিগ্রুপ ডিভাইসগুলি ব্যবহার করতে হবে allow এটিকে ঘিরে ধরুন ।
আপনি কেবল ব্যবহার করতে পারেন -v /dev:/devতবে এটি অনিরাপদ কারণ এটি আপনার হোস্ট থেকে সমস্ত ডিভাইসকে পাত্রে ম্যাপ করে, কাঁচা ডিস্ক ডিভাইস সহ আরও কিছু। মূলত এটি কনটেইনারটি হোস্টের মধ্যে রুট পেতে দেয়, যা সাধারণত আপনি চান না।
Cgroups পদ্ধতির ব্যবহার সেই ক্ষেত্রে আরও ভাল এবং ডিভাইসগুলিতে কাজ করে যা কনটেইনারটি শুরু হওয়ার পরে যুক্ত হয়।
বিস্তারিত এখানে দেখুন: প্রাইভিলাইজড ব্যবহার না করে ডকারে ইউএসবি ডিভাইসগুলি অ্যাক্সেস করা
এটি পেস্ট করা কিছুটা শক্ত, তবে সংক্ষেপে আপনার চরিত্রের ডিভাইসের জন্য আপনাকে প্রধান সংখ্যাটি সংগ্রহ করতে হবে এবং এটি সিগ্রুপে প্রেরণ করতে হবে:
189 হল / dev / 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/Docamentation/cgroup-v1/devices.txt
আমি ইতিমধ্যে প্রদত্ত উত্তরগুলি প্রসারিত করতে চেয়েছিলাম /dev/bus/usbযা গতিযুক্ত সংযুক্ত ডিভাইসগুলির সাথে সমর্থনযুক্ত নয় এবং বুট 2 ডকার ভিএম সহ উইন্ডোজ হোস্ট ব্যবহার করার সময় কীভাবে এই কাজ করা যায় include
আপনি যদি উইন্ডোজের সাথে কাজ করে থাকেন তবে আপনাকে ভার্চুয়ালবক্স পরিচালকের মধ্যে ডকারের অ্যাক্সেস করতে চাইলে এমন ডিভাইসের জন্য যে কোনও ইউএসবি বিধি যুক্ত করতে হবে। এটি করতে আপনি ভিএম চালিয়ে চালিয়ে যেতে পারেন:
host:~$ docker-machine stop default
ভার্চুয়ালবক্স ম্যানেজারটি খুলুন এবং প্রয়োজনীয় ফিল্টারগুলির সাথে ইউএসবি সমর্থন যুক্ত করুন।
বুট 2 ডকার ভিএম শুরু করুন:
host:~$ docker-machine start default
যেহেতু ইউএসবি ডিভাইসগুলি বুট 2 ডকার ভিএম-এর সাথে সংযুক্ত রয়েছে তাই কমান্ডগুলি সেই মেশিন থেকে চালানো দরকার। ভিএম দিয়ে একটি টার্মিনাল খুলুন এবং ডকার রান কমান্ডটি চালান:
host:~$ docker-machine ssh
docker@default:~$ docker run -it --privileged ubuntu bash
দ্রষ্টব্য, কমান্ডটি এভাবে চালিত হলে কেবল পূর্ববর্তী সংযুক্ত USB ডিভাইসগুলি ক্যাপচার করা হবে। আপনি যদি ধারকটি শুরু করার পরে সংযুক্ত ডিভাইসের সাথে এটি কাজ করতে চান তবে কেবলমাত্র ভলিউম ফ্ল্যাগের প্রয়োজন। সেক্ষেত্রে, আপনি ব্যবহার করতে পারেন:
docker@default:~$ docker run -it --privileged -v /dev:/dev ubuntu bash
দ্রষ্টব্য, কিছু ক্ষেত্রে এর মতো ডিভাইস ক্যাপচার করার /devপরিবর্তে আমাকে ব্যবহার /dev/bus/usbকরতে হয়েছিল /dev/sg2। আমি কেবল ধরে নিতে পারি যেমন /dev/ttyACM0বা এর মতো ডিভাইসের ক্ষেত্রেও এটি সত্য /dev/ttyUSB0।
ডকার রান কমান্ডগুলি লিনাক্স হোস্টের সাথেও কাজ করবে।
আরেকটি বিকল্প হ'ল ইউদেব সামঞ্জস্য করা, যা ডিভাইসগুলি কীভাবে মাউন্ট করা হয় এবং কী কী সুবিধা সহ নিয়ন্ত্রণ করে। সিরিয়াল ডিভাইসে অ-রুট অ্যাক্সেসের অনুমতি দেওয়ার জন্য দরকারী Use আপনার যদি স্থায়ীভাবে সংযুক্ত ডিভাইস থাকে, তবে --deviceবিকল্পটি সর্বোত্তম উপায়। যদি আপনার সাময়িক ডিভাইস থাকে তবে আমি যা ব্যবহার করছি তা এখানে:
ডিফল্টরূপে, সিরিয়াল ডিভাইসগুলি মাউন্ট করা হয় যাতে কেবল রুট ব্যবহারকারীরা ডিভাইসটি অ্যাক্সেস করতে পারে। অ-রুট ব্যবহারকারীদের দ্বারা সেগুলি পাঠযোগ্য।
/Etc/udev/rules.d/99-serial.rules নামে একটি ফাইল তৈরি করুন। নিম্নলিখিত ফাইলটি এই ফাইলটিতে যুক্ত করুন:
KERNEL=="ttyUSB[0-9]*",MODE="0666"
MODE = "0666" সমস্ত ব্যবহারকারীদের আপনার ttyUSB ডিভাইসগুলিতে পড়ার / লেখার (তবে চালানো নয়) অনুমতি দেবে। এটি সর্বাধিক অনুমতিমূলক বিকল্প এবং আপনি নিজের সুরক্ষা প্রয়োজনীয়তার উপর নির্ভর করে এটি আরও সীমাবদ্ধ করতে চাইতে পারেন। যখন কোনও ডিভাইস লিনাক্স গেটওয়েতে প্লাগ ইন করা হয় তখন কী ঘটে থাকে তা নিয়ন্ত্রণ করার বিষয়ে আপনি আরও শিখতে পারেন।
সিরিয়াল ডিভাইসগুলি প্রায়শই ক্ষণস্থায়ী হয় (যে কোনও সময় প্লাগ করা এবং প্লাগ লাগানো যেতে পারে)। এ কারণে, আমরা সরাসরি ডিভাইস বা এমনকি / dev / সিরিয়াল ফোল্ডারে মাউন্ট করতে পারি না, কারণ জিনিসগুলি প্লাগযুক্ত না করা হলে সেগুলি অদৃশ্য হয়ে যায়। এমনকি যদি আপনি এগুলি আবার প্লাগ ইন করেন এবং ডিভাইসটি আবার প্রদর্শিত হয়, এটি প্রযুক্তিগতভাবে যা মাউন্ট করা হয়েছিল তার চেয়ে আলাদা একটি ফাইল, তাই ডকার এটি দেখতে পাবেন না। এই কারণে, আমরা হোস্ট থেকে পাত্রে পুরো / dev ফোল্ডারটি মাউন্ট করি। আপনি আপনার ডকার রান কমান্ডে নিম্নলিখিত ভলিউম কমান্ডটি যুক্ত করে এটি করতে পারেন:
-v /dev:/dev
যদি আপনার ডিভাইস স্থায়ীভাবে সংযুক্ত থাকে, তবে - ডিভাইস বিকল্প বা আরও নির্দিষ্ট ভলিউম মাউন্ট ব্যবহার করা সম্ভবত সুরক্ষা দৃষ্টিকোণ থেকে আরও ভাল বিকল্প।
আপনি যদি - ডিভাইস বিকল্পটি ব্যবহার না করে এবং পুরো / ডেভ ফোল্ডারে মাউন্ট করেন তবে আপনার কনটেইনারটি চালিত করতে হবে সুবিধাজনক মোডে (আমি উপরে বর্ণিত সিগ্রুপের জিনিসগুলি পরীক্ষা করতে যাচ্ছি এটি দেখার জন্য) )। আপনি আপনার ডকার রান কমান্ডটিতে নিম্নলিখিতটি যুক্ত করে এটি করতে পারেন:
--privileged
যদি আপনার ডিভাইসটি প্লাগ এবং প্লাগ লাগানো যায় তবে লিনাক্স গ্যারান্টি দেয় না যে এটি সর্বদা একই টিটিএসবিএক্সএক্সএক্সএক্সএক্স অবস্থিত হবে (বিশেষত যদি আপনার একাধিক ডিভাইস থাকে)। ভাগ্যক্রমে, লিনাক্স / dev / সিরিয়াল / বাই-আইডি ফোল্ডারে ডিভাইসে স্বয়ংক্রিয়ভাবে একটি সিমিলিংক তৈরি করবে। এই ফোল্ডারটির ফাইলটি সর্বদা একই নামে থাকবে।
এটি দ্রুত রুনডাউন, আমার একটি ব্লগ নিবন্ধ রয়েছে যা আরও বিশদে যায়।
আমাদের পক্ষে নির্দিষ্ট ইউএসবি ডিভাইসটিকে একটি নির্দিষ্ট ডক পাত্রে আবদ্ধ করা কঠিন যা এটি নির্দিষ্ট। আপনি দেখতে পাচ্ছেন, অর্জনের প্রস্তাবিত উপায় হ'ল:
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
এই সার্ভারটি স্থাপন করার পরে, আপনি সহজেই এইচটিটিপি অনুরোধের মাধ্যমে সংযুক্ত ডিভাইসের সমস্ত তথ্য পেতে পারেন:
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)
উপরের উত্তরে যুক্ত করা হচ্ছে, যারা ডকারের অভ্যন্তরে কাজ করে এবং ব্যক্তিগতকৃত মোড ব্যবহার না করে একটি বাহ্যিক ইউএসবি ডিভাইস (এইচডিডি, ফ্ল্যাশ ড্রাইভ) ব্যবহার করার দ্রুত উপায় চান তাদের জন্য :
হোস্টটিতে আপনার ডিভাইসে ডেপথটি সন্ধান করুন:
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>
দাবিপরিত্যাগ:
আপনি যদি ইউএসবি ডিভাইসগুলিকে অ্যাক্সেস করতে চান যা ডক ধারক ইতিমধ্যে চলমান অবস্থায় প্লাগ ইন করা যেতে পারে, উদাহরণস্বরূপ / dev / video0 এ কেবল সংযুক্ত ইউএসবি ওয়েবক্যাম অ্যাক্সেস করুন, আপনি ধারকটি শুরু করার সময় একটি সিগ্রুপ বিধি যুক্ত করতে পারেন। এই বিকল্পটির কোনও - বেসরকারী ধারক প্রয়োজন হয় না এবং কেবলমাত্র নির্দিষ্ট ধরণের হার্ডওয়্যার অ্যাক্সেসের অনুমতি দেয়।
আপনি যে ধরণের ডিভাইস যুক্ত করতে চান তার প্রধান সংখ্যাটি ডিভাইসটি পরীক্ষা করুন। আপনি এটি লিনাক্স কার্নেল ডকুমেন্টেশনে সন্ধান করতে পারেন । অথবা আপনি এটি আপনার ডিভাইসের জন্য পরীক্ষা করতে পারেন। উদাহরণস্বরূপ / dev / video0 এর সাথে সংযুক্ত ওয়েবক্যামের জন্য ডিভাইসটির প্রধান নম্বরটি পরীক্ষা করতে, আপনি এটি করতে পারেন ls -la /dev/video0। এর ফলস্বরূপ এমন কিছু ঘটে:
crw-rw----+ 1 root video 81, 0 Jul 6 10:22 /dev/video0
যেখানে প্রথম সংখ্যা (81) হল ডিভাইসের প্রধান সংখ্যা number কিছু সাধারণ ডিভাইস প্রধান সংখ্যা:
আপনি ডকারের ধারক শুরু করার সময় বিধিগুলি যুক্ত করুন:
--device-cgroup-rule='c major_number:* rmw'আপনি যে ধরণের ডিভাইসে অ্যাক্সেস করতে চান তার জন্য বিধি যুক্ত-v /run/udev:/run/udev:ro-v /dev:/devসুতরাং আপনার ডকার পাত্রে সমস্ত ইউএসবি ওয়েবক্যাম এবং সিরিয়াল 2 ইউএসবি ডিভাইস যুক্ত করতে, করুন:
docker run -it -v /dev:/dev --device-cgroup-rule='c 188:* rmw' --device-cgroup-rule='c 81:* rmw' ubuntu bash