उपयोगकर्ता द्वारा लॉग इन किए बिना बूट पर स्वचालित रूप से / मीडिया / LABEL पर बाहरी ड्राइव माउंट करें?


73

यह प्रश्न समान है, लेकिन जैसा मैं चाहता हूं उसके विपरीत। मैं चाहता हूं कि बाहरी USB ड्राइव को बूट पर स्वचालित रूप से माउंट किया जाए, बिना किसी लॉग इन के जैसे स्थानों पर /media/<label>

मैं नहीं चाहता कि सभी डेटा को fstab में, आंशिक रूप से दर्ज किया जाए क्योंकि यह थकाऊ और कष्टप्रद है, लेकिन ज्यादातर इसलिए कि मैं भविष्यवाणी नहीं कर सकता कि मैं इसमें क्या कर रहा हूँ या भविष्य में विभाजन कैसे बदलेंगे।

मैं चाहता हूं कि ड्राइव एमपीडी जैसी चीजों के लिए सुलभ हो , और जब मैं एसएसएच के साथ लॉग इन करता हूं तो उपलब्ध हो। gnome-mountजब आप स्थानीय रूप से एक गनोम ग्राफ़िकल सत्र में लॉग इन होते हैं, तो केवल चीजों को माउंट करने के लिए लगता है।


4
महान प्रश्न, काश मेरे पास आपके लिए एक उत्तर होता, अब मैं उत्सुक हूं कि यह कैसे हल किया जाता है।
पलटना

1
मैंने अपना उत्तर अपडेट कर दिया।
रयान थॉम्पसन

1
और मैं, रिकॉर्ड के लिए, Gnome को स्थापित करने में कोई समस्या नहीं है, जैसा कि मैं पहले से ही कर रहा हूं, लेकिन हेडलेस GUI- कम सर्वर के लिए एक समाधान सबसे अच्छा होगा।
एंडोलिथ

1
ARRRGHH ... मेरे जवाब में बग। RUN में। /usr/local/sbin/udev-automounter.sh mount %kहोना चाहिए /usr/local/sbin/udev-automounter.sh %k। माफ़ करना।
क्वैक कोटे

1
ठीक है, अपडेट -3 के रूप में, यह रिक्त स्थान के साथ काम करता है। यह <LABEL> के "एन्कोडेड" संस्करण का उपयोग करके ऐसा करता है जो रिक्त स्थान को धर्मान्तरित करता है \x20। तो यह सुंदर नहीं है, लेकिन यह काम करेगा। udv लेबल के साथ रिक्त स्थान को अच्छी तरह से संभाल नहीं कर रहा है, लेकिन एक और विकल्प है जो अंडरस्कोर का उपयोग करता है बजाय \x20's (इसलिए यह कम से कम अच्छा दिखता है)। ऐसा लगता है कि अंतरिक्ष-हैंडलिंग को गोले में जाना पड़ता है।
क्वैक क्विटोटे

जवाबों:


74
  • उबंटू सर्वर 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.ruleslocal.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>, फिर इस जानकारी को माउंट करने वाली स्क्रिप्ट में भेजता है। विशेष रूप से, यह नियम मेल खा रहा है:

  1. 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
    
  2. ACTION=="add"- केवल मैच की addघटनाओं ...

  3. SUBSYSTEMS=="usb"- केवल उन डिवाइस से मिलान करें जो USB बस में हैं। हम SUBSYSTEMSयहां उपयोग करते हैं क्योंकि यह हमारे डिवाइस के माता-पिता के खिलाफ मेल खाता है; जिस डिवाइस में हम रुचि रखते हैं, वह वास्तव में SUBSYSTEM == "scsi" होगी। एक मूल USB डिवाइस के खिलाफ मिलान हमारे प्रोग्राम को आंतरिक ड्राइव में जोड़ने से बचता है।

  4. 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 को अपने नियमों को फिर से लोड करने के लिए बताना होगा ताकि नया प्रभावी हो सके। इनमें से किसी भी तरीके का उपयोग करें (यदि पहला काम नहीं करता है, तो दूसरा चाहिए ... लेकिन पहले पहले प्रयास करें):

  • Daud sudo udevadm control --reload-rules

  • Daud sudo /etc/init.d/udev reload

  • रिबूट


स्क्रिप्ट! दरअसल, 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

3
तुम महान हो! :)
kolypto

