Як автоматично монтувати знімні носії в / media / <LABEL> без вставлення на робочий стіл?


17

У мене є система sid Debian (Wheezy) (і те саме для арки), без будь-якого середовища для робочого столу (і зовсім не Xorg).

Я можу монтувати свої SD-карти, USB-накопичувачі, зовнішній жорсткий диск за міткою у вказаний каталог /media/вручну з mount/ umountі відповідними записами в час /etc/fstabабо автоматично під час завантаження, але це є переконливим, обмежувальним та недостатньо динамічним для моїх потреб: якщо я хочу, щоб вони були змонтовані /media/<LABEL>, кожен пристрій, який має інший, <LABEL>потребує власного запису, і кожен <LABEL>підкаталог також повинен бути створений / видалений вручну /media/).

Отже, що це кращий спосіб , щоб встановити їх автоматично в /media/<LABEL> при вставці (і демонтувати їх з файлової системи , як тільки вони не відключені , незалежно від того , наскільки небезпечно для даних )?

Ідеальним рішенням буде:

  1. виявити , коли знімний носій вставлений в (тобто при додаванні в /dev/якості sdax, sdbx... по udev)
  2. створити каталог /media/відповідно до його мітки (мітка знімного носія)
  3. змонтуйте його в каталозі /media/<LABEL>в RWрежимі (якщо це підтримує файлова система) з flushопцією (для a vfat)
  4. виявити, якщо носій відключено
  5. якщо тоді відключіть його від файлової системи
  6. видаліть відповідний каталог із /media/

(пристрої повинні бути встановлені в синхронному режимі очевидно, щоб уникнути втрати даних при відключенні гарячої роботи через кешування редагування: sync чи занадто багато для vfatзнімних носіїв, тому flush було створено як компроміс , менш безпечний sync, але менш ризикований відповідно до життя -цикли флеш-пам’яті)

Я знайшов деяку інформацію про autofs, HAL, udisks, udisks2, і usbmountт.д., але неясно , який з них є застарілим або кращим, і в будь-якому випадку, я не зрозумів, як налаштувати їх легко в моїй системі , щоб зробити це, до сих пір ...


По-перше, ви шукали подібні запитання? Пам’ятаю, це вже просили. По-друге, відключення має відбутися до відключення.
enzotib

1
Звичайно, я так і зробив: o] Ось і на суперпопулярному. Проблема полягає в тому, що інструменти еволюціонують (udisks / udev), або застаріли (HAL?), Інші "не бажані" (udisks2?) Тощо. У всякому разі, я не зміг знайти жодного робочого чи чіткого рішення. Більшість того, що я дізнався, знаю, покладаються на механізм середовища робочого столу (Gnome, KDE або XFCE); Я не хочу встановлювати жодних. Про тремтіння, не обов’язково. Якщо для пристрою встановлено значення sync, deamon може від'єднати пристрій від fs, якщо виявить, що він був відключений від мережі без втрати даних. Усі дистрибутиви на робочому столі роблять це. Я хочу це в терміналі.
cedbeu

Подивіться на цю Замінуhalevt . Щодо відключення, DE зазвичай очікують, що ви виймете пристрій з файлового менеджера, перш ніж фізично відключити його.
enzotib

Так, правда. Але я бачив, що деякі демони (які раніше використовувались) могли від'єднати пристрої з файлів fs, які не було відключено перед відключенням, і навіть автоматично видалити відповідний каталог з / media /, і що вони залишаються в межах звичайного способу робити (якщо пристрої налаштовані так, щоб бути синхронними звичайно). Дякуємо за ваше посилання. Я буду дивитись, як тільки повернусь додому на удісксевт. Я вже дивлюся на devmon і udiskie, але їх немає в пакунках Debian. Якщо я можу знайти щось інше, я спробую це, але я не можу повірити, що в Debian немає нативного рішення для цього.
cedbeu

