🐧 Как включить shell скрипт rc.local в systemd при загрузке системы Linux |

🐧 Как включить shell скрипт rc.local в systemd при загрузке системы Linux

Мануал
Мы можем легко включить поддержку скриптов оболочки rc.local в systemd при загрузке системы Linux.
Традиционно скрипт оболочки /etc/rc.local используется разработчиками и системным администратором Linux для вызова других скриптов или команд после загрузки всех служб.
Обычно /etc/rc.local вызывается в конце, когда Linux init переключается на многопользовательский уровень запуска.
Однако по умолчанию поддержка /etc/rc.local отключена в systemd.
В этой статье мы покажем, как включить и выполнить скрипт оболочки rc.local во время загрузки с помощью systemd в Linux.

Включение скрипта оболочки rc.local в systemd при загрузке системы Linux

Совместимость с /etc/rc.local достигается через systemd с помощью специальной службы под названием rc-local.service.

Этот модуль автоматически вызывается в multi-user.target системой systemd-rc-local-generator, если /etc/rc.local является исполняемым.

Выполнение скрипта оболочки rc.local во время загрузки с использованием systemd

Естественно, создайте или обновите/отредактируйте файл с именем /etc/rc.local с помощью вашего любимого текстового редактора.

Я собираюсь использовать команду vim:

$ sudo vim /etc/rc.local
## RHEL/CentOS/Fedora Linux отредактируйте файл /etc/rc.d/rc.local ##
$ sudo vim /etc/rc.d/rc.local

Добавьте необходимые команды или вызовите скрипт.
Вот мой файл:
#!/bin/sh
# add your commands 
# call your scripts here
 
# let us set stuff for my wifi
/sbin/iw phy0 wowlan enable magic-packet disconnect
 
# last line must be exit 0 
exit 0

Сохраните и закройте файл при использовании vim.

🐧 Как сохранить файл в Vi / Vim и выйти

Убедитесь, что вы установили права на исполнение файла с помощью команды chmod:

$ sudo chmod -v +x /etc/rc.local

Настройка rc-local.service в Linux, когда systemd запускается

Все, что нам нужно сделать, это ввести следующую команду systemctl:

$ sudo systemctl enable rc-local.service

