Как удостовериться, что systemd не запускает единицу, пока udev не создал узел устройства

Я хочу смонтировать файловую систему UBI во время начальной загрузки. В зависимости от конфигурации номер устройства MTD мог варьироваться от сборки до сборки, но это всегда будет названный раздел add.

Я добавил следующие файлы

# /usr/lib/udev/rules.d/76-mtd-alias.rules
ACTION!="add", GOTO="mtd_alias_end"
SUBSYSTEM=="mtd", SYMLINK="mtd-byname/$attr{name}", TAG+="systemd"
LABEL="mtd_alias_end"

это создает файлы как /dev/mtd-by-name/add как символьная ссылка на соответствующее /dev/mtdblockX файл (где X зависимый конфигурации).

# /usr/lib/systemd/system/mnt-data.mount
[Unit]
Description=Mount data partition
Requires=data-attach.service
After=data-attach.service
[Mount]
What=ubi0_0
Where=/mnt/data
Type=ubifs

вместе с

#/usr/lib/systemd/system/data-attach.service
[Unit]
Description=Attach data ubi partition

[Service]
Type=oneshot
RemainAfterExit=yes
Requires=dev-mtd\x2dbyname-add.device
After=dev-mtd\x2dbyname-add.device
ExecStart=/usr/sbin/ubiattach /dev/ubi_ctrl -p /dev/mtd-byname/add
ExecStop=/usr/sbin/ubidetach /dev/ubi_ctrl -p /dev/mtd-byname/add

Проблема - это хотя systemd действительно запускается data-attach.service, это все еще делает это прежде udev создал символьные ссылки.

После того, как система загрузилась, я вижу что device был запущен, хотя монтирование перестало работать:

# systemctl status data-attach.service
● data-attach.service - Attach data ubi partition
   Loaded: loaded (/lib/systemd/system/data-attach.service; static; vendor preset: enabled)
   Active: failed (Result: exit-code) since Fri 2018-06-22 11:11:50 UTC; 7min ago
  Process: 164 ExecStart=/usr/sbin/ubiattach /dev/ubi_ctrl -p /dev/mtd-byname/add (code=exited, status=255)
 Main PID: 164 (code=exited, status=255)

Jun 22 11:11:50 LogiPeru ubiattach[164]: libubi: error!: cannot stat "/dev/mtd-byname/add"
Jun 22 11:11:50 LogiPeru ubiattach[164]:         error 2 (No such file or directory)
Jun 22 11:11:50 LogiPeru ubiattach[164]: ubiattach: error!: cannot attach "/dev/mtd-byname/add"
Jun 22 11:11:50 LogiPeru ubiattach[164]:            error 2 (No such file or directory)
Jun 22 11:11:50 LogiPeru systemd[1]: Starting Attach data ubi partition...
Jun 22 11:11:50 LogiPeru systemd[1]: data-attach.service: Main process exited, code=exited, status=255/n/a
Jun 22 11:11:50 LogiPeru systemd[1]: data-attach.service: Failed with result 'exit-code'.
Jun 22 11:11:50 LogiPeru systemd[1]: Failed to start Attach data ubi partition.

Но device действительно загружался:

# systemctl status 'dev-mtd\x2dbyname-add.device'
● dev-mtd\x2dbyname-add.device - /dev/mtd-byname/add
   Follow: unit currently follows state of sys-devices-virtual-mtd-mtd10.device
   Loaded: loaded
   Active: active (plugged) since Fri 2018-06-22 11:11:50 UTC; 10min ago
   Device: /sys/devices/virtual/mtd/mtd10
# ls -l /dev/mtd-byname/add
lrwxrwxrwx    1 root     root             8 Jun 22 11:11 /dev/mtd-byname/add -> ../mtd10

Где я шел не так, как надо? Почему Requires и After маркировки в data-attach.service быть проигнорированным? Если я ожидаю, пока я не могу войти в систему, то я могу работать systemctl start mnt-data.mount и монтирование успешно выполняется.

2
задан 6 September 2018 в 04:57

1 ответ

[Service]
<...>
Requires=dev-mtd\x2dbyname-add.device
After=dev-mtd\x2dbyname-add.device

Необходимо поместить Requires= и After= директивы в [Unit] раздел файла единицы. Они не будут работать ни в одном [Service] или любой другой раздел.

Совет для будущего диагноза: systemctl daemon-reload, как другой systemctl глаголы, пишут его предупреждения и ошибки только в системный журнал а не в systemctlstdout/stderr (т.е. консоль). systemctl daemon-reload, в частности, только сообщает об отказе относительно критических ошибок, как отказ говорить systemd. Следовательно может быть выгодно вручную проверить системный журнал с чем-то как journalctl -e _PID=1 после любого systemctl команды.

3
ответ дан 2 December 2019 в 02:42

Другие вопросы по тегам:

Похожие вопросы: