LINUX.ORG.RU
ФорумAdmin

Не стартуют юниты systemd

 ,


1

1

Есть два юнита: Первый:

$ cat /etc/systemd/system/leds.service
[Unit]
Description=Setting leds permissions

[Service]
Type=oneshot
ExecStart=/usr/bin/chmod 666 /sys/class/leds/paz00-led/brightness

[Install]
WantedBy=multi-user.target

Второй:

$ cat /etc/systemd/system/input-event-daemon.service
[Unit]
Description=Input event daemon

[Service]
Type=simple
ExecStart=/usr/bin/input-event-daemon -D

[Install]
WantedBy=multi-user.target
Юниты все, естественно, активированы.
На первый systemd ругается, что команда завершилась с кодом 1, а на второй пишет, что он, мол, загружен, но процесс был завершен (code=exited, status=0/SUCCESS). После полной загрузки системы команда # systemctl start leds input-event-daemon с терминала отрабатывает нормально (процесс появился, разрешения у файла стоят нужные). В чем проблема?

юнитам чегото не хватает в Requires для полного щастья и они стартуют раньше своих гипотетических зависимостей?

x0r ★★★★★
()

С первым юнитом проблема в том, что он имеет полное право выполниться до того, как нужное устройство будет обнаружено. Правильный способ это сделать — через udev:

/etc/udev/rules.d/99-leds.rules:

ACTION=="add", SUBSYSTEM=="leds", KERNEL=="paz00-led", TEST=="brightness", RUN+="/usr/bin/chmod 666 %p/brightness"

Со вторым, насколько понимаю, проблема будет такая же: демон запускается до того, как появляются искомые input-устройства. Солюшен частично описан в доке (раздел KNOWN BUGS), но там не хватает собственно расстановки зависимостей, а именно создания соответствующих устройствам .device-юнитов (TAG+="systemd" и указания их в After-зависимостях твоего юнита (After=dev-input-WHATEVER.device).

В общем, «покажи свой конфиг, и я скажу, что тебе делать».

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

Правило добавил, спасибо.

демон запускается до того, как появляются искомые input-устройства.

Да, действительно, как-то об этом не подумал.

создания соответствующих устройствам .device-юнитов

Не вариант просто добавить After=systemd-udevd.service?

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

Не вариант, т. к. 1) udev полностью асинхронный и 2) все юниты без DefaultDependencies=false и так неявно стартуют после него.

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

Впрочем, можно сделать через жопу^Wsettle:

Wants=systemd-udev-settle.service
After=systemd-udev-settle.service

systemd-udev-settle (udevadm settle) — это такая команда, которая ждёт завершения обработки всех событий, присутствующих в очереди udev.

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

Если не через жопу, то вот так.

Посмотри их имена (cat /sys/class/input/eventX/device/name) и для каждого такого имени добавь правило:

/etc/udev/rules.d/99-input.rules:

ACTION=="add", SUBSYSTEM=="input", ATTR{device/name}=="<имя>", TAG+="systemd", SYMLINK+="input/<придумай-идентификатор>", ENV{SYSTEMD_ALIAS}+="/dev/input/<тот-же-идентификатор>"

Потом допиши в юнит (заменяя в идентификаторах дефисы на \x2d):

Requires=dev-input-<идентификатор1>.device dev-input-<идентификатор2>.device ...
After=dev-input-<идентификатор1>.device dev-input-<идентификатор2>.device ...

И, наконец, поскольку номера event1 и event4 имеют полное право измениться в любой момент, в конфиге input-event-daemon замени event1 и event4 на соответствующие идентификаторы.

intelfx ★★★★★
()
Последнее исправление: intelfx (всего исправлений: 3)
Ответ на: Если не через жопу, то вот так. от intelfx

Не взлетело. Вот измененные/созданные файлы:

$ cat /etc/udev/rules.d/99-leds.rules 
ACTION=="add", SUBSYSTEM=="leds", KERNEL=="paz00-led", TEST=="brightness", RUN+="/usr/bin/chmod 666 %p/brightness"

$ cat /etc/udev/rules.d/99-events.rules 
ACTION=="add", SUBSYSTEM=="input", ATTRS{name}=="Compal PAZ00 Headset Jack", TAG+="systemd", SYMLINK="input/jack", ENV{SYSTEMD_ALIAS}+="/dev/input/jack"
ACTION=="add", SUBSYSTEM=="input", ATTRS{name}=="lid switch", TAG+="systemd", SYMLINK="input/lid", ENV{SYSTEMD_ALIAS}+="/dev/input/lid"
$ cat /etc/systemd/system/input-event-daemon.service 
[Unit]
Description=Input event daemon
Requires=dev-input-jack.device dev-input-lid.device
After=dev-input-jack.device dev-input-lid.device

[Service]
Type=simple
ExecStart=/usr/bin/input-event-daemon -D

[Install]
WantedBy=multi-user.target

Ссылки в /dev/input появились:

$ ls -l /dev/input/{jack,lid}
lrwxrwxrwx 1 root root 6 окт 25 04:41 /dev/input/jack -> event1
lrwxrwxrwx 1 root root 6 окт 25 04:41 /dev/input/lid -> event4
а права не изменились:
$ ls -l /sys/class/leds/paz00-led/brightness 
-rw-r--r-- 1 root root 4096 окт 25 04:41 /sys/class/leds/paz00-led/brightness
Ну и статус демона:
$ systemctl status input-event-daemon
● input-event-daemon.service - Input event daemon
   Loaded: loaded (/etc/systemd/system/input-event-daemon.service; enabled)
   Active: inactive (dead)

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

Таак. Поехали. Вот что значит «писал по памяти».

Для первого случая: /sys%p/brightness.

Для второго случая: что говорит systemctl status dev-input-{jack,lid}.device?

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

Хотя даже так: добавь эту команду (systemctl status, только в уже развёрнутом состоянии, без { }) в ExecStartPre= к юниту, перегрузись и посмотри в лог.

intelfx ★★★★★
()
Ответ на: комментарий от intelfx
 $ systemctl status dev-input-{jack,lid}.device
● dev-input-jack.device
   Loaded: loaded
   Active: inactive (dead)

● dev-input-lid.device
   Loaded: loaded
   Active: inactive (dead)
окт 25 05:58:44 alarm systemd[1]: Job dev-input-jack.device/start timed out.
окт 25 05:58:44 alarm systemd[1]: Timed out waiting for device dev-input-jack.device.
окт 25 05:58:44 alarm systemd[1]: Dependency failed for Input event daemon.
...
окт 25 05:58:44 alarm systemd[1]: Job dev-input-lid.device/start timed out.
окт 25 05:58:44 alarm systemd[1]: Timed out waiting for device dev-input-lid.device.
Extraterrestrial ★★★★★
() автор топика
Последнее исправление: Extraterrestrial (всего исправлений: 1)
Ответ на: комментарий от Extraterrestrial

Ничего не понимаю. Только что воспроизвёл этот же конфиг — всё работает, устройства обнаруживаются.

Кстати, в правилах SYMLINK+=, а не SYMLINK= (судя по манам)... Но раз работает, то, видимо, пофиг.

Что говорит udevadm test /sys/class/input/event1?

