Автоматично монтувати зовнішні накопичувачі на / media / LABEL під час завантаження, не ввівши користувача?


73

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

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

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


4
Чудове запитання, хочете, щоб у вас була відповідь, тепер мені цікаво, як це вирішено.
інвертувати

1
Я оновив свою відповідь.
Райан Томпсон

1
І, для запису, у мене немає проблем із встановленням Gnome, як я вже це роблю, але рішення для безголових серверів без GUI було б найкращим.
ендоліт

1
ARRRGHH ... помилка у моїй відповіді. в РУН. /usr/local/sbin/udev-automounter.sh mount %kповинно бути /usr/local/sbin/udev-automounter.sh %k. вибачте.
квакш-кіхот

1
Добре, що стосується Update-3, він працює з пробілами. це робиться за допомогою "закодованої" версії <LABEL>, яка перетворює пробіли у \x20s. тож це не дуже, але це спрацює. udev не дуже добре поводиться з мітками-пробілами, але є інший варіант, який використовує підкреслення замість \x20s (так, принаймні, це виглядає приємно). схоже, що обробка місця повинна надходити до оболонок.
квахтіт кіхот

Відповіді:


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? Whzzat?)

UDEV - система гарячої підключення ядра. Це те, що автоматично налаштовує належні пристрої та посилання на пристрої (наприклад /dev/disk/by-label/<LABEL>), як під час завантаження, так і для пристроїв, доданих під час роботи системи.

D-Bus та HAL використовуються для надсилання апаратних подій слухачам, таких як Desktop Environment. Отже, коли ви входите в GNOME і вставляєте компакт-диск або підключіть USB-накопичувач, ця подія слід за цим ланцюжком:

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

І заздалегідь, ваш привід встановлюється. Але в безголівковій системі нам не хочеться входити в систему, щоб отримати переваги автоматичного управління.

Правила Udev

Оскільки UDEV дозволяє нам писати правила та запускати програми для вставки пристроїв, це ідеальний вибір. Ми збираємось скористатися існуючими правилами Debian / Ubuntu, дозвольмо їм встановити /dev/disk/by-label/<LABEL>посилання для нас, і додамо ще одне правило, яке монтуватиме пристрій для нас.

Правила UDEV зберігаються в /etc/udev/rules.d/lib/udev/rules.dв Кармічній) і обробляються в числовому порядку. Будь-який файл, що не починається з числа, обробляється після нумерованих файлів. У моїй системі правила 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утилітою " catch-all" .

Після додавання правила підключіть свій пристрій. Дайте йому кілька секунд, а потім перевірте, на який пристрій призначено:

$ 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+=правила в останніх рядках (3-й знизу в цьому прикладі). Ви можете бачити аргументи, які використовувались для цього пристрою. Ви можете запустити цю команду зараз, щоб перевірити, чи аргументи звучать; якщо він працює у вашому командному рядку, він повинен працювати автоматично, коли вставлено пристрій.

Ви також можете відстежувати події 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

3
Ти чудовий! :)
kolypto

1
Якщо я запускаю auto-mount.sh вручну, він працює, але не, якщо я підключаю диск, а не під час завантаження. : /
endolith

тому проблема полягає в правилах UDEV. lemme трохи розгорніть цей розділ, щоб допомогти вам налагодити.
кихат шарлатан

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/… Щоб вирішити, подивіться на сервер defaultfault.com/questions/766506/…
Pro Backup

9

Одним із останніх варіантів, який запропонували інші по мережі, є ivman, але, схоже, це залежить від того pmount, про який ви вже заявили, не працює. pmountпокинуто і ivmanмайже те саме.

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

