USB-флеш-накопители автоматически монтируются (безголовый компьютер)

Вопрос или проблема

Для проекта SamplerBox до сих пор я использовал /dev/sda1 /media auto nofail 0 0, чтобы USB флеш-накопители автоматически монтировались при вставке на безголовом компьютере, см. также Автоматическое монтирование и автоматическое перемонтирование с /etc/fstab. Но это кажется не очень надежным, например, когда USB флеш-накопитель вынимается, а затем снова вставляется.

Какое легкое и простое в настройке решение доступно в Debian, чтобы автоматически монтировать каждое устройство /dev/sd* в /media/?

  • Если подключен второй флеш-накопитель, игнорировать или монтировать в другую папку /media2/

  • Если накопитель был извлечен (даже без корректного umount), а затем повторно вставлен через несколько минут, он должен быть смонтирован снова

Сценарий использования – это безголевое устройство, на которое конечный пользователь может подключать USB флеш-накопители, и оно должно всегда распознаваться (независимо от того, удалил ли он предыдущий USB флеш-накопитель без разрешения в программном обеспечении).

На основе комментария @FelixJN я немного модифицировал это отличное руководство Андреа Фортуны в соответствии с моими потребностями, и вот решение:

  1. Создайте файл /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
    
  2. Создайте файл /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
    
  3. Создайте файл /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. Перезапустите правила:

     udevadm control --reload-rules
     systemctl daemon-reload
    
  5. Подключите USB флеш-накопитель. Он должен быть смонтирован в /media/.

Я только что использовал это решение на Raspberry Pi. Требуются минимальные изменения:

  1. Создайте файл 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 # параметры монтирования, специфичные для файловой системы
    
  2. В файле /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, чтобы обеспечить надежное автоматическое монтирование.

Цели

  1. Автоматическое монтирование устройств в директорию /media/ каждого подключаемого USB-накопителя.
  2. Игнорирование повторного монтирования, если накопитель уже подключен.
  3. Позволить изменение местоположения монтирования, если подключено несколько накопителей, например, /media/ для первого и /media2/ для второго.
  4. Обеспечение обработки событий подключения и отключения без необходимости в использовании команды 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 обеспечивает стабильную работу сервиса и простоту настройки, что делает его отличным выбором для автоматизации управления накопителями.

Оцените материал
Добавить комментарий

Капча загружается...