it-swarm.asia

هل تريد تحميل محركات أقراص خارجية تلقائيًا على / media / LABEL عند التمهيد دون تسجيل دخول مستخدم؟

هذا السؤال مشابه ، لكنه نوع من عكس ما أريد. أريد أن يتم تثبيت محركات أقراص USB الخارجية تلقائيًا عند التمهيد ، دون تسجيل دخول أي شخص ، إلى مواقع مثل /media/<label>.

لا أرغب في إدخال جميع البيانات في fstab ، جزئيًا لأنها مملة ومزعجة ، لكن في الغالب لأنني لا أستطيع التنبؤ بما سأقوم بتوصيله به أو كيف ستتغير الأقسام في المستقبل.

أريد أن تكون محركات الأقراص في متناول أشياء مثل MPD ، ومتاحة عند تسجيل الدخول باستخدام SSH. يبدو أن gnome-mount يقوم فقط بتثبيت الأشياء عند تسجيل الدخول محليًا إلى جلسة Gnome الرسومية.

72
endolith
  • ملاحظة لخادم Ubuntu 11.10: فشل هذا البرنامج النصي على خادم Ubuntu 11.10 بسبب الأمر القديم vol_id. تم استبدال vol_id بواسطة blkid. لإصلاح البرنامج النصي ، استبدل "vol_id" بـ "blkid -o udev" في البرنامج النصي udev-auto-mount.sh.

لقد كنت أضرب رأسي حول هذا لفترة من الوقت الآن ، وأعتقد أنني وجدت حلًا عمليًا. تم تطوير هذا واختباره على نظام قائم على دبيان ، لذلك يجب أن يعمل على أوبونتو. سأشير إلى الافتراضات التي يقدمها حتى يمكن تكييفها مع الأنظمة الأخرى أيضًا.

  • سيقوم تلقائيًا بتركيب محركات أقراص USB على البرنامج المساعد ، ويجب ألا يستغرق الكثير لتتكيف مع Firewire.
  • يستخدم UDEV ، لذلك لا يوجد قرود باستخدام HAL/DeviceKit/GNOME-Anything.
  • يقوم تلقائيًا بإنشاء دليل /media/LABEL لتركيب الجهاز عليه.

  • ومع ذلك ، قد يتداخل مع عدادات تلقائية أخرى ؛ لا أستطيع اختبار ذلك. أتوقع أنه مع تنشيط Gnome-VFS ، قد يحاول الاثنان القيام بالتركيب ... إذا فشل Gnome-VFS في التثبيت ، فقد لا يقوم بتكوين رمز سطح مكتب. يجب أن يكون إلغاء التحميل من Gnome ممكنًا ، ولكنه قد يتطلب gksudo أو ما شابه ذلك.

لم أختبر ذلك عند بدء تشغيل النظام ، لكن السبب الوحيد الذي يجعلني أرى أنه قد لا يعمل هو ما إذا كان يحاول تحميل محرك أقراص USB قبل أن يكون النظام جاهزًا للتركيبات. إذا كان الأمر كذلك ، فستحتاج على الأرجح إلى قرص إضافي واحد إلى البرنامج النصي للتثبيت. (أنا أتحقق من ServerFault لمعرفة ما إذا كان هناك أي نصيحة ، ولكن ليس هناك الكثير من الاهتمام بها.)

إلى ذلك ، ثم.


مراجع UDEV:


الخلفية (UDEV؟ Whuzzat؟)

UDEV هو نظام النواة الساخنة. إنه ما يقوم تلقائيًا بتكوين الأجهزة المناسبة وروابط الجهاز (مثل /dev/disk/by-label/<LABEL>) ، في وقت التمهيد وللأجهزة المضافة أثناء تشغيل النظام.

يتم استخدام D-Bus و HAL لإرسال أحداث الأجهزة إلى المستمعين مثل بيئات سطح المكتب. لذلك عند تسجيل الدخول إلى جنوم وإدخال قرص مضغوط أو توصيل في محرك أقراص USB ، يتبع هذا الحدث هذه السلسلة:

kernel -> udev -> dbus -> hal -> gnome-vfs/nautilus (mount)

والمعزوفة ، يتم تثبيت محرك الأقراص الخاص بك. ولكن في نظام مقطوع الرأس ، لا نريد تسجيل الدخول للحصول على فوائد الحساب التلقائي.

قواعد Udev