1
Я на Debian теж , і я використовую , fdisk -lа потім mount- це дві команди, але добре, якщо ви хочете автоматизований, вам доведеться розібрати fdisk -lвихід, а потім покласти його в mount- я такі речі з head, tail, tr, cut, і т.д., але плюси зазвичай роблять це за допомогою awk, а ще краще, шукайте дані в потрібному місці. Щодо видалення, принаймні для мене, коли я переходжу на /mntце, це робиться автоматично. Про тригер (коли ви підключаєтесь) у мене немає поняття, але, будь ласка, повідомте нам, коли ви вирішите це.
Емануель Берг

Відповіді:


10

Я думаю, ти шукаєш pmount.

Якщо ви хочете автоматичного монтажу після вставки, див. Розділ Автозапуск USB-накопичувачів на Debian .

Якщо ваша система використовує udisks2 , це кращий спосіб реагування на вставлення знімного пристрою зберігання даних. Підказки щодо налаштування Udisks див. У Arch Wiki .

В іншому випадку програма, яка реагує, коли з’являється новий пристрій, є udev , тому автоматичне встановлення запускається правилом udev . Пакет usbmount містить правила udev для автоматичного монтажу USB-накопичувачів та декількох інших. Виклик mountз правил udev не працює для файлових систем FUSE (наприклад, ntfs-3g), тому використовуйте udisks, якщо вам це потрібно.

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


Дякую мільйон за відповідь. Я спробую це якнайшвидше, і дозволю людям тут знати. Про тремтіння. Хлопці, будь ласка, перестаньте мені говорити, що справа в тому, що це не так: o] Демонтація після відключення пристрою ідеально має сенс (і можлива), як тільки пристрій налаштовано на синхронність. Тоді це лише питання файлової системи. Якщо дані передані без кешування (синхронно), не потрібно вимкнути підключення без відключення. Тоді демонтаж можна виконати і корисно лише повідомити систему про те, що пристрою вже немає.
cedbeu

1
@cblab Ви надто спрощуєте. Якщо файл відкритий для запису, і ви витягнете пристрій, файл, ймовірно, може бути пошкоджений; відключення гарантує, що жоден файл не відкритий. У багатьох файлових системах (не FAT), демонтування - це більше, ніж встановлення брудного біта на 0, їм потрібно, наприклад, очистити журнал. Для флеш-пристроїв головна проблема при кріпленні синхронізації полягає в тому, що він зношує пристрій набагато швидше, оскільки він перешкоджає групуванню записів. Дивіться superuser.com/questions/180722/… та readlist.com/lists/vger.kernel.org/linux-kernel/22/111748.html
"SO - перестаньте бути злим"

Привіт @Gilles. Дякуємо за ваші відповіді. Я не думаю, що я надмірно спрощую. Ви маєте рацію в деяких моментах. Але користувач вирішує, чи хоче він жити ризиковано. Погодьтесь, ваша посада становить 7 років; Тепер flushваріант монтажу, розроблений спеціально для vfatуникнення цих проблем: запис виконується не після кожного блоку, але як тільки пристрій видається неактивним. І спалахи спалаху значно збільшили і їх тупиковий життєвий цикл. Тепер, очевидно, користувач повинен знати, що не відключати пристрої під час підключення під час відкриття файлів або під час копіювання (або незабаром після цього). Але це хороший компроміс.
cedbeu

у будь-якому випадку, usbmount міг бути для мене гарним варіантом, але, на жаль, він не монтує пристрої в папку залежно від їх назв етикетки, але в /media/usb-*, що не відповідає моїм потребам. Я хочу мати змогу автоматично монтувати пристрої /media/<DEV_LABEL>з flushпараметром при їх виявленні (якщо це можливо при динамічному створенні каталогу), а також відключити їх та видалити каталоги /media/автоматично, якщо вони більше не виявляються. Ризик, який я беру на себе, залежить від мене.
cedbeu

1
Зверніть увагу, що usbmountбільше не підтримують NTFS jessie: bugs.debian.org/774149
malat

