एक udv नियम डिबग करने के लिए (/etc/udev/rules.d/… में)


15

मैं एक नया मूल नियम बना रहा हूं

/etc/udev/rules.d/10-myrule.rules

युक्त

KERNEL!="sdb*", GOTO="auto_mount_end"
ACTION=="add", RUN+="/usr/bin/mount /dev/sdb1 /media"
LABEL="auto_mount_end"

मैंने बचाया, रिबूट किया, और एक एसडी कार्ड डाला (द्वारा पहचाना गया /dev/sdb1, मैं इसे देखता हूं dmesg), लेकिन कुछ भी नहीं होता है। जब मैं स्वयं mount /dev/sdb1 /mediaकाम करता हूं , तो यह काम करता है।

मैं इस तरह के udevनियम का निवारण / डीबग कैसे कर सकता हूं ?

नोट: मैं ArchLinux का उपयोग कर रहा हूं, लेकिन यह किसी भी डिस्ट्रो पर समान होना चाहिए?


1
फ़ाइल नाम में परिवर्तन करें 99-myrule.rules...
jasonwryan

@ अंजोनव्रीयन: वही: कुछ नहीं होता है। एक udv नियम का निवारण कैसे करें? क्या मुझे इसे मैन्युअल रूप से ट्रिगर करना चाहिए (इस मामले में कैसे?)
बसज

क्या systemdसामान्य udev व्यवहार के लिए कुछ परिवर्तन?
बसज

1
कोशिश udevadm monitor, देखना यह और इस
कुंभ पावर

1
AFA ने नियमों को फिर से पढ़ने के लिए udv प्राप्त करने के लिए रीबूट करने के लिए नीट नहीं किया है (देखें unix.stackexchange.com/a/39371/44760 )। मैंने अपना udv डिबगिंग किया है (जो वास्तव में सबसे आसान काम नहीं है!) udevadm testऔर वास्तविकता के साथ मान्य नियम udevadm info
ज़गरिम्सन

जवाबों:


11
  • 10-जैसा कि जसोनव्रीयन ने उल्लेख किया है, उच्च संख्या (90 का अच्छा) का उपयोग करें। इसलिए आप शासन को एक दूसरे पर हावी नहीं होने देंगे।
  • आप वास्तव में जरूरत के रूप में न्यूनतम कुंजी का प्रयोग करें। उदाहरण, !=और GOTO/ LABEL, इसके बजाय सीधे उपयोग करें==

    ACTION=="add", KERNEL=="sdb*", RUN+="/usr/bin/mount /dev/sdb1 /media"
    
  • आपका लक्ष्य sdb1निश्चित कमांड के साथ था , अंधा मैच का उपयोग करके कम से कम करेंKERNEL=="sdb1"

  • मुझे एक छाया डिबगिंग नियम बनाने के लिए उपयोगी लगता है, मैंने छाया कहा क्योंकि मैं हमेशा इसे उसी फ़ाइल में छोड़ता हूं, इसलिए मुझे इसका उपयोग तब करना चाहिए जब मुझे इसकी आवश्यकता हो।

    ACTION=="add", KERNEL=="sdb*", RUN+="/bin/sh -c 'echo == >> /home/user/Desktop/udev-env.txt; env >> /home/user/Desktop/udev-env.txt'"
    #ACTION=="add", KERNEL=="sdb*", RUN+="/usr/bin/mount /dev/sdb1 /media"
    

    नोट: udev-env.txt बनाया जाता है फिर नियम को ट्रिगर किया जाता है। एक मिलान नोड के==अनुरूपलाइन। उस फ़ाइल में दर्ज ENV 2 नोड या अधिक के बीच मिश्रण हो सकता है, लगभग एक ही समय में बनाया गया, यह एकबफरिंग समस्या है।stdout

  • घटनाओं को संसाधित करने के लिए किन नियमों का उपयोग करें udevadm monitor -u, udevadm test ...और udevadm trigger ...यह सत्यापित करने के लिए।

  • स्क्रिप्ट्स के अंदर डीबग लॉग बनाने और विफल आदेशों को पकड़ने के लिए आप पर निर्भर है, उनके रिटर्न मूल्य को भी stdout& stderrसंदेशों को सहेज कर ।

