LINUX.ORG.RU
ФорумTalks

давайте разберемся, так ли плох systemd?

 


0

1

Я тоже, как и многие тут, попал под истерию ненависти к systemd. Но все таки решил узнать поподробнее, что же это.

Звучит очень неплохо. Может знающие люди смогут объяснить по-подробнее, что же в этом плохого? Ну или может я читал слишком устаревшую статью, и с тех пор systemd, как политый водой гремлин, породил кучку злобных и страшных мутантов?

Update 1: пока из трех страниц треда так и не была указана киллер-фича systemd, окромя более быстрой загрузки. Если кто такую киллер-фичу знает (то есть такое, что раньше не было возможно/было возможно, но трудно), милости просим в тред.

Итоги:

Очевидные преимущества:

быстрая загрузка

systemd - это аналог xinetd, только для системных сервисов.

решение проблемы отдельного /usr и других подобных поблем с разделами на корню

решение проблемы "убегания" демонов после двойного форка с помощью cgroups.

Очевидные недостатки:

для родительского процесса с pid 1  слишком сложная => ненадежная программа.

linux only

бинарные логи (хоть и поправимо в теории)


Последнее исправление: dikiy (всего исправлений: 6)
Ответ на: комментарий от vaka

Всё в одном файле - это прямо как BSD Init. Негибко и засрать легко.

Quasar
()
Ответ на: комментарий от Deleted

franchukroman> Оно ничем не лучше systemd. + оно не имеет и малой части фич systemd.

Вот этим оно лучше, чем systemd - не пихали туда что попало.

Quasar
()
Ответ на: комментарий от true_admin

Чушь несёшь ты. Есть компоненты системы, а есть - пользовательские приложения. systemd никак ко второму не относится. Но да - сейчас ощущается нехватка UNIX-Way в приложениях. И это очень нехорошо.

Quasar
()
Ответ на: комментарий от true_admin

То, что предлагает поцеринг - это отсутствие гибкости системы и прибитость костылей гвоздями к системе.

Quasar
()
Ответ на: комментарий от gentoo_root

Если ты ставишь systemd и у тебя система начала лучше работать - значит с системой было что-то не так изначально. И systemd оказался всего лишь костылём (который в любом момент может рухнуть), подперевшим фундаментальную проблему проектирования дистрибутива.

Quasar
()
Ответ на: комментарий от gentoo_root

initramfs придумали не для того, чтобы туда тащить всё попало.

Quasar
()
Ответ на: комментарий от gentoo_root

gentoo_root> Это заботы мейнтейнеров дистрибутива, куда класть какие библиотеки.

Нет. Это забота стандарта, куда библиотеки помещать. А ты, блин, опять чушь порешь.

Quasar
()
Ответ на: комментарий от true_admin

Тенденция ухода от текстовых терминалов сама по себе неплоха (подразумеваются телетайпы). Они устарели уже давно. Вопрос в том, в какую сторону уходить. Вот в Plan9 в верно направлении пошли - вместо телетайпов сделали устройства консолей (и не обязательно текстовых).

Quasar
()
Ответ на: комментарий от dikiy

Запись данных технологического процесса в реальном времени с интервалом в несколько миллисекунд, как бы совсем не фантазия...

backbone
()
Ответ на: комментарий от Quasar

в Plan9 в верно направлении пошли

И капитально сломали цвета в терминала (впрочем, в plan9 терминалов как таковых нет из-за упоротости девелоперов файлами).

x3al
()
Ответ на: комментарий от Quasar

Если ты ставишь systemd и у тебя система начала лучше работать - значит с системой было что-то не так изначально.

Я вполне согласен — там не было нормальной системы управления демонами. Были лишь какие-то говноскрипты на баше, полностью состоящие из костылей, которые даже не могли нормально убить демоны, потому что они полагались на pid-файлы. Это не говоря о том, что они ещё и почти каждой строчкой запускали по несколько новых процессов, когда их можно не запускать.

И systemd оказался всего лишь костылём

Он оказался удобным решением, потому что мне не нужно переписывать все init-скрипты так, чтобы они использовали cgroups, хотя и это можно сделать, а достаточно просто написать короткие юниты, в которых только указать, какой процесс запускать и когда это делать (зависимости).

initramfs придумали не для того, чтобы туда тащить всё попало.

