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


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

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

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


68
2017-10-11 18:13


الأصل


سؤال كبير ، أتمنى لو كان لدي إجابة لك ، الآن أشعر بالفضول كيف يتم حل هذا. - invert
لقد قمت بتحديث إجابتي. - Ryan Thompson
وأنا ، للسجل ، ليس لدي مشكلة مع تثبيت Gnome ، كما أفعل بالفعل ، ولكن الحل لخوادم بدون واجهة المستخدم الرسومية أقل يكون أفضل. - endolith
ARRRGHH ... خلل في جوابي. في الجري. /usr/local/sbin/udev-automounter.sh mount %k يجب ان يكون /usr/local/sbin/udev-automounter.sh %k. آسف. - quack quixote
حسنًا ، بدءًا من Update-3 ، يعمل مع المساحات. يفعل ذلك عن طريق استخدام إصدار "مشفر" من <LABEL> الذي يحول المساحات إلى \x20الصورة. لذا فهي ليست جميلة ، لكنها ستنجح. لا يقوم udev بالتعامل مع التسميات ذات المسافات بشكل جيد ، ولكن هناك خيار آخر يستخدم الشرطات السفلية بدلاً من \x20(لذلك يبدو على الأقل لطيف). يبدو أن التعامل مع الفضاء يجب أن يدخل في shellscripts. - quack quixote


الأجوبة:


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

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

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

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

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

إلى ذلك ، ثم.


مراجع UDEV:


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

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

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

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

بمجرد التحقق من قراءة القاعدة بشكل صحيح ، يجب إخبار 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

سوبر البرنامج النصي مكافأة التطهير!

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

70
2017-11-03 12:38



أنت رائع! :) - kolypto
إذا قمت بتشغيل auto-mount.sh يدويا يعمل ، ولكن ليس إذا قمت بتوصيل محرك أقراص ، وليس على التمهيد. : / - endolith
وبالتالي فإن المشكلة هي مع قواعد UDEV. قم بتوسيع هذا القسم قليلاً لمساعدتك في التصحيح. - quack quixote
ARRRGHH ... علة في تشغيل. منعطف أو دور /usr/local/sbin/udev-automounter.sh mount %k إلى /usr/local/sbin/udev-automounter.sh %k. آسف. - quack quixote
لقد جمعت جميع النصوص على جيثب: github.com/fatso83/Code-Snippets/tree/master/system-utils/...  أنها تعمل بشكل جيد على أوبونتو 10.10 ، وتشمل أيضا إلغاء تحميل السيارات - oligofren


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

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

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

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


العمل مع HALEVT

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

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

إذا كنت تحتاج إلى إعادة تشغيل HEM و HALVT daemons للتحقق من التكوينات الجديدة ، استخدم هذا للحصول عليها في الترتيب الصحيح:

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 للنظر في التعديلات الخاصة بك. يتعلق الأمر في الغالب بإعداد استبدال gnome-mount للكاتب fluxbox البيئة ، لذلك فإن نموذج XML الخاص به يعمل أكثر مما تريد ، ولكنه طريقة رائعة للتعرف على ما يمكنك القيام به. هناك أيضا بعض الأمثلة الجيدة في /usr/share/doc/halevt/examples.

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

وإليك الإضافات الخاصة بي لجعل عمل CD / DVD autounting:

<!-- 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
2017-11-03 16:22



ﺑﺎﻟﻧﺳﺑﺔ ﻟﻟﻧﺎس اﻟذﯾن ﯾﻘرأون ھذا ﻓﻲ ﻋﺎم 2013 ، ﯾﺟب ﻋﻟﯾﮭم اﻵن أن ﯾﻌﻟﻣوا أن ﺷﮭﺎدة HAL ﻗد ﺗم إھﻣﺎﻟﮭﺎ ، وﯾﻧﺑﻐﻲ أن ﯾﻟﺟﺄوا إﻟﯽ ﺣﻟول ﻣﺳﺗﻧدة إﻟﯽ اﻷودﯾف ﻣﺛل اﻟواﺣدة اﻟواﺣدة اﻟﺗﻲ ﺗم إﻋطﺎﺋﮭﺎ أﻋﻼه. - oligofren


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

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

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

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

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

