LINUX.ORG.RU

Автоопределение USB-устройств в Linux Mint 18.3 (udev,udisks, или что?)

 , , ,


1

2

Привет, All!

По причине описанной в другой ветке этого форума, у меня возник более конкретный вопрос, который я вынес сюда как более общую тему:

  • Как в системе Linux Mint 18.3 реализовано автоопределение usb-устройств сейчас в 2018 году?

Проблема в том, что почти вся информация, которая находится по подобным поисковым запросам датируется 2011-2015 годами и ссылается на настройку утилиты udev путём добавления в каталог /etc/udev/rules.d/ файлов с описаниями правил монтирования.

Но беда в том, что в моей системе этот каталог изначально пуст и все описанные в инструкциях действия не дают никакого результата.

Каталог /etc/udisks2/ тоже пуст.

Я нашёл упоминание о рolkit, но как это может быть связано с моей задачей я не очень понимаю.


в моей системе этот каталог изначально пуст

В /etc/udev/rules.d/ пишет только админ (локалхоста), если конечно дистр не упоротый. Обычно правила, поставляемые с пакетом, живут в /usr/lib/udev/rules.d/ и/или в /lib/udev/rules.d/.

действия не дают никакого результата

  • Убедись, что правило описано правильно и хандлит нужное тебе устройство.
  • udevadm control --reload делал?

рolkit

Туда лучше не лезь, если не знаешь, что делать. Проще добавить пользователя в соответствующую группу (GID и название группы в разных дистрах могут отличаться, потому тут не подскажу) и перелогиниться (при этом, чтобы изменения вступили в силу, пользователь должен завершить все активные сессии, потому, если не сработало, лучше перезагрузить компьютер).

r3lgar ★★★★★ ()
Ответ на: комментарий от r3lgar

Убедись, что правило описано правильно и хандлит нужное тебе устройство.

Ну, опишу всё по порядку, может я где-то ступил.

Вначале, я использовал dmesg для сбора информации. Я сделал два файла с выводами этой утилиты до и после подключения NXT-устройства:

[  450.099572] usb 2-1.6: new full-speed USB device number 5 using ehci-pci
[  450.215504] usb 2-1.6: New USB device found, idVendor=0694, idProduct=0002
[  450.215508] usb 2-1.6: New USB device strings: Mfr=0, Product=0, SerialNumber=1
[  450.215511] usb 2-1.6: SerialNumber: 0016531AA633

В статьях 2011-2012 годов по подключению NXT, как раз упоминалось, что у устройства долженsы быть idVendor=0694 и idProduct=0002.

Дальше, разница выводов lsusb до и после подключения устройства была:

Bus 002 Device 006: ID 0694:0002 Lego Group Mindstorms NXT

Причём, это всё работало ещё до того как я стал прописывать настройки в пустой по умолчанию каталог /etc/udev/rules.d/, но такое поведение было описано и в тех статьях, которые я читал.

Что касается udev, то у меня в системе установлена по умолчанию версия 229-4ubuntu21.4, что бы это ни значило.

Дальше, в разных статьях по настройке рекомендовалось следующее:

1) Создать файл /etc/udev/rules.d/80-nxt.rules с текстом:

SUBSYSTEM=="usb_device", ACTION=="add", SYSFS{idVendor}=="0694", SYSFS{idProduct}=="0002", SYMLINK+="nxt-%k", MODE="0666"

2) Или создать тот же файл но с текстом (предполагается, что это разные вариации для разных версий udev, но какой для чего я не в курсе):

SUBSYSTEM=="usb", ACTION=="add", ATTRS{idVendor}=="0694", ATTRS{idProduct}=="0002", SYMLINK+="nxt-%k", MODE="0666"

3) В другом источнике, предлагалось создать файл /etc/udev/rules.d/45-legonxt.rules с текстом:

SUBSYSTEM=="usb", DRIVER=="usb", ATTRS{idVendor}=="0694", ATTRS{idProduct}=="0002", MODE="0660", OWNER="dalts"

4) Ещё предлагался вариант файла /etc/udev/rules.d/70-nxt.rules с текстом:

SUBSYSTEM=="usb", ATTRS{idVendor}=="0694", GROUP="nxt", MODE="0660"

В принципе, названия файлов, по всей видимости не важны, просто я привожу примеры из разных источников и опробовал я эти варианты по отдельности.

После создания конфигурационного файла, предполагалось выполнить команду:

service udev restart

Но ни эта команда, ни перезагрузка, ни

sudo udevadm control --reload
мне не помогли.

:-(

Честно говоря, я не очень представляю, как можно проверить автораспознание NXT-устройства, подключенного к usb, но выполняя инструкции по установке софта (компиляторов nxc и nbc) предполагалось, что при запуске компиляторов с определёнными опциями, компиляторы должны загрузить бинарные файлы в подключенное и автоматически расшаренное NXT-устройство. Этого не происходит.

Hemulo ()
Последнее исправление: Hemulo (всего исправлений: 2)
Ответ на: комментарий от anonymous

что за шиза? Компилируй и отправляй, через scp там или чем, как тебе уже надо.

Вообще, мне нужно хоть как-то расшарить доступ к устройству, чтобы загружать на него программы любым из возможных способов!

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

Ну, и просто в примере компилятора nbc для системы NXT по умолчанию приводятся варианты типа:

You can then compile this up using

nbc -O=HelloWorld HelloWorld.nxc

...

then upload your HelloWorld program

 nxt_push HelloWorld 

You can then run the program using the buttons on the NXT

Тут речь была о загрузке ранее скомпилированного компилятором nbc файла из исходника HelloWorld.nxc в бинарник HelloWorld с помощью специального питоновского скрипта nxt_push


Another final option is to use the the built in download feature of nbc, you can do something like this when you compile:

nbc -d -S=usb HelloWorld.nxc

This will automatically download a successful build to the NXT brick, there is also a -r option to download and run.

А тут, компиляция и загрузка того же исходника осуществляется самим компилятором nbc

Ну, а сам nbc -help выдаёт в первых строчках описания своих опций:

Next Byte Codes Compiler version 1.2 (1.2.1.r5, built Sun Jun 30 18:17:23 CDT 2013)
     Copyright (c) 2006-2011, John Hansen
Syntax: nbc [options] filename [options]

   -T=<target>: target can be NXT or SPRO
   -S=<portname>: specify port name (usb), brick resource name, or alias
   -d: download program
   -r: download and run program
...
...

Hemulo ()
Ответ на: комментарий от Hemulo

использовал dmesg для сбора информации

А следовало бы использовать udevadm monitor, оттуда можно копировать данные (почти) как есть.

idVendor=0694, idProduct=0002

Показывай написанное тобой правило.

service udev restart

Зачем? Используй udevadm control --reload.

В общем, давай написанное правило и выхлоп udevadm monitor (вытаскиваешь девайс, запускаешь монитор, втыкаешь девайс, ждёшь получения информации (её будет много)).

r3lgar ★★★★★ ()
Ответ на: комментарий от r3lgar

Показывай написанное тобой правило.

В общем, я решил сделать все действия сначала (И кажется заработало):

1) я создал один файл рулесов с немного изменёнными параметрами:

SUBSYSTEM=="usb", ACTION=="add", ATTRS{idVendor}=="0694", ATTRS{idProduct}=="0002", SYMLINK+="nxt", MODE="0666"

Тут, насколько я понимаю, проверяются 4 первых параметра на соответствие, потом создаётся символьная ссылка с именем «nxt» и задаются (для этой ссылки?) права доступа «666».

2) После этого я выполнил команду: udevadm control --reload

3) Потом выключил NXT-устройство и снова его включил.

4) Набрал lsusb для просмотра устройств и получил:

Bus 002 Device 009: ID 0694:0002 Lego Group Mindstorms NXT
...

5) Потом я набрал команду: ls -l /dev/bus/usb/002/

...
crw-rw---- 1 root plugdev 189, 136 авг 11 14:42 009

Вроде тут видно, что устройство 009 было подключено, но права доступа к нему «crw-rw----»

6) Потом я набрал: ls -l /dev/nxt

lrwxrwxrwx 1 root root 15 авг 11 14:42 /dev/nxt -> bus/usb/002/009

Во! Вот это мне понравилось!
Как я понял, при подключении NXT была создана символьная ссылка на устройство /dev/nxt и права на эту ссылку были определены уже по максимуму: «lrwxrwxrwx».

При отключенном устройстве, эта символьная ссылка недоступна.

7) Вывод udevadm monitor (отключил девайс, запустил монитор, включил девайс):