1
अगर मैं ऑटो- mount.sh चलाऊं तो यह काम करता है, लेकिन अगर मैं ड्राइव में प्लग करता हूं, तो बूट पर नहीं। : /
एंडोलिथ

इसलिए समस्या UDEV नियमों के साथ है। lemme उस अनुभाग का विस्तार करता है जिससे आपको डीबग करने में मदद मिलेगी।
क्विकोट क्विकोट करें

3
मैंने
जीथब

1
संदर्भ: udev_237 - आदमी udev (Ubuntu_18.04) ध्यान दें कि ऐसे प्रोग्राम जो नेटवर्क या माउंट / अनमाउंट फाइल सिस्टम को एक्सेस करते हैं, उन्हें udv नियमों के अंदर अनुमति नहीं दी जाती है , क्योंकि सिस्टम-udevd.service पर लागू होने वाले डिफ़ॉल्ट सैंडबॉक्स के कारण स्रोत: unix.stackexchange.com/questions/200194/... एक समाधान के लिए, पर एक नजर है serverfault.com/questions/766506/...
प्रो बैकअप

9

एक अंतिम विकल्प जो दूसरों ने नेट के आसपास सुझाया है ivman, लेकिन यह निर्भर करता है pmount, जो आपने पहले ही कहा था कि काम नहीं करता है। pmountछोड़ दिया है और ivmanलगभग एक ही है।

के लिए प्रतिस्थापन ivmanहै halevt, और यह कर्मिक में उपलब्ध है। यह ivman(पढ़ें: "बनाए रखा गया" और "pmount पर निर्भर नहीं करता है") का पुन: कार्यान्वयन है। पैकेज Jaunty पर उपलब्ध नहीं है, हालाँकि आप इसे स्वयं बनाने में सक्षम हो सकते हैं यदि आप अपग्रेड करने की योजना नहीं बना रहे हैं।

ये दोनों उपकरण डीबस और एचएएल परतों के ऊपर बैठते हैं और उनसे घटनाओं का जवाब देते हैं। जाहिरा तौर पर दोनों एक सिस्टम डेमॉन के रूप में या उपयोगकर्ता-सत्र माउंट मैनेजर (एक ला ग्नोम-वीएफएस) के रूप में चला /etc/defaults/{ivman,halevt}सकते हैं - फाइलें सिस्टम सेटिंग्स के प्रभारी हैं।

यहां माउंटपॉइंट ivmanका उपयोग करने के लिए कुछ निर्देश दिए गए हैं /media/<LABEL>। यह संभावना है कि ऐसा करने का halevtएक सरल तरीका है, लेकिन शायद वे आपको उत्तर खोजने में मदद करेंगे।


HALEVT के साथ काम करना

अद्यतन : ऑटोमैटिक सीडी mounts प्राप्त करने के हित में, जो कि मेरा UDEV उत्तर प्रदान नहीं करता है, मैंने गहराई से देखा halevt। मुझे यह ब्लॉग पोस्ट मिला जिसने प्रक्रिया के बारे में बहुत कुछ समझाने में मदद की। मुझे halevtडेबियन लेनी के लिए अपने स्वयं के पैकेज को संकलित करना पड़ा (सौभाग्य से सभी निर्भरताएं लेन-बैकपोर्ट अनुभाग में थीं)। एक बार स्थापित होने के बाद, प्रक्रिया ज्यादातर भयानक नहीं थी:

  1. सुनिश्चित करें कि सिस्टम हैलट-डेमॉन सक्षम है /etc/default/halevt
  2. सिस्टम को उपयोगकर्ता को डिवाइस माउंट करने की अनुमति दें /etc/PolicyKit/PolicyKit.conf(नीचे देखें; स्रोत )
  3. वॉल्यूम लेबल को पसंदीदा माउंटपॉइंट में कॉपी करने के लिए HAL पॉलिसी को संशोधित करें /etc/hal/fdi/policy/preferences.fdi(नीचे देखें)
  4. यदि आप सीडी / डीवीडी का समर्थन चाहते हैं, तो उपरोक्त ब्लॉगपोस्ट से eject.halस्क्रिप्ट को पकड़ो , संशोधित करें और इसमें सहेजें /usr/local/bin
  5. Mounts को सक्षम करने के लिए halevt सिस्टम कॉन्फिगर को संशोधित करें /etc/halevt/halevt.xml
  6. सिस्टम लॉग-इन को रोकने के लिए अपने लॉगिन प्रबंधक के पूर्व और बाद के सत्र की स्क्रिप्ट में कोड जोड़ें जब कोई लॉग ऑन करता है, और जब वे लॉग ऑफ करते हैं तो इसे पुनः आरंभ करें।

