Включение rc.local в Debian 10
Одна из самых полезных функций файла rc.local — запуск скриптов во время загрузки системы. К примеру, в нём можно было запустить правила iptables, добавив всего лишь строчку вроде /etc/firewall/iptables.sh.
К сожалению, в современных версиях Debian эта функция стала недоступна, но её можно вернуть вручную, и в этой статье речь пойдёт именно об этом.
В первую очередь нам необходимо создать службу rc-local.service.
Для этого создадим файл /etc/systemd/system/rc-local.service
# touch /etc/systemd/system/rc-local.service
# nano /etc/systemd/system/rc-local.service
и внесём в него несколько строк:
[Unit] Description=/etc/rc.local ConditionPathExists=/etc/rc.local [Service] Type=forking ExecStart=/etc/rc.local start TimeoutSec=0 StandardOutput=tty RemainAfterExit=yes SysVStartPriority=99 [Install] WantedBy=multi-user.target
После этого создадим файл /etc/rc.local
и сюда добавим такие строчки:
Сделаем этот файл исполняемым
Далее включим службу в автозагрузку, запустим её и проверим состояние
# systemctl enable rc-local # systemctl start rc-local # systemctl status rc-local
Если показывает такое состояние
Для проверки можно запустить скрипт, который во время загрузки будет создавать пустой файл с именем даты и времени запуска системы. Для этого создадим каталог /home/rc-local/
и в самом файле /etc/rc.local перед строчкой
touch /home/rc-local/`date +%Y-%m-%d_%H-%M` &
В данном примере показаны 3 файла, каждый из которых был создан в процессе загрузки системы.
Похожие посты:
Управление автозагрузкой в debian
Скрипты инициализации — это не большие программы на shell, которые обычно управляют сервисами, также известными как демоны. Прочие приложения для скриптов инициализации включают в себя простое управление состоянием чего-нибудь вроде hdparm (управляет временем перехода в спящий режим для жестких дисков), iptables (загрузка правил файрвола в ядро) и setserial (конфигурация последовательного порта). Директория /etc/init.d содержит скрипты исполняемые с помощью init во время загрузки и состоянии инициализации.
Скрипты инициализации также важны во время запуска и останова системы (в *nix системах просто меняется“runlevel”). Если вы посмотрите на список процессов, запущенных на вашей машине (попробуйте команду ps auwx), то есть вероятность, что процесс с наименьшим PID будет называться “init”. Это родительский процесс для всех процессов, это первая программа которую ядро запускает при загрузке. Программа init, которую можно найти по пути /sbin/init, ответственна за в рабочее состояние после того, как загрузится ядро.
Существует три простые утилиты для управления стартовыми и инициализационными скриптами:
Далее мы рассмотрим их все и приведем несколько примеров их использования.
update-rc.d
Устанавливает и удаляет ссылки на скрипты инициализации в System-V стиле. update-rc.d автоматически обновляет ссылки на скрипты инициализации в System-V стиле вида /etc/rcrunlevel.d/NNname на скрипты /etc/init.d/name. Они запускаются с помощью init когда меняется уровень загрузки и обычно используются для запуска или остановки системных сервисов, таких как демоны. init поддерживает следующие уровни загрузки — 0123456789S и NN — это двухцифренный код используемый init для определения в каком порядке должны запускаться скрипты.
Синтаксис update-rc.d
update-rc.d [-n] [-f] name remove
update-rc.d [-n] name defaults [NN | NN-start NN-stop]
update-rc.d [-n] name start|stop NN runlevel runlevel start|stop NN runlevel runlevel
Когда запускается с опциями defaults, start или stop, update-rc.d создает ссылки /etc/rcrunlevel.d/[SK]NNname указывающие на скрипт /etc/init.d/name. Если какие-либо файлы уже существуют, то update-rc.d ничего не делает. Это объясняется тем, что системный администратор может изменить порядок ссылок, при условии, что как минимум одна ссылка сохранится, без того чтобы конфигурация была перезаписана.
Доступные опции.
-n — ничего не делать, только показать что будет сделано.
-f — заставить удалять символические ссылки даже если /etc/init.d/name все еще существует.
Примеры использования update-rc.d
Вставить ссылки с использованием defaults:
Эквивалентная команда с использованием явных наборов аргументов:
# update-rc.d samba start 20 2 3 4 5 . stop 20 0 1 6 .
Если вы хотите удалить скрипт из автозагрузки, то используйте следующую команду:
Если вы хотите узнать о команде update-rc.d больше, то прочтите страницу man.
rcconf
Rcconf позволяет управлять тем, какие сервисы будут запускаться когда система загружается или уходит в перезагрузку. Утилита показывает меню, содержащее все сервисы, которые должны быть запущены при загрузке. Те, которые должны запускаться помечены и вы можете включить или выключить отдельные сервисы. Эта утилита конфигурирует системные сервисы во взаимодействии с системными уровнями загрузки (runlevels). Она включает или выключает сервисы с применением скриптов в /etc/init.d/. Rcconf работает с конфигурацией уровней загрузки в стиле System-V. Фактически это TUI(Text User Interface) к команде update-rc.d
Rcconf получает список сервисов от /etc/init.d и просматривает директории /etc/rc?.d чтобы определить запущен сервис или нет.
Если число (NN в /etc/rc?.d/NNname) не равно 20 (по умолчанию), то rcconf сохраняет имя сервиса и число в /var/lib/rcconf/services так что возможно восстановить конфигурацию сервиса в исходном состоянии.
Установка rcconf в Debian.
Эта команда выполнит установку. Теперь вы можете использовать утилиту с помощью команды:
Если будет выводится сообщение rcconf needs dialog or whiptail, то необходимо будет установить утилиту dialog:
Теперь запустив rcconf Вы увидите на экране следующее:
Важные файлы:
/var/lib/rcconf/services — файл с данными о номерах процессов.
/var/lib/rcconf/lock — файл блокировки.
/var/lib/rcconf/guide.default — Guide File который генерируется утилитой update-rcconf-guide.
/var/lib/rcconf/guide — Guide File который может быть определен пользователем (администратором).
Если вы хотите узнать больше об утилите rcconf, то ознакомьтесь со страницей man.
file-rc
Этот пакет предоставляет альтернативный механизм для загрузки или остановки системы и смены уровней загрузки. Ссылки /etc/rc?.d/* будут сконвертированы в единый конфигурационный файл /etc/runlevel.conf который легче администрировать, чем символьные ссылки и который более гибок. Пакет автоматически сконвертирует ваши существующие символьные ссылки в файл во время установки и конвертирует файл обратно в символьные ссылки при удалении. Оба механизма совместимы посредством скриптов /etc/init.d/rc, /etc/init.d/rc*, /usr/sbin/update-rc.d и /usr/sbin/invoke-rc.d
Установка file-rc в Debian.
В ходе установки в русифицированной версии Debian выводятся следующие сообщения:
Следующие НОВЫЕ пакеты будут установлены:
file-rc
0 пакетов обновлено, 1 установлено новых, 0 пакетов отмечено для удаления, и 42 пакетов не обновлено.
Необходимо получить 39,2 kB архивов. После распаковки 184 kB будет занято.
Следующие пакеты имеют неудовлетворённые зависимости:
sysv-rc: Конфликтует: file-rc но устанавливается 0.8.12.
Следующие действия разрешат зависимости:
Удалить следующие пакеты:
1) sysv-rc
Текущее состояние: 41 обновлён [-1].
Конфигурационный файл file-rc расположен в /etc/runlevel.conf. Если вы хотите посмотреть конфигурационный файл по умолчанию, то это можно сделать здесь.
#
05 — 0 /etc/init.d/halt
05 — 1 /etc/init.d/single
05 — 6 /etc/init.d/reboot
10 0,1,6 2,3,4,5 /etc/init.d/sysklogd
12 0,1,6 2,3,4,5 /etc/init.d/kerneld
[…]
89 0,1,6 2,3,4,5 /etc/init.d/cron
99 — 2,3,4,5 /etc/init.d/rmnologin
99 0,1,6 2,3,4,5 /etc/init.d/xdm
Если вы хотите узнать больше деталей о file-rc, то читайте страницу man.
Опубликовано 12 September 2012
Как добавить в автозагрузку Debian 8 .sh скрипт?
Здравствуйте! Нужно запустить при запуске системы скрипт .sh который будет подключаться к ssh серверу (поднимать ssh тоннель).
Конфиг для коннекта находится в файле /home/user/connect.sh я добавил строчку в /etc/rc.local
/home/user/connect.sh
Но оно упорно не хочет подключаться, скажите пожалуйста как и где правильно прописать?
Оценить 4 комментария
Запуск из /etc/rc.local — штука непредсказуемая, так как, например, запуск может произойти ещё до того, как заработает сеть, и поэтому скрипт обломается.
По-хорошему, нужно взять какой-нибудь сетевой серсис (апач например, если установлен) из /etc/init.d за образец, и создать свои скрипты, прописав их запуск под номером (для sysv init), бОльшим тех сервисов, которые нужны уже запущенными при старте вашего сервиса (или, для systemd — прописав правильные зависимости).
На худой конец, скрипт можно запустить из кронтаба нужного пользователя, вставив строчку:
@reboot /usr/local/bin/your-script.sh
но скрипт не будет отрабатывать завершение работы системы, так что лучше озаботьтесь таки созданием номального сервиса.
Предлагаю через systemd. Создай файл вида /etc/systemd/system/ssh_tunnel.service
[Unit] Description=SSH tunnel After=syslog.target network.target [Service] Type=forking User=user ExecStart=/usr/bin/ssh -i /home/user/.ssh/key -N -T -L 127.0.0.1:51143:192.168.5.5:143 -o MACs=hmac-sha2-512-etm@openssh.com user@host ExecStop=/bin/kill $MAINPID ExecReload=/bin/kill $MAINPID && /usr/bin/ssh -i /home/user/.ssh/key -N -T -L 127.0.0.1:51143:192.168.5.5:143 -o MACs=hmac-sha2-512-etm@openssh.com user@host Restart=on-failure [Install] WantedBy=multi-user.target
Обновляем информацию systemd:
systemctl daemon-reload
Стартуем сервис:
systemctl start ssh_tunnel.service
Смотрим его статус:
systemctl status ssh_tunnel.service
Если все в порядке, включаем его в автозагрузку:
systemctl enable ssh_tunnel.service