udv द्वारा पुकारे जाने पर माउंट निष्पादित नहीं किया जाता है


17

मैंने अपने USB फ्लैश ड्राइव को माउंट और अनमाउंट करने के लिए कुछ udv नियम बनाने की कोशिश की; इस समय के नियम बहुत सरल हैं:

ACTION=="add",KERNEL=="sd[b-z]",RUN+="/root/scripts/plug_flash_drive.sh %k"
ACTION=="remove",KERNEL=="sd[b-z]",RUN+="/root/scripts/unplug_flash_drive.sh %k"

plug_flash_drive.sh भी बहुत सरल है:

device_name=$1
mount_options="umask=000,utf8"
if [ ! -e "/media/$device_name" ]; then
    mkdir "/media/$device_name"
fi
sleep 1
/usr/bin/mount "/dev/$device_name" "/media/$device_name" -o "$mount_options"

unplug_flash_drive.sh:

device_name=$1

umount "/dev/$device_name"
rmdir "/media/$device_name"

मैंने कुछ परीक्षण किए हैं ताकि मुझे पता चल सके कि:

  • जब प्लग किया जाता है, तो मेरी फ्लैश ड्राइव का पता लगाया जाता है; एक फ़ाइल / देव में बनाई गई है
  • प्लग_फ्लैश_ड्राइव.श को udv द्वारा कहा जाता है
  • स्क्रिप्ट का mkdir हिस्सा काम करता है
  • हालाँकि, ऐसा लगता है कि स्क्रिप्ट का "माउंट" भाग निष्पादित नहीं किया गया है, इसलिए मेरी ड्राइव माउंट नहीं है
  • जब मैं कमांड लाइन पर अपनी स्क्रिप्ट को कॉल करता हूं, तो वे पूरी तरह से काम करते हैं

क्या किसी को पता है कि udev द्वारा बुलाए जाने पर माउंट को निष्पादित क्यों नहीं किया जाता है?

EDIT 28/08/14: मैंने अपनी स्क्रिप्ट के अंत में "grep -q / proc / mounts && इको सक्सेस" इको फेल्योर को अपने डिबग लॉग में जांचने के लिए जोड़ा था कि क्या डिवाइस वास्तव में स्क्रिप्ट के समाप्त होने से पहले आरोहित है। ऐसा लगता है कि डिवाइस है उस बिंदु तक कि जब स्क्रिप्ट udev द्वारा कहा जाता है पर रखा होगा। तो अब असली समस्या यह है कि "मेरे ब्लॉक डिवाइस को uev के माध्यम से माउंट स्क्रिप्ट के अंत के बाद प्रतीत नहीं होता है": s


इस बिंदु के पास हो सकता है, लेकिन आप क्यों करते mkdir "$mount_dir"हैं लेकिन rmdir "/media/$device_name"? कहां $mount_dirसेट है?
जी-मैन का कहना है कि मोनिका '

क्षमा करें, यह एक टाइपो है, मैंने मूल कोडों में अलियासिंग के लिए कुछ काफी बेकार चरों का उपयोग किया और मैंने उन्हें स्पष्टता के लिए यहाँ हटा दिया
मैगवा

क्या आपने पुराने स्कूल डिबगिंग की कोशिश की है; जैसे, द्वारा डाल set -xvऔर exec >> "$HOME"/mount.log 2>&1में .shफ़ाइलें?
जी-मैन का कहना है कि 'मोनिका'

1
मैंने ऐसा किया है, लेकिन मुझे जो लॉग मिलता है, उसके अनुसार माउंट को निष्पादित किया जाता है जब स्क्रिप्ट को udv द्वारा बुलाया जाता है।
Udv

1
उस स्थिति में, कमांड लाइन से चलने पर स्क्रिप्ट भी विफल हो जाएगी
मैगवा

जवाबों:


22

systemd-udevd अपने स्वयं के फाइल सिस्टम नेमस्पेस में चलता है और udev .rules के भीतर की गई डिफ़ॉल्ट mounts द्वारा होस्ट का प्रचार नहीं करता है। अपनी पुरानी लिपियों को बनाने के लिए आप इसकी प्रतिलिपि बनाने या संपादित करने (या बेहतर) MountFlags=sharedमें सेट कर सकते हैं/usr/lib/systemd/system/systemd-udevd.service/etc/systemd/system/

man 5 systemd.execअधिक जानकारी के लिए देखें , MountFlagsविकल्प।


"मेजबान से प्रचार न करें" से आपका क्या मतलब है?
सेबल

2
मुझे विश्वास है कि user83388 का अर्थ है कि वे "रूट" नामस्थान का प्रचार नहीं करते हैं
मार्क

2

इस लेखन के रूप में, अन्य उत्तर गलत हैं (या पुराने हैं)।

आपको mountएक Systemd सेवा से नहीं चलना चाहिए । टिप्पणी MountFlagsऔर PrivateMountsलाइनों के बाद भी systemd-udevd.service, आपका नियम NTFS या EXFAT जैसे FUSE फाइल सिस्टम के लिए काम नहीं करेगा, क्योंकि FUSE प्रक्रिया को सिस्टमड द्वारा मदद से मार दिया जाएगा।

इस ArchWiki पृष्ठ को देखें जिसमें कई बेहतर विकल्प सूचीबद्ध हैं। मेरी प्राथमिकता गीथहब पर एक छोटी सी परियोजना है जिसे udv-media-automount कहा जाता है , जो केवल Udev नियम से एक Systemd सेवा को पुनरारंभ करता है। यह नामदेव और बाल प्रक्रियाओं पर Udev के विभिन्न बोझिल प्रतिबंधों के आसपास जाने का एक सुविधाजनक तरीका है।

इस awser को भी देखें , जो दिखाता है कि SYSTEMD_WANTSSystemd यूनिट शुरू करने के लिए Udev वेरिएबल का उपयोग कैसे किया जाता है ।


-1

आप RUN असाइनमेंट के नियमों के :=बजाय उपयोग करने का प्रयास कर सकते हैं +=

:=ऑपरेटर सूची मूल्य सेट करता है और आगे के परिवर्तन की अनुमति नहीं देता।


धन्यवाद, लेकिन माउंट अभी भी काम नहीं करता है :(
मैगवा

1
शायद आपका मामला नहीं है, लेकिन मेरे सिस्टम में माउंट / बिन / माउंट स्थित है। "कमांड -v माउंट" का प्रयास करें।
xae

1
मेरे सिस्टम में, "कमांड -v माउंट" द्वारा दिया गया पथ / usr / bin / Mount है। मैंने देखा कि मेरे पास एक / बिन / माउंट निष्पादन योग्य भी था, लेकिन यह या तो तब काम करता है जब
udv
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.