☰ Оглавление

Доступ к MTP-устройствам с правами обычного пользователя

Начиная с версии 3.0, Android стал передавать данные между компьютером и устройством по MTP. К счастью, в Linux MTP хорошо поддержан самым разным софтом: GPhoto, Amarok, Audacious, Banshee, Gnomad2, Nautilus, Qlix, Rhythmbox… Я пользуюсь gMTP.

Проблема только с правами и с доступом к устройству от обычного (непривилегированного) пользователя. Решением этой проблемы мы сейчас и займёмся.

Определение параметров устройства

Так как мы параноики и не хотим давать всем права на всё, давайте определимся точно с устройством.

Запускаем команду:

# udevadm monitor --environment --udev

и подключаем устройство к компьютеру.

Udev выдаёт массу информации, из которой для нас будет наиболее ценной вот эта:

DEVPATH=/devices/pci0000:00/0000:00:1d.7/usb6/6-1/6-1:1.0
SUBSYSTEM=usb
DEVTYPE=usb_interface
PRODUCT=4e8/6860/400

(естественно, ваши значения, скорее всего, будут отличаться)

Зная путь к устройству DEVPATH, запрашиваем более детальную информацию:

# udevadm info -a --path=/devices/pci0000:00/0000:00:1d.7/usb6/6-1/6-1:1.0

Здесь давайте обратим внимание на атрибуты

ATTRS{idVendor}=="04e8"
ATTRS{idProduct}=="6860"

Можно выбрать и другие, но эти представляются мне наиболее очевидными.

Теперь мы знаем об устройстве достаточно. Переходим к настройке udev.

Настройка прав на устройство в udev

В большинстве дистрибутивов правила udev хранятся в файлах /etc/udev/rules.d/<NN>-<name>.rules. <NN> — две любые цифры (в нашем случае их значения не существенны), и <name> — любое имя просто для собственного удобства. Расширение .rules обязательно. Без него файл будет проигнорирован. То есть имя файла /etc/udev/rules.d/42-android.rules подойдёт.

В этот файл пишем строчку примерно такого вида:

SUBSYSTEMS=="usb", ENV{DEVTYPE}=="usb_device", ATTRS{idVendor}=="04e8", ATTRS{idProduct}=="6860", MODE:="0666"

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

Можно было поступить иначе, использовав директивы USER или GROUP. Это уже на ваше усмотрение.

Теперь заставляем udev перечитать правила:

# udevadm control --reload-rules

Всё должно начать работать.

Проверяем, всё ли работает

Теперь вы можете переподключить устройство и проверить, что ваш софт его видит.

Если что-то пошло не так, то можно проверить, работает ли ваше правило.

Для этого можно выполнить пару команд

# ls -l /dev/libmtp-6-1
lrwxrwxrwx 1 root root 15 апр  5 19:18 /dev/libmtp-6-1 -> bus/usb/006/010
# ls -l /dev/bus/usb/006/010
crw-rw-rw- 1 root root 189, 649 апр  5 19:18 /dev/bus/usb/006/010

Или обойтись одной:

# ls -Ll /dev/libmtp-6-1
crw-rw-rw- 1 root root 189, 649 апр  5 19:18 /dev/libmtp-6-1

Как видите, в моём случае udev сделал как раз то, что было прописано в правилах: устройство принадлежит пользователю root, а права crw-rw-rw-. Если у вас правило не сработало, ещё раз проверьте, не пропустили ли вы какие-то шаги.

Успехов!