Initramfs придумали для того, чтобы смонтировать корень, когда это не может сделать ядро. Потом она ещё и стал монтировать /proc, /sys и /dev (она всё равно их монтирует, не нужно их размонтировать, чтобы опять смонтировать). В более общем случае initramfs готовит файловую систему, чтобы ей мог спокойно пользоваться юзерспейс, поэтому нет ничего плохого в том, чтобы монтировать /usr оттуда. А костыль здесь — само наличие /bin, /sbin и /lib, когда можно всё положить в /usr/bin, /usr/sbin и /usr/lib и это удобнее. Как раз положить бинарники в корень только для того, чтобы запускать их, пока не вся ФС доступна — это костыль, потому что нефиг вообще запускать что-то, пока не готова ФС.

Нет. Это забота стандарта, куда библиотеки помещать.

Правильно, по стандарту библиотеки должны лежать в /lib, если они нужны во время инициализации до монтирования /usr.

gentoo_root
()
Ответ на: комментарий от true_admin

ААА, посмотрел исходники, ОНО ЧЕРЕЗ autotools КОНФИГУРИЦЦАА!

Будто это что-то плохое.

ratvier 😊
()
Ответ на: комментарий от Quasar

Если ты ставишь systemd и у тебя система начала лучше работать - значит с системой было что-то не так изначально. И systemd оказался всего лишь костылём (который в любом момент может рухнуть), подперевшим фундаментальную проблему проектирования дистрибутива.

Если ты проапгрейдил стабильный 80486SX-33 до Core i7 и система начала работать отзывчивей, значит, с ней было что-то не так изначально. Core i7 оказался всего лишь костылем (который в любом момент может сгореть), подперевшим фундаментальную проблему проектирования дистрибутива.

shimon
()
Ответ на: комментарий от true_admin

ААА, посмотрел исходники, ОНО ЧЕРЕЗ autotools КОНФИГУРИЦЦАА!

Только ручная правка мейкфайлов, только хардкор!

shimon
()
Ответ на: комментарий от gentoo_root

потому что нефиг вообще запускать что-то, пока не готова ФС.

Полнейший бред. Процедура начальной загрузки по этому и называется bootstraping ака «вытягивание самого себя за шнурки» - потому что там все это в той или иной мере «запуск чего-то пока не готова ФС».

Более того /bin /sbin не исчезли фактически, их тупо заменил initrd, с утерей многих функций. Так как именно эти функции /bin & /sbin выполнял - специфического мелкого раздела где лежит нечто что нужно что бы запускать «пока ФС не готова».

kernel
()
Ответ на: комментарий от kernel

Более того /bin /sbin не исчезли фактически, их тупо заменил initrd, с утерей многих функций.

Интересно, какую же это мегаполезную функцию, нужную для загрузки, выполняют /bin и /sbin, которой нет в initramfs?

Так как именно эти функции /bin & /sbin выполнял - специфического мелкого раздела где лежит нечто что нужно что бы запускать «пока ФС не готова».

Получается дублирование функциональности. Если нет initramfs, то в теории систему может загрузить то, что находится не в /usr. Но если без initramfs не обойтись (в случае LVM, например), то теперь функции монтирования ФС уже выполняет initramfs, а реализация из корня не используется. В большинстве дистрибутивов всё равно всегда используется initramfs, поэтому необходимость делать в корне минимальную систему (которая давно уже не минимальна) для поднятия остального отпадает. В федоре правильно сделали, что выпилили её, оставив только initramfs — чтобы не было трёх разных мест, в которых лежат бинарники и одно из которых не использовалось, а осталось только 2.

gentoo_root
()
Ответ на: комментарий от backbone

Запись данных технологического процесса в реальном времени с интервалом в несколько миллисекунд, как бы совсем не фантазия...

ты не понмиаешь чтоли? Данный интервал все равно программа зписать не смогла бы :) А так запишет из буфера.

dikiy
() автор топика
Ответ на: комментарий от gentoo_root

Интересно, какую же это мегаполезную функцию, нужную для загрузки, выполняют /bin и /sbin, которой нет в initramfs?

В / есть удобство поправить процедуру загрузки при необходимости, например. Есть возможность получить нормальную консоль с bash. Гораздо проще прикрутить сеть (sshd). В initrd свое отдельное, кривое окружение - урезанные библиотеки и прочее.

Получается дублирование функциональности.

Да, получается. Просто 95% тех кто орет «/bin ненужен» имеют в виду что ненужны именно функции которые он выполняет. А IRL все наоборот - функции как раз никуда не делись.

чтобы не было трёх разных мест, в которых лежат бинарники и одно из которых не использовалось, а осталось только 2.

