Как автоматически подключить съемный носитель в / media / <LABEL> при вставке, без какой-либо среды рабочего стола?


17

У меня есть система Debian sid (Wheezy) (и то же самое для arch), без какой-либо среды рабочего стола (и вообще без 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т.д., но неясно , какой из них является устаревшим или предпочтительным, и в любом случае, я не понял, как настроить их легко в моей системе , чтобы сделать это, до сих пор ...


Во-первых, вы искали похожие вопросы? Я помню, это уже спрашивали. Во-вторых, перед отключением должно произойти отключение.
Энзотиб

1
Конечно я сделал: o] Здесь и на суперпользователя. Проблема в том, что инструменты развиваются (udisks / udev) или устарели (HAL?), Другие «не предпочтительны» (udisks2?) И так далее. Во всяком случае, я не смог найти ни рабочего, ни четкого решения. Большая часть того, что я узнал, опирается на механизм среды рабочего стола (Gnome, KDE или XFCE); Я не хочу устанавливать их. О разборках не обязательно. Если устройство установлено на sync, демон может отключить устройство от fs, если обнаружит, что оно было отключено без потери данных. Все настольные дистрибутивы делают это. Я хочу это в терминале.
Cedbeu

Посмотрите на эту заменуhalevt . Что касается размонтирования, обычно DE ожидает, что вы извлечете устройство из файлового менеджера, прежде чем физически отключите его.
энзотиб

Да, верно. Но я видел, что некоторые (ранее использовавшиеся) демоны могли размонтировать устройства из fs, которые не были размонтированы перед отключением, и даже автоматически удалить их соответствующий каталог из / media /, и это оставалось в пределах обычного способа работы (если устройства настроены на синхронность конечно). Спасибо за вашу ссылку. Я посмотрю, как только вернусь домой на udisksevt. Я уже посмотрел на devmon и udiskie, но их нет в пакетах Debian. Если я смогу найти что-то еще, я попробую это, но я не могу поверить, что в Debian нет собственного решения для этого.
cedbeu

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

Ответы:


10

Я думаю, что вы ищете pmount.

Если вам нужен автоматический монтаж при вставке, смотрите раздел «Автоматическое подключение USB-флешек в Debian» .

Если ваша система использует udisks2 , это предпочтительный способ реагирования на установку съемного устройства хранения. Смотрите Arch Wiki для советов по настройке Udisks.

В противном случае программа, которая реагирует на появление нового устройства, называется 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- перестать быть злым »

Привет @ Жиль. Спасибо за ваши ответы. Я не думаю, что я упрощаю, хотя. Вы правы в некоторых моментах. Но пользователь решает, хочет ли он жить рискованно. Вы согласитесь, вашему посту 7 лет; теперь flushопция монтирования, разработанная специально для этого, vfatпозволяет избежать этих проблем: запись выполняется не после каждого блока, а как только устройство кажется неактивным. И флэш-воспоминания также значительно увеличили свои тупиковые жизненные циклы. Теперь, очевидно, пользователь должен знать, чтобы не отключать устройства во время открытия файлов или во время копирования (или вскоре после этого). Но это хороший компромисс.
cedbeu

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

1
Обратите внимание, что usbmountбольше не поддерживает NTFS jessie: bugs.debian.org/774149
малат

2

Вот как я недавно это сделал, и теперь я вполне доволен этим подходом. Это для Ubuntu 12.04 + gentoo, но я думаю, что любой дистрибутив, который позволяет установить udev и автозапуск должен работать.

Предварительные условия: Вы должны установить 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)

Настройте autofs для автомонтирования / 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 должен быть исполняемым, чтобы autofs использовал его как (bash) скрипт. Так например

sudo chmod 0755 /etc/auto.usb

Что это делает? Этот скрипт сообщит AutoFS (/ usr / sbin / automount), как монтировать раздел устройства хранения USB.

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

Затем сценарий предоставит правильные параметры монтирования в зависимости от раздела устройства.

Примечание: я включил пример кода для файловых систем "vfat" (вероятно, наиболее распространенных для USB-флешек), "ntfs" и "xfs". Конечно, это довольно легко расширить для поддержки большего количества файловых систем.

Шаг 3) Необязательно ... Чтобы "извлечь" == размонтировать ваши флешки (или разделы на вашей флешке), создайте скрипт в / sbin / usbeject:

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

С помощью этого сценария вы можете использовать «sudo usbeject» для размонтирования всех подключенных разделов USB-устройств (указав автомонтированию отключить их).

Конечно, вы можете просто убедиться, что раздел нигде не используется; Затем автомонтировщик размонтирует раздел после 60 секундного ожидания ...

Настоящий трюк здесь заключается в использовании символических ссылок от "/ media / usb" на "/ media / autousb":

  • Символические ссылки "/ media / usb" будут созданы udev, чтобы дать пользователю простой обзор того, какие разделы устройства хранения USB есть.
  • 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, так и на Arch, но, вероятно, работает на всех дистрибутивах, которые используют udev.


Я думаю, что + r следует заменить на + x в «установить его в исполняемый файл (sudo chmod + r /lib/udev/storage-autounmount.sh)»
Джереми

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

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

@TomRoche был 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 для автомонтирования.


Привет и добро пожаловать сюда. Спасибо за ваш вариант. Для Udiskie я на самом деле хотел использовать полную опцию командной строки (Xorg или графический интерфейс не доступны в системе). И ... Вопросу 6,5 лет (ах, черт возьми!), Я думаю, что сейчас все изменилось :) Но в любом случае, +1 за ваш первый ответ, спасибо.
Cedbeu

1

Пожалуйста, смотрите страницу ArchWiki Udev . Вы не должны выполняться mountиз правил Udev или из сценариев, которые выполняются правилами Udev.

Однако, как показано в проекте udev-media-automount , это довольно просто сделать, вызвав модуль Systemd из правила Udev, которое затем вызывает скрипт, выполняющий монтирование. В отличие от udisks2 и других решений, udev-media-automount ориентирован на простой случай, когда вы хотите смонтировать что-либо как rootпользователь без необходимости ожидания присутствия среды рабочего стола или «пользовательского сеанса». Похоже, это именно то, о чем просит ОП, и я нашел его функциональным и простым для понимания.


Хорошо.Спасибо. Это довольно старый вопрос, который я задал (почти 7 лет назад… я не чувствую себя моложе ^^). Но все же я посмотрю на ваше предложение. Я думаю, что с тех пор среда systemd стала более зрелой. Спасибо, я проверю это!
Cedbeu

0

Я нашел способ сделать это, отредактировав файл / etc / fstab. Простая запись выглядит так:

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

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


Кронштейны в /etc/fstabтолько автоматически монтироваться при загрузке.
Грэм

@ Graeme, у меня есть sdcard, который я монтирую через / etc / fstab. В качестве теста я попытался отключить и физически удалить SD-карту из моего компьютера. Я проверил, что монтирование больше не показывалось через 'df'. Когда я снова вставил свою SD-карту, монтирование снова появилось, хотя я явно не перемонтировал его. Это на Ubuntu 16.04.
Джино

@ Джино, Ubuntu уже некоторое время выполняет автоматическое монтирование по умолчанию.
Грэм

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

@ Джино Я давно не пользовался Ubuntu, но уверен, что он автоматически смонтирует вашу SD-карту независимо от того, что находится в fstab. Fstab больше настраивает элементы базовой системы, чем дополнительные диски в современных системах.
Грэм
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.