Вопрос или проблема
Я пытаюсь использовать 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 вызывает ошибку, из-за которой устройство отключается. Это может происходить по нескольким причинам:
- Отсутствие необходимых прав доступа: Хотя правила udev действительно выполняются от имени пользователя root, они могут запускаться в окружении, которое отличается от обычной оболочки.
- Файловые системы и монтирование: 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
.