- उबंटू सर्वर 11.10 के लिए नोट: यह स्क्रिप्ट अप्रचलित
vol_id
कमांड के कारण उबंटू सर्वर 11.10 पर विफल हो जाती है । vol_id
द्वारा अधिगृहित किया गया है blkid
। स्क्रिप्ट को ठीक करने के लिए, "vol_id" को udev-auto-mount.sh
स्क्रिप्ट में "blkid -o udev" से बदल दें ।
मैं थोड़ी देर के लिए इसके चारों ओर अपना सिर पीट रहा हूं, और मुझे लगता है कि मुझे एक काम करने वाला समाधान मिल गया है। यह डेबियन-आधारित प्रणाली पर विकसित और परीक्षण किया गया है, इसलिए इसे उबंटू पर काम करना चाहिए। मैं उन धारणाओं को इंगित करता हूँ जिससे यह अन्य प्रणालियों के लिए भी अनुकूलित हो सके।
- यह स्वचालित रूप से प्लगइन पर यूएसबी ड्राइव को माउंट करेगा, और फायरवायर के लिए अनुकूलित करने के लिए बहुत कुछ नहीं लेना चाहिए।
- यह UDEV का उपयोग करता है, इसलिए HAL / DeviceKit / GNOME-Anything के साथ कोई भी बंदर नहीं करता है।
- यह स्वचालित रूप
/media/LABEL
से डिवाइस को माउंट करने के लिए एक निर्देशिका बनाता है।
- हालांकि, यह अन्य ऑटोमाउंटर्स के साथ हस्तक्षेप कर सकता है ; मैं उसके लिए परीक्षण नहीं कर सकता। मुझे उम्मीद है कि, Gnome-VFS सक्रिय के साथ, दोनों माउंट करने की कोशिश कर सकते हैं ... यदि Gnome-VFS माउंट को विफल करता है, तो यह डेस्कटॉप आइकन को कॉन्फ़िगर नहीं कर सकता है। सूक्ति से संभव होना चाहिए, लेकिन आवश्यकता
gksudo
या समान हो सकता है ।
मैंने सिस्टम बूट पर इसका परीक्षण नहीं किया है, लेकिन एकमात्र कारण मैं देख सकता हूं कि यह काम नहीं कर सकता है यदि यह सिस्टम को माउंट करने से पहले यूएसबी ड्राइव को माउंट करने की कोशिश करता है। यदि ऐसा है, तो संभवतः आपको माउंट स्क्रिप्ट के लिए एक अतिरिक्त ट्विन की आवश्यकता होगी। ( अगर कोई सलाह है, तो यह देखने के लिए मैं सर्वरफॉल्ट के साथ जांच कर रहा हूं , लेकिन वहां पर इसमें ज्यादा दिलचस्पी नहीं है।)
उस पर, तब।
UDEV संदर्भ:
पृष्ठभूमि (UDEV? Whuzzat?)
UDEV कर्नेल का हॉटप्लग सिस्टम है। यह वही है जो स्वचालित रूप से उचित डिवाइस और डिवाइस सिम्लिंक (जैसे /dev/disk/by-label/<LABEL>
) को बूट समय पर और सिस्टम के चलने के दौरान जोड़े गए उपकरणों के लिए कॉन्फ़िगर करता है।
D- बस और HAL का उपयोग डेस्कटॉप एनवायरनमेंट जैसे श्रोताओं को हार्डवेयर ईवेंट भेजने के लिए किया जाता है। इसलिए जब आप GNOME लॉग इन करते हैं और USB ड्राइव में CD या प्लग डालते हैं, तो वह घटना इस श्रृंखला का अनुसरण करती है:
kernel -> udev -> dbus -> hal -> gnome-vfs/nautilus (mount)
और प्रेस्टो, आपकी ड्राइव माउंट हो जाती है। लेकिन एक बिना सिर वाली प्रणाली में, हम नहीं चाहते कि ऑटोमोटिविंग के लाभों को प्राप्त करने के लिए लॉग इन किया जाए।
उदय नियम
चूंकि UDEV हमें नियम लिखने देता है और डिवाइस प्रविष्टि पर प्रोग्राम चलाता है, यह एक आदर्श विकल्प है। हम डेबियन / उबंटू के मौजूदा नियमों का लाभ उठाने जा रहे हैं, उन्हें /dev/disk/by-label/<LABEL>
हमारे लिए सिम्लिंक सेटअप करने दें, और एक और नियम जोड़ें जो हमारे लिए डिवाइस को माउंट करेगा।
UDEV के नियमों को /etc/udev/rules.d
(और /lib/udev/rules.d
कार्मिक पर) रखा जाता है , और इन्हें संख्यात्मक क्रम में संसाधित किया जाता है। नंबर के साथ शुरू न होने वाली कोई भी फाइल नंबर वाली फाइलों के बाद प्रोसेस हो जाती है। मेरे सिस्टम पर, एचएएल नियम एक फाइल में हैं 90-hal.rules
, इसलिए मैंने अपने नियमों को रखा, ताकि 89-local.rules
एचएएल को प्राप्त करने से पहले वे संसाधित हो जाएं। मुख्य रूप से, आपको यह सुनिश्चित करने की आवश्यकता है कि ये नियम किसके बाद होते हैं 60-persistent-storage.rules
। local.rules
काफी अच्छा हो सकता है।
इसे अपनी नई नियम फ़ाइल में रखें:
# /etc/udev/rules.d/local.rules
# /etc/udev/rules.d/89-local.rules
# ADD rule: if we have a valid ID_FS_LABEL_ENC, and it's USB, mkdir and mount
ENV{ID_FS_LABEL_ENC}=="?*", ACTION=="add", SUBSYSTEMS=="usb", \
RUN+="/usr/local/sbin/udev-automounter.sh %k"
सुनिश्चित करें कि वहाँ के बाद कोई स्थान नहीं है \
, बस newline
( \n
)।
बदले SUBSYSTEMS=="usb"
के लिए SUBSYSTEMS=="usb|ieee1394"
फायरवायर समर्थन के लिए।
यदि आप चाहते हैं कि डिवाइस हमेशा किसी विशेष उपयोगकर्ता के स्वामित्व में हो, तो एक OWNER="username"
खंड जोड़ें । यदि आपको किसी विशेष उपयोगकर्ता के स्वामित्व वाली फ़ाइलों की आवश्यकता है, तो इसके बजाय माउंट स्क्रिप्ट को ट्विक करें।
नियम पढ़ना
यह डिवाइस को चलाने के लिए प्रोग्राम की सूची में चलाने के लिए एक प्रोग्राम जोड़ता है। यह USB विभाजन उपकरणों की पहचान करता है <LABEL>
, फिर इस जानकारी को माउंट करने वाली स्क्रिप्ट में भेजता है। विशेष रूप से, यह नियम मेल खा रहा है:
ENV{ID_FS_LABEL_ENC}=="?*"
- पहले सिस्टम नियम द्वारा सेट किया गया एक पर्यावरण चर। गैर-फाइल सिस्टम के लिए मौजूद नहीं है, इसलिए हम इसके लिए जांच करते हैं। हम वास्तव ID_FS_LABEL
में माउंट पॉइंट के लिए उपयोग करना चाहते हैं , लेकिन मैंने UDEV को मेरे लिए इसे भागने के लिए राजी नहीं किया है, इसलिए हम माउंट स्क्रिप्ट को संभाल लेंगे।
यह और अन्य पर्यावरण चर udv द्वारा vol_id
कमांड ( पदावनत ) का उपयोग करके प्राप्त किए जाते हैं । यह विभाजन पर अच्छा त्वरित विवरण देखने के लिए एक आसान उपकरण है:
$ sudo vol_id /dev/sdc1
ID_FS_TYPE=ext2
ID_FS_UUID=a40d282a-4a24-4593-a0ab-6f2600f920dd
ID_FS_LABEL=Travel Dawgs
ID_FS_LABEL_ENC=Travel\x20Dawgs
ID_FS_LABEL_SAFE=Travel_Dawgs
ACTION=="add"
- केवल मैच की add
घटनाओं ...
SUBSYSTEMS=="usb"
- केवल उन डिवाइस से मिलान करें जो USB बस में हैं। हम SUBSYSTEMS
यहां उपयोग करते हैं क्योंकि यह हमारे डिवाइस के माता-पिता के खिलाफ मेल खाता है; जिस डिवाइस में हम रुचि रखते हैं, वह वास्तव में SUBSYSTEM == "scsi" होगी। एक मूल USB डिवाइस के खिलाफ मिलान हमारे प्रोग्राम को आंतरिक ड्राइव में जोड़ने से बचता है।
RUN+="..."
- एक मैच नहीं है, लेकिन एक कार्रवाई: इस कार्यक्रम को चलाने के लिए कार्यक्रमों की सूची में जोड़ें। कार्यक्रम के तर्कों में, %k
डिवाइस नाम (जैसे sdc1
, नहीं /dev/sdc1
) के लिए विस्तारित $env{FOO}
हो जाता है और पर्यावरण चर FOO की सामग्री प्राप्त करता है।
नियम का परीक्षण
पहला संदर्भ लिंक (ऊपर) एक उत्कृष्ट UDEV ट्यूटोरियल है, लेकिन यह थोड़ा पुराना है। आपके नियमों ( udevtest
विशेष रूप से) के परीक्षण के लिए यह चलने वाले कार्यक्रमों को कैच-ऑल udevadm
यूटिलिटी द्वारा बदल दिया गया है ।
आपके द्वारा नियम जोड़ने के बाद, अपने डिवाइस में प्लग इन करें। इसे कुछ सेकंड दें, फिर देखें कि यह किस उपकरण को सौंपा गया है:
$ ls -l /dev/disk/by-label/*
lrwxrwxrwx 1 root root 10 2009-10-25 07:27 label_Foo -> ../../sda1
lrwxrwxrwx 1 root root 10 2009-10-25 07:27 label_Bar -> ../../sdb1
lrwxrwxrwx 1 root root 10 2009-10-25 07:27 label_Baz -> ../../sdc1
यदि आपके हटाने योग्य ड्राइव में है label_Baz
, तो यह डिवाइस पर है sdc1
। इसे चलाएँ और आउटपुट को अंत की ओर देखें:
$ sudo udevadm test /sys/block/sdc/sdc1
parse_file: reading (...) (many lines about files it reads)
import_uevent_var: import into environment: (...) (many lines about env variables)
(...) (many lines tracing rule matches & programs run)
update_link: found 1 devices with name 'disk/by-label/LABEL_BAZ'
update_link: found '/block/sdc/sdc1' for 'disk/by-label/LABEL_BAZ'
update_link: compare (our own) priority of '/block/sdc/sdc1' 0 >= 0
update_link: 'disk/by-label/LABEL_BAZ' with target 'sdc1' has the highest priority 0, create it
udevtest: run: '/usr/local/sbin/udev-automounter.sh sdc1 LABEL_BAZ'
udevtest: run: 'socket:/org/freedesktop/hal/udev_event'
udevtest: run: 'socket:@/org/kernel/udev/monitor'
RUN+=
पिछली कुछ पंक्तियों में हमारे नियम से स्क्रिप्ट नाम देखें (इस उदाहरण में नीचे से तीसरा)। आप इस डिवाइस के लिए उपयोग किए जाने वाले तर्कों को देख सकते हैं। आप यह कमांड चला सकते हैं कि यह जांचने के लिए कि तर्क ध्वनि हैं; यदि यह आपके कमांडलाइन पर काम करता है, तो यह एक उपकरण सम्मिलित होने पर स्वचालित रूप से काम करना चाहिए।
आप वास्तविक समय में UDEV घटनाओं की निगरानी भी कर सकते हैं: रन sudo udevadm monitor
( man udevadm
स्विच पर विवरण देखें )। फिर बस एक नए डिवाइस में प्लग करें और ईवेंट को स्क्रॉल करके देखें। (संभवतः ओवरकिल तब तक जब तक आप वास्तव में निम्न-स्तरीय विवरण में न हों ...)
नियमों को पुनः लोड करना
एक बार जब आप सत्यापित कर लेते हैं कि नियम ठीक से पढ़ा जा रहा है, तो आपको UDEV को अपने नियमों को फिर से लोड करने के लिए बताना होगा ताकि नया प्रभावी हो सके। इनमें से किसी भी तरीके का उपयोग करें (यदि पहला काम नहीं करता है, तो दूसरा चाहिए ... लेकिन पहले पहले प्रयास करें):
स्क्रिप्ट! दरअसल, 2 लिपियों ...
यहाँ पहली स्क्रिप्ट है। चूंकि हमारे द्वारा चलाए जाने वाले कार्यक्रम को जल्दी से पूरा करने की आवश्यकता है, इसलिए यह पृष्ठभूमि में दूसरी स्क्रिप्ट को बंद कर देता है। इसे इसमें डालें /usr/local/sbin/udev-automounter.sh
:
#!/bin/sh
#
# USAGE: usb-automounter.sh DEVICE
# DEVICE is the actual device node at /dev/DEVICE
/usr/local/sbin/udev-auto-mount.sh ${1} &
यहाँ दूसरी स्क्रिप्ट है। यह थोड़ा और इनपुट जाँच करता है। इसे अंदर डालें /usr/local/sbin/udev-auto-mount.sh
। आप नीचे दिए गए विकल्पों को माउंट करना चाहते हैं। यह स्क्रिप्ट अब अपने आप ही विभाजन LABEL ढूंढने का काम करती है; UDEV केवल DEVICE नाम भेजता है।
यदि बूट-टाइम पर ड्राइव माउंट करने में कोई समस्या है , तो आप sleep 60
इस स्क्रिप्ट में एक अच्छा लंबा डाल सकते हैं, सिस्टम को ड्राइव को माउंट करने के प्रयास से पहले सभी तरह से आने के लिए सिस्टम का समय दे सकते हैं।
मैंने टिप्पणियों में एक सुझाव दिया है कि कैसे जांच करें ( ps
यह देखने के लिए कि क्या वेबसर्वर चल रहा है), लेकिन आप इसे अपने सिस्टम के साथ जोड़ना चाहते हैं। मुझे लगता है कि आपके द्वारा उपयोग किए जा रहे अधिकांश नेटवर्क सर्वर इस उद्देश्य के लिए पर्याप्त होंगे - nfsd, smbd, Apache, आदि। जोखिम, निश्चित रूप से, यदि सेवा नहीं चल रही है तो माउंट स्क्रिप्ट विफल हो जाएगी, इसलिए हो सकता है कि कोई परीक्षण कर रहा हो विशेष रूप से फ़ाइल का अस्तित्व एक बेहतर समाधान होगा।
#!/bin/sh
#
# USAGE: udev-auto-mount.sh DEVICE
# DEVICE is the actual device node at /dev/DEVICE
#
# This script takes a device name, looks up the partition label and
# type, creates /media/LABEL and mounts the partition. Mount options
# are hard-coded below.
DEVICE=$1
# check input
if [ -z "$DEVICE" ]; then
exit 1
fi
# test that this device isn't already mounted
device_is_mounted=`grep ${DEVICE} /etc/mtab`
if [ -n "$device_is_mounted" ]; then
echo "error: seems /dev/${DEVICE} is already mounted"
exit 1
fi
# If there's a problem at boot-time, this is where we'd put
# some test to check that we're booting, and then run
# sleep 60
# so the system is ready for the mount below.
#
# An example to experiment with:
# Assume the system is "booted enough" if the HTTPD server is running.
# If it isn't, sleep for half a minute before checking again.
#
# The risk: if the server fails for some reason, this mount script
# will just keep waiting for it to show up. A better solution would
# be to check for some file that exists after the boot process is complete.
#
# HTTPD_UP=`ps -ax | grep httpd | grep -v grep`
# while [ -z "$HTTPD_UP" ]; do
# sleep 30
# HTTPD_UP=`ps -ax | grep httpd | grep -v grep`
# done
# pull in useful variables from vol_id, quote everything Just In Case
eval `/sbin/vol_id /dev/${DEVICE} | sed 's/^/export /; s/=/="/; s/$/"/'`
if [ -z "$ID_FS_LABEL" ] || [ -z "$ID_FS_TYPE" ]; then
echo "error: ID_FS_LABEL is empty! did vol_id break? tried /dev/${DEVICE}"
exit 1
fi
# test mountpoint - it shouldn't exist
if [ ! -e "/media/${ID_FS_LABEL}" ]; then
# make the mountpoint
mkdir "/media/${ID_FS_LABEL}"
# mount the device
#
# If expecting thumbdrives, you probably want
# mount -t auto -o sync,noatime [...]
#
# If drive is VFAT/NFTS, this mounts the filesystem such that all files
# are owned by a std user instead of by root. Change to your user's UID
# (listed in /etc/passwd). You may also want "gid=1000" and/or "umask=022", eg:
# mount -t auto -o uid=1000,gid=1000 [...]
#
#
case "$ID_FS_TYPE" in
vfat) mount -t vfat -o sync,noatime,uid=1000 /dev/${DEVICE} "/media/${ID_FS_LABEL}"
;;
# I like the locale setting for ntfs
ntfs) mount -t auto -o sync,noatime,uid=1000,locale=en_US.UTF-8 /dev/${DEVICE} "/media/${ID_FS_LABEL}"
;;
# ext2/3/4 don't like uid option
ext*) mount -t auto -o sync,noatime /dev/${DEVICE} "/media/${ID_FS_LABEL}"
;;
esac
# all done here, return successful
exit 0
fi
exit 1
सुपर बोनस सफाई स्क्रिप्ट!
एक और स्क्रिप्ट। यह सब करता है डिवाइस को अनमाउंट करें और माउंटपॉइंट निर्देशिकाओं को हटा दें। यह मानता है कि ऐसा करने के लिए उसके पास निजी हैं, इसलिए आपको इसे चलाने की आवश्यकता होगी sudo
। यह स्क्रिप्ट अब कमांडलाइन पर पूर्ण माउंटपॉइंट लेती है, जैसे:
$ /usr/local/sbin/udev-unmounter.sh "/media/My Random Disk"
इसे इसमें डालें /usr/local/sbin/udev-unmounter.sh
:
#!/bin/sh
#
# USAGE: udev-unmounter.sh MOUNTPT
# MOUNTPT is a mountpoint we want to unmount and delete.
MOUNTPT="$1"
if [ -z "$MOUNTPT" ]; then
exit 1
fi
# test mountpoint - it should exist
if [ -e "${MOUNTPT}" ]; then
# very naive; just run and pray
umount -l "${MOUNTPT}" && rmdir "${MOUNTPT}" && exit 0
echo "error: ${MOUNTPT} failed to unmount."
exit 1
fi
echo "error: ${MOUNTPT} does not exist"
exit 1