نظرًا لأن UDEV يتيح لنا كتابة القواعد وتشغيل البرامج عند إدخال الجهاز ، فهذا اختيار مثالي. سنستفيد من قواعد Debian/Ubuntu الحالية ، والسماح لهم بإعداد رمز /dev/disk/by-label/<LABEL> لنا ، وإضافة قاعدة أخرى ستنشئ الجهاز لنا.

يتم الاحتفاظ بقواعد UDEV في /etc/udev/rules.d/lib/udev/rules.d على Karmic) ، وتتم معالجتها بترتيب رقمي. تتم معالجة أي ملف لا يبدأ برقم بعد الملفات المرقمة. في نظامي ، توجد قواعد HAL في ملف يسمى 90-hal.rules ، لذلك وضعت قواعدي في 89-local.rules بحيث تتم معالجتها قبل أن تصل إلى HAL. في المقام الأول ، تحتاج إلى التأكد من حدوث هذه القواعد بعد 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" لدعم Firewire.

  • إذا كنت تريد أن يكون الجهاز دائمًا مملوكًا لمستخدم معين ، فأضف جملة OWNER="username". إذا كنت تحتاج فقط إلى الملفات التي يملكها مستخدم معين ، فقم بتعديل البرنامج النصي للتثبيت بدلاً من ذلك.

قراءة القاعدة

يؤدي ذلك إلى إضافة برنامج لتشغيله إلى قائمة البرامج للجهاز لتشغيله. تقوم بتعريف أجهزة قسم USB بواسطة <LABEL> ، ثم تقوم بتمرير هذه المعلومات إلى برنامج نصي يقوم بالتركيب. على وجه التحديد ، هذه القاعدة مطابقة:

  1. ENV{ID_FS_LABEL_ENC}=="?*" - متغير بيئة تم تعيينه بواسطة قاعدة نظام سابقة. غير موجود لأنظمة غير ملفات ، ولهذا السبب نتحقق منه. نود في الواقع استخدام ID_FS_LABEL لنقطة التحميل ، لكنني لم أقنع UDEV بالهروب من ذلك بالنسبة لي ، لذلك سنسمح لبرنامج نصي للتركيب بمعالجة ذلك.

    يتم الحصول على هذا ومتغيرات البيئة الأخرى بواسطة udev باستخدام الأمر 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 للحصول على تفاصيل حول رموز التبديل). ثم قم فقط بتوصيل جهاز جديد ومشاهدة الأحداث بالتمرير. (ربما overkill إلا إذا كنت في التفاصيل ذات المستوى المنخفض حقا ...)

إعادة تحميل القواعد

بمجرد التحقق من قراءة القاعدة بشكل صحيح ، يجب عليك إخبار UDEV بإعادة تحميل قواعدها حتى تصبح القاعدة الجديدة سارية المفعول. استخدم أيًا من هذه الطرق (إذا لم تنجح الطريقة الأولى ، فيجب على الثانية ... ولكن حاول أولاً):

  • تشغيل Sudo udevadm control --reload-rules

  • تشغيل 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 فقط يرسل اسم الجهاز.

إذا كانت هناك مشكلة في تركيب محركات الأقراص في وقت التمهيد ، فيمكنك وضع رمز طويل جميل 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
73
quack quixote

أحد الخيارات النهائية التي اقترحها الآخرون حول الشبكة هو ivman ، لكن يبدو أن ذلك يعتمد على pmount ، الذي ذكرته بالفعل لا يعمل. يتم التخلي عن pmount و ivman هو نفسه تقريبًا.

بديل ivman هو halevt ، وهو متوفر في Karmic. إنه إعادة تنفيذ ivman (اقرأ: "صُنع" و "لا يعتمد على pmount"). الحزمة غير متوفرة على Jaunty ، على الرغم من أنك قد تكون قادرًا على بنائها بنفسك إذا كنت لا تخطط للترقية.

كل من هذه الأدوات تقع فوق طبقات DBus و HAL وتستجيب للأحداث منها. من الواضح أن كلاهما يمكن أن يعمل إما كخفي للنظام أو كمدير تحميل لجلسة المستخدم (la Gnome-VFS) - ملفات /etc/defaults/{ivman,halevt} هي المسؤولة عن إعدادات النظام.

فيما يلي بعض الإرشادات من أجل التغيير والتبديل ivman لاستخدام نقاط تحميل /media/<LABEL>. من المحتمل أن halevt لديه طريقة أكثر بساطة للقيام بذلك ، ولكن ربما سيساعدك في العثور على إجابة.