intelfx ★★★★★
()
Ответ на: комментарий от intelfx
calling: test
version 216
load module index
timestamp of '/etc/systemd/network' changed
timestamp of '/usr/lib/systemd/network' changed
Parsed configuration file /usr/lib/systemd/network/99-default.link
Created link configuration context.
timestamp of '/etc/udev/rules.d' changed
Skipping overridden file: /usr/lib/udev/rules.d/80-net-setup-link.rules.
Reading rules file: /usr/lib/udev/rules.d/10-dm.rules
Reading rules file: /usr/lib/udev/rules.d/11-dm-lvm.rules
Reading rules file: /usr/lib/udev/rules.d/13-dm-disk.rules
Reading rules file: /usr/lib/udev/rules.d/40-hpet-permissions.rules
Reading rules file: /usr/lib/udev/rules.d/42-usb-hid-pm.rules
Reading rules file: /usr/lib/udev/rules.d/50-firmware.rules
Reading rules file: /usr/lib/udev/rules.d/50-udev-default.rules
Reading rules file: /usr/lib/udev/rules.d/60-cdrom_id.rules
Reading rules file: /usr/lib/udev/rules.d/60-drm.rules
Reading rules file: /usr/lib/udev/rules.d/60-ffado.rules
Reading rules file: /usr/lib/udev/rules.d/60-keyboard.rules
Reading rules file: /usr/lib/udev/rules.d/60-persistent-alsa.rules
Reading rules file: /usr/lib/udev/rules.d/60-persistent-input.rules
Reading rules file: /usr/lib/udev/rules.d/60-persistent-serial.rules
Reading rules file: /usr/lib/udev/rules.d/60-persistent-storage-tape.rules
Reading rules file: /usr/lib/udev/rules.d/60-persistent-storage.rules
Reading rules file: /usr/lib/udev/rules.d/60-persistent-v4l.rules
Reading rules file: /usr/lib/udev/rules.d/60-rfkill.rules
Reading rules file: /usr/lib/udev/rules.d/60-rtc-symlink.rules
Reading rules file: /usr/lib/udev/rules.d/61-accelerometer.rules
Reading rules file: /usr/lib/udev/rules.d/63-md-raid-arrays.rules
Reading rules file: /usr/lib/udev/rules.d/64-btrfs.rules
Reading rules file: /usr/lib/udev/rules.d/64-md-raid-assembly.rules
Reading rules file: /usr/lib/udev/rules.d/69-cd-sensors.rules
Reading rules file: /usr/lib/udev/rules.d/69-dm-lvm-metad.rules
Reading rules file: /usr/lib/udev/rules.d/70-infrared.rules
Reading rules file: /usr/lib/udev/rules.d/70-power-switch.rules
Reading rules file: /usr/lib/udev/rules.d/70-uaccess.rules
Reading rules file: /usr/lib/udev/rules.d/71-seat.rules
Reading rules file: /usr/lib/udev/rules.d/73-seat-late.rules
Reading rules file: /usr/lib/udev/rules.d/75-net-description.rules
Reading rules file: /usr/lib/udev/rules.d/75-probe_mtd.rules
Reading rules file: /usr/lib/udev/rules.d/75-tty-description.rules
Reading rules file: /usr/lib/udev/rules.d/77-nm-olpc-mesh.rules
Reading rules file: /usr/lib/udev/rules.d/78-sound-card.rules
Reading rules file: /usr/lib/udev/rules.d/80-drivers.rules
Skipping empty file: /etc/udev/rules.d/80-net-setup-link.rules
Reading rules file: /usr/lib/udev/rules.d/80-udisks2.rules
Reading rules file: /usr/lib/udev/rules.d/90-alsa-restore.rules
Reading rules file: /usr/lib/udev/rules.d/95-cd-devices.rules
Reading rules file: /usr/lib/udev/rules.d/95-dm-notify.rules
Reading rules file: /usr/lib/udev/rules.d/95-udev-late.rules
Reading rules file: /usr/lib/udev/rules.d/95-upower-csr.rules
Reading rules file: /usr/lib/udev/rules.d/95-upower-hid.rules
Reading rules file: /usr/lib/udev/rules.d/95-upower-wup.rules
Reading rules file: /etc/udev/rules.d/99-events.rules
Reading rules file: /etc/udev/rules.d/99-leds.rules
Reading rules file: /usr/lib/udev/rules.d/99-systemd.rules
rules contain 49152 bytes tokens (4096 * 12 bytes), 15511 bytes strings
3004 strings (33348 bytes), 2101 de-duplicated (18741 bytes), 904 trie nodes used
IMPORT builtin 'input_id' /usr/lib/udev/rules.d/50-udev-default.rules:10
capabilities/ev raw kernel attribute: 21
capabilities/abs raw kernel attribute: 0
capabilities/rel raw kernel attribute: 0
capabilities/key raw kernel attribute: 0
test_key: no EV_KEY capability
GROUP 97 /usr/lib/udev/rules.d/50-udev-default.rules:26
IMPORT builtin 'path_id' /usr/lib/udev/rules.d/60-persistent-input.rules:31
LINK 'input/by-path/platform-sound.7-event' /usr/lib/udev/rules.d/60-persistent-input.rules:36
LINK 'input/jack' /etc/udev/rules.d/99-events.rules:1
handling device node '/dev/input/event1', devnum=c13:65, mode=0660, uid=0, gid=97
preserve permissions /dev/input/event1, 020660, uid=0, gid=97
preserve already existing symlink '/dev/char/13:65' to '../input/event1'
found 'c13:65' claiming '/run/udev/links/\x2finput\x2fjack'
creating link '/dev/input/jack' to '/dev/input/event1'
preserve already existing symlink '/dev/input/jack' to 'event1'
unload module index
Unloaded link configuration context.
This program is for debugging only, it does not run any program
specified by a RUN key. It may show incorrect results, because
some values may be different, or not available at a simulation run.

ACTION=add
DEVLINKS=/dev/input/jack
DEVNAME=/dev/input/event1
DEVPATH=/devices/soc0/sound.7/sound/card0/input2/event1
ID_INPUT=1
ID_PATH=platform-sound.7
ID_PATH_TAG=platform-sound_7
MAJOR=13
MINOR=65
SUBSYSTEM=input
SYSTEMD_ALIAS=/dev/input/jack
TAGS=:systemd:
USEC_INITIALIZED=63477
Extraterrestrial ★★★★★
() автор топика
Ответ на: комментарий от Extraterrestrial

Понятия не имею, что не так. Устройство существует, тегом помечено, а в базе systemd его нет.

Так, а что насчёт вот этого? Ядро самосборное?

REQUIREMENTS:
        Linux kernel >= 3.7
        Linux kernel >= 3.8 for Smack support

        Kernel Config Options:
          CONFIG_DEVTMPFS
          CONFIG_CGROUPS (it is OK to disable all controllers)
          CONFIG_INOTIFY_USER
          CONFIG_SIGNALFD
          CONFIG_TIMERFD
          CONFIG_EPOLL
          CONFIG_NET
          CONFIG_SYSFS
          CONFIG_PROC_FS
          CONFIG_FHANDLE (libudev, mount and bind mount handling)

        udev will fail to work with the legacy sysfs layout:
          CONFIG_SYSFS_DEPRECATED=n

        Legacy hotplug slows down the system and confuses udev:
          CONFIG_UEVENT_HELPER_PATH=""

        Userspace firmware loading is not supported and should
        be disabled in the kernel:
          CONFIG_FW_LOADER_USER_HELPER=n
intelfx ★★★★★
()
Последнее исправление: intelfx (всего исправлений: 2)
Ответ на: комментарий от Extraterrestrial

Ты проверил опции ядра? Мне самому уже интересно, что могло сломаться.

intelfx ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.