Служба, вызванная udev, не может выполнить sh-скрипт.

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

Я работаю над сервисом для захвата 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), но я не уверен в причине этого. Есть ли какие-либо указания на документы или возможные решения этой проблемы?

Мои мысли о том, что может быть причиной:

  1. Возможно, это связано с тем, что systemd.exec выполняет команду в песочнице, так что оболочка bash не имеет всех необходимых переменных окружения (ссылка 1)
  2. Возможно, я неправильно вызываю dm-verity_log_error.sh в поле атрибута ExecStart=. Запуск сервиса с помощью systemctl start dm-verity.service проходит успешно. Я провел некоторые другие тесты с ExecStart=/bin/ls, и он также успешно выполняется при срабатывании правил.
  3. Возможно, 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, давайте детально проанализируем возможные причины и потенциальные решения.

Анализ проблемы

  1. Логи системы: Из представленных вами логов видно, что сервис dm-verity.service сталкивается с ошибкой сегментации (код 11, статус SEGV) при попытке выполнения dm-verity_log_error.sh. Это указывает на то, что происходит нарушение сегментации памяти, что может свидетельствовать о проблемах с самим скриптом, его исполняемостью или с окружением, в котором он исполняется.

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

  3. Проблемы с скриптом: Есть вероятность, что ваш скрипт dm-verity_log_error.sh может не иметь соответствующих прав на выполнение или же не может выполнить команду my-logger-adaptor из-за отсутствия необходимых ресурсов или библиотек в окружении, в котором он запускается.

Рекомендации по решению

  1. Проверка прав на скрипт: Убедитесь, что у скрипта dm-verity_log_error.sh правильно установлены права: используйте chmod +x /usr/bin/dm-verity_log_error.sh. Выполните команду, чтобы проверить права доступа:

    ls -l /usr/bin/dm-verity_log_error.sh
  2. Запуск скрипта напрямую: Попробуйте выполнить ваш скрипт напрямую из командной строки, чтобы убедиться, что он работает корректно:

    /bin/bash /usr/bin/dm-verity_log_error.sh

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

  3. Логи и отладка: Добавьте в скрипт вывод отладочной информации в файл, чтобы понять, на каком этапе он ломается:

    #!/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
  4. Настройка окружения в service-файле: Если my-logger-adaptor требует определенных переменных окружения, добавьте эти переменные в секцию [Service] вашего service-файла:

    [Service]
    Environment="VAR1=value1"
    Environment="VAR2=value2"
  5. Проверка зависимости от bash: Так как у вас запрашивается bash, убедитесь, что bash корректно установлен и доступен в вашей системе. Вы можете попытаться указать полный путь к интерпретатору в ExecStart, например:

    ExecStart=/bin/bash /usr/bin/dm-verity_log_error.sh

Заключение

Следует выполнить вышеозначенные шаги, чтобы выявить и устранить причины сбоя при выполнении вашей службы dm-verity. Также полезно будет обратить внимание на официальные документы systemd и udev для дальнейшего изучения:

Удачи в вашей работе над проектом! Если проблемы продолжают возникать, не стесняйтесь возвращаться для дальнейшей помощи.

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

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