Я рад что вы упомянули «бинарники которые не используются». Ведь initrd это именно бинарники которые не используются, кроме десятка секунд во время загрузки.

Собственно /bin, это такой initrd где конструкторы пошли еще дальше - исключили дублирование кода и отдельную систему для загрузки. Если вы хотите использовать программу не только в фазе работы, а еще и в фазе загрузки - вы размещаете ее в /bin . Собственно /bin это такой initrd который все время подмонтирован и не ведет к дублированию кода.

kernel
()
Ответ на: комментарий от dikiy

Записать не могла бы, но клиент будет считать, что сервер запущен и готов отдавать данные. В итоге клиент отправит запросы в очередь, которые не будут обработаны, что приведёт в лучшем случае к выполнению фиктивных операций клиента (а цель создания этих UNIX-сокетов как раз обратная - сократить время запуска), в худшем - к ошибке в работе всей системы или её части.
Я не говорю, что это плохо всегда, но есть такие случаи. :)

backbone
()
Ответ на: комментарий от kernel

В / есть удобство поправить процедуру загрузки при необходимости, например.

Ничего не мешает это сделать в нормальной initramfs. И часто нужно править процедуру загрузки? Лично у меня никогда не возникало необходимости изменять что-то в готовой initramfs. Может, у вас есть реальные примеры, когда это действительно нужно, а не теоретические рассуждения?

Есть возможность получить нормальную консоль с bash.

Во многих initramfs можно даже установить breakpoint'ы, после которых появляется busybox shell. Можно и запихать bash, но это не нужно во время загрузки.

кроме десятка секунд во время загрузки.

Ничего себе у вас initramfs жирная.

Собственно /bin, это такой initrd где конструкторы пошли еще дальше - исключили дублирование кода и отдельную систему для загрузки. Если вы хотите использовать программу не только в фазе работы, а еще и в фазе загрузки - вы размещаете ее в /bin . Собственно /bin это такой initrd который все время подмонтирован и не ведет к дублированию кода.

Вот только одна проблема — чтобы получить этот чудо-bin, нужно для начала выполнить код из initramfs, который соберёт LVM. В отличие от initramfs, ядро не всегда может его смонтировать.

gentoo_root
()
Ответ на: комментарий от Quasar

Нет. Это забота стандарта, куда библиотеки помещать. А ты, блин, опять чушь порешь.

В альте вот все нужное для systemd положили в /lib. /usr на отдельном разделе заводится без всяких телодвижений. Но ты можешь продолжать плакаться.

Vovka-Korovka
()
Ответ на: комментарий от Quasar

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

true_admin
()
Ответ на: комментарий от Quasar

То, что предлагает поцеринг - это отсутствие гибкости системы

чего именно тебе не хватает в systemd? Или так, теоретизируешь на тему «а вот если мне мега-костыль понадобится...».

true_admin
()
Ответ на: комментарий от Vovka-Korovka

Теперь ещё одними user-библиотеками в /lib стало больше. «Жирнее ещё жирнее» - девиз поттеринга и его поделий, а разрабы и мейнтейнеры дистров ведутся

daemonpnz
()
Ответ на: комментарий от daemonpnz

Теперь ещё одними user-библиотеками в /lib стало больше. «Жирнее ещё жирнее» - девиз поттеринга и его поделий, а разрабы и мейнтейнеры дистров ведутся

# du -hs /lib
226M    /lib
# du -hs /lib/systemd/
3,2M    /lib/systemd/

Ну просто жуть - целые 3.2 мегабайта. Как дальше жить.

Vovka-Korovka
()
Ответ на: комментарий от Vovka-Korovka

А давайте всё свалим в папочку linux, а пользовательские приложения разложим по папочкам linux program и устроем so-hell.

daemonpnz
()
Ответ на: комментарий от backbone

В итоге клиент отправит запросы в очередь, которые не будут обработаны, что приведёт в лучшем случае к выполнению фиктивных операций клиента (а цель создания этих UNIX-сокетов как раз обратная - сократить время запуска), в худшем - к ошибке в работе всей системы или её части.

в случае с RT клиентом, делать соединение на сокетах по крайней мере странно. Но если уж и делаешь, то никто не мешает выставить буферизацию в ноль. Тогда даже твоя фантастическая ситуация будет разрулена так как ты хочешь.

dikiy
() автор топика
Ответ на: комментарий от gentoo_root

Были лишь какие-то говноскрипты на баше, полностью состоящие из костылей, которые даже не могли нормально убить демоны, потому что они полагались на pid-файлы.