العمل مع HALEVT

التحديث : حرصًا على الحصول على أقراص مضغوطة تلقائية أيضًا ، والتي لا توفرها إجابة UDEV ، نظرت بعمق إلى halevt. لقد وجدت هذا نشر مدونة مما ساعد في شرح الكثير عن هذه العملية. اضطررت إلى تجميع حزمة halevt الخاصة بي لـ Debian Lenny (لحسن الحظ ، كانت جميع التبعيات موجودة في قسم الدعم ليني). بمجرد التثبيت ، كانت العملية في الغالب غير مروعة:

  1. تأكد من تمكين نظام halevt-daemon في /etc/default/halevt
  2. اسمح للمستخدم بإيقاف تشغيل الأجهزة في /etc/PolicyKit/PolicyKit.conf (انظر أدناه ؛ المصدر )
  3. تعديل سياسة HAL لنسخ تسمية وحدة التخزين في نقطة التحميل المفضلة في /etc/hal/fdi/policy/preferences.fdi (انظر أدناه)
  4. إذا كنت تريد دعم CD/DVD ، فاخذ eject.hal script من مدونة المدونة أعلاه ، عدّلها واحفظها في /usr/local/bin.
  5. تعديل تكوين نظام 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 بالفعل رمزًا أساسيًا ، لذا سيتعين عليك تخصيص هذا للاستخدام الخاص بك. في حالتي ، قدّم نظامي بالفعل تصاعد عمليات الإزالة الأساسية ، لكن اضطررت إلى إضافة دعم لتركيب CDROM وزر الإخراج.

يحتوي منشور المدونة الذي ذكرته على تكوين XML مثال جيد للبحث عن تعديلاتك الخاصة. يتعلق الأمر في الغالب بإعداد بديل gnome-mount لبيئة fluxbox الخاصة بالمؤلف ، وبالتالي فإن مثاله XML أكثر مما تريد ، لكنه طريقة رائعة للتعرف على ما يمكنك القيام به. هناك أيضًا بعض الأمثلة الجيدة في /usr/share/doc/halevt/examples.

اضطررت أيضًا إلى تشغيل Sudo sh -c "mkdir /var/halevt ; chown halevt:plugdev /var/halevt" قبل أن يعمل كل شيء.

فيما يلي الإضافات الخاصة بي لجعل CD/DVD يعمل تلقائيًا:

<!-- 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

بمجرد تشغيل النظام ، ستحتاج إلى تعطيله عند تسجيل الدخول إلى جنوم ، وإعادة تشغيله مرة أخرى عند تسجيل الخروج. (راجع إجابتي على هذا السؤال لمديري تسجيل الدخول بخلاف GDM.) هذه الأشياء نظرية نظرًا لأنني لا أستخدمها ، لكن يجب أن تعمل.

في /etc/gdm/PreSession/Default ، أضف هذا لإيقاف النظام halevt-daemon:

/etc/init.d/halevt stop

في /etc/gdm/PostSession/Default ، أضف هذا لإعادة تشغيل النظام halevt-daemon:

/etc/init.d/halevt start
9
quack quixote

مع مرور الوقت ، تظهر حلول أسهل.

يعتمد هذا الحل على حزمة برامج udevil التي تمت كتابتها لهذا الغرض ولا تتطلب أي ترقيع مع قواعد udev. من المفضل (للمستخدمين الجدد والقدامى) كحل مباشر.

النص devmon من udevil يقوم بكل السحر بينما يعتمد فقط على udev و glib. يعمل تقريبا خارج الصندوق دون الحاجة إلى التكوين الأولي.

كل ما قمت به على محطة العمل الخاصة بي هو الاتصال بـ devmon من rc.local مثل هذا:
devmon 2>&1 >> /var/log/devmon &
لراحتك ، قد ترغب في تضمين هذا في برنامج نصي بدلاً من rc.local باستخدام أداة تلقائية مثل pleaserun لإنشائها: https://unix.stackexchange.com/أ/124609/42673

بعد تشغيله ، يتم فحص السعة التخزينية التي أقوم بتوصيلها (يبحث عن أقسام وإذا تم العثور عليه ينظر إلى علامات نظام الملفات الخاصة به) ثم يتم تثبيته في /media/FILESYSTEM_LABEL.
لا يمكن أن نتخيل شيئًا أكثر بساطة من ذلك باستثناء ربما أن (في) systemd الشهير لدمج هذه الوظيفة في مرحلة ما في المستقبل.

