Я хочу улучшить время начальной загрузки своего Ubuntu GNOME 16.04 путем отключения плимутских сервисов при начальной загрузке. Я нашел два ответа о том, как сделать это на различных веб-сайтах а именно:
# systemctl disable plymouth-quit-wait.service
# systemctl mask plymouth-quit-wait.service
Я не могу выполнить ни одно из вышеупомянутого, если я не знаю то, что они делают.
Если сервис enabled
, затем существует символьная ссылка где-нибудь в
/etc/systemd/system
в файл единицы, чаще всего где-нибудь в
/lib/systemd/system
Услужливо, когда Вы enable
сервис, полные пути созданной ссылки и цели будут распечатаны к stdout.
Отключение сервиса удаляет символьную ссылку, таким образом, сам файл единицы не затронут, но сервис не загружается при следующей начальной загрузке, когда systemd читает /etc/systemd/system
.
Однако отключенный сервис может быть загружен и будет запущен, если сервис, который зависит от него, запускается; enable
и disable
только настройте поведение автоматического запуска для единиц, и состояние легко переопределяется.
Сервис маскированный является тем, файл единицы которого является символьной ссылкой на /dev/null
. Это делает "невозможным" загрузить сервис, даже если это требуется другим, включается сервис.
Когда Вы mask
сервис, символьная ссылка создается из /etc/systemd/system
кому: /dev/null
, отъезд исходного файла единицы, в другом месте нетронутого. Когда Вы unmask
сервис символьная ссылка удален.
Однако я заметил, что эти команды не всегда соблюдают.
Когда я пытаюсь замаскировать большинство сервисов, это перестало работать:
$ sudo systemctl mask bluetooth.service
Failed to execute operation: Invalid argument
Конечно, я остановил сервис сначала. @Anwar предлагает маскировать, только возможно для некритических сервисов.
Размаскирование сервиса маскированного, если я не замаскировал его сам, также перестало работать (тихо). Я полагаю, что это вызвано тем, что нет никакого файла единицы для сервиса нигде, кроме формы символьной ссылки на /dev/null
, на этот раз в /lib/systemd/system
:
$ file $(locate fuse.service)
/lib/systemd/system/fuse.service: symbolic link to /dev/null
$ sudo systemctl unmask fuse.service
$ systemctl status fuse
● fuse.service
Loaded: masked (/dev/null; bad)
Active: inactive (dead)
Я не единственный, имеющий эту проблему
Для фактического размаскирования x11-распространенного сервиса маскированного я должен был удалить символьную ссылку на /dev/null
и sudo apt-get install --reinstall x11-common && sudo systemctl daemon-reload
. Теперь, когда я запрашиваю его с systemctl status x11-common
Я вижу, что сервис имеет хороший зеленый круг и загружается и активен (вышедший), хотя он не имеет никакого файла единицы.
Для дальнейшей ссылки эта статья о том, Как Использовать Systemctl, может быть несколько полезной.
Короче говоря,
disable
делает единицу отключенной во время начальной загрузки. Но та единица может быть запущена в любое время после начальной загрузки.
mask
отключает единицу полностью. Это не может быть запущено без размаскирования. Это автоматически подразумевает, что перестанет работать во время начальной загрузки.
Это довольно просто.
systemctl start
, systemctl stop
: запускается сразу (останавливает) рассматриваемую единицу;systemctl enable
, systemctl disable
: метки (снимают выделение) с единицы для автоматического запуска во время начальной загрузки (определенным для единицы способом, описанным в [Install]
раздел);systemctl mask
, systemctl unmask
: запрещает (позволяет) всем и любым попыткам запустить рассматриваемую единицу (или вручную или как зависимость любой другой единицы, включая зависимости цели начальной загрузки по умолчанию). Обратите внимание, что маркировка для автоматического запуска в systemd реализована путем добавления искусственной зависимости от цели начальной загрузки по умолчанию до рассматриваемой единицы, таким образом, "маска" также запрещает автозапуск.Касательно: systemctl (1).
Еще: Lennart Poettering (2011-03-02). "Три Уровня Прочь". systemd для Администраторов. 0pointer.de.