अपडेट करें:

  • संदर्भ: udev_237 - man udev (Ubuntu_18.04)

    RUN{type}

    Note that running programs that access the network or mount/unmount filesystems is not
    allowed inside of udev rules, due to the default sandbox that is enforced on
    systemd-udevd.service.
    

1
बहुत उपयोगी। कुछ टिप्पणियां udevadm test...केवल आपको पर्यावरण चर दिखाने के लिए दिखाई देती हैं, जिन्हें प्राप्त ATTRSकरने के udevadm info $DEVICEलिए आप इन अन्य सेटिंग्स का उपयोग कर सकते हैं ।
Righ

1
में udevadm infoरिटर्न उपकरणों की एक पेड़ एक युक्ति है और उसकी मूल उपकरणों के बीच भेद करने के लिए सेटिंग्स सावधान रहना (गुण अगर ओवरराइड नहीं विरासत में मिला हो रहे हैं)। मेरे मामले में उपतंत्र गलत था।
Righ

udevadm test "This program is for debugging only, it does not run any program specified by a RUN key. It may show incorrect results, because some values may be different, or not available at a simulation run."क्या वास्तव में क्या हो रहा है, इसका पता लगाने का कोई तरीका नहीं है?
मार्ख

@ मारक, आप udevadm monitor -uघटनाओं / स्थितियों udevadm trigger ...की जांच करने और उनके कार्यों का परीक्षण करने के लिए उपयोग कर सकते हैं ।
user.dz

@MarcH, लेकिन स्क्रिप्ट्स के अंदर डीबग लॉग बनाने और विफल आदेशों को पकड़ने के लिए आप पर निर्भर है (उनकी वापसी के मूल्य को बचाने के लिए भी stdout और stderr संदेश)।
user.dz

1

मुझे लगता है कि आप जिस कमांड को देख रहे हैं वह यहां है udevadm। आप udv घटनाओं के एक rescan को ट्रिगर करने के लिए triggerऔर testमापदंडों का उपयोग करेंगे , और क्रमशः एक विशिष्ट घटना का परीक्षण करने के लिए।

ईएल 7. नामकरण में नए नेटवर्क डिवाइस के साथ पुट लगाते हुए मैंने इसे कठिन तरीके से सीखा। सौभाग्य!


1
  1. एक udv नियम फ़ाइल बनाएँ

    sudo nano /etc/udev/rules.d/99-removable-sd.rules
    
  2. नियम जोड़ें जो udisks को इसे स्वचालित करने के लिए कहता है

    SUBSYSTEM=="block", SUBSYSTEMS=="mmc", DRIVERS=="mmcblk", ATTRS{type}=="SD", ENV{UDISKS_AUTO}="1", ENV{UDISKS_SYSTEM}="0"
    

    ATTRS{type}=="SD" यदि आप विभिन्न प्रकारों का उपयोग कर रहे हैं, तो आवश्यक नहीं है।

  3. रीलोड नियम

    sudo udevadm control -R
    
  4. इसे बेदखल करें फिर वापस डाल दें।

संदर्भ: आर्कलिनक्स विकी: कुछ उपकरणों, जिन्हें हटाने योग्य माना जाना चाहिए, वे नहीं हैं


0

मुझे RASPBERRY PI 3 B + के साथ भी यही समस्या थी, यह संभव हो सकता है कि ऊपर दिए गए आदेश आपकी मदद कर सकते हैं। लेकिन यह मेरी मदद नहीं किया। मैं USB संग्रहण डिवाइस सम्मिलित करने पर एक स्क्रिप्ट मंगाने की कोशिश कर रहा था। नियम syslog में लॉग इन नहीं होते हैं, इसलिए यह समझना बहुत मुश्किल हो जाता है कि कौन सा नियम काम किया या कौन सा नियम विफल रहा।

तो मैंने निम्नलिखित कार्य किया:

(१) मैंने अपना नियम फ़ाइल /etc/udev/rules.d/100-myrule.rules में बनाया

(२) तब मैंने आज्ञा चलाई sudo /etc/init.d/udev restart

फिर मैंने काम किया यह जाँच की। जानकारी का एक टुकड़ा, आपके लिए उपयोगी हो सकता है या नहीं भी हो सकता है, लेकिन फाइलसिस्टम udv के लिए आसानी से पढ़े जाते हैं जब तक कि कमांड (2) निष्पादित नहीं होती है।

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