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