Вот как я недавно это сделал, и теперь я вполне доволен этим подходом. Это для Ubuntu 12.04 + gentoo, но я думаю, что любой дистрибутив, который позволяет установить udev и автозапуск должен работать.
Предварительные условия: Вы должны установить udev + autofs.
Шаг 1)
Создайте следующий файл «/etc/udev/rules.d/90-usbsd-auto.rules» (конечно, вы можете использовать любое имя, если оно оканчивается на «.rules»). :
# Add symlink /dev/usbdisks/<label> to /dev/sd[a-z][1-9]
# if partition has a label
# Add symlink /media/usb/<label> to /media/autousb/<label>
# for automounter support
ACTION=="add", KERNEL=="sd*", ENV{DEVTYPE}=="partition", \
ENV{ID_BUS}=="usb", ENV{ID_FS_LABEL_ENC}=="?*", \
SYMLINK+="usbdisks/$env{ID_FS_LABEL_ENC}", MODE:="0660", \
RUN+="/bin/rm /media/usb/$env{ID_FS_LABEL_ENC}", \
RUN+="/bin/ln -sf /media/autousb/$env{ID_FS_LABEL_ENC} /media/usb/$env{ID_FS_LABEL_ENC}"
# Fallback: If partition has a NO label, use kernel name (sd[a-z][1-9])
ACTION=="add", KERNEL=="sd*", ENV{DEVTYPE}=="partition", \
ENV{ID_BUS}=="usb", ENV{ID_FS_LABEL_ENC}!="?*", \
SYMLINK+="usbdisks/%k", MODE:="0660", \
RUN+="/bin/rm /media/usb/%k", \
RUN+="/bin/ln -sf /media/autousb/%k /media/usb/%k"
# Some FileSystems emit a "change" event when they are unmounted.
# UDEV seems to delete the device symlink in this case :-(
# So we need to re-create it here
ACTION=="change", KERNEL=="sd*", ENV{DEVTYPE}=="partition", \
ENV{ID_BUS}=="usb", ENV{ID_FS_LABEL_ENC}=="?*", \
SYMLINK+="usbdisks/$env{ID_FS_LABEL_ENC}", MODE:="0660"
# Fallback: If partition has NO label, use kernel name
ACTION=="change", KERNEL=="sd*", ENV{DEVTYPE}=="partition", \
ENV{ID_BUS}=="usb", ENV{ID_FS_LABEL_ENC}!="?*", \
SYMLINK+="usbdisks/%k", MODE:="0660"
# When device is removed, also remove /media/usb/<label>
ACTION=="remove", KERNEL=="sd*", ENV{DEVTYPE}=="partition", \
ENV{ID_BUS}=="usb", ENV{ID_FS_LABEL_ENC}=="?*", \
RUN+="/bin/rm /media/usb/$env{ID_FS_LABEL_ENC}"
# Fallback: If partition has no label, remove /media/usb/%k
ACTION=="remove", KERNEL=="sd*", ENV{DEVTYPE}=="partition", \
ENV{ID_BUS}=="usb", ENV{ID_FS_LABEL_ENC}!="?*", \
RUN+="/bin/rm /media/usb/%k"
Что это делает: создает две символические ссылки, одну для раздела запоминающего устройства USB в «/ dev / usbdisks / <...>». Он будет использовать либо метку раздела USB-накопителя, либо имя ядра, если метка отсутствует. Вторая символическая ссылка будет ссылаться с "/ media / usb / <...>" на "/ media / autousb / <...>", это делается для поддержки автомонтирования (см. Шаг 2).
Примечание. Изначально я не использовал правила с переменными ID_FS_LABEL_ENC, поскольку, на мой взгляд, это опасно. Что произойдет, если вы подключите две USB-флешки с одинаковой этикеткой?
Но постер специально хотел использовать метку USB-диска, поэтому я соответствующим образом изменил правила.
Чтобы убедиться, что udev читает эти правила, используйте
sudo udevadm control --reload-rules
С этим файлом правил udev все настроено для автоматического монтирования раздела USB-накопителя. Обратите внимание, что прямо сейчас устройство НЕ будет автоматически подключено (намеренно). Он будет автоматически смонтирован, как только вы используете его
Шаг 2)
Настройте autofs для автомонтирования / media / autousb / <...>: я добавил следующую строку в мой файл /etc/auto.master (для Ubuntu 12.04):
/media/autousb /etc/auto.usb --timeout=60
Это означает, что AutoFS отключит устройство после 60 секунд бездействия. Вы можете использовать меньше или больше, в зависимости от вашего вкуса.
Для Gentoo вы должны изменить "/etc/autofs/auto.master", чтобы имело смысл использовать
/media/autousb /etc/autofs/auto.usb --timeout=60
Теперь я создал "auto.usb" со следующим содержимым:
#!/bin/bash
key=${1}
fstype=$(/sbin/blkid -o value -s TYPE /dev/usbdisks/${key})
if [ "${fstype}" = "vfat" ] ; then
echo "-fstype=vfat,sync,uid=0,gid=plugdev,umask=007 :/dev/usbdisks/${key}"
exit 0
fi
if [ "${fstype}" = "ntfs" ] ; then
echo "-fstype=fuse.ntfs-3g,sync,uid=0,gid=plugdev,umask=007 :/dev/usbdisks/${key}"
exit 0
fi
if [ "${fstype}" = "ext4" ] ; then
echo "-fstype=ext4,sync,nocheck :/dev/usbdisks/${key}"
exit 0
fi
exit 1
Этот auto.usb должен быть исполняемым, чтобы autofs использовал его как (bash) скрипт. Так например
sudo chmod 0755 /etc/auto.usb
Что это делает? Этот скрипт сообщит AutoFS (/ usr / sbin / automount), как монтировать раздел устройства хранения USB.
Сначала сценарий будет использовать «/ sbin / blkid», чтобы выяснить, какая файловая система находится в разделе.
Затем сценарий предоставит правильные параметры монтирования в зависимости от раздела устройства.
Примечание: я включил пример кода для файловых систем "vfat" (вероятно, наиболее распространенных для USB-флешек), "ntfs" и "xfs". Конечно, это довольно легко расширить для поддержки большего количества файловых систем.
Шаг 3) Необязательно ... Чтобы "извлечь" == размонтировать ваши флешки (или разделы на вашей флешке), создайте скрипт в / sbin / usbeject:
#!/bin/bash
killall -s SIGUSR1 /usr/sbin/automount
С помощью этого сценария вы можете использовать «sudo usbeject» для размонтирования всех подключенных разделов USB-устройств (указав автомонтированию отключить их).
Конечно, вы можете просто убедиться, что раздел нигде не используется; Затем автомонтировщик размонтирует раздел после 60 секундного ожидания ...
Настоящий трюк здесь заключается в использовании символических ссылок от "/ media / usb" на "/ media / autousb":
- Символические ссылки "/ media / usb" будут созданы udev, чтобы дать пользователю простой обзор того, какие разделы устройства хранения USB есть.
- AutoFS затем автоматически смонтирует раздел, если вы используете его через / media / usb
- С помощью скриптового файла "auto.usb" вы можете поддерживать любую файловую систему и, кроме того, вы также можете поддерживать любую схему именования.
- Этот подход поддерживает USB-накопители с несколькими разделами, даже если эти разделы используют разные типы файловых систем.