... BAT BLOG: posts/2016-04-21_xadada_init.md
блог старой летучей мыши. /m/ /v/ /β/
   2016-04-22 00:08

Fly, XADADA!

Система инита, сделанная “КАК НАДО”, наконец-то…

Systemd-lovers, проходите мимо - этот пост не для вас. Он предназначен для homo sapiens.

Как обычно - начну с “нытья”: сегодня у нас, дорогие мои линуксоиды - всё плохо. Мейнстрим “испортился”, как залежалые консервы, пораженные бутулизмом. Вроде и банку не вспучило, но отрава уже внутри, осталось только употребить ее и “почувствовать лёгкое недомогание”.

Sapienti, как известно, sat. Он понимает, что жить дальше в созданных условиях будет тяжело, практически невыносимо. Некоторые уже наступили на эти грабли, а кое-кто уже выбрал путь отказа, и начал менять свои системы инициализации на другие.

Однако и параллельности при загрузке хочется, как хочется и сохранить свои наработки в сфере инит-скриптов за прошедшие годы. Хочется же? Хочется.

К примеру - я люблю работать под музыку, и музыки у меня навалом. Каждый раз копаться в огроменном архиве мне осточертело, да и люблю я иногда “фактор случайности”. До некоторого момента мне нравилось слушать интернет-радио. Оно давало мне и музыку для фона, и тот самый фактор случайности. Однако, уж не знаю по какой причине - мои любимые радиостанции просто перестали вещать или кардинально сменили формат. Ну, да не суть. Вот я и решил поднять своё собственное радио в своей собственной сети, попутно выставив его наружу.

Казалось бы - проблем-то? icecast+ezstreamer и вперде. Ага, щаззз! Не тут-то было. Systemd в виртуалке люто обломался запустить сервисы корректно, - смонтировать самбовские шары с моего хранилища, последовательно запустить софты и вывести логи. “Что, бля?!!” скзал я, и снес нахрен поднятую для этого виртуальную машину. Дальше работа пошла “по накатанной” - на нативном amd сервере с установленным Void Linux.

Всё бы хорошо, но и тут прилетела птица обломинго: runit, используемый в “воиде” как стандартная система инициализации и мониторинга, смог запустить только половину требуемых сервисов, a именно - icecast. От ezstrem его sv “феерично стошнило”.

“Да мать же вашу!” сказал я, и написал простейший инит-скрипт из пяти строчек, который чудесно стартанул и все требуемое мне поднял. Так же я поступил с nmbd/smbd из комплекта поставки самбы, с джаббер-сервером и еще рядом сервисов.

Дальше нужно было решить - как все эти нормальные скрипты запускать. Концептуально это решилось относительно просто - я подумал и разделил систему инициализации на два уровня - первый (init, PID1) и второй (runit), запускаемый после всех скриптов init'а.

С реализацией все оказалось значительно “веселее”: не очень хотелось городить огород из ранлевелов sysvinit, да и кому они нужны, если вдуматься? Лично я всегда использовал один ранлевел, фактически - третий. Если нужно было работать в графической среде - включал дефолтным пятый. То есть - все скрипты бут-инициализации системы всегда лежали в одном ранлевеле. Значит, sysvinit тоже не особо-то и нужен. Как и всякие мутные навороты в инит-скриптах, зачастую избыточные для удобства некоторых действий.

Также не вполне понятно, зачем в поздних дистрибуциях sysvinit потребовалось всё ТАК усложнять?! (ой, не говорите мне про systemd, там всё еще печальнее)…

Итак, наши задачи - не сильно поломать ситему инициализации, принятую в void linux, но первым уровнем запихнуть какой-нибудь вменяемый init.

Ну, собираем идеи в кучу и реализуем связку: патчим слегка sinit, пишем скрипты-обертки для init/shutdown (должны запускать скрипты S/K соответственно), и после их отработки дергаем runit, чтобы он дозапустил оставшиеся части системы, включил (respawn) TTY-консоли и запустил xorg.

Проверил… Работает, можно ставить перед runit'ом. Так и поступил. Попутно перенес из runit'а все его core services в свежеполученный /etc/init.d, переименовал эти скрипты, ничего не изменяя внутри, и перезагрузил систему.

Да, от нажатия кнопки питания до старта иксов линух теперь грузится за 13 секунд вместо прежних 7-и. Но я думаю, что это можно пережить.

Попутно написал и подобрал некоторые обертки и колбэки для “типичнных для debian/redhat” sysvinit-скриптов, чтобы упростить портирование уже существующих скриптов в новую систему инита.

Собрал всё в кучу. Порадовался, что, наконец-то, я вижу полный процесс загрузки системы, логи и ошибки в этих логах.

Теперь, если у меня возникают сложности с запуском какого-либо сервиса в runit, я пишу простейший классический инит-скрипт, и переношу его в /etc/init.d - оттуда всё запускается и работает так, как нужно админу, то есть - мне.

и чо так сразу было не сделать, а?!


2016-04-21 22-50