udevil في لمحة (github.io/udevil)
البرنامج النصي: devmon (igurublog / النصي devmon)


5
2017-07-08 23:38





الإجابة على 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
2017-08-15 01:06



شكراً لكم ... كانت هذه أبسط طريقة لما أردت تحقيقه. عملت حتى على Ubuntu Server 16 مع حجم ntfs - ChrisPrime


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

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


3
2018-05-20 09:36



لا يمكن تحميل Usbmount حسب التسمية ، إلا إذا قمت بملء قائمة التسميات في ملف التكوين. - Gilles
انظر المشاركة esite.ch/2014/04/11/... إذا كنت ترغب في إضافة تصاعد إلى التسمية إلى usbmount دون الحفاظ على قائمة. - Oliver Sauder


لطرد تعليمات ممتازة quackote quackote للإزالة:

أضف السطر التالي إلى ملف حكم udev الذي قمت به سابقًا (/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.


3
2017-10-30 16:24



أعتقد if [ -n "$device_is_mounted" ]; then يجب ان يكون if [ -z "${MOUNTPT}" ]; thenأليس كذلك؟ - eresonance
eresonance ، شكرا لرؤساء يصلح! - chotchki


قد ترغب في ذلك جرب Pysdm


2
2017-10-29 05:42



هذا مجرد محرر fstab آخر ، أليس كذلك؟ - endolith
نعم ، ولكن "يسمح أيضًا بإنشاء قواعد udev للتهيئة الديناميكية لأجهزة التخزين" - Sathya♦
هل سيساعدني "إنشاء قواعد udev" بطريقة ما؟ ليس لدي أي فكرة عما يعنيه ذلك. هل يقوم بتركيب أجهزة قابلة للإزالة لم تكن معروفة من قبل بدون مستخدم قام بتسجيل الدخول محليًا؟ - endolith
عذرا ، أنا لا أي فكرة عن قواعد udev. هل يمكن إلقاء نظرة على fredericiana.com/2006/03/15/writing-udev-rules-short-notes و reactivated.net/writing_udev_rules.html - Sathya♦


يمكنك محاولة وضع 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 الحزمة ، والتي تفعل ما تريد ، ولكن ربما تتداخل مع automounting العادي.


2
2017-10-11 19:29



أمر غير معروف "gnome-volume-manager". أنا في Ubuntu Jaunty. - endolith
يوجد مدير / usr / lib / gnome-volume-manager / gnome-volume-manager ، لكنه لا يفعل شيئًا. - endolith
حسنا أرى ذلك. هناك حزمة تسمى gnome-volume-manager أيضًا. ذات صلة: crunchbanglinux.org/forums/topic/239/... - endolith
يبدو أن gnome-volume-manager يستخدم HAL لتركيب الأشياء؟ و "اعتبارا من عام 2009 ، HAL قيد الاستهانة لصالح DeviceKit." لماذا كل شيء في لينكس دائما هكذا؟ انهم مجرد البدء في الحصول على شيء يعمل على ما يرام تقريبا ومن ثم أنها تستوعب واستبدالها بشيء جديد لا يعمل. - endolith
لم تعد حتى تعمل بعد الآن. > pmount / dev / disk / by-label / STORAGE خطأ: device / dev / sdc1 غير قابل للإزالة togaware.com/linux/survivor/Using_Gnome_Volume_Manager.html - endolith


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

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


1
2017-10-11 19:13



ستحتاج إلى تمكين قسم الكون للحصول عليه. - quack quixote
apt: mountmanager؟ section = universe؛) - endolith
هل هذا فقط سوف يضع fstab لي؟ - endolith
endolith: ألن يكون مناسبًا: universe؟ install = mountmanager تكون أكثر منطقية؟ ؛) - Bobby
هل يعمل هذا التنسيق؟ لا يقول ذلك في صفحة الرجل manpages.ubuntu.com/manpages/karmic/en/man8/apturl.8.html - endolith


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

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

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

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

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