Вопрос или проблема
Для проекта SamplerBox до сих пор я использовал /dev/sda1 /media auto nofail 0 0
, чтобы USB флеш-накопители автоматически монтировались при вставке на безголовом компьютере, см. также Автоматическое монтирование и автоматическое перемонтирование с /etc/fstab. Но это кажется не очень надежным, например, когда USB флеш-накопитель вынимается, а затем снова вставляется.
Какое легкое и простое в настройке решение доступно в Debian, чтобы автоматически монтировать каждое устройство /dev/sd*
в /media/
?
-
Если подключен второй флеш-накопитель, игнорировать или монтировать в другую папку
/media2/
-
Если накопитель был извлечен (даже без корректного
umount
), а затем повторно вставлен через несколько минут, он должен быть смонтирован снова
Сценарий использования – это безголевое устройство, на которое конечный пользователь может подключать USB флеш-накопители, и оно должно всегда распознаваться (независимо от того, удалил ли он предыдущий USB флеш-накопитель без разрешения в программном обеспечении).
На основе комментария @FelixJN я немного модифицировал это отличное руководство Андреа Фортуны в соответствии с моими потребностями, и вот решение:
-
Создайте файл
/root/usb-mount.sh
, содержащий следующее (и добавьте разрешение +x):#!/bin/bash ACTION=$1 DEVBASE=$2 DEVICE="/dev/${DEVBASE}" MOUNT_POINT=$(/bin/mount | /bin/grep ${DEVICE} | /usr/bin/awk '{ print $3 }') # Проверяем, смонтирован ли этот накопитель case "${ACTION}" in add) if [[ -n ${MOUNT_POINT} ]]; then exit 1; fi # Уже смонтирован, выходим eval $(/sbin/blkid -o udev ${DEVICE}) # Получаем информацию для этого накопителя: $ID_FS_LABEL, $ID_FS_UUID и $ID_FS_TYPE OPTS="rw,relatime" # Глобальные параметры монтирования if [[ ${ID_FS_TYPE} == "vfat" ]]; then OPTS+=",users,gid=100,umask=000,shortname=mixed,utf8=1,flush"; fi # Параметры монтирования, специфичные для типа файловой системы if ! /bin/mount -o ${OPTS} ${DEVICE} /media/; then exit 1; fi # Ошибка во время процесса монтирования: очистка точки монтирования ;; remove) if [[ -n ${MOUNT_POINT} ]]; then /bin/umount -l ${DEVICE}; fi ;; esac
-
Создайте файл
/etc/systemd/system/[email protected]
, содержащий:[Unit] Description=Монтирование USB накопителя на %i [Service] Type=oneshot RemainAfterExit=true ExecStart=/root/usb-mount.sh add %i ExecStop=/root/usb-mount.sh remove %i
-
Создайте файл
/etc/udev/rules.d/99-local.rules
, содержащий:KERNEL=="sd[a-z][0-9]", SUBSYSTEMS=="usb", ACTION=="add", RUN+="/bin/systemctl start usb-mount@%k.service" KERNEL=="sd[a-z][0-9]", SUBSYSTEMS=="usb", ACTION=="remove", RUN+="/bin/systemctl stop usb-mount@%k.service"
-
Перезапустите правила:
udevadm control --reload-rules systemctl daemon-reload
-
Подключите USB флеш-накопитель. Он должен быть смонтирован в
/media/
.
Я только что использовал это решение на Raspberry Pi. Требуются минимальные изменения:
- Создайте файл
usb-mount.sh
в/home/pi
вместо/root
.
Измените строку с параметрами монтирования, специфичными для типа файловой системы, чтобы владельцем был ‘pi’, а не ‘root’:if [[ ${ID_FS_TYPE} == 'vfat' ]]; then OPTS+=',users,uid=1000,gid=100,umask=000,shortname=mixed,utf8=1,flush'; fi # параметры монтирования, специфичные для файловой системы
- В файле
/etc/systemd/system/[email protected]
скорректируйте последние две строки:ExecStart=/home/pi/usb-mount.sh add %i
ExecStop=/home/pi/usb-mount.sh remove %i
Ответ или решение
Автоматическое монтирование USB-накопителей на безголовом компьютере с Debian
Для проекта SamplerBox необходимо решение, которое позволит автоматически монтировать USB-накопители на безголовом компьютере с минимальными усилиями и высокой надежностью. Ранее использовался метод с fstab
, но возникли проблемы с обнаружением накопителей после их отключения и повторного подключения. Рассмотрим, какие шаги необходимо предпринять для решения данной задачи на Debian, чтобы обеспечить надежное автоматическое монтирование.
Цели
- Автоматическое монтирование устройств в директорию
/media/
каждого подключаемого USB-накопителя. - Игнорирование повторного монтирования, если накопитель уже подключен.
- Позволить изменение местоположения монтирования, если подключено несколько накопителей, например,
/media/
для первого и/media2/
для второго. - Обеспечение обработки событий подключения и отключения без необходимости в использовании команды
umount
.
Решение
Для достижения поставленных целей можно использовать скрипт на Bash, системы systemd
и правила udev
. Давайте пройдемся по необходимым шагам.
Шаг 1: Создание скрипта монтирования
Создайте файл /root/usb-mount.sh
со следующим содержимым:
#!/bin/bash
ACTION=$1
DEVBASE=$2
DEVICE="/dev/${DEVBASE}"
MOUNT_POINT=$(/bin/mount | /bin/grep ${DEVICE} | /usr/bin/awk '{ print $3 }')
case "${ACTION}" in
add)
if [[ -n ${MOUNT_POINT} ]]; then exit 1; fi
eval $(/sbin/blkid -o udev ${DEVICE})
OPTS="rw,relatime"
if [[ ${ID_FS_TYPE} == "vfat" ]]; then OPTS+=",users,gid=100,umask=000,shortname=mixed,utf8=1,flush"; fi
if ! /bin/mount -o ${OPTS} ${DEVICE} /media/; then exit 1; fi
;;
remove)
if [[ -n ${MOUNT_POINT} ]]; then /bin/umount -l ${DEVICE}; fi
;;
esac
Не забудьте добавить разрешения на выполнение:
chmod +x /root/usb-mount.sh
Шаг 2: Создание системного сервиса
Создайте файл /etc/systemd/system/usb-mount@.service
со следующим содержимым:
[Unit]
Description=Mount USB Drive on %i
[Service]
Type=oneshot
RemainAfterExit=true
ExecStart=/root/usb-mount.sh add %i
ExecStop=/root/usb-mount.sh remove %i
Шаг 3: Настройка udev
Создайте файл /etc/udev/rules.d/99-local.rules
со следующим содержимым:
KERNEL=="sd[a-z][0-9]", SUBSYSTEMS=="usb", ACTION=="add", RUN+="/bin/systemctl start usb-mount@%k.service"
KERNEL=="sd[a-z][0-9]", SUBSYSTEMS=="usb", ACTION=="remove", RUN+="/bin/systemctl stop usb-mount@%k.service"
Шаг 4: Перезагрузка правил udev
После настройки всех файлов выполните следующие команды, чтобы перезапустить правила и процессы systemd
:
udevadm control --reload-rules
systemctl daemon-reload
Шаг 5: Подключение USB-накопителя
Теперь вы можете подключить USB-накопитель, и он должен автоматически монтироваться в директорию /media/
. Если у вас подключено несколько накопителей, можно будет расширить скрипт для монтирования их в /media2/
или другие указанные папки.
Заключение
Это решение является эффективным и простым способом автоматического монтирования USB-накопителей в среде Debian на безголовом устройстве. Оно позволяет избежать проблем с повторным подключением, не требуя ручного вмешательства со стороны пользователя. Использование systemd
и udev
обеспечивает стабильную работу сервиса и простоту настройки, что делает его отличным выбором для автоматизации управления накопителями.