KERNEL[13403.579950] add      /devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.6 (usb)
KERNEL[13403.580758] add      /devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.6/2-1.6:1.0 (usb)
UDEV  [13403.604433] add      /devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.6 (usb)
UDEV  [13404.612498] add      /devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.6/2-1.6:1.0 (usb)

Тут всего 4 строчки, но они мне как-то ничего не говорят.

В итоге, после проведения всех этих телодвижений, оказалось, что я могу уже загружать программы с помощью компилятора nbc:

nbc -d -S=usb hello.nxc

Но загрузка данных с помощью питоновского скрипта nxt_push пока не работает.

Также, всё ещё не видит подключенного по usb устройства и запущенная под Wine система BricXX.

Честно говоря, я пока не понял до конца, в чём проблема.
Может быть нужно как-то менять права доступа к самому устройству, а не только к символьной ссылке?
Может нужно что-то городить с группами и групповыми правами?

Hemulo ()
Последнее исправление: Hemulo (всего исправлений: 1)
Ответ на: комментарий от Hemulo

Все симлинки имеют такие права доступа. MODE в правиле udev задает пермиссии не для симлинка а для самого девайс нода (в данном случае для /dev/bus/usb/002/009.

У тебя права получились другие — 0660, root:plugdev. Значит открыть этот девайс нод сможет только пользователь группы plugdev (ну и конечно root).

Почему получились другие права — видимо правило, которое ты добавил, перекрыто каким-то другим правилом. Порядок правил зависит от порядка, в котором udevd читает файлы с правилами, а читает он их в порядке лексиграфического возрастания имен. Поэтому файлам с правилами дают имена с числовыми префиксами. Попробуй назвать свой файл правил с префиксом 99-, может быть тогда твое правило станет последним.

Можно также попробовать запустить nbc -d с правами рута. Рут однозначно имеет право открывать любые девайс ноды. Если и с правами рута nbc -d не может загрузить программу на устройство, значит дело не в правах, и правилами udev ты ситуацию не поправишь.

iliyap ★★★★ ()
Ответ на: комментарий от iliyap

Порядок правил зависит от порядка, в котором udevd читает файлы с правилами, а читает он их в порядке лексиграфического возрастания имен. Поэтому файлам с правилами дают имена с числовыми префиксами. Попробуй назвать свой файл правил с префиксом 99-, может быть тогда твое правило станет последним.

Да, вот только что сам тоже обратил на это внимание!

Настроил всё то же самое на ноуте, с той лишь разницей, что на ноуте файл рулесов прописал с большим числом в начале и результаты вывода на ноуте отличались по правам доступа.

Сейчас исправил и на первом компе. Всё пучком стало с отображаемыми правами.

Можно также попробовать запустить nbc -d с правами рута.

Да, по факту, так оно сейчас и работало. Просто при установке компилятора прописывался конфиг через sudo visudo

_username_ ALL = NOPASSWD: /usr/local/bin/nbc

с заменой имени пользователя, конечно...

Т.е. насколько я понимаю, тут nbc запускается с админскими правами без запроса пароля.

Hemulo ()
Последнее исправление: Hemulo (всего исправлений: 1)
Ответ на: комментарий от Hemulo

проверяются 4 первых параметра на соответствие

== — сравнение, = — присвоение.

потом создаётся символьная ссылка с именем «nxt»

Не потом, а при условии соответствия условиям.

задаются (для этой ссылки?) права доступа «666»

symlink всегда имеет lrwxrwxrwx (ибо ему пофиг, он прозрачно перенаправляет туда, куда ссылается, и права будут те, что у реального файла/устройства/директории), права доступа присваиваются девайсу. Я представления не имею, что за девайс, но я бы назначил хотя бы группу, и разрешил доступ только этой группе.

устройство 009 было подключено, но права доступа к нему «crw-rw----»

Попробуй вначале назначить права доступа, и только потом создать симлинк.

и права на эту ссылку были определены уже по максимуму

Читай выше.

Но загрузка данных с помощью питоновского скрипта nxt_push пока не работает.

А права-то на запись есть?

«crw-rw----»

Если от юзера, то нет.

Также, всё ещё не видит подключенного по usb устройства и запущенная под Wine система BricXX.

Тут ничем не помогу.

Может быть нужно как-то менять права доступа к самому устройству, а не только к символьной ссылке?

Права, назначенные на symlink (кроме прав на чтение), менять смысла нет, читай выше. Про изменение прав я уже написал выше — измени порядок правила (смести создание ссылки в конец строки).

Может нужно что-то городить с группами и групповыми правами?

Я бы сделал, разграничив права. Но учитывая, что тебе нужен доступ из Wine… не заморачивайся.

r3lgar ★★★★★ ()
Ответ на: комментарий от Hemulo

Так и не понял, загружает ли у тебя nbc -d программу в устройство под пользователем, или только под рутом, или вообще никак не загружает.

iliyap ★★★★ ()
Последнее исправление: iliyap (всего исправлений: 1)
Ответ на: комментарий от iliyap

только пользователь группы plugdev

С этим разобрался, но подумал, что может быть поможет включение в рулесы описания новой группы типа GROUP="nxt" с последующим добавлением нужному пользователю этой группы.

Сделал, проверил, но отличий не увидел, т.к. изначально nbc всё равно имел админские права и не обращал внимания на все ограничения, а во-вторых, права всё равно выставляются в 666, и наличие дополнительной группы вроде как и не нужно вообще (в отличие от прав 660).

Но, на всякий случай, я добавил группу, что называется, на вырост.

Hemulo ()
Ответ на: комментарий от iliyap

Так и не понял, загружает ли у тебя nbc -d программу в устройство под пользователем, или только по рутом, или вообще никак не загружает.

Сейчас nbc -d работает. По факту, он работает с админскими правами, но учитывая мои теперешние настройки, видимо, должен был бы работать и без админских прав.

Я пока не разобрался с другими способами загрузки программ, кроме как nbc -d. Но, это, вероятней всего, уже совсем другой вопрос.

Hemulo ()
Ответ на: комментарий от r3lgar

Да, я понял некоторые свои косяки, и теперь изменил кое что в настройках.

1) Я создал единственный файл рулесов в начинающийся с большого номера (поскольку файлов с другими номерами в этом каталоге не было, то я изначально решил, что номер моего файла не очень важен, и это было ошибкой). Итак файл 80-legonxt.rules:

SUBSYSTEM=="usb", ACTION=="add", ATTRS{idVendor}=="0694", ATTRS{idProduct}=="0002", GROUP="nxt", SYMLINK+="nxt", MODE="0666"

== — сравнение, = — присвоение.
Не потом, а при условии соответствия условиям.

Да, я знаю, просто не точно выразился.

В данном конфиге я оставил права «666» и добавил группу «nxt», на будущее, и чтобы не забыть.

2) После этого, я выполнил udevadm control --reload

3) Включил NXT и получил следующие выводы:

lsusb :

Bus 002 Device 012: ID 0694:0002 Lego Group Mindstorms NXT
...

ls -l /dev/bus/usb/002/ :

...
crw-rw-rw- 1 root nxt  189, 139 авг 11 17:16 012

ls -l /dev/nxt :

lrwxrwxrwx 1 root root 15 авг 11 17:16 /dev/nxt -> bus/usb/002/012

Теперь все настройки более корректны, добавлена группа nxt и права доступа к устройству настроены на 666, как и было задумано.

Hemulo ()
Ответ на: комментарий от iliyap

Судя по всей этой писанине, nbc -d работал изначально.

В теории, видимо должен был. Но мне почему-то казалось, что он не работал. Я экспериментировал с разными программами, и много всего перепробовал с разными настройками.

Попробую потом на новом компе с нуля поставить только один nbc и поиграюсь с ним без настройки прав.

Hemulo ()
Ответ на: комментарий от Hemulo

и добавил группу «nxt»

Группу создать не забыл? (%

добавлена группа nxt и права доступа к устройству настроены на 666

С одной стороны ты создаёшь группу и присваиваешь владение файлом устройства ей, с другой оставляешь доступ на запись всем остальным. Если тебе нужен доступ для всех, то выделять группу — просто лишняя трата времени.

r3lgar ★★★★★ ()
Ответ на: комментарий от r3lgar

Группу создать не забыл? (%

Да, я написал, что соответствующую группу присвоил пользователю.
Если конкретно, то:

sudo usermod -a -G nxt _username_

выделять группу — просто лишняя трата времени

Да, понятно. Просто я решил заранее выделить, чтобы потом не забыть.

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

Но потом, я планирую перенести всё в компьютерный класс, и там, возможно, ограничу права доступа по групповому принципу, прикрыв права до 660.

Hemulo ()
Последнее исправление: Hemulo (всего исправлений: 4)