यदि आपको अपने नए कॉन्फ़िगरेशन की जांच करने के लिए HAL और HALEVT डेमॉन को पुनरारंभ करने की आवश्यकता है, तो उन्हें सही क्रम में प्राप्त करने के लिए इसका उपयोग करें:

sudo sh -c "/etc/init.d/halevt stop ; /etc/init.d/hal restart ; /etc/init.d/halevt start"

चरण 1

जाँच करें कि START_DAEMON=yesमें /etc/default/halevt

चरण 2

इसमें /etc/PolicyKit/PolicyKit.conf, इसे अनुभाग के अंदर जोड़ें <config></config>:

<match action="org.freedesktop.hal.storage.mount-removable">
   <match user="halevt">
      <return result="yes"/>
   </match>
</match>

चरण 3

इसमें /etc/hal/fdi/policy/preferences.fdi, `अनुभाग के अंदर जोड़ें :

<match key="volume.label" empty="false">
    <match key="volume.label" is_absolute_path="false">
        <merge key="volume.policy.desired_mount_point" type="copy_property">volume.label</merge>
    </match>
</match>

चरण 4

स्क्रिप्ट अच्छी है लेकिन उसे चलाने की जरूरत है /bin/bash; कुछ सिस्टम वास्तव में उपयोग /bin/dashकिया /bin/shजाता है जब कहा जाता है। इसलिए स्क्रिप्ट में शीर्ष पंक्ति को बदलकर सुनिश्चित करें कि आपको सही मिल रहा है:

#!/bin/sh         <------ old first line

#!/bin/bash       <------ new first line

चरण 5

यह मौजमस्ती वाला भाग है। आपका सिस्टम /etc/halevt/halevt.xmlपहले से ही एक मूल प्रदान कर सकता है , इसलिए आपको इसे अपने स्वयं के उपयोग के लिए दर्जी करना होगा। मेरे मामले में, मेरे सिस्टम ने पहले से ही बुनियादी रिमार्बल्स बढ़ते प्रदान किए थे, लेकिन मुझे सीडीरॉम माउंटिंग और इजेक्ट बटन के लिए समर्थन जोड़ना था।

मैंने जिस ब्लॉग पोस्ट का उल्लेख किया है, उसमें आपके स्वयं के ट्वीक देखने के लिए एक अच्छा उदाहरण XML कॉन्फ़िगरेशन है। यह ज्यादातर लेखक के fluxboxपर्यावरण के लिए एक गनोम-माउंट प्रतिस्थापन स्थापित करने के बारे में है, इसलिए उसका उदाहरण XML आप चाहते हैं की तुलना में अधिक करता है, लेकिन यह एक शानदार तरीका है कि आप क्या कर सकते हैं। में भी कुछ अच्छे उदाहरण हैं /usr/share/doc/halevt/examples

मुझे भी sudo sh -c "mkdir /var/halevt ; chown halevt:plugdev /var/halevt"सबकुछ चलाने से पहले काम करना होगा।

यहां सीडी / डीवीडी काम को स्वचालित करने के लिए मेरे अतिरिक्त हैं:

<!-- CD/DVD mount -->
<halevt:Device match="hal.block.device &amp; hal.block.is_volume = true  &amp; hal.volume.is_disc = true &amp; hal.volume.disc.has_data = true">
   <halevt:Property name="hal.volume.is_mounted">
      <halevt:Action value="true" exec="halevt-mount -u $hal.udi$ -p $hal.volume.policy.desired_mount_point$ -m 002"/>
   </halevt:Property>
</halevt:Device>

<!-- CD/DVD eject button support -->
<halevt:Device match="hal.storage.drive_type = cdrom">
   <halevt:Condition name="EjectPressed" exec='/usr/local/bin/eject.hal $hal.block.device$'/>
</halevt:Device>

चरण 6

एक बार जब आप सिस्टम हाईलेवल-डेमन काम कर रहे होते हैं, तो आपको GNOME में प्रवेश करते समय इसे निष्क्रिय करना होगा, और जब आप लॉग आउट करेंगे तब इसे फिर से शुरू करेंगे। ( गैर-जीडीएम लॉगिन प्रबंधकों के लिए इस सवाल का मेरा जवाब देखें ।) यह सामान सैद्धांतिक है क्योंकि मैं इसका उपयोग नहीं करता, लेकिन यह काम करना चाहिए।

में /etc/gdm/PreSession/Default, इस ऐड प्रणाली halevt-डेमॉन को रोकने के लिए:

/etc/init.d/halevt stop

इसमें /etc/gdm/PostSession/Default, सिस्टम halevt-daemon को पुनरारंभ करने के लिए इसे जोड़ें:

/etc/init.d/halevt start

3
2013 में इसे पढ़ने वाले लोगों के लिए, उन्हें अब पता होना चाहिए कि एचएएल को पदावनत कर दिया गया है, और उन्हें udv आधारित समाधानों का सहारा लेना चाहिए जैसे कि ऊपर दिए गए एक क्वैक क्विक्सोट।
ऑलिगॉफ्रेन

6

जैसे-जैसे समय बीतता है, आसान समाधान दिखाई देते हैं।

यह समाधान udevil सॉफ़्टवेयर पैकेज पर निर्भर करता है जो इस उद्देश्य के लिए लिखा गया था और उसे udv नियमों के साथ कोई छेड़छाड़ करने की आवश्यकता नहीं थी। यह सीधे-सीधे समाधान के रूप में (नए और पुराने उपयोगकर्ताओं के लिए) बेहतर है।

devmonUdvil की स्क्रिप्ट सभी जादू करती है जबकि केवल udv और glib पर निर्भर करती है। प्रारंभिक कॉन्फ़िगरेशन की आवश्यकता के बिना लगभग बॉक्स से बाहर काम करता है।

मैंने अपने कार्य केंद्र पर जो कुछ भी किया है rc.local, वह इस तरह से कॉल करने के लिए किया गया था :
devmon 2>&1 >> /var/log/devmon &
अपने आराम के लिए आप इसे बनाने के लिए rc.localएक स्वचालित टूल का उपयोग करने के बजाय इसे एक इनिट स्क्रिप्ट में एम्बेड करना चाह सकते हैं pleaserun: https://unix.stackexchange.com/ एक / १,२४,६०९ / +४२६७३

इसे चलाने के बाद, मेरे द्वारा प्लग किए गए स्टोरेज का निरीक्षण किया जाता है (यह विभाजनों की तलाश करता है और यदि उनके फाइलसिस्टम लेबलों में पाया जाता है) तो उसमें चढ़ जाता है /media/FILESYSTEM_LABEL
भविष्य में कुछ बिंदु पर इस कार्यक्षमता को शामिल करने के लिए शायद सिवाय इसके कि (इन) प्रसिद्ध प्रणाली को छोड़कर कुछ भी सरल की कल्पना नहीं कर सकता है।

udevil At A Glance ( github.io/udevil )
स्क्रिप्ट: devmon ( igurublog / script-devmon )


3

quack quixote का जवाब Ubuntu Lucid Lynx (10.04) पर काम नहीं करता है - कोई /sbin/vol_idआदेश नहीं है ।

फैंसी होने और udv का उपयोग करने के बजाय, इसे अपने /etc/rc.local में डालें और किया जाए:

for dev in $(ls -1 /dev/disk/by-label/* | grep -v EFI) ; do
  label=$(basename $dev)
  mkdir -p /media/$label
  $(mount | grep -q /media/$label) || mount $dev /media/$label
done

1
धन्यवाद .. मैं जो पूरा करना चाहता था, उसके लिए यह सबसे सरल तरीका था। यहां तक ​​कि उबंटू सर्वर 16 पर एक ntfs वॉल्यूम के साथ काम किया
क्रिसप्राइम

3

डेबियन आधारित सिस्टम (जैसे उबंटू आदि) के लिए usbmount पैकेज है जो स्वचालित रूप से आपके लिए USB ड्राइव को माउंट करता है। यह मूल रूप से पहले से उल्लिखित एक udv आधारित दृष्टिकोण का उपयोग करता है - केवल यह केवल एक साधारण पैकेज स्थापित है। ऐसा लगता है कि पैकेज का मूल लेखक भाप से बाहर चला गया है, लेकिन उबंटू / डेबियन अभी भी इसे बनाए रखने के लिए प्रकट होता है (मुझे लगता है कि यह उतना जटिल नहीं है) - इसलिए यह अभी भी नवीनतम रिलीज में उपलब्ध है।

स्थापित स्क्रिप्ट को उचित माउंट पॉइंट प्रदान करने के लिए (/etc/usbmount/usbmount.conf) कॉन्फ़िगर किया जा सकता है।


1
Usbmount तब तक लेबल द्वारा माउंट नहीं किया जा सकता, जब तक कि आप कॉन्फ़िगरेशन फ़ाइल में लेबल की सूची नहीं भरते।
गाइल्स

1
यदि आप किसी सूची को बनाए रखने के बिना usbmount में बढ़ते लेबल को जोड़ना चाहते हैं, तो esite.ch/2014/04/11/… पोस्ट देखें ।
ओलिवर सउडर

3

हटाने के लिए क्विकोट क्विक्सोट के उत्कृष्ट निर्देशों को वापस करने के लिए:

निम्न पंक्ति को उस udv नियम फ़ाइल में जोड़ें जिसे आपने पहले बनाया था (/etc/udev/rules.d) "

ENV{ID_FS_LABEL_ENC}=="?*",   ACTION=="remove",      SUBSYSTEMS=="usb", \
         RUN+="/usr/local/sbin/udev-autounmounter.sh %k"

अगला निम्नलिखित स्क्रिप्ट बनाएं और इसे निम्नलिखित सामग्रियों के साथ निष्पादन योग्य (/usr/local/sbin/udev-autounmounter.sh) चेंबोड करें:

#!/bin/sh
#
# USAGE: usb-autounmounter.sh DEVICE 
#   DEVICE   is the actual device node at /dev/DEVICE

/usr/local/sbin/udev-auto-unmount.sh ${1} &

अंत में स्वयं अनमाउंट स्क्रिप्ट (udev-auto-unmount.sh):

#!/bin/sh
#
# USAGE: udev-auto-unmount.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 the device is already mounted
MOUNTPT=`mount | grep ${DEVICE} | cut -d ' ' -f 3`
if [ -z "${MOUNTPT}" ]; then
   echo "error: the device is not already mounted"
   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

इसलिए अन्य निर्देशों के साथ, udev घटनाओं पर निर्देशिका स्वतः दिखाई और गायब हो जाएगी।


मुझे लगता if [ -n "$device_is_mounted" ]; thenहै if [ -z "${MOUNTPT}" ]; then, यह नहीं होना चाहिए?
1929

2

आप Pysdm को आज़माना चाहते हैं


यह सिर्फ एक और fstab संपादक है, है ना?
एंडोलिथ

हाँ, पर "यह भी भंडारण उपकरणों की गतिशील विन्यास के लिए udev नियम बना सकते हैं"
Sathyajith भट्ट

क्या "udv के नियमों का निर्माण" किसी तरह मेरी मदद करेगा? मुझे नहीं पता कि इसका क्या मतलब है। क्या यह पहले से अज्ञात हटाने योग्य डिवाइसों को माउंट करता है, बिना उपयोगकर्ता स्थानीय रूप से लॉग इन किए?
21

क्षमा करें, मुझे udv नियमों पर कोई भी सुराग नहीं है। आप पर एक नज़र हो सकता था fredericiana.com/2006/03/15/writing-udev-rules-short-notes और reactivated.net/writing_udev_rules.html
Sathyajith भट्ट

2

आप su username -c gnome-volume-manager/etc/rc.local में डालने का प्रयास कर सकते हैं । यह केवल सूक्ति-मात्रा-प्रबंधक चलाने के लिए पर्याप्त हो सकता है।

संपादित करें: ऐसा लगता है कि गनोम-वॉल्यूम-प्रबंधक डिफ़ॉल्ट वितरण का हिस्सा नहीं है, यहां तक ​​कि उबंटू डेस्कटॉप पर भी।

wajig policy  gnome-volume-manager
gnome-volume-manager:
  Installed: (none)
  Candidate: 2.24.0-0ubuntu1
  Version table:
     2.24.0-0ubuntu1 0
        500 http://ubuntu.secs.oakland.edu jaunty/universe Packages

हालाँकि, यदि आप इसे स्थापित करते हैं, तो भी यह काम करेगा। यह आजमाने के काबिल है। यदि यह काम नहीं करता है, तो इसे फिर से निकालें।

usbmountपैकेज भी है , जो आप चाहते हैं, लेकिन संभवतः सामान्य ऑटोमाउंटिंग में हस्तक्षेप कर सकता है।


अज्ञात कमांड "सूक्ति-मात्रा-प्रबंधक"। मैं उबुन्टु जयंती में हूँ।
एंडोलिथ

एक / usr / lib / gnome-volume-manager / gnome-volume-manager है, लेकिन यह कुछ भी नहीं करता है।
एंडोलिथ

ओह मैं समझा। एक पैकेज भी है, जिसे सूक्ति-मात्रा-प्रबंधक कहा जाता है। संबंधित: crunchbanglinux.org/forums/topic/239/…
एंडोलिथ

ऐसा लगता है कि gnome-volume-manager चीजों को माउंट करने के लिए HAL का उपयोग करता है? और "2009 तक, एचएएल डिवाइसकिट के पक्ष में पदावनत होने की प्रक्रिया में है।" लिनक्स में सब कुछ हमेशा ऐसा क्यों होता है? वे बस लगभग सही काम करना शुरू कर देते हैं और फिर वे इसे बाहर निकाल देते हैं और इसे कुछ नया काम नहीं करते हैं।
1

pmount भी अब काम नहीं करता है। > pmount / dev / disk / by-label / STORAGE त्रुटि: डिवाइस / dev / sdc1 हटाने योग्य नहीं है togaware.com/linux/survivor/Using_Gnome_Volume_Manager.html
endolith

2

क्वैक क्विक्सोट के udv- आधारित समाधान के लिए मेरे संपादित परिशिष्टों को अस्वीकार कर दिया गया था, इसलिए मैं उन्हें यहां रखने जा रहा हूं। कृपया पहले उनकी पोस्ट देखें।

सबसे पहले, यदि आप चाहते हैं कि आपका udv नियम कार्य करे जब कोई भी उपकरण SCSI सबसिस्टम (जिसमें USB, फायरवायर और eSATA दोनों शामिल हैं) के माध्यम से जुड़ा हुआ है, तो SUBSYSTEMS मैच को udv नियम में बदल दें SUBSYSTEMS=="scsi"

हालांकि, ध्यान रखें कि यह स्वचालित रूप से आंतरिक ड्राइव सहित बहुत कुछ माउंट करेगा, यदि आप सिस्टम चालू करते समय उन्हें हॉटप्लग करते हैं, तो यह वह नहीं हो सकता है जो आप चाहते हैं।

दूसरे, यहां वह स्क्रिप्ट है जिसका मैं उपयोग कर रहा हूं, जो उस पोस्ट की सभी स्क्रिप्टों को बदल देता है। यह स्वचालित रूप से माउंट किए गए माउंटपॉइंट / मीडिया / जैसे ही माउंट किए गए ब्लॉक डिवाइस को हटा दिया जाता है - मैन्युअल हस्तक्षेप की कोई आवश्यकता नहीं है। इसके अलावा, पृष्ठभूमि में चलने के लिए एक अलग स्क्रिप्ट को कॉल करने के बजाय, यह खुद को पृष्ठभूमि में रखता है जब इसे टर्मिनल से निष्पादित नहीं किया जाता है (जैसे जब udev के माध्यम से निष्पादित किया जाता है)।

यह डिवाइस को गायब होने तक प्रतीक्षा करने के लिए inotifywait का उपयोग करता है जो गायब हो गया था, और फिर इसे बनाई गई निर्देशिका को हटा देता है। इसलिए, आपको अपने सिस्टम पर इनोटिफ़ाइ-टूल्स लगाने होंगे। डेबियन-आधारित डिस्ट्रोस (उबंटू सहित) पर, sudo apt-get install inotify-toolsपर्याप्त होना चाहिए।

#!/bin/bash
#
# Auto-mounter script, to be executed by udev on the addition of a
# mass storage device.
#
# Takes one argument; the base block device partition, e.g. "sdb3".
#
# Creates a mountpoint for the partition using its FS label, in
# /media/{fslabel} and mounts it there, read-only, unsynced.
#
# If the filesystem has no label, "Untitled" is used instead.
#
# If another filesystem is already mounted at that location, the
# newcomer will be mounted with an integer number appended to its
# label.

MOUNT_OPTS="ro,noatime,nodiratime"



# If we're called from a non-tty and not explicitly told to continue,
# we call ourselves in a subshell and thus return immediately (udev
# gets impatient):
if [[ "$2" != "backgrounded" ]] && ! tty &> /dev/null; then
    ($0 $1 backgrounded &)
    exit
fi



# Determine the desired mountpoint from the label of the fs on the partition:
MOUNTPOINT="/media/$(blkid /dev/$1 | grep LABEL | sed -E 's:^.+LABEL="([^"]+).+:\1:')"

# If it had no label, use "Untitled":
[[ "$MOUNTPOINT" = "/media/" ]] && MOUNTPOINT="/media/Untitled"

# If something's already mounted there, append a number:
if [[ -e "$MOUNTPOINT" ]] && mountpoint "$MOUNTPOINT" &> /dev/null; then
    NUM=1
    while mountpoint "$MOUNTPOINT $NUM" &> /dev/null; do NUM=$((NUM+1)); done
    MOUNTPOINT="$MOUNTPOINT $NUM"
fi

# Create the mountpoint and mount there:
mkdir "$MOUNTPOINT" && mount -o $MOUNT_OPTS /dev/$1 "$MOUNTPOINT"



# Wait until the device is removed (the block device is "deleted"):
inotifywait -e delete /dev/$1

# Then clean up. If it fails, retry every second for up to 5 mins:
TRIES=0
while [[ -e "$MOUNTPOINT" ]] && [[ $TRIES -lt 300 ]]; do
    rmdir "$MOUNTPOINT"
    sleep 1s
    TRIES=$((TRIES+1))
done

आप ध्यान दें कि मैं उपकरणों को बिना सिंक के, और केवल-पढ़ने के लिए माउंट करता हूं। ऐसा इसलिए है क्योंकि 99% समय, मेरा उपयोग मामला बाहरी ड्राइव से पढ़ रहा है, और जब भी मुझे इसे लिखने की आवश्यकता होती है, मैं वैसे भी सर्वर पर सक्रिय रहने वाला हूं, और आसानी से एक mount -o remount,rw <mountpoint>कमांड जारी कर सकता हूं । अपनी आवश्यकताओं के अनुरूप संपादित करें :)


आप इस स्क्रिप्ट को कैसे चलाते हैं? आधुनिक संस्करणों के लिए halevtएक मौजूदा apt-getसक्षम पैकेज नहीं लगता है ।
Campbeln

अघ ... शायद अगर मैं क्वैक क्विकोट के टॉप / एक्सेप्टेड आंसर एंट्री का पालन करूँ ... तो फिर भी यहाँ फुलर उत्तर देना अच्छा
रहेगा

1

पर्वतारोही के माध्यम से कॉन्फ़िगर करने का प्रयास करें, ताकि आपको मैन्युअल रूप से डेटा दर्ज न करना पड़े।

यह उबंटू भंडार का एक हिस्सा होना चाहिए।


आपको इसे प्राप्त करने के लिए ब्रह्मांड अनुभाग को सक्षम करने की आवश्यकता होगी।
क्वैक

उपयुक्त: पर्वतारोही; खंड = ब्रह्मांड;)
अंत्योदय

यह सिर्फ मेरे लिए एक fstab स्थापित करने के लिए जा रहा है?
एंडोलिथ

@endolith: उपयुक्त नहीं होगा: ब्रह्मांड? स्थापित करें = पर्वतारोही अधिक तार्किक होगा? ;)
बॉबी

क्या वह प्रारूप काम करता है? यह इतना कहना नहीं है आदमी पेज में manpages.ubuntu.com/manpages/karmic/en/man8/apturl.8.html
endolith

-5

यदि आपके पास एक समय में केवल एक ही ड्राइव है, तो आप बस इसे अपनी /etc/fstabफ़ाइल में संपादित कर सकते हैं । की तर्ज पर कुछ:

/dev/sdb1     /mnt/usbdrive     ext3     defaults 0   0

इसे बूट पर माउंट करना चाहिए, और इसे परमिट वाले किसी के लिए भी सुलभ बनाना चाहिए। यदि आपके पास एक से अधिक ड्राइव हैं, तो आप इसके साथ भी कर सकते हैं:

/dev/sdb1     /mnt/usbdrive1     ext3     defaults 0   0
/dev/sdc1     /mnt/usbdrive2     ext3     defaults 0   0

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