Мне вот интересно, чем же это pid-файл костыль? Очень изящное решение даже.

dikiy
() автор топика
Ответ на: комментарий от true_admin

чего именно тебе не хватает в systemd? Или так, теоретизируешь на тему «а вот если мне мега-костыль понадобится...».

именно так.

dikiy
() автор топика
Ответ на: комментарий от dikiy

Мне вот интересно, чем же это pid-файл костыль? Очень изящное решение даже.

давайте разберемся, так ли плох systemd? (комментарий)

gentoo_root

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

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

gentoo_root
()
Ответ на: комментарий от gentoo_root

приходилось полагаться на pid-файлы, создаваемые самим демоном, что очень ненадёжно, потому что в теории демон может записать туда лажу

в теории демон может даже rm -rf / сделать.

или его может прибить пользователь и запустить новый процесс с тем же pid, а если pid-файлы создавать извне, без участия демона, то он может форкнуться и поменять pid.

данный демон может прибить только _суперпользователь_. А суперпользователь, в отличие от пользователя, должен знать, как правильно перезапускать/останавливать демоны.

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

решение может и не самое идеальное, но уж точно не плохое. Все твои аргументы притянуты за уши.

dikiy
() автор топика
Ответ на: комментарий от dikiy

в случае с RT клиентом, делать соединение на сокетах по крайней мере странно

Частный бюджетный случай запуска сервера и клиента на одном хосте.

Но если уж и делаешь, то никто не мешает выставить буферизацию в ноль. Тогда даже твоя фантастическая ситуация будет разрулена так как ты хочешь.

Выставить буферизацию в ноль - вмешательство в приложение, а ситуация не фантастическая, а практическая.

Но я не вижу тут предмета для спора, ведь в Systemd, как я понял можно указать - какие сокеты (или для каких демонов) создавать преждевременно, а какие нет, правильно?

Просто в целом, я попрежнему не вижу преимуществ перед OpenRC. Правда немногие указывают на разницу во времени загрузки в 5-10 секунд, может это и критично для кого-то, я не спорю.

backbone
()
Ответ на: комментарий от dikiy

А суперпользователь, в отличие от пользователя, должен знать, как правильно перезапускать/останавливать демоны.

Apache вполне может запустить кривой cgi-скрипт, который форкнется и зависнет, а потом останется висеть после того, как apache будет убит по pid-файлу. Администратор вовсе не обязан помнить наизусть все имена cgi-скриптов на своём сервере (скрипты могут писать другие пользователи) и уж точно не обязан подбирать за демонами какашки. Система управления демонами должна работать надёжно, а не лишь бы как попало. А системный администратор не обязан выучить наизусть все исходники демона и предугадывать его поведение в любой ситуации. Гораздо проще управлять системой, когда любого демона (в том числе незнакомого) можно прибить одной командой и не нужно знать, какие процессы при каких условиях он создаёт и зачем он это делает.

Все твои аргументы притянуты за уши.

Пример с apache вполне жизненный.

решение может и не самое идеальное, но уж точно не плохое.

Оно полностью полагается на костыли, специфичные для каждого демона, которые основаны на знании его поведения. Если оно изменится, то эти костыли рухнут.

gentoo_root
()
Ответ на: комментарий от backbone

в случае с RT клиентом, делать соединение на сокетах по крайней мере странно

Частный бюджетный случай запуска сервера и клиента на одном хосте.

прошу конкретики. что они делают, и почему все происходит именно так, как ты описал.

Но если уж и делаешь, то никто не мешает выставить буферизацию в ноль. Тогда даже твоя фантастическая ситуация будет разрулена так как ты хочешь.

Выставить буферизацию в ноль - вмешательство в приложение, а ситуация не фантастическая, а практическая.

ты даже не понял о чем я ;-] Я имел в виду буферизацию сокета.

dikiy
() автор топика
Ответ на: комментарий от gentoo_root

Все твои аргументы притянуты за уши.

Пример с apache вполне жизненный.

такие примеры как апач можно на пальцах пересчитать. для них можно вполне свою обертку написать, которая cgroups заюзает.

решение может и не самое идеальное, но уж точно не плохое.

Оно полностью полагается на костыли, специфичные для каждого демона, которые основаны на знании его поведения. Если оно изменится, то эти костыли рухнут.

99% всех демонов ведут себя одинаково. Будь-то syslogd, acpid, tor, mldonkey или что-то еще.

оно полагается не на костыли, а на обычное поведение демона.

dikiy
() автор топика
Ответ на: комментарий от dikiy

