Установка камеры с использованием jmtpfs в правиле udev

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

Я пытаюсь использовать jmtpfs, чтобы смонтировать свою GoPro для передачи файлов, когда подключаю ее к компьютеру.

У меня есть скрипт, который работает вне правила udev. Однако, когда он выполняется внутри правила udev, скрипт вызывает сбой и отключает моё USB-устройство.

Минимально работающий пример приведен здесь:

скрипт

#!/usr/bin/env bash
jmtpfs /media/GoPro > /tmp/gopro.log 2> /tmp/gopro.err

правило udev

SUBSYSTEM=="usb", ATTR{idVendor}=="2672", ATTR{idProduct}=="004b", ACTION=="add", RUN+="/bin/bash -c /home/matt/Projects/GoProScraping/scripts/grab_go_pro_files.sh"

Вывод файла /tmp/gopro.err:

Устройство 0 (VID=2672 и PID=004b) неизвестно в libmtp v1.1.19.
Пожалуйста, сообщите эту VID/PID и модель устройства команде разработчиков libmtp
fusermount: ошибка монтирования: Операция не разрешена

Вывод journalctl -f:

29 сен 09:45:31 nina kernel: usb 1-4: новое высокоскоростное USB устройство номер 16 с использованием xhci_hcd
29 сен 09:45:31 nina kernel: usb 1-4: Найдено новое USB устройство, idVendor=2672, idProduct=004b, bcdDevice= 0.01
29 сен 09:45:31 nina kernel: usb 1-4: Новые строки USB устройства: Mfr=1, Product=2, SerialNumber=3
29 сен 09:45:31 nina kernel: usb 1-4: Продукт: GoPro MAX
29 сен 09:45:31 nina kernel: usb 1-4: Производитель: GoPro
29 сен 09:45:31 nina kernel: usb 1-4: Сериальный номер: C3351325091705
29 сен 09:45:31 nina sudo[1455]:     root : PWD=/ ; USER=root ; COMMAND=/usr/bin/jmtpfs /media/GoPro
29 сен 09:45:31 nina sudo[1455]: pam_unix(sudo:session): сеанс открыт для пользователя root(uid=0) (uid=0)
29 сен 09:45:34 nina sudo[1455]: pam_unix(sudo:session): сеанс закрыт для пользователя root
29 сен 09:45:34 nina kernel: usb 1-4: USB отключено, устройство номер 16
29 сен 09:45:34 nina systemd-udevd[1453]: 1-4: Процесс '/bin/bash -c /home/matt/Projects/GoProScraping/scripts/grab_go_pro_files.sh' завершился с кодом выхода 1.

Похоже, что я подключаю GoPro, udev фиксирует, что она подключена, затем возникает ошибка разрешения, и это приводит к отключению USB, после чего udev снова фиксирует устройство.

Однако, если я попробую выполнить команду: jmtpfs /media/GoPro от имени пользователя root, всё монтируется нормально, и я могу вручную получить доступ к файлам.

Я думал, что правила udev выполняются от имени root, что я упускаю?

Ответ или решение

Для решения проблемы с автоматическим монтированием камеры GoPro с использованием jmtpfs через правило udev, следует учитывать, что правила udev запускаются в контексте ядра, что может ограничивать доступ к некоторым ресурсам и вызывать проблемы с разрешениями.

Проблема

Как вы уже отметили, запуск скрипта из правила udev вызывает ошибку, из-за которой устройство отключается. Это может происходить по нескольким причинам:

  1. Отсутствие необходимых прав доступа: Хотя правила udev действительно выполняются от имени пользователя root, они могут запускаться в окружении, которое отличается от обычной оболочки.
  2. Файловые системы и монтирование: mnt через fuse, такие как jmtpfs, могут не работать должным образом при нарушении стандартного парадигмы работы с udev.

Решение

Вот шаги, которые могут помочь исправить эту ситуацию:

1. Измените правило udev

Попробуйте изменить правило так, чтобы оно запускало скрипт через at или systemd таймер. Это создаст дополнительную задержку перед исполнением, что может помочь в устранении ошибок, связанных с разрешениями.

Пример udev правила:

SUBSYSTEM=="usb", ATTR{idVendor}=="2672", ATTR{idProduct}=="004b", ACTION=="add", RUN+="/usr/bin/systemd-run --user --scope /bin/bash /home/matt/Projects/GoProScraping/scripts/grab_go_pro_files.sh"

Это позволит вашему скрипту выполняться в сессии пользователя systemd, что может обойти проблемы с разрешениями.

2. Измените скрипт

Обновите ваш скрипт, чтобы он содержал некоторую задержку перед выполнением команды jmtpfs, что может помочь, если устройство еще не полностью инициализировано.

Пример обновленного скрипта:

#!/usr/bin/env bash
sleep 5  # Задержка перед монтированием
jmtpfs /media/GoPro &> /tmp/gopro.log

3. Убедитесь в правильной настройке папки

Убедитесь, что папка /media/GoPro существует и доступна для записи пользователю, от имени которого запускается скрипт. Можно создать папку, если она еще не существует:

mkdir -p /media/GoPro
chown root:users /media/GoPro   # Замените 'users' на группу, которой необходимо предоставить доступ
chmod 775 /media/GoPro

4. Проверка зависимости

Убедитесь также, что все необходимые зависимости установлены и актуальны. Иногда библиотека libmtp может быть устаревшей для вашей модели GoPro, поэтому убедитесь, что ваша версия обновлена.

Заключение

Следуя указанным шагам, вы сможете решить проблему, связанную с монтированием GoPro через jmtpfs с помощью правил udev. Если вы по-прежнему испытываете трудности, рекомендуем просмотреть логи journalctl на предмет дополнительных ошибок и проверить наличие обновлений для libmtp.

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

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