Когда я подключаю устройство Bluetooth (например, Wiimote) к своему компьютеру и вывожу список всех устройств systemd через systemctl list-units -t device
, устройство отображается как sys-subsystem-bluetooth-devices-hci0:ID.device
.
Проблема:
Я хочу привязать службу systemd к определенному устройству Bluetooth (например, wiimote). Таким образом, мне понадобится идея о названии.ИДЕНТИФИКАТОРотличается на двух машинах Arch Linux.
Вопросы:
- Кто назначает эти устройства?ИДЕНТИФИКАТОРs к устройствам bluetooth systemd?
- ЭтоИДЕНТИФИКАТОРстатический наодинсистемы и среди обновлений системы, и, таким образом, безопасно ли привязывать службы к этому устройству, т. е. будет ли эта служба запускаться только при подключении устройства Bluetooth того же типа?
- Могу ли я изменить/повлиять на это?ИДЕНТИФИКАТОР?
Попытки:
Я пытался изменитьИДЕНТИФИКАТОРс правилом udev, следующим за этимописание на Arch wiki. Через udevadm info -a -p $(udevadm info -q path -n /dev/hidraw4 )
я получил:
looking at device '/devices/pci0000:00/0000:00:14.0/usb1/1-4/1-4:1.0/bluetooth/hci0/hci0:256/0005:057E:0330.000C/hidraw/hidraw4':
KERNEL=="hidraw4"
SUBSYSTEM=="hidraw"
DRIVER==""
looking at parent device '/devices/pci0000:00/0000:00:14.0/usb1/1-4/1-4:1.0/bluetooth/hci0/hci0:256/0005:057E:0330.000C':
KERNELS=="0005:057E:0330.000C"
SUBSYSTEMS=="hid"
DRIVERS=="wiimote"
ATTRS{country}=="00"
ATTRS{devtype}=="gen20"
ATTRS{extension}=="none"
looking at parent device '/devices/pci0000:00/0000:00:14.0/usb1/1-4/1-4:1.0/bluetooth/hci0/hci0:256':
KERNELS=="hci0:256"
SUBSYSTEMS=="bluetooth"
DRIVERS==""
Все KERNEL(S)
записи не одинаковы в двух системах. Поэтому я попытался применить правило udev:
SUBSYSTEMS=="hid", DRIVERS=="wiimote", TAG+="systemd", SYMLINK+="wii"
Но это не создает никаких дополнительных единиц устройства.
решение1
Вам необходимо добавить:
ENV{SYSTEMD_ALIAS}="/dev/wii"
(что и SYMLINK+="wii"
создает) для вашего правила udev.
После нормализации пути это приводит к dev-wii.device
.
(Примечание: это звучит так просто, но мне потребовалось несколько часов, чтобы дойти до этого, так что я ни в коем случае не отвергаю это как простой вопрос! Я боролся с этим в своих собственных целях, наткнувшись на ваш вопрос в надежде найти для себя решение.)
По касательной, если ваше правило udev разбито на несколько строк, разрывы экранированы с помощью \
, вам также нужно убедиться, что файл заканчивается пустой строкой. В противном случае, он, по-видимому, анализируется udev (это не похоже на то, что символ EOF
каким-то образом экранируется), но не достигает желаемого результата.