71

Этот вопрос похож, но как бы противоположен тому, что я хочу. Я хочу, чтобы внешние USB-накопители автоматически монтировались при загрузке, без входа в систему, в такие места, как /media/<label> .

Я не хочу вводить все данные в fstab, отчасти потому, что это утомительно и раздражает, но в основном потому, что я не могу предсказать, что я подключу к нему или как изменятся разделы в будущем.

Я хочу, чтобы диски были доступны для таких вещей, как MPD, и были доступны при входе в систему по SSH. Кажется, gnome-mount монтирует вещи только тогда, когда вы локально вошли в графический сеанс Gnome.

11 ответов11

73
  • Примечание для Ubuntu Server 11.10: этот сценарий не выполняется на Ubuntu Server 11.10 из-за устаревшей команды vol_id . vol_id был заменен blkid . Чтобы исправить сценарий, замените "vol_id" на «blkid -o udev» в сценарии udev-auto-mount.sh .

Некоторое время я бился головой об этом, и я думаю, что нашел рабочее решение. Это разработано и протестировано в системе на основе Debian, поэтому оно должно работать в Ubuntu. Я укажу на предположения, которые он делает, чтобы его можно было адаптировать и к другим системам.

  • Он автоматически подключит 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 используются для отправки аппаратных событий слушателям, таким как Desktop Environments. Поэтому, когда вы входите в GNOME и вставляете компакт-диск или подключаете USB-накопитель, это событие следует следующей цепочке:

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

И до того, ваш диск будет установлен. Но в безголовой системе нам не нужно входить в систему, чтобы воспользоваться преимуществами автоматического монтирования.

Правила Удев

Поскольку 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

Супер бонус сценарий очистки!

Еще один скрипт. Все это делает размонтирование устройства и удаление каталогов точки монтирования. Предполагается, что для этого у него есть привилегии, поэтому вам нужно запустить его с помощью 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
9

Последний вариант, который другие предложили в сети, - это ivman , но это зависит от pmount , который, как вы уже сказали, не работает. pmount заброшен, а ivman почти такой же.

Замена для ivman является halevt , и это доступно на Karmic. Это переопределение ivman (читай: "поддерживается" и "не зависит от pmount"). Пакет недоступен в Jaunty, хотя вы можете создать его самостоятельно, если не планируете обновление.

Оба эти инструмента находятся над уровнями DBus и HAL и отвечают на события от них. Очевидно, что оба могут работать как системный демон или как менеджер монтирования сеанса пользователя (в виде Gnome-VFS) - файлы /etc/defaults/{ivman,halevt} отвечают за системные настройки.

Вот несколько инструкций по настройке ivman для использования /media/<LABEL> точек монтирования. Вероятно, у halevt есть более простой способ сделать это, но, возможно, они помогут вам найти ответ.


Работа с HALEVT

Обновление: В интересах получения CD монтирует срабатывают сам , как хорошо, что мой Udev ответ не дает, я смотрел глубже в halevt Я нашел этот пост в блоге, который помог объяснить многое о процессе. Мне пришлось скомпилировать свой собственный пакет halevt для Debian Lenny (к счастью, все зависимости были в разделе lenny-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 при входе в систему, и перезапустить его при выходе из системы.

Если вам нужно перезапустить демоны 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

После того, как вы запустили систему halevt-daemon, вам нужно будет отключить ее при входе в GNOME и перезапустить снова при выходе из системы. (См. Мой ответ на этот вопрос для менеджеров входа не в GDM.) Этот материал теоретический, так как я им не пользуюсь, но он должен работать.

В /etc/gdm/PreSession/Default добавьте это, чтобы остановить систему halevt-daemon:

/etc/init.d/halevt stop

В /etc/gdm/PostSession/Default добавьте это, чтобы перезапустить систему halevt-daemon:

/etc/init.d/halevt start
6

Со временем появляются более простые решения.

Это решение основано на программном пакете udevil, который был написан для этой цели, и не требует вмешательства в правила udevil. Это, вероятно, предпочтительнее (для новых и старых пользователей) в качестве простого решения.

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 .
Не могу представить ничего более простого, кроме, возможно, того, что (в) известной системе появится возможность включить эту функциональность в будущем.

Udevil с первого взгляда (github.io/udevil)
Скрипт: devmon (igurublog/script-devmon)

3

Для систем на основе Debian (например, Ubuntu и т.д.) Есть пакет usbmount , который автоматически подключает USB-накопители. Он в основном использует подход, основанный на udev, как уже было изложено - только это простая установка пакета. Кажется, первоначальный автор пакета исчерпал себя, но Ubuntu/Debian все еще поддерживает его (я думаю, что это не так сложно) - так что он все еще доступен в последних выпусках.

Установленные сценарии можно настроить (/etc/usbmount/usbmount.conf) для предоставления соответствующих точек подключения.

3

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

Чтобы избавиться от превосходных инструкций Quackote Quixote по удалению:

Добавьте следующую строку в файл правил 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.

2

Вы можете попробовать Pysdm

2

Вы можете попробовать поместить 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 , который делает то, что вы хотите, но может помешать нормальному автомонтированию.

1

Мои отредактированные дополнения для решения на основе udev от Quack Quixote были отклонены, поэтому я собираюсь разместить их здесь. Пожалуйста, обратитесь к его сообщению в первую очередь.

Прежде всего, если вы хотите, чтобы правило udev действовало, когда какое-либо устройство подключено через подсистему SCSI (которая включает в себя как USB, FireWire и eSATA), измените соответствие SUBSYSTEMS в правиле udev на SUBSYSTEMS=="scsi" .

Имейте в виду, однако, что это автоматически смонтирует практически все, включая внутренние диски, если вы подключите их к сети во время работы системы, так что это может быть не тем, что вы хотите.

Во-вторых, вот сценарий, который я использую, который заменяет все сценарии в этом посте. Он также автоматически очищает созданные точки монтирования в /media /, как только удаленное смонтированное блочное устройство удаляется - нет необходимости в ручном вмешательстве. Кроме того, вместо вызова другого сценария для запуска в фоновом режиме, он помещает себя в фоновый режим, когда он не выполняется с терминала (например, когда выполняется с помощью udev).

Он использует inotifywait для ожидания исчезновения смонтированного устройства, а затем удаляет созданный каталог. Поэтому в вашей системе должны быть установлены inotify-tools. На дистрибутивах на основе Debian (включая 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

Попробуйте настроить через mountmanager, чтобы вам не приходилось вводить данные вручную.

Это должно быть частью репозитория Ubuntu.

-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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .