Почему некоторые системные сервисы находятся в «маскированном» состоянии?

43

Когда я запускаю команду sudo systemctl list-unit-files(я думаю, что sudo является необязательным), я получаю вывод, который показывает все службы и их состояние.

Вот фрагмент из моей машины:

UNIT FILE                                  STATE
...
debian-fixup.service                       static  
debug-shell.service                        disabled
display-manager.service                    enabled 
dns-clean.service                          enabled 
dsmcad.service                             enabled 
emergency.service                          static  
failsafe-x.service                         static  
friendly-recovery.service                  masked  
fuse.service                               masked  
gdm.service                                masked  
getty-static.service                       static  
getty@.service                             enabled 
gpsd.service                               indirect
gpsdctl@.service                           static  
gpu-manager.service                        enabled 
halt-local.service                         static  
halt.service                               masked  
hostname.service                           masked
...

Интересно, почему некоторые сервисы находятся в «замаскированном» состоянии. Я думаю, что это означает, что «это лучше, чем« отключение », потому что служба не может быть запущена ни вручную, ни systemd».

Как я могу получить больше информации о состоянии единицы обслуживания?

Кто поместил подразделения в их соответствующее состояние?

Я пытался, например, sudo systemctl help dsmcad- это только вызывает documentation = ...строку из файла модуля./etc/systemd/system/dsmcad.service

Примечание: здесь я точно знаю , что такое сервис dsmcad и что он делает, я сам его установил. Меня больше интересует общее решение.

KNB
источник

Ответы:

48

maskэто более сильная версия disable. При использовании disableвсех символических ссылок указанный файл модуля удаляется. При использовании maskединиц будет связано с /dev/null. Это будет отображаться, если вы проверите, например, с помощью systemctl status halt.service. Преимущество maskсостоит в том, чтобы предотвратить любой вид активации, даже ручной.

Внимание: systemctl list-unit-filesперечисляет состояние файлов модуля (статическое, включено, отключено, замаскировано, косвенно) и не имеет никакого отношения к состоянию службы. Чтобы посмотреть на услуги использования systemctl list-units.

Kellerspeicher
источник
8
Пожалуйста, также объясните, как удалить маскированное состояние, если это необходимо.
erikbwork
19
Существует maskи unmaskкоманда , которая может быть использована с systemctl. Так что просто делай systemctl unmask name_of_service.service.
Kellerspeicher
из-за этого я systemctl unmask name_of_service.serviceполностью удалил мой файл определения сервиса /etc/systemd/system/, так что теперь мне нужно добавить его снова. Если он снова замаскируется, я
застряну
1
Привет, Эльдамир, /etc/systemd/systemэто просто символические ссылки на сервисы. Вы должны добавить *.serviceфайл, /lib/systemd/systemоткуда он будет связан, /etc/systemd/systemесли вы enableслужба. maskсоздает ссылку /dev/nullи unmaskудаляет эту ссылку, /etc/systemd/systemи, очевидно, не имеет значения, если кто-то поместит туда файл.
Kellerspeicher
3

hostname.serviceмаскируется как избыточный, потому что systemdустанавливает имя хоста (из / etc / hostname) очень рано при запуске.

Этот параметр предоставляется пакетом Debian systemd.

$ ls -l /lib/systemd/system/hostname.service
lrwxrwxrwx 1 root root 9 Apr  8 22:47 /lib/systemd/system/hostname.service -> /dev/null
$ dpkg-query --search /lib/systemd/system/hostname.service
systemd: /lib/systemd/system/hostname.service

Точно так же Debian теперь может работать без сценария оболочки для haltсистемы, вместо этого он обрабатывается systemd-shutdown (исходный код здесь ).

Если служба была замаскирована вручную, маска будет установлена /etc/systemd/systemвместо нее .

Службы также маскируются при удалении из Debian / Ubuntu . Я не знаю почему.

sourcejedi
источник
Маскировка и удаление услуг имеют различие между удалением и очисткой пакета. В первом случае файлы конфигурации сохраняются, и поэтому может быть опасно активировать службу по ошибке (так как файл службы все еще может находиться в файлах конфигурации). В очищенном пакете также будут удалены служебные файлы, которые не будут маскироваться.
Фиксиман
0

Поскольку вы запрашиваете информацию о замаскированном состоянии, важно упомянуть, что в службе можно наблюдать, что после ее запуска изменения в ее определениях перезагружаются (systemctl daemon-reload) и новое состояние НЕ подходит . Одним из простых примеров для понимания является следующий сценарий:

a) the service is running well (already started)
b) edit the service definition file and delete everything in its contents
c) reload
d) state masked will be observed too

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

Замечание: я не уверен, что это происходит нарочно или это простая ошибка (опция по умолчанию), но это может быть интересная информация, чтобы поделиться

Тьяго Конрадо
источник