Systemd: заставить systemd заново обнаружить зависимости systemd.device

Вопрос или проблема

Systemd: заставить systemd заново обнаружить зависимости systemd.device

Я настраиваю сервис восстановления, который перешифровывает объем LUKS (mmcblk0p2), если [email protected] не удается. Этот сервис, [email protected], запускает скрипт, который завершает работу с 1 всякий раз, когда объем зашифрован. В сервисе указано:

OnSuccess=fsck@dev-mapper-%i.service
OnFailure=systemd-cryptsetup@%i.service

Теперь это работает в той части, что устройство-отображение создается, если я усечу раздел (dd if=/dev/zero of=/dev/mmcblk0p2) и перезагружу, но [email protected] BindsTo dev-mapper-data.device, и systemd продолжает говорить, что зависимость не выполнена, хотя отображение доступно как /dev/mapper/data.

$ ls -l /dev/mapper/data
lrwxrwxrwx 1 root root 7 Aug  7 12:07 /dev/mapper/data -> ../dm-1

$ systemctl list-dependencies [email protected] | cat
[email protected]
○ ├─dev-mapper-data.device
● ├─[email protected]

Я читал, что могу добавить тег udev, чтобы заставить systemd распознать устройство, но мои правила, похоже, ничего не делают, и оно не реагирует на udevadm trigger /dev/mapper/data.

KERNEL=="dm-[0-9]", SUBSYSTEM=="block", TAG+="systemd"

Что я упускаю или делаю не так?

Ответ или решение

Для решения вашей проблемы с зависимостями systemd и устройствами, вы можете попробовать несколько подходов. Основная проблема, которую вы описали, связана с тем, что systemd не обнаруживает зависимости для устройства dev-mapper-data.device, несмотря на то, что устройство доступно как /dev/mapper/data. Давайте подробнее рассмотрим, что можно сделать для устранения этой проблемы.

1. Проверьте udev правила

Вы упомянули, что добавили следующее правило для udev:

KERNEL=="dm-[0-9]", SUBSYSTEM=="block", TAG+="systemd"

Убедитесь, что правило сохранено в правильном файле правил, например в /etc/udev/rules.d/99-systemd.rules. После добавления правила, выполните команду для перезагрузки udev:

sudo udevadm control --reload-rules
sudo udevadm trigger

Это должно обновить правила для udev и позволить systemd узнать о новых устройствах.

2. Перезапустите systemd

После изменения правил udev рекомендуется перезапустить систему или перезапустить конкретные службы, чтобы убедиться, что systemd обновит свои зависимости. Вы можете использовать следующие команды:

sudo systemctl daemon-reload

Это обновит конфигурацию systemd, особенно после изменения файлов юнитов или правил udev.

3. Измените зависимость в вашем юните

В вашем юните вы можете попробовать добавить After= и Requires= для четкой зависимости от устройства. Например:

[Unit]
Requires=dev-mapper-data.device
After=dev-mapper-data.device

Это гарантирует, что ваш сервис будет ожидать, пока устройство будет доступно.

4. Проверьте состояние устройства

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

systemctl status dev-mapper-data.device

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

5. Логирование и отладка

Если вышеуказанные шаги не помогли, полезно будет проверить логи systemd. Выполните следующую команду для фильтрации логов по вашему юниту:

journalctl -u [email protected]

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

Заключение

Если вы попробовали все вышеперечисленное, но проблема не устраняется, проверьте, нет ли других конфигураций или конфликтов в вашем системе, которые могут влиять на работу systemd и udev. Возможно, стоит также рассмотреть возможность открытия темы на форумах или сообществах, таких как StackExchange или Reddit, предоставив туда полные логи и конфигурации.

С помощью этих шагов вы должны быть в состоянии выявить и решить проблему с обнаружением зависимостей устройства systemd.

Оцените материал
Добавить комментарий

Капча загружается...