2

Ось як я це нещодавно зробив, і зараз я цілком задоволений таким підходом. Це для Ubuntu 12.04 + gentoo, але, мабуть, будь-який дистрибутив, який дозволяє встановлювати udev і autofs, повинен працювати.

Передумови: Ви повинні встановити udev + autofs.

Крок 1)

Створіть наступний файл "/etc/udev/rules.d/90-usbsd-auto.rules" (звичайно, ви можете використовувати будь-яке ім'я, поки воно закінчується на ".rules"). :

# Add symlink /dev/usbdisks/<label> to /dev/sd[a-z][1-9] 
# if partition has a label
# Add symlink /media/usb/<label> to /media/autousb/<label>
# for automounter support
ACTION=="add", KERNEL=="sd*", ENV{DEVTYPE}=="partition", \
    ENV{ID_BUS}=="usb", ENV{ID_FS_LABEL_ENC}=="?*", \
    SYMLINK+="usbdisks/$env{ID_FS_LABEL_ENC}", MODE:="0660", \
    RUN+="/bin/rm /media/usb/$env{ID_FS_LABEL_ENC}", \
    RUN+="/bin/ln -sf /media/autousb/$env{ID_FS_LABEL_ENC} /media/usb/$env{ID_FS_LABEL_ENC}"

# Fallback: If partition has a NO label, use kernel name (sd[a-z][1-9])
ACTION=="add", KERNEL=="sd*", ENV{DEVTYPE}=="partition", \
    ENV{ID_BUS}=="usb", ENV{ID_FS_LABEL_ENC}!="?*", \
    SYMLINK+="usbdisks/%k", MODE:="0660", \
    RUN+="/bin/rm /media/usb/%k", \
    RUN+="/bin/ln -sf /media/autousb/%k /media/usb/%k"

# Some FileSystems emit a "change" event when they are unmounted.
# UDEV seems to delete the device symlink in this case :-(
# So we need to re-create it here
ACTION=="change", KERNEL=="sd*", ENV{DEVTYPE}=="partition", \
    ENV{ID_BUS}=="usb", ENV{ID_FS_LABEL_ENC}=="?*", \
    SYMLINK+="usbdisks/$env{ID_FS_LABEL_ENC}", MODE:="0660"

# Fallback: If partition has NO label, use kernel name
ACTION=="change", KERNEL=="sd*", ENV{DEVTYPE}=="partition", \
    ENV{ID_BUS}=="usb", ENV{ID_FS_LABEL_ENC}!="?*", \
    SYMLINK+="usbdisks/%k", MODE:="0660"


# When device is removed, also remove /media/usb/<label>
ACTION=="remove", KERNEL=="sd*", ENV{DEVTYPE}=="partition", \
    ENV{ID_BUS}=="usb", ENV{ID_FS_LABEL_ENC}=="?*", \
    RUN+="/bin/rm /media/usb/$env{ID_FS_LABEL_ENC}"

# Fallback: If partition has no label, remove /media/usb/%k
ACTION=="remove", KERNEL=="sd*", ENV{DEVTYPE}=="partition", \
    ENV{ID_BUS}=="usb", ENV{ID_FS_LABEL_ENC}!="?*", \
    RUN+="/bin/rm /media/usb/%k"

Що це робить: це створює два посилання, один для розділу USB-накопичувача у розділі "/ dev / usbdisks / <...>". Він буде використовувати або мітку розділу USB-накопичувача, або ім'я ядра, якщо мітки немає. Друге символьне посилання буде посилатися з "/ media / usb / <...>" на "/ media / autousb / <...>", це робиться для підтримки автозапуску (див. Крок 2).

Примітка: Спочатку я не використовував правила зі змінними ID_FS_LABEL_ENC, оскільки це на мою думку небезпечно. Що станеться, якщо ви підключите дві USB-накопичувачі, які використовують однакову мітку?

Але плакат спеціально хотів використовувати ярлик USB-диска, тому я відповідно змінив правила.

Щоб переконатися, що udev читає ці правила, використовуйте

sudo udevadm control --reload-rules

З цим файлом правил udev все налаштовано для автоматичного налаштування розділу USB-накопичувача. Зауважте, що це зараз, пристрій НЕ буде автоматизовано (навмисно). Після автоматичного використання він буде автоматизований

Крок 2)

Налаштування автофайлів для automount / media / autousb / <...>: я додав наступний рядок до файлу "/etc/auto.master" (для Ubuntu 12.04):

/media/autousb /etc/auto.usb --timeout=60

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

Для Gentoo ви повинні змінити "/etc/autofs/auto.master", щоб було доцільно використовувати

/media/autousb /etc/autofs/auto.usb --timeout=60

Тепер я створив "auto.usb" із таким вмістом:

#!/bin/bash

key=${1}
fstype=$(/sbin/blkid -o value -s TYPE /dev/usbdisks/${key})
if [ "${fstype}" = "vfat" ] ; then
  echo "-fstype=vfat,sync,uid=0,gid=plugdev,umask=007 :/dev/usbdisks/${key}"
  exit 0
fi
if [ "${fstype}" = "ntfs" ] ; then
  echo "-fstype=fuse.ntfs-3g,sync,uid=0,gid=plugdev,umask=007 :/dev/usbdisks/${key}"
  exit 0
fi
if [ "${fstype}" = "ext4" ] ; then
  echo "-fstype=ext4,sync,nocheck :/dev/usbdisks/${key}"
  exit 0
fi

exit 1

Цей auto.usb має бути виконаним, щоб автофіксатори використовували це як (bash) скрипт. Так, наприклад

sudo chmod 0755 /etc/auto.usb

Що це робить: Цей скрипт розповість AutoFS (/ usr / sbin / automount), як змонтувати розділ пристрою зберігання USB.

Сценарій спочатку використовуватиме "/ sbin / blkid", щоб дізнатися, яка файлова система знаходиться на розділі.

Потім сценарій надасть правильні параметри кріплення залежно від розділу пристрою.

Примітка. Я включив зразок коду для файлів "vfat" (мабуть, найбільш поширений для USB-паличок), "ntfs" та "xfs". Звичайно, досить просто поширити це на підтримку більшої кількості файлових систем.

Крок 3) Необов’язково ... Щоб "вийняти" == від'єднати свої USB-накопичувачі (або розділи на вашій палиці usb), створіть сценарій під / sbin / usbeject:

#!/bin/bash
killall -s SIGUSR1 /usr/sbin/automount

За допомогою цього сценарію ви можете використовувати "sudo usbeject" для демонтажу всіх змонтованих розділів USB-пристроїв (сказавши automount зняти їх).

Звичайно, ви можете просто переконатися, що розділ ніде не використовується; Автомобіль відключить розділ після 60 секунд таймауту ...

Справжня хитрість тут полягає у використанні символьних посилань від "/ media / usb" до "/ media / autousb":

  • Посилання "/ media / usb" будуть створені udev, даючи користувачеві простий огляд, які розділи пристроїв зберігання даних є там
  • AutoFS автоматично автоматизує розділ на вимогу, якщо ви використовуєте його через / media / usb
  • За допомогою сценарію "auto.usb" ви можете підтримувати будь-яку файлову систему, а також ви можете підтримувати будь-яку схему іменування.
  • Цей підхід підтримує USB-накопичувачі з декількома розділами, навіть якщо ці розділи використовують різні типи файлової системи.

2

Гаразд, минуло давно, але я все одно відповім на своє питання найкращим варіантом, який я знайшов на даний момент. Підводячи підсумок: створіть udevправило, пов’язане з деякими сценаріями (які створюватимуть / видалятимуть каталоги та знімати / монтувати знімні пристрої) та додавати до udevтипу події пристрою = partition.

