Несколько дней назад я наткнулся на 32-битный дистрибутив CentOS 8 и решил протестировать его на старом 32-битном компьютере. После загрузки я понял, что в нём есть ошибка, из-за которой пропадает сетевое соединение. Каждый раз при перезагрузке мне приходилось вручную восстанавливать сетевое соединение, и я задумался: как можно автоматизировать этот процесс с помощью скрипта, который запускается при каждой загрузке системы?
Решение простое, и сегодня я покажу вам, как это сделать с помощью сервисов systemd, но прежде чем мы перейдём к этому, давайте вкратце рассмотрим, что такое сервис и как он работает.
В этой статье мы рассмотрим основы работы служебных модулей systemd, их связь с «целевыми объектами» и то, как настроить служебный модуль для запуска скрипта при загрузке. Мы будем говорить простым языком, уделяя внимание практическим шагам, чтобы вы знали всё необходимое для самостоятельной работы.
Что такое сервисный модуль Systemd?
Проще говоря, сервис в systemd — это файл конфигурации, который определяет, как сервис должен работать в вашей системе. Это может быть что-то вроде сетевой службы, программы или даже скрипта, который должен запускаться при загрузке компьютера или в определённый момент во время загрузки.
Эти служебные модули сгруппированы в целевые объекты, которые можно рассматривать как этапы или стадии процесса загрузки. Например, когда ваша система достигает многопользовательской цели (уровень выполнения 3), запускаются определённые службы. Вы можете рассматривать эти целевые объекты как «коллекции» служб, которые работают вместе на разных этапах загрузки.
systemctl --type=service
Здесь вы увидите все активные службы в вашей текущей цели. Некоторые службы работают непрерывно, в то время как другие запускаются один раз, а затем завершают работу.
Проверка состояния службы
Если вам интересно, активна ли конкретная служба, вы можете использовать systemctl status
для проверки:
systemctl status firewalld.service
Эта команда проверяет состояние службы брандмауэра. Вы увидите, что она активна, то есть работает, и включена, то есть запустится автоматически при следующей загрузке.
Вы также можете временно остановить службу (до следующей загрузки), используя:
systemctl stop firewalld.service systemctl status firewalld.service
Это остановит службу брандмауэра на этом сеансе, но не помешает её запуску в следующий раз.
Включение и отключение Служб
Чтобы служба автоматически запускалась при загрузке, необходимо включить её, создав символическую ссылку в соответствующей папке:
systemctl enable firewalld.service
Чтобы отключить его, вам нужно просто запустить:
systemctl disable firewalld.service
Создание пользовательского сервисного подразделения
Чтобы настроить службу, которая запускает скрипт при загрузке, мы создадим новую служебную единицу в каталоге /etc/systemd/system
. Здесь вы увидите существующие служебные файлы и папки для разных целей.
cd /etc/systemd/system ls -l
Давайте создадим собственное служебное подразделение под названием connection.service
с помощью Vim или вашего предпочтительного текстового редактора:
vim connection.service или vi connection.service
Добавьте в файл следующее содержимое.
[Unit] Description=Bring up network connection After=network.target [Service] ExecStart=/root/scripts/conup.sh [Install] WantedBy=multi-user.target
Объяснение:
[Unit]
: Метаданные устройства. Мы дали ему описание и указали, что он должен запускаться послеnetwork.target
, то есть он будет работать только после инициализации сети.[Service]
В этом разделе определяется команда, которая будет выполняться при запуске службы. В данном случае запускается скриптconup.sh
.[Install]
Этот раздел сообщает systemd, что служба должна быть загружена на многопользовательском уровне, который является стандартным уровнем запуска для большинства систем.
Теперь включите службу, чтобы она автоматически запустилась при следующей загрузке:
systemctl enable connection.service
Вы можете подтвердить, что он был включен, проверив каталог multi-user.target.wants
:
ls -l multi-user.target.wants/
Символическая ссылка на connection.service
теперь должна присутствовать. Однако нам всё равно нужно создать скрипт, который будет запускать этот сервис.
Создание скрипта
Теперь давайте создадим скрипт conup.sh
, который запустит сетевое подключение.
cd /root mkdir scripts cd scripts vi conup.sh
Добавьте следующую строку, чтобы включить сеть. Здесь скрипт использует команду nmcli для включения сетевого подключения на интерфейсе enp0s3
.
#!/bin/bash nmcli connection up enp0s3
Не забудьте сделать скрипт исполняемым.
chmod +x conup.sh
На этом этапе сервис готов к работе.
Тестирование сервиса
Чтобы протестировать его без перезагрузки, вы можете запустить вручную.
systemctl start connection.service
Если всё настроено правильно, служба выполнит скрипт, и ваше сетевое подключение будет восстановлено.
В качестве альтернативы, если вы написали более простой скрипт, например touch /tmp/testbootfile
, вы можете проверить, был ли создан файл в /tmp
, чтобы убедиться, что служба работает должным образом.
Заключение
К этому моменту вы должны хорошо понимать, что такое служебные модули systemd и как их создавать и управлять ими в вашей системе. Вы также автоматизировали распространённую задачу — включение сетевого подключения при загрузке с помощью простого служебного модуля.
Надеемся, что это руководство поможет вам лучше управлять службами, целями и сценариями в systemd, сделав вашу систему более автоматизированной и эффективной.