किसी भी USB संग्रहण डिवाइस से मिलान करने के लिए Udev नियम


10

मैं udevकिसी भी USB मास-स्टोरेज डिवाइस के लिए नियम कैसे लागू कर सकता हूं , जो केवल विशिष्ट के लिए नहीं है? क्या में बदला जाना चाहिए idVendor, और idProduct?

 ACTION=="add", SUBSYSTEM=="usb", SYSFS{idVendor}=="0204", SYSFS{idProduct}=="6025",
     RUN+="/home/workspace/bash_script.sh"

जवाबों:


7

एक स्टोरेज डिवाइस blockसबसिस्टम में है, इसलिए आप SUBSYSTEM=="block"इस तरह से अपने नियम में चाहेंगे:

ACTION=="add", KERNEL=="sd?", SUBSYSTEM=="block", ENV{ID_BUS}=="usb", \
    RUN+="/path/to/script"

यदि आप उपयोग कर रहे हैं systemd, तो आप systemdहर बार एक यूएसबी स्टोरेज डिवाइस को जोड़ने पर एक यूनिट चला सकते हैं । इकाई फ़ाइल बनाएँ, जैसे /etc/systemd/system/my-usb-rule.service:

[Service]
Type=oneshot
ExecStart=/path/to/script

और नियम, जैसे /etc/udev/rules.d/85-my-usb-rule.rules:

ACTION=="add", KERNEL=="sd?", SUBSYSTEM=="block", ENV{ID_BUS}=="usb", \
    ENV{SYSTEMD_WANTS}="my-usb-rule.service"

अब udevट्रिगर होगा my-usb-rule.service(जो बदले में आपकी स्क्रिप्ट को निष्पादित करेगा) किसी भी यूएसबी स्टोरेज डिवाइस ऐड इवेंट पर।


नियमों / इकाइयों को संपादित करने के बाद कॉन्फ़िगरेशन पुनः लोड करना न भूलें:

udevadm control --reload
systemctl daemon-reload

जब मैं एक USB मास स्टोरेज जोड़ता हूं, तो मैं इसमें शामिल विभाजन पर कार्य करना चाहूंगा। Udev स्तर पर मैं 4 सबसिस्टम से घटनाओं को देख सकता हूं: usb, scsi, bdi, और block (इस क्रम में)। पहले 3 अनुपयोगी हैं, क्योंकि विभाजन अभी तक ज्ञात नहीं है। ब्लॉक इवेंट में ID_BUS = scsi है, न कि आपके कोड उदाहरण में usb। मुझे ब्लॉक इवेंट में कोई उपयुक्त विशेषता दिखाई नहीं दे रही है, जो मुझे बताएगी कि यह USB मास स्टोरेज है या नहीं। (Udvadm मॉनिटर और udevadm जानकारी का उपयोग करके जांच की गई)। जब तक मैं भरोसा नहीं कर सकता कि ID_BUS = scsi यथोचित नहीं बल्कि USB मास स्टोरेज हो सकता है।
उवे ग्यूडर

@ यूवेग्यूडर - आपके कार्यक्रम के लिए एक तर्क के रूप में डिवाइस नाम का उपयोग करने के लिए आपको कुछ भी नहीं रोकना और विभाजन पर उस अधिनियम के आधार पर ...
don_crissti

खैर, USB इवेंट में डिवाइस का नाम कुछ इस तरह है / dev / बस / usb / 002/040। नहीं यकीन है कि मेरे कार्यक्रम में क्या करना है। ब्लॉक की घटनाओं में डिवाइस का नाम कुछ इस तरह है / dev / sdb या / dev / sdb1। यही मैं चाहता हूं, लेकिन अब मैं इस समस्या पर वापस आ गया हूं कि ID_BUS = scsi। मुझे थोड़ा और आगे मिला: एक नियम फ़ाइल है 80-udisk2, जो एक संपत्ति ID_DRIVE_THUMB जोड़ता है। यह सुनिश्चित नहीं है कि यह कितना मजबूत है, सूचीबद्ध बहुत कम विक्रेताओं को लगता है। मेरी नियम फ़ाइल को 70- * कहा जाता था, इसलिए मेरी / dev / sdb से अपेक्षा नहीं थी। अजीब तरह से पर्याप्त / देव / sdb1 मिलान हुआ, हालांकि मेरा शासन पहले चलता है।
उवे ग्यूडर

1
आह, मैं अभी ध्यान देता हूं कि मूल प्रश्न किसी भी USB मास स्टोरेज ड्राइव का था। उस नियम के साथ काम करना चाहिए SUBSYSTEM=="block", SUBSYSTEMS=="usb"( एस के साथ अंतर पर ध्यान दें )। मुझे संदेह है कि यह हमेशा ENV{ID_BUS}=="usb"मूल उत्तर के साथ काम कर सकता है , क्योंकि मैं यहां मूल्य स्कैसी देखता हूं। लेकिन मैं मूल रूप से पूछे जाने की तुलना में थोड़ी अलग समस्या पर काम कर रहा हूं, मैं कोई भी यूएसबी स्टिक (पेनड्राइव) चाहता हूं, लेकिन कोई बाहरी ड्राइव नहीं।
उवे ग्यूडर

1
वास्तव में गंदा सच यह है कि ENV{ID_BUS}सभी प्रणालियों पर मूल्य समान नहीं है। कल मैं udv 210 के साथ एक पुरानी प्रणाली पर काम कर रहा था (मेरा मानना ​​है कि अब जांच नहीं कर सकता क्योंकि मशीन इंटरनेट पर नहीं है), वहां मान scsi था । अब, मैं udev 228 के साथ नई मशीन पर हूं और मान usb है । उसी यूएसबी स्टिक के लिए, मैं इसे अपने साथ ले जा रहा हूं। (यह सुनिश्चित नहीं है कि यहां udv संस्करण प्रासंगिक कारक है, यह कर्नेल या udv नियमों को स्थापित करने वाला कोई अन्य पैकेज भी हो सकता है, e, g, udisks2) फिर भी SUBSYSTEM=="block", SUBSYSTEMS=="usb"(नोट S ) पोर्टेबल और सुरक्षित हो सकता है।
उवे ग्यूडर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.