1 - Створення скриптів додавання / видалення

Зберегти наступний сценарій storage-automount.shдля /lib/udev/і зробити його виконуваним ( sudo chmod a+x /lib/udev/storage-automount.sh):

#!/bin/sh

# set the mountpoint name according to partition or device name
mount_point=$ID_FS_LABEL
if [ -z $mount_point ]; then
    mount_point=${DEVNAME##*/}
fi

# if a plugdev group exist, retrieve it's gid set & it as owner of mountpoint
plugdev_gid="$(grep plugdev /etc/group|cut -f3 -d:)"
if [ -z $plugdev_gid ]; then
    gid=''
else
    chown root:plugdev $mount_point
    gid=",gid=$plugdev_gid"
fi

# create the mountpoint directory in /media/ (if not empty)
if [ -n $mount_point ]; then
    mkdir -p /media/$mount_point
    # other options (breaks POSIX): noatime,nodiratime,nosuid,nodev
    mount -t $ID_FS_TYPE \
      -o rw,flush,user,uid=0$gid,umask=002,dmask=002,fmask=002 \
      $DEVNAME /media/$mount_point
fi

Зберегти наступний сценарій storage-autounmount.shдля /lib/udev/і зробити його виконуваним ( sudo chmod a+x /lib/udev/storage-autounmount.sh):

#!/bin/sh

# set the mountpoint name according to partition or device name
mount_point=$ID_FS_LABEL
if [ -z $mount_point ]; then
    mount_point=${DEVNAME##*/}
fi

# remove the mountpoint directory from /media/ (if not empty)
if [ -n $mount_point ]; then
    umount -l /media/$mount_point
    rm -R /media/$mount_point
fi

2 - Створення udevправила приєднання цих сценаріїв до подій

І, нарешті, додайте udevправило /etc/udev/rules.d/, наприклад 85-storage-automount.rules:

ENV{DEVTYPE}=="partition", RUN+="/lib/udev/storage-automount.sh", ENV{REMOVE_CMD}="/lib/udev/storage-autounmount.sh"

і дозвольте йому мати ті ж дозволи, що й інші правила у цьому режимі / папці

Тепер, коли ви підключите запам'ятовуючий пристрій, буде створений каталог /media/відповідно до імені розділу (я не пам’ятаю, але думаю, що він також працює з розділом NTFS) і ваш розділ буде встановлений у ньому. Користувачі - це R / W, якщо у вас є plugdevгрупа у вашій системі. Також пристрої монтуються в синхронному режимі, щоб обмежити ризики втрати даних у разі гарячого відключення.

Коли пристрій видалено, його відключено, а каталог видалено з нього /media

Крім того , інструмент для моніторингу udevподій udevadm monitor, з варіантами , як --envабо --property:

$ udevadm monitor --env

Це перевірено і працює чудово як на debian, так і на арках, але, ймовірно, працює над усіма дистрибутивами, на які спирається udev.


Я думаю, що + r слід замінити на + x у "встановіть його у виконуваний файл (sudo chmod + r /lib/udev/storage-autounmount.sh)"
Джеремі

У мене є нова інсталяція jessie, під час якої я уважно стежив за вашими вказівками, але не можу зробити автоматичну роботу з tty1 навіть після перезавантаження (що не передбачено вашими інструкціями, але я також не отримав автоматичного попереднього перезавантаження). Встановлення USB-накопичувача виявлено (я отримую консольні повідомлення), але нічого не видно в / media / (крім cdrom). Я можу встановити USB-накопичувач вручну, тому я знаю, що це добре працює. [продовження в наступному коментарі]
TomRoche

[продовження з попереднього коментаря] У мене встановлений пакет = udev, попередньо заповнений dirs = {/ etc / udev / rules.d /, / lib / udev /} і виконаний = udevadm у $ PATH. Мені хотілося б знати (1) в якому випуску Debian ви зробили цю роботу? (Я припускаю, що хрип) (2) які пакунки Debian крім вас встановлені udev?
TomRoche

@TomRoche Was Wheezy, в той час, дійсно, і у мене не було встановлено спеціального пакету, я намагався зробити мінімалістичну настройку і намагався максимально уникати використання пакетів, які не були передбачені мінімальною установкою. Мені не потрібно було перезавантажувати, що це, як це не в моїх інструкціях. Вже давно я не занурився в нього… Можу спробувати скоро знову.
cedbeu

1

Я думаю, що це досить пізно, але я опублікую це, якщо комусь це потрібно: (також моя перша відповідь StackExchange)

Перевіривши рішення в багатьох місцях, я знайшов просте рішення в Arch Wiki:

Посилання на Arch Wiki .

Ми можемо додати правило udisks2, щоб змінити каталог монтування за замовчуванням /run/media/$USER/на /media/<Label>.

Додайте таке правило в /etc/udev/rules.d/імені типу 99-udisks2.rules:

ENV{ID_FS_USAGE}=="filesystem|other|crypto", ENV{UDISKS_FILESYSTEM_SHARED}="1"

Тоді ми можемо просто встановити такий простий інструмент, як Udiskie для automount .


Привіт, і ласкаво просимо сюди. Дякуємо за Ваш вибір. Що стосується Udiskie, я дійсно хотів отримати повний параметр командного рядка (у системі немає жодного Xorg чи графічного інтерфейсу). І ... Питання - 6,5 років (о, боже!), Я думаю, що зараз змінилися речі :) Але все одно, +1 за вашу першу відповідь, дякую.
cedbeu

1

Перегляньте сторінку ArchWiki Udev . Ви не повинні виконувати mountправила Udev або сценарії, виконані правилами Udev.

Однак, як показано в проекті udev-media-automount , зробити це досить просто, викликаючи блок Systemd з правила Udev, який потім викликає сценарій, який виконує монтаж. На відміну від udisks2 та інших рішень, udev-media-automount орієнтований на простий випадок, коли ви хочете встановити щось як rootкористувач, не обов'язково чекаючи присутності робочого середовища або "сеансу користувача". Здається, це саме те, що просить ОП, і я виявив, що це функціонально і легко зрозуміти.


Приємно, дякую. Це досить старе питання, яке я задав (майже 7 років тому ... не змушує себе почуватись молодшим ^^). Але все-таки я ознайомлюсь із вашою пропозицією. Я здогадуюсь, системне середовище з тих пір стало набагато більш зрілим. Дякую, я перевірю це!
cedbeu

0

Я знайшов спосіб зробити це шляхом редагування файлу / etc / fstab. Простий запис виглядає так:

/dev/sdb1 /media/robot/hdd1 ntfs defaults 0 0

<file system> <mount point> <type> <options> <dump> <pass>


Кріплення вбудовується /etc/fstabавтоматично автоматично під час завантаження.
Graeme

@Graeme, у мене є sdcard, який я монтую через / etc / fstab. Як тест, я спробував відключити та фізично вийняти sdcard з комп'ютера. Я переконався, що кріплення більше не відображається через 'df'. Коли я знову вставив свою sdcard, кріплення знову з’явилось, хоча я явно не перераховував її. Це на Ubuntu 16.04.
Джино

@Gino, Ubuntu вже деякий час робив автоматичне встановлення за замовчуванням.
Graeme

@Graeme, схоже, що автобунтер Ubuntu вибирає правильне кріплення з / etc / fstab, якщо воно існує там. Так, принаймні на Ubuntu 16.04, кріплення автоматично встановлюється під час завантаження та після наступного повторного вставки в порт usb, якщо такі є ..
Gino

@Gino Я деякий час не використовував Ubuntu, але я впевнений, що він автоматизує вашу sd-карту незалежно від того, що є у fstab. Fstab скоріше стосується налаштування основних елементів системи, ніж додаткових дисків на сучасних системах.
Graeme
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.