Обидва ці інструменти сидять над шарами DBus та HAL та реагують на події, що виникають з них. Мабуть, обидва можуть працювати як системний демон або як менеджер монтування сеансу користувача (a la 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, щоб переглянути власні зміни. В основному це стосується налаштування заміни для гнома для середовища автора 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-daemon:

/etc/init.d/halevt start

3
Для людей, які читають це у 2013 році, вони повинні тепер знати, що HAL був застарілим, і вони повинні вдатися до рішень, заснованих на udev, таких як кіхот з одним кваксом, поданий вище.
олігофрен

6

Із часом з'являються більш прості рішення.

Це рішення покладається на програмний пакет udevil, який був написаний для цієї мети, і не вимагає поводження з правилами udev. Це, мабуть, бажано (для нових та старих користувачів) як прямого рішення.

devmonСкрипт з udevil робить всю магію , а тільки в залежності від Udev і жвавий. Працює майже поза коробкою, не потребуючи початкової конфігурації.

Все, що я зробив на своїй робочій станції, - це зателефонувати devmon з rc.localцього приводу :
devmon 2>&1 >> /var/log/devmon &
для вашого комфорту ви можете вбудувати це в сценарій init замість 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
ChrisPrime

3

Для систем на базі Debian (наприклад, Ubuntu тощо) є пакет usbmount, який автоматично встановлює USB-накопичувачі для вас. В основному він використовує підхід, заснований на udev, як уже окреслено - лише це проста установка пакету. Здається, у первинного автора пакета не вистачало пари, але Ubuntu / Debian все ще зберігає його (я думаю, це не так складно) - тому він все ще доступний в останніх випусках.

Встановлені сценарії можуть бути налаштовані (/etc/usbmount/usbmount.conf) для забезпечення відповідних точок монтажу.


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

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

3

Щоб змити чудові інструкції щодо видалення квактету:

Додайте наступний рядок до файлу правил 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} &

Нарешті, сам сценарій відключення (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, чи не так?
ерезонанс

2

Ви можете спробувати Pysdm


Це просто ще один редактор fstab, чи не так?
ендоліт

Так, але "Це також дозволяє створити правила udev для динамічної конфігурації пристроїв зберігання даних"
Sathyajith Bhat

Чи допоможе мені "створення правил 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.

Редагувати: Схоже, що gnome-volume-менеджер більше не є частиною дистрибутива за замовчуванням, навіть на робочому столі 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 використовує HAL для монтажу речей? І "Станом на 2009 рік, HAL перебуває у старі депресії на користь DeviceKit." Чому все в Linux завжди таке? Вони просто починають змушувати щось працювати майже правильно, а потім виймають це і замінюють його чимось новим, що не працює.
ендоліт

pmount навіть не працює. > Pmount / DEV / диск / с-етикетки / ЗБЕРІГАННЯ Помилка: пристрій / DEV / sdc1 не є знімним togaware.com/linux/survivor/Using_Gnome_Volume_Manager.html
ендоліти

2

Мої відредаговані доповнення до рішення, що базується на квітівському квіхоті, було відхилено, тому я збираюся викласти їх тут. Будь ласка, зверніться спочатку до його повідомлення.

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

Але майте на увазі, що це автоматично змонтує майже все, включаючи внутрішні накопичувачі, якщо ви підключаєте їх до роботи під час роботи системи, тому це може бути не тим, що вам потрібно.

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

Він використовує inotifywait, щоб зачекати, поки встановлений пристрій зникне, а потім видалить створений ним каталог. Тому вам потрібно встановити інструменти inotify-у вашій системі. На дистрибутивах, заснованих на 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можливим пакетом для сучасних версій.
Кемпбелн

Ага ... можливо, якщо я слідкую за ТОП / Прийнятою відповіддю з запису quixote's ... Все одно було б добре відповісти тут більш повна :)
Campbeln

1

Спробуйте налаштувати через mountmanager, щоб не потрібно було вводити дані вручну.

Він повинен бути частиною сховища ubuntu.


Вам потрібно буде включити розділ Всесвіту, щоб отримати його.
шарлатанний кіхот

apt: mountmanager? section = всесвіт;)
endolith

Це просто збираюся встановити fstab для мене?
ендоліт

@endolith: Чи не apt: все-таки? install = mountmanager буде більш логічним? ;)
Боббі

Чи працює цей формат? Це не сказано на сторінці man manges.ubuntu.com/manpages/karmic/en/man8/apturl.8.html
endolith

-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.