Алексей Федорчук
«Гномомстрасти», описанные в прошлой заметке, в основном уже отгорели. Хотя и поныне чуть ли не каждую неделю на Distrowatch’е можно видеть дистрибутивы (как правило, клоны Debian’а или Ubuntu) с GNOME 2 или вариациями на его темы в качестве десктопа по умолчанию. А вот страсти по очередной новинке, впервые увидевшей свет в составе Fedora, systemd
, только разгораются. И причину их опять надо поискать в истории.
Как известно, исторически сложилось так, что Linux ассимилировал систему инциализации в стиле SysV, с главным процессом init
и уровнями запуска (Runlevel) — наборами сценариев на разные случаи жизни. Замечу тут в скобках, что BSD-подобный стиль инициализации некоторых дистрибутивов Linux (Slackware, Gentoo, Arch, CRUX) — своего рода эвфемизм: от присутствия главного сценария инциализации и его конфига в них уровни запуска (свойственные Linux и отсутствующие в BSD-системах) никуда не исчезают.
Инициализации в стиле SysV — сто лет в обед, и время от времени у разработчиков возникало желание её усовершенствовать. Не то чтобы она вдруг в одночасье начала работать плохо. Но росло число устройств, росло количество обеспечивающих их работу стартовых скриптов — и все они запускались в конечном счёте через тот же процесс init
, так что время загрузки всё возрастало. И появлялось стремление его сократить.
А сокращение времени загрузки было возможно двумя способами. Первый — это не грузить при старте машины заведомо ненужные сервисы. Но это та земля, где каждый умирает в одиночку. И таким путём проблема могла быть решена только в индивидуальном порядке. Системное же её решение — это параллельный запуск тех сервисов, которые не зависят друг от друга.
Есть, конечно, ещё и третий способ — загрузка графической среды и системы авторизации до окончания работы сценариев инициализации, как это сделано в Windows. Но это создаёт лишь иллюзию ускорения процесса загрузки. Хотя, с точки зрения конечного пользователя, даёт чисто психологический эффект быстроты.
Маленькое отступление про скорость загрузки. Я скромно имхую, что эта материя лежит в сфере не программирования и вообще компьютерных технологий, а исключительно метрологии. Как это было сказано в старом анекдоте про психоаналитиков:
Коллеги, мы же профессионалы. Давайте просто расстегнём штаны и померяем.
Так и время загрузки есть объект для сравнительного измерения при форумных дискуссиях. Практический смысл его сокращения стремится к нулю. Ибо при стационаром использовании в рабочем (не развлекательном!) режиме для персонального компьютера норма — одна загрузка в сутки, а то и реже. И кустарём-надомником это время тратится на совершение утреннего туалета, а офисным работником — на обмен приветствиями с коллегами, первую рабочую сигарету etc. А старт любой более-менее современной машины, пусть и перегруженной сервисами по самые… уши, всё равно пройдёт быстрее, чем эти увлекательные занятия.
Конечно, в мобильном режиме расклад иной — классический пример с коммивояжёром, демонстрирующим свои товары потенциальному клиенту, я слышу уже лет 20 как минимум. Однако в этом случае важна не абстрактная скорость загрузки машины, а приведение её в боевую готовность — включая запуск всех необходимых приложений и их данных, причём подчас с совершенно определённого места. И потому резонные люди в таких условиях не занимаются вылавливанием лишнего стартового демона, а применяют всякого рода спящие и ждущие режимы, а также suspend to куда_нужно или куда_можно.
Возражение на счёт серверов ынтырпрайз-сферы, когда каждая секунда простоя способна принести научно-фантастические убытки, тоже старо, как мир. И столь же обосновано. Ибо если тот, чей бизнес зависит от бесперебойной работы компьютерных сетей, не озаботился заранее дублирующими серверами, резервными источниками электроэнергии и так далее, то он сам себе очень злобный буратино. Ну а при глобальных форс-мажорах, типа веерных отключений по всему штату/области/раену, как правило, не так важно, восстановится ли работоспособность одного отдельно взятого сервера через 24 часа 55 минут или через 24 часа, 55 минут и ещё 45 секунд.
В настоящее же время понятие скорости загрузки вообще утрачивает физический смысл. Это связано с постепенным распространением SDD-накопителей, по крайней мере, в качестве носителей для системы и приложений. Скорость чтения с них на порядок превышает таковую для традиционных HDD. И на этом фоне время запуска стартовых служб становится исчезающе малым.
Сужу по своему опыту. Через мои руки прошло два SSD Corsair с интерфейсами SATA II и SATA III, и выполненный в виде платы PCI-E OCZ Revo Drive. Все дистрибутивы, которые у меня были в то же время (Fedora, PCLinuxOS, openSUSE) грузились с любого из них примерно за 20 секунд — из них всё мало-мальски уловимое время уходило на поиск DNS-сервера и синхронизацию по NTP, а собственно процесс инициализации, вне зависимости от схемы её (классический init
, upstart
или systemd
, о которых скоро зайдёт речь) занимал какие-то мгновения.
Скажу больше: нынче и с традиционного HDD система подчас грузится за меньшее время, нежели уходит на процедуру POST при включении машины — особенно на «навороченных» материнских платах. После таких наблюдений любые разговоры о «проблеме скорости загрузки» могут вопсриниматься только в юмористическом ключе.
Не, я не к тому, что не надо стремиться к сокращению времени загрузки, напротив — это как выпить всю водку и перецеловать всех женщин: цель недостиживая, нокак сказал некогда наш Президент, стремиться к ней нужно.
В старые добрые времена классического SysVinit отлов лишних стартовых сервисов являл собой увлекательное занятие, немало способствующее, к тому же, общему образованию. А построение схемы распараллеливания стартовых процессов, вероятно, очень неплохая гимнастика ума — нечто вроде интеллектуального преферанса, как выражается мой старый товарищ Владимир Попов.
Не случайно, когда несколько лет назад проблема ускорения загрузки вдруг стала актуальной (или показалось, что стала), практически одновременно было разработано несколько «параллельных» альтернатив классическому init
‘у: runit
, daemontools
, initng
. Была даже попытка портировать на Linux систему инициализации MacOS X — launchd
. Правда, некоторую известность из них приобрёл, пожалуй, только initng
. Однако и он, насколько я знаю, не прижился даже в родном дистрибутиве — в Gentoo.
Не смотря на различие в деталях, все эти системы инициализации сохраняли init’оподобие, то есть объединяли в себе традиционные shell-скрипты и простые теовые конфиги, от которых они получали свои параметры. И если в скрипты лазать ручонками шаловливыми, без чёткого понимания смысла своих действий, весьма не рекомендовалось, то поменять значение-другое параметра в конфигах было вполне по силам почти любому функционально грамотному пользователю.
Примерно в том же ключе init’оподобия была оформлена и система upstart
. Она разрабатывалась в рамках проекта Ubuntu на достаточно ранних стадиях его жизни (upstart 0.1.0 — сентябрь 2006 года). И сначала за пределами родного дистрибутива не использовалась. Однако весной 2008 года система upstart
, как прогрессивная, была включена… куда? Разумеется, в самый фронтирный дистрибутив своего времени, в Fedora 9-го релиза.
Казалось бы, поддержка со стороны двух самых «крутых» носителей прогресса в Linux-мире предвещает триумфальное по нему шествие советской власти этой системе. Но:
Судьба играется с пакетом
Пакеты же клепает человек
И, как мы скоро увидим, человек такой нашёлся.