Автоматически подключать внешние диски к / media / LABEL при загрузке без входа пользователя?


73

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

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

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


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

1
Я обновил свой ответ.
Райан Томпсон

1
И у меня, для протокола, нет проблемы с установкой Gnome, как я уже делаю, но решение для безголовых серверов без GUI было бы лучшим.
эндолит

1
ARRRGHH ... ошибка в моем ответе. в RUN. /usr/local/sbin/udev-automounter.sh mount %kдолжно быть /usr/local/sbin/udev-automounter.sh %k. извиняюсь.
Квик-кихот

1
Хорошо, что касается Update-3, он работает с пробелами. это делается с помощью «закодированной» версии <LABEL>, которая преобразует пробелы в \x20's'. так что это не красиво, но это будет работать. udev не очень хорошо обрабатывает метки с пробелами, но есть еще одна опция, в которой вместо подчеркивания используются подчеркивания \x20(так что, по крайней мере, это выглядит красиво). Похоже, космическая обработка должна идти в сценарии оболочки.
шарлатан-кихот

Ответы:


74
  • Примечание для 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в Кармическом) и обрабатываются в числовом порядке. Любой файл, не начинающийся с цифры, обрабатывается после нумерованных файлов. В моей системе правила 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 избежать ее для меня, поэтому мы позволим сценарию монтирования обработать это.

    Эта и другие переменные окружения получаются с помощью vol_idкоманды udev ( устарело ). Это удобный инструмент, чтобы увидеть приятные быстрые детали на разделе:

    $ 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 в режиме реального времени: run 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

3
Ты замечательный! :)
Колыпто

1
Если я запускаю auto-mount.sh вручную, это работает, но не тогда, когда я подключаю диск, а не при загрузке. : /
эндолит

так что проблема с правилами UDEV. Позвольте мне немного расширить этот раздел, чтобы помочь вам в отладке.
шарлатан-кихот

3
Я собрал все скрипты на github: github.com/fatso83/Code-Snippets/tree/master/system-utils/… Они отлично работают на Ubuntu 10.10, а также включают автоматическое отключение
oligofren

1
Ссылка: udev_237 - man udev (Ubuntu_18.04) Обратите внимание, что запуск программ, которые обращаются к сети или монтируют / размонтируют файловые системы, не разрешен внутри правил udev из-за изолированной программной среды по умолчанию, которая применяется в systemd-udevd.service. источник: unix.stackexchange.com/questions/200194/… Чтобы найти решение, взгляните на serverfault.com/questions/766506/…
Pro Backup,

9

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

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

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

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


Работа с HALEVT

Обновление : В интересах получения автоматических монтировок компакт-дисков, которые не дает мой ответ 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-демон:

/etc/init.d/halevt stop

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

/etc/init.d/halevt start

3
Для тех, кто читает это в 2013 году, теперь они должны знать, что HAL устарел, и им следует прибегнуть к решениям на основе udev, таким как приведенный выше квашот.
oligofren

6

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

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

devmonСкрипт из udevil делает всю магию , а только в зависимости от Udev и бойкий. Работает практически из коробки без необходимости начальной настройки.

Все, что я делал на своей рабочей станции, это вызывал devmon rc.localпримерно так:
devmon 2>&1 >> /var/log/devmon &
для вашего удобства вы можете захотеть встроить это в сценарий инициализации вместо rc.localиспользования автоматического инструмента, например, pleaserunдля его создания: https://unix.stackexchange.com/ а / 124609/42673

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

Краткий обзор udevil ( github.io/udevil )
Скрипт: devmon ( igurublog / script-devmon )


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

1
СПАСИБО .. это был самый простой способ для того, что я хотел достичь. Даже работал на Ubuntu Server 16 с томом
NTFS

3

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

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


1
Usbmount не может монтироваться по меткам, если вы не заполните список меток в файле конфигурации.
Жиль

1
См. Сообщение esite.ch/2014/04/11/…, если вы хотите добавить монтирование для метки в usbmount без ведения списка.
Оливер Саудер

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.


Я думаю, if [ -n "$device_is_mounted" ]; thenдолжно быть if [ -z "${MOUNTPT}" ]; then, не так ли?
eresonance

2

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


Это просто еще один редактор fstab, не так ли?
эндолит

Да, но «Это также позволяет создавать правила udev для динамической конфигурации устройств хранения»
Сатьяджит Бхат

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

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


Неизвестная команда «gnome-volume-manager». Я в Ubuntu Jaunty.
эндолит

Существует / usr / lib / gnome-volume-manager / gnome-volume-manager, но он ничего не делает.
эндолит

А ну понятно. Также есть пакет под названием gnome-volume-manager. Связанный: crunchbanglinux.org/forums/topic/239/...
эндолиты

Похоже, gnome-volume-manager использует HAL для монтирования вещей? И «Начиная с 2009 года, HAL находится в процессе устаревания в пользу DeviceKit». Почему все в Linux всегда так? Они просто начинают работать с чем-то, что работает почти правильно, а затем отрывают его и заменяют чем-то новым, что не работает.
эндолит

pmount даже больше не работает. > Pmount / DEV / диск / с-этикетки / ХРАНЕНИЕ Ошибка: устройство / DEV / sdc1 не является съемным togaware.com/linux/survivor/Using_Gnome_Volume_Manager.html
эндолиты

2

Мои отредактированные дополнения для решения на основе 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>команду. Изменить в соответствии с вашими потребностями :)


Как вы запускаете этот скрипт? halevtне похоже на актуальный apt-getпакет для современных версий.
Кэмпбелн

Ага ... может быть, если я буду следовать записи TOP / Accepted Answer from Quack quixote's ... Было бы неплохо получить более полный ответ здесь :)
Кэмпбелн

1

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

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


Вам нужно включить раздел юниверса, чтобы получить его.
шарлатан-кихот

apt: mountmanager? section = вселенная;)
эндолит

Это просто собирается установить fstab для меня?
эндолит

@endolith: Разве apt: universe? install = mountmanager не будет более логичным? ;)
Бобби

Этот формат работает? Он не говорит , так что в человеке страницы manpages.ubuntu.com/manpages/karmic/en/man8/apturl.8.html
эндолиты

-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 и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.