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

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

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

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

  • Примечание для 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 (ссылка на правила udev)
  • Man udev (см. Вашу систему для последней версии)
  • Man udevadm (инструмент администрирования udev, снова посмотрите на свою систему)
  • Резервное копирование на USB-накопитель на жестком диске (совершенно другая проблема, но полезная для понимания решения)

Фон (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 в том, что бы избежать его для меня, поэтому мы разрешим скрипту mount обрабатывать это.

    Эта и другие переменные среды получают 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 события add

  3. SUBSYSTEMS=="usb" – только устройства соответствия, которые находятся на шине USB. Мы используем SUBSYSTEMS здесь, потому что это соответствует родителям нашего устройства; Устройство, которое нас интересует, на самом деле будет SUBSYSTEM == "scsi". Совпадение с родительским USB-устройством позволяет не добавлять нашу программу во внутренние диски.

  4. RUN+="..." – не совпадение, а действие: добавьте эту программу в список запущенных программ. В аргументах программы %k расширяется до имени устройства (например, sdc1 , not /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, чтобы перезагрузить его правила, чтобы новый вступил в силу. Используйте любой из этих методов (если первый не работает, второй должен … но сначала попробуйте):

  • Run 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 

Один окончательный вариант, который другие предложили в сети, – ivman , но, похоже, зависит от pmount , о котором вы уже говорили, не работает. pmount заброшен, и ivman почти такой же.

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

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

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


Работа с HALEVT

Обновление . В интересах получения автоматических CD-монтировок, которые мой ответ UDEV не предоставляет, я смотрел глубже на halevt . Я нашел этот пост в блоге, который помог объяснить многое о процессе. Мне пришлось скомпилировать собственный пакет halevt для Debian Lenny (к счастью, все зависимости были в разделе lenny-backports). После установки процесс был в основном не ужасным:

  1. Убедитесь, что система halevt-daemon включена в /etc/default/halevt
  2. Разрешить системе halevt подключать устройства в /etc/PolicyKit/PolicyKit.conf (см. Ниже, источник )
  3. Измените политику HAL, чтобы скопировать метку тома в предпочтительную /etc/hal/fdi/policy/preferences.fdi монтирования в /etc/hal/fdi/policy/preferences.fdi (см. Ниже)
  4. Если вам нужна поддержка CD / DVD, возьмите скрипт eject.hal из вышеуказанного blogpost, измените и сохраните в /usr/local/bin .
  5. Измените конфигурацию системы halevt, чтобы включить /etc/halevt/halevt.xml в /etc/halevt/halevt.xml
  6. Добавьте код в сценарии до и после сеанса вашего менеджера входа, чтобы остановить системный halevt-daemon, когда кто-то войдет в систему, и перезапустите его при выходе из системы.

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

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

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

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

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

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

Udevil At A Glance ( github.io/udevil )
Сценарий: devmon ( igurublog / script-devmon )

Ответ 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 

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

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

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

Добавьте следующую строку в файл правила udev, который вы сделали ранее (/etc/udev/rules.d) "

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

Затем создайте следующий скрипт и chmod его исполняемый файл (/usr/local/sbin/udev-autounmounter.sh) со следующим содержимым:

 #!/bin/sh # # USAGE: usb-autounmounter.sh DEVICE # DEVICE is the actual device node at /dev/DEVICE /usr/local/sbin/udev-auto-unmount.sh ${1} & 

Наконец, сам скрипт unmount (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.

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

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

Попробуйте настроить с помощью mountmanager, так что вам не нужно вводить данные вручную.

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

Мои измененные дополнения для решения, основанные на 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, eg "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> . Редактируйте в соответствии с вашими потребностями 🙂

Если у вас есть только один диск, установленный за один раз, вы можете просто отредактировать его в /etc/fstab . Что-то вроде:

 /dev/sdb1 /mnt/usbdrive ext3 defaults 0 0 

Это должно установить его при загрузке и сделать его доступным для всех с perms. Если у вас несколько дисков, вы все равно можете сделать это с помощью:

 /dev/sdb1 /mnt/usbdrive1 ext3 defaults 0 0 /dev/sdc1 /mnt/usbdrive2 ext3 defaults 0 0 
  • Имена файлов в ручном накопителе превратились в текст тарабарщины
  • Должен ли я отформатировать USB-накопители и SD-карты в FAT, FAT32, exFAT или NTFS? (Файлы Windows, живые Linux-искатели)
  • Не удается удалить раздел в diskpart - недопустимый аргумент?
  • Что на самом деле происходит с USB-накопителем, когда он умирает?
  • Есть ли команда DOS (cmd.exe из Win7) для извлечения флэш-накопителя?
  • Chkdsk / r для моего pendrive - Недостаточно места на диске для восстановления потерянных данных после согласия на восстановление потерянных цепочек
  • В чем разница между «безопасным удалением» и «выбросом»?
  • Постоянная установка Windows 7 (или XP) на USB-накопитель
  • Можно ли загрузиться с USB-накопителя на Toshiba Tecra A2?
  • Создание установочного флеш-диска Windows XP в Linux
  • Выполнить программу при удалении USB-накопителя
  • Давайте будем гением компьютера.