Вопрос или проблема
Я настроил несколько RPis с сервисом systemd, который запускает экземпляр chromium-browser в киоске, но на нескольких, казалось бы, случайных устройствах он не запускается. Я проверил статус, просто пытаясь включить его, и получаю
$ sudo systemctl enable kiosk.service
Не удалось включить юнит: Файл юнита /lib/systemd/system/kiosk.service замаскирован.
Я посмотрел, что значит “замаскированный”, чтобы понять, как это произошло, и ответы просто говорят, что “юниты связаны с /dev/null
“. Хорошо, но почему это произошло с моим сервисом? ~~systemctl unmask kiosk.service
снимет маску с моего сервиса, но~~ (забудьте об этом, смотрите редактирование ниже) я хотел бы убедиться, что это не продолжит происходить.
Вот содержимое “kiosk.service”, если это имеет значение:
[Unit]
Описание=Chromium Kiosk
Wants=graphical.target
After=graphical.target
[Service]
ExecStartPre=/bin/sleep 20
Environment=DISPLAY=:0.0
Environment=XAUTHORITY=/home/pi/.Xauthority
Type=simple
ExecStart=/bin/bash /home/pi/kiosk.sh
Restart=on-abort
User=pi
Group=pi
[Install]
WantedBy=graphical.target
РЕДАКТИРОВАНИЕ:
На самом деле sudo systemctl unmask kiosk.service
похоже, ничего не делает. Когда я это делаю, а затем sudo systemctl enable kiosk.service
, он возвращает ту же жалобу, что он замаскирован.
РЕДАКТИРОВАНИЕ2:
Так что вместо успешного снятия маски я просто удалил lib/systemd/system/kiosk.service и снова подписал его как сервис, теперь он, похоже, остается включенным. Все еще не имею понятия, почему он был замаскирован изначально.
Это требует либо перезагрузки, либо использования unmask --now
sudo systemctl unmask --now kiosk.service
Ответ или решение
Сервис вашего "kiosk.service" стал маскированным, что является довольно распространенной проблемой в среде системного администрирования, особенно при использовании системы управления системными единицами systemd. Давайте разберем причины, почему ваш сервис оказался в таком состоянии, а также возможные меры для предотвращения данной ситуации в будущем.
Что означает "маскировка" сервиса?
Когда сервис в systemd маскируется, это означает, что его файл единицы (unit file) переименовывается или связывается с /dev/null
. В результате, все команды, касающиеся данного сервиса, такие как start
, stop
, enable
или disable
, не будут работать, так как systemd не может получить доступ к его определению. Это делается в основном с целью предотвратить случайное использование данного сервиса.
Почему ваш сервис стал маскированным?
Существует несколько причин, почему это могло произойти:
-
Другие администраторы: Если на устройстве работало несколько администраторов или если конфигурация выполнялась через автоматизированные инструменты (например, Ansible, Puppet), вероятно, что кто-то из них случайно или намеренно маскировал сервис.
-
Конфликты с другими сервисами: Иногда зависимости между сервисами ведут к тому, что один сервис может маскировать другой, чтобы предотвратить потенциальные конфликты.
-
Проблемы при установке/обновлении: Если сервис был установлен неправильно или обновлен, это могло вызвать его маскировку. Например, если файл единицы был удален или заменен, это также могло повлиять на маскировку.
-
Механизмы безопасности: В некоторых случаях, особенно в системах с повышенными мерами безопасности, администраторы могут намеренно маскировать сервисы, которые они считают ненужными или потенциально опасными.
Как предотвратить маскировку сервиса в будущем
-
Контроль изменений: Внедрите систему контроля версий для конфигурационных файлов ваших сервисов. Это поможет отслеживать изменения и понять, кто и когда изменил настройки.
-
Мониторинг состояния сервисов: Используйте инструменты мониторинга, такие как Prometheus или Nagios, для отслеживания статусов ваших сервисов. Это позволит вам быстро реагировать на изменения, включая возникающие ошибки или маскировку.
-
Документация и инструкции: Всегда придерживайтесь документации и четко фиксируйте, какие действия были проведены с сервисами. Это поможет избежать путаницы и недопонимания в команде.
-
Обучение сотрудников: Проведите обучение для всех участников команды по основам работы с systemd. Знание команд, таких как
mask
иunmask
, а также их последствий, поможет избежать непреднамеренных ошибок.
Заключение
Проблема маскировки сервиса "kiosk.service" может быть решена с помощью команды systemctl unmask
, которая должна вернуть его в рабочее состояние. Если не удается восстановить сервис через unmask
, лучше удалить его файл и заново создать, как вы сделали. Однако важно разобраться в причинах его маскировки, чтобы избежать повторения ситуации в будущем. Monitoring, документация и бессменный контроль изменений — ваши лучшие союзники в этой задаче.