Перезагрузите Linux:
$ sudo reboot
Проверьте статус после перезагрузки:
$ sudo systemctl status rc-local.service
Вот что мы увидим на экране:
 rc-local.service - /etc/rc.local Compatibility
     Loaded: loaded (/etc/systemd/system/rc-local.service; enabled-runtime; ven>
    Drop-In: /usr/lib/systemd/system/rc-local.service.d
             └─debian.conf
     Active: active (exited) since Wed 2020-11-04 13:29:54 IST; 1h 59min ago
       Docs: man:systemd-rc-local-generator(8)
      Tasks: 0 (limit: 37939)
     Memory: 0B
     CGroup: /system.slice/rc-local.service

Nov 04 13:29:54 itsecforu systemd[1]: Starting /etc/rc.local Compatibility
Nov 04 13:29:54 itsecforu systemd[1]: Started /etc/rc.local Compatibility.

Как посмотреть конфигурацию сервиса

Откройте приложение терминал и введите:

$ sudo systemctl cat rc-local.service

Мы увидим конфигурацию systemd следующим образом:
# /etc/systemd/system/rc-local.service
#  SPDX-License-Identifier: LGPL-2.1+
#
#  This file is part of systemd.
#
#  systemd is free software; you can redistribute it and/or modify it
#  under the terms of the GNU Lesser General Public License as published by
#  the Free Software Foundation; either version 2.1 of the License, or
#  (at your option) any later version.
 
# This unit gets pulled automatically into multi-user.target by
# systemd-rc-local-generator if /etc/rc.local is executable.
[Unit]
Description=/etc/rc.local Compatibility
Documentation=man:systemd-rc-local-generator(8)
ConditionFileIsExecutable=/etc/rc.local
After=network.target
 
[Service]
Type=forking
ExecStart=/etc/rc.local start
TimeoutSec=0
RemainAfterExit=yes
GuessMainPID=no
 
# /usr/lib/systemd/system/rc-local.service.d/debian.conf
[Unit]
# not specified by LSB, but has been behaving that way in Debian under SysV
# init and upstart
After=network-online.target
 
# Often contains status messages which users expect to see on the console
# during boot
[Service]
StandardOutput=journal+console
StandardError=journal+console

Примечание. Запустите sudo SYSTEMD_LOG_LEVEL=debug /usr/lib/systemd/system-generators/systemd-rc-local-generator для отладки проблем с /etc/rc.local, когда скрипт не загружается.

Информация об уровнях выполнения Linux

Когда по умолчанию использовался init, у нас были следующие уровни запуска:

  • S – загрузить систему Linux
  • 0 – выключить Linux
  • 6 – Перезагрузить Linux
  • 1 – Однопользовательский режим Linux, используемый для восстановления системы Linux в аварийном режиме
  • 2–5 – Обычная многопользовательская система, поддерживающая как CLI, так и GUI, а также полную сетевую связь

Застую дистрибутивы Linux и система Unix изменяли эти значения уровней выполнения в соответствии со своими потребностями.

Тем не менее, /etc/rc.local вызывается, когда система входит в многопользовательский режим через уровни запуска от 2 до 5.

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

Поэтому я написал это краткое руководство для разработчиков Linux и системных администраторов.

Создать свой собственный сервис легко с systemd на Linux

Вместо скрипта оболочки в /etc/rc.d/ или вызова /etc/rc.local мы сделаем это по другому.

Он работает только в Linux, но не в других вариантах Unix. Тогда просто сделайте:

# /etc/systemd/system/my-service-name-goes-here.service
#
# Sample template to call your script or command when systemd boots into multi user mode
#
[Unit]
Before=network.target
[Service]
Type=oneshot
ExecStart=/path/to/command
ExecStart=/path/to/script arg1 arg2
RemainAfterExit=yes
[Install]
WantedBy=multi-user.target

Например, вот как мы можем установить правила Wireguard или openvpn iptables:

# /etc/systemd/system/wireguard-iptables.service
[Unit]
Before=network.target
[Service]
Type=oneshot
ExecStart=/usr/sbin/iptables -t nat -A POSTROUTING -s 10.8.1.0/24 ! -d 10.8.1.0/24 -j SNAT --to 123.x.x.x
ExecStart=/usr/sbin/iptables -I INPUT -p udp --dport 1194 -j ACCEPT
ExecStart=/usr/sbin/iptables -I FORWARD -s 10.8.1.0/24 -j ACCEPT
ExecStart=/usr/sbin/iptables -I FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
ExecStop=/usr/sbin/iptables -t nat -D POSTROUTING -s 10.8.1.0/24 ! -d 10.8.1.0/24 -j SNAT --to 123.x.x.x
ExecStop=/usr/sbin/iptables -D INPUT -p udp --dport 1194 -j ACCEPT
ExecStop=/usr/sbin/iptables -D FORWARD -s 10.8.1.0/24 -j ACCEPT
ExecStop=/usr/sbin/iptables -D FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
RemainAfterExit=yes
[Install]
WantedBy=multi-user.target

А потом:

$ sudo systemctl enable wireguard-iptables.service
$ sudo systemctl start wireguard-iptables.service
$ sudo systemctl stop wireguard-iptables.service

Заключение

Надеюсь, вы найдете это краткое руководство по включению поддержки /etc/rc.local полезным для обеспечения обратной совместимости и простоты использовани systemd.

Пожалуйста, не спамьте и никого не оскорбляйте. Это поле для комментариев, а не спамбокс. Рекламные ссылки не индексируются!
Добавить комментарий