udevil At A Glance ( github.io/udevil )
البرنامج النصي: devmon ( igurublog/script-devmon )

6
Costin Gușă

بالنسبة للأنظمة المستندة إلى دبيان (مثل Ubuntu وغيرها) ، هناك حزمة usbmount تقوم تلقائيًا بحمل محركات أقراص USB لك. يستخدم بشكل أساسي نهجًا يعتمد على udev كما هو محدد بالفعل - إنه مجرد تثبيت حزمة بسيط. يبدو أن مؤلف الحزمة الأصلي قد نفد من Steam ولكن Ubuntu/Debian لا يزال يبدو أنه يحتفظ بها (أعتقد أنها ليست بهذا التعقيد) - لذلك لا يزال متوفراً في آخر إصدار إطلاق.

يمكن تكوين البرامج النصية المثبتة (/etc/usbmount/usbmount.conf) لتوفير نقاط التحميل المناسبة.

3
Pierz

لا تعمل إجابة quack quixote على Ubuntu Lucid Lynx (10.04) - لا يوجد أمر /sbin/vol_id.

بدلاً من أن تكون خياليًا واستخدام udev ، ضع هذا في /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
3
mrm

للتخلص من الإرشادات الممتازة للإزالة qu quecote:

أضف السطر التالي إلى ملف قاعدة udev الذي قمت بإنشائه مسبقًا (/etc/udev/rules.d) "

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

قم بعد ذلك بإنشاء البرنامج النصي التالي و chmod القابل للتنفيذ (/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.

3
chotchki

قد ترغب في تجربة Pysdm

2
Sathyajith Bhat

يمكنك محاولة وضع su username -c gnome-volume-manager في/etc/rc.local. قد يكون كافياً ببساطة تشغيل مدير gnome-volume-manager.

تحرير: يبدو أن gnome-volume-manager لم يعد جزءًا من التوزيع الافتراضي ، حتى على سطح مكتب Ubuntu.

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 ، التي تفعل ما تريد ، ولكن ربما تتداخل مع عملية التثبيت التلقائي العادية.

2
Ryan Thompson

تم رفض الإضافات التي تم تعديلها للحل الذي يستند إلى udev من quackote ، لذا سأضعها هنا. يرجى الرجوع إلى منصبه أولا.

أولاً وقبل كل شيء ، إذا كنت تريد أن تعمل قاعدة udev عندما يكون أي جهاز متصلًا عبر النظام الفرعي SCSI (والذي يتضمن كلاً من USB و FireWire و eSATA) ، قم بتغيير مطابقة SUBSYSTEMS في قاعدة udev إلى SUBSYSTEMS=="scsi".

ومع ذلك ، ضع في اعتبارك أن هذا سيؤدي تلقائيًا إلى تثبيت أي شيء إلى حد كبير ، بما في ذلك محركات الأقراص الداخلية إذا قمت بربطها أثناء تشغيل النظام ، لذلك قد لا يكون ما تريده.

ثانيًا ، إليك النص الذي أستخدمه والذي يحل محل جميع النصوص الموجودة في هذا المنشور. كما أنه يقوم تلقائيًا بتنظيف نقاط التحميل التي تم إنشاؤها في/media/بمجرد إزالة جهاز الكتلة المثبتة - لا حاجة للتدخل اليدوي. علاوة على ذلك ، بدلاً من استدعاء برنامج نصي مختلف لتشغيله في الخلفية ، فإنه يضع نفسه في الخلفية عندما لا يتم تنفيذه من جهاز طرفي (على سبيل المثال عند تنفيذه عبر udev).

يستخدم inotifywait للانتظار حتى يختفي الجهاز الذي تم تحميله ، ثم يزيل الدليل الذي أنشأه. لذلك ، تحتاج إلى تثبيت أدوات inotify على نظامك. في التوزيعات المستندة إلى دبيان (بما في ذلك Ubuntu) ، يجب أن يكون 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>. تحرير لتناسب احتياجاتك :)

1
DanielSmedegaardBuus

حاول التكوين عبر mountmanager ، حتى لا تضطر إلى إدخال البيانات يدويًا.

يجب أن يكون جزءًا من مستودع أوبونتو.

1
Abhinav