для них можно вполне свою обертку написать, которая cgroups заюзает.

Вот это как раз и есть костыль — для определённых демонов делать одно, а для других другое. Нужно везде использовать cgroups и не важно, systemd будет управлять им или нет.

Кстати, другой пример — bumblebee. При запуске программы через optirun, если она демонизируется, то optirun подумает, что процесс умер и остановит второй X-сервер, из-за чего программа реально умрёт. Так делают всякие вендовые программы под вайном и не только они. А если бы optirun использовал cgroups для слежения за запущенной программой, то этой проблемы бы не было. Надо будет когда-нибудь написать альтернативу optirun.

99% всех демонов ведут себя одинаково.

Это вовсе не так. Некоторые «демоны» вообще не демонизируются (для них нужны костыли вроде start-stop-daemon), некоторые демонизируются сразу, некоторые демонизируются не сразу, а только после того, как считали конфигурацию и не упали от неправильного конфига. Некоторые создают pid-файл, а некоторые не создают (ими управлять без cgroups сложнее всего, потому что если они не создают pid-файл, то надёжно создать извне его нельзя, потому что приходится использовать pidof, а демон может быть запущен несколько раз разными скриптами, например, двойной squid, поэтому pidof вернёт несколько значений, а гарантированного способа отличить pid своего демона нет). Это уже с ходу 6 возможных комбинаций, т.е. 6 возможных наборов костылей.

gentoo_root
()
Ответ на: комментарий от dikiy

прошу конкретики. что они делают, и почему все происходит именно так, как ты описал.

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

ты даже не понял о чем я ;-] Я имел в виду буферизацию сокета.

Клиент гарантированно получит отказ, не ожидая этого, вот о чём я говорю.

backbone
()
Ответ на: комментарий от backbone

Клиент гарантированно получит отказ, не ожидая этого, вот о чём я говорю.

Тогда он не зависит ни от чего и клиент можно запускать не зависимо от сервера.

dikiy
() автор топика
Ответ на: комментарий от dikiy

Тогда он не зависит ни от чего и клиент можно запускать независимо от сервера.

Если клиент учитывает возможность неготовности сервера, то да.

backbone
()
Ответ на: комментарий от backbone

Тогда он не зависит ни от чего и клиент можно запускать независимо от сервера.

Если клиент учитывает возможность неготовности сервера, то да.

если у него есть такой вариант как «отказ», то это равносильно учитыванию неготовности сервера.

dikiy
() автор топика
Ответ на: комментарий от backbone

В случае «отказа» может идти сообщение об ошибке в лог

бида-бида. То есть одно сообщение - это проблема, а то что программа позволяет существование отказов и в то же время до зарезу хочет о них знать - это нормально, да?

dikiy
() автор топика
Ответ на: комментарий от dikiy

Неприятно, если эти сообщения видит заказчик, к примеру. Отказ - это ошибка, программа должна продолжать свою работу, сообщая о них. Если запуск происходит в строгой последовательности: сервер, потом клиент, в логе этой ошибки не появится и всем будет хорошо.

Вроде всё рассказал, к чему только не понял... Ведь в Systemd нет проблемы просто отключить эту мегафичу!? Есть же? :)

backbone
()
Ответ на: комментарий от backbone

Неприятно, если эти сообщения видит заказчик, к примеру. Отказ - это ошибка, программа должна продолжать свою работу, сообщая о них. Если запуск происходит в строгой последовательности: сервер, потом клиент, в логе этой ошибки не появится и всем будет хорошо.

ну тогда как я и говорил, пусть подождет в io-wait. Потом пусть кинет ошибку о задержанной транзакции. Ничего страшного в этом нет.

Ведь в Systemd нет проблемы просто отключить эту мегафичу!? Есть же? :)

Спешу тебя разочаровать, способность ограждать заказчика от неприятных сообщений в логах не входит в перечень возможностей systemd.

dikiy
() автор топика
Ответ на: комментарий от dikiy

Здесь читаю, что socket создаётся выборочно для демона, значит это не захардкодено для всех сервисов или же подразумевается, что для всех демонов нужно создавать эти сокеты?

backbone
()
Ответ на: комментарий от backbone

я таких тонкостей не знаю. Думаю, что принудительно не надо для всех создавать.

dikiy
() автор топика
Ответ на: комментарий от Deleted

используя один и тот же русский язык можно выражать мысли при помощи литературного языка, а можно и по фене ботать.

какой плохой русский язык, в нем не предусмотрен встроенный динамит для отбраковки хлама.

argin
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.