Вопрос или проблема
Я работаю над сервисом для захвата uevent устройства маппера dm-verity. Однако я не могу понять, почему сервис может быть вызван, но не запускает мой скрипт логирования.
У меня есть следующие правила (/etc/udev/rules.d/dm-verity.rules
) на основе этого обсуждения (перенос строки добавлен для читаемости):
KERNEL=="dm-[0-9]*", \
ACTION=="change", \
SUBSYSTEM=="block", \
ENV{DM_VERITY_ERR_BLOCK_NR}!="", \
TAG+="systemd", \
ENV{SYSTEMD_WANTS}+="dm-verity.service"
У меня есть следующий сервис (/etc/systemd/system/dm-verity.service
):
[Unit]
Description=dm-verity uevent logger
[Service]
Type=forking
ExecStart=/usr/bin/dm-verity_log_error.sh
У меня есть следующий скрипт (/usr/bin/dm-verity_log_error.sh
):
#!/bin/bash
echo "dm-verity occurs" | my-logger-adaptor
exit 0
Я могу подтвердить из журнала, что dm-verity.rules
и dm-verity.service
срабатывают, однако сервис не может выполнить dm-verity_log_error.sh
. Фрагмент журнала выглядит следующим образом.
systemd[1]: dm-verity.service: About to execute: /bin/bash -c /usr/bin/dm-verity_log_error.sh
systemd[1]: dm-verity.service: Forked /bin/bash as 19823
systemd[19823]: dm-verity.service: Kernel keyring not supported, ignoring.
systemd[19823]: dm-verity.service: Executing: /bin/bash -c /usr/bin/dm-verity_log_error.sh
systemd[1]: dm-verity.service: Changed dead -> start
systemd[1]: Starting dm-verity uevent logger
systemd[1]: dm-verity.service: cgroup is empty
audit[19823]: ANOM_ABEND auid=4294967295 uid=0 gid=0 ses=4294967295 pid=19823 comm="bash" exe="/bin/bash.bash" sig=11 res=1
systemd[1]: Received SIGCHLD from PID 19823 (bash).
systemd[1]: Child 19823 (bash) died (code=killed, status=11/SEGV)
systemd[1]: dm-verity.service: Child 19823 belongs to dm-verity.service.
systemd[1]: dm-verity.service: Main process exited, code=killed, status=11/SEGV
systemd[1]: dm-verity.service: Failed with result 'signal'.
systemd[1]: dm-verity.service: Changed start -> failed
systemd[1]: dm-verity.service: Job dm-verity.service/start finished, result=failed
systemd[1]: Failed to start dm-verity uevent logger
Из логов видно, что возникает ошибка при выполнении командной оболочки bash для запуска скрипта (code=killed, status=11/SEGV
), но я не уверен в причине этого. Есть ли какие-либо указания на документы или возможные решения этой проблемы?
Мои мысли о том, что может быть причиной:
- Возможно, это связано с тем, что
systemd.exec
выполняет команду в песочнице, так что оболочка bash не имеет всех необходимых переменных окружения (ссылка 1) - Возможно, я неправильно вызываю
dm-verity_log_error.sh
в поле атрибутаExecStart=
. Запуск сервиса с помощьюsystemctl start dm-verity.service
проходит успешно. Я провел некоторые другие тесты сExecStart=/bin/ls
, и он также успешно выполняется при срабатывании правил. - Возможно,
dm-verity_log_error.sh
действительно запустился, но завершился слишком быстро. Однако я не уверен, относится ли основной процесс в журнале к завершенномуdm-verity.service
или к самому скриптуdm-verity_log_error.sh
.
Я пытался искать подобные проблемы в Интернете, но не нашел ничего подходящего. Возможно, я использовал неправильные ключевые слова для поиска. Я прочитал следующие ссылки на данный момент:
Я использую плату разработки с Yocto 2.6 и systemd 239.
Ответ или решение
Основываясь на вашем описании проблемы с сервисом dm-verity
, который не может успешно выполнить скрипт dm-verity_log_error.sh
, давайте детально проанализируем возможные причины и потенциальные решения.
Анализ проблемы
-
Логи системы: Из представленных вами логов видно, что сервис
dm-verity.service
сталкивается с ошибкой сегментации (код 11, статус SEGV) при попытке выполненияdm-verity_log_error.sh
. Это указывает на то, что происходит нарушение сегментации памяти, что может свидетельствовать о проблемах с самим скриптом, его исполняемостью или с окружением, в котором он исполняется. -
Окружение systemd: Ваша идея о том, что скрипт может выполняться в ограниченном окружении, вполне обоснована. По умолчанию, службы systemd запускаются в контексте управления ресурсами и ограничениями, которые могут ограничивать доступ к системным ресурсам, переменным среды и т.д.
-
Проблемы с скриптом: Есть вероятность, что ваш скрипт
dm-verity_log_error.sh
может не иметь соответствующих прав на выполнение или же не может выполнить командуmy-logger-adaptor
из-за отсутствия необходимых ресурсов или библиотек в окружении, в котором он запускается.
Рекомендации по решению
-
Проверка прав на скрипт: Убедитесь, что у скрипта
dm-verity_log_error.sh
правильно установлены права: используйтеchmod +x /usr/bin/dm-verity_log_error.sh
. Выполните команду, чтобы проверить права доступа:ls -l /usr/bin/dm-verity_log_error.sh
-
Запуск скрипта напрямую: Попробуйте выполнить ваш скрипт напрямую из командной строки, чтобы убедиться, что он работает корректно:
/bin/bash /usr/bin/dm-verity_log_error.sh
Если он выполняется без ошибок, это может указывать на то, что проблема связана с окружением, в котором он запускается.
-
Логи и отладка: Добавьте в скрипт вывод отладочной информации в файл, чтобы понять, на каком этапе он ломается:
#!/bin/bash echo "Starting dm-verity_log_error" >> /tmp/dm-verity_log.txt echo "dm-verity occurs" | my-logger-adaptor >> /tmp/dm-verity_log.txt echo "Finished execution" >> /tmp/dm-verity_log.txt exit 0
-
Настройка окружения в service-файле: Если
my-logger-adaptor
требует определенных переменных окружения, добавьте эти переменные в секцию[Service]
вашего service-файла:[Service] Environment="VAR1=value1" Environment="VAR2=value2"
-
Проверка зависимости от
bash
: Так как у вас запрашиваетсяbash
, убедитесь, чтоbash
корректно установлен и доступен в вашей системе. Вы можете попытаться указать полный путь к интерпретатору вExecStart
, например:ExecStart=/bin/bash /usr/bin/dm-verity_log_error.sh
Заключение
Следует выполнить вышеозначенные шаги, чтобы выявить и устранить причины сбоя при выполнении вашей службы dm-verity
. Также полезно будет обратить внимание на официальные документы systemd и udev для дальнейшего изучения:
Удачи в вашей работе над проектом! Если проблемы продолжают возникать, не стесняйтесь возвращаться для дальнейшей помощи.