Вопрос или проблема
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.