Похоже, systemd - это новая горячая система инициализации в блоке, такая же, как Upstart несколько лет назад. Каковы плюсы / минусы для каждого? Кроме того, как каждая из них сравнивается с другими системами инициализации?
Похоже, systemd - это новая горячая система инициализации в блоке, такая же, как Upstart несколько лет назад. Каковы плюсы / минусы для каждого? Кроме того, как каждая из них сравнивается с другими системами инициализации?
Ответы:
Большинство ответов здесь пять лет, поэтому пришло время для некоторых обновлений.
Ubuntu по умолчанию использовал upstart, но отказался от него в прошлом году в пользу systemd - смотрите:
По этой причине в Wiki Ubuntu есть хорошая статья Systemd для пользователей Upstart - очень подробное сравнение между upstart и systemd и руководство по переходу от upstart к systemd.
(Обратите внимание, что согласно вики Ubuntu, вы по-прежнему можете запускать upstart в текущих версиях Ubuntu по умолчанию, установив upstart-sysv
и запустив, sudo update-initramfs -u
но учитывая масштабы проекта systemd, я не знаю, как он работает на практике, или нет systemd можно удалить.)
Большая часть информации в разделах «Команды и сценарии» ниже взята из некоторых примеров, использованных в этой статье (она удобно лицензируется, как и вклады пользователей Stack Exchange в рамках лицензии Creative Commons Attribution-ShareAlike 3.0 ).
Вот быстрое сравнение общих команд и простых скриптов, подробное объяснение смотрите в разделах ниже. Этот ответ сравнивает старое поведение систем на основе Upstart с новым поведением систем на основе systemd, как было задано в вопросе, но обратите внимание, что команды, помеченные как «Upstart», не обязательно зависят от Upstart - они часто являются командами, которые являются общими для любой не системной системы Linux и Unix.
su
machinectl shell
(см. раздел «Замена команды su» ниже)
screen
systemd-run --user --scope screen
(см. раздел «Неожиданное уничтожение фоновых процессов» ниже)
tmux
systemd-run --user --scope tmux
(см. раздел «Неожиданное уничтожение фоновых процессов» ниже)
start foo
systemctl start foo
stop foo
systemctl stop foo
restart foo
systemctl restart foo
initctl list
systemctl status
init-checkconf /etc/init/foo.conf
systemd-analyze verify /lib/systemd/system/foo.service
initctl list-env
systemctl show-environment
initctl set-env foo=bar
systemctl set-environment foo=bar
initctl unset-env foo
systemctl unset-environment foo
В upstart журналы - это обычные текстовые файлы в каталоге / var / log / upstart, поэтому вы можете обрабатывать их как обычно:
cat /var/log/upstart/foo.log
tail -f /var/log/upstart/foo.log
В systemd логи хранятся во внутреннем двоичном формате (не в виде текстовых файлов), поэтому вам необходимо использовать journalctl
команду для доступа к ним:
sudo journalctl -u foo
sudo journalctl -u foo -f
Пример сценария upstart, написанный на /etc/init/foo.conf
:
description "Job that runs the foo daemon"
start on runlevel [2345]
stop on runlevel [016]
env statedir=/var/cache/foo
pre-start exec mkdir -p $statedir
exec /usr/bin/foo-daemon --arg1 "hello world" --statedir $statedir
Пример сценария systemd, написанный на /lib/systemd/system/foo.service
:
[Unit]
Description=Job that runs the foo daemon
Documentation=man:foo(1)
[Service]
Type=forking
Environment=statedir=/var/cache/foo
ExecStartPre=/usr/bin/mkdir -p ${statedir}
ExecStart=/usr/bin/foo-daemon --arg1 "hello world" --statedir ${statedir}
[Install]
WantedBy=multi-user.target
su
Замена команды была объединена в Systemd в запросе тянуть # 1022:
потому что, по словам Леннарта Поеттеринга, «су - действительно сломанная концепция» .
Он объясняет, что «вы можете использовать su и sudo, как и раньше, но не ожидайте, что он будет работать в полном объеме » .
Официальный способ достижения su
подобного поведения теперь:
machinectl shell
Это было объяснено Леннартом Поеттерингом в дискуссии по вопросу № 825:
«Ну, были долгие дискуссии по этому поводу, но проблема в том, что то, что должен делать su, очень непонятно. [...] Короче говоря, su - действительно сломанная концепция. Это даст вам вид оболочки , и это хорошо, чтобы использовать это для этого, но это не полный вход в систему, и не должен быть принят за один. " - Леннарт Поэттеринг
Смотрите также:
Команды как:
больше не работает, как ожидалось . Например, nohup
это команда POSIX, чтобы убедиться, что процесс продолжает работать после выхода из сеанса. Это больше не работает на systemd. Также такие программы, как screen
и tmux
должны вызываться особым образом, иначе процессы, которые вы запускаете с ними, будут убиты (в то время как не уничтожение этих процессов обычно является основной причиной запуска screen или tmux в первую очередь).
Это не ошибка, это осознанное решение, поэтому вряд ли оно будет исправлено в будущем. Вот что Леннарт Поеттеринг сказал по этому поводу:
На мой взгляд, в UNIX было довольно странно, что по умолчанию произвольный пользовательский код оставался неограниченным после выхода из системы. Многие люди, работающие с ОС, уже давно обсуждают, что это должно быть возможно, но, конечно, не по умолчанию, но никто так и не осмелился щелкнуть переключателем, чтобы превратить его из значения по умолчанию в опцию. Не очистка пользовательских сессий после выхода из системы - это не только уродливо и несколько хакерски, но и проблема безопасности. Теперь systemd 230 наконец-то щелкнул переключателем и, наконец, по умолчанию все корректно очищает, когда пользователь выходит из системы.
Для получения дополнительной информации см .:
Таким образом, systemd работает задом наперед - в upstart-заданиях запускаются как можно быстрее, а в systemd-заданиях запускаются тогда, когда это необходимо. В конце дня обе системы могут запускать одинаковые задания в одном и том же порядке, но вы думаете об этом, глядя, так сказать, с противоположной стороны.
Вот как это объясняет Systemd для пользователей Upstart :
Модель Upstart для запуска процессов (заданий) «основана на жадных событиях», т.е. все доступные задания, события запуска которых запускаются, запускаются как можно раньше. Во время загрузки программа upstart синтезирует некоторые начальные события, такие как запуск или rcS, в качестве «корня дерева», ранние службы запускаются на них, а более поздние службы запускаются при запуске первых. Новая работа просто должна установить свой файл конфигурации в / etc / init /, чтобы стать активной.
Модель systemd для запуска процессов (модулей) основана на «отложенной зависимости», то есть модуль будет запускаться только в том случае, если от него зависит какой-либо другой начальный модуль. Во время загрузки systemd запускает «корневой модуль» (default.target, может быть переопределен в grub), который затем транзитивно расширяется и запускает свои зависимости. Новый модуль должен добавить себя в качестве зависимости модуля загрузочной последовательности (обычно multi-user.target), чтобы стать активным.
Теперь некоторые последние данные по Википедии:
(Смотрите Википедию для получения актуальной информации)
В прошлом был предложен форк Debian, чтобы избежать systemd . Devuan GNU + Linux был создан - форк Debian без Systemd (благодаря fpmurphy1 для указания его в комментариях).
Для получения дополнительной информации об этом противоречии, см .:
Как многие из вас уже могут знать, голосование по Debian Init GR, проводимое Иэном Джексоном, было бесполезным для защиты наследия Debian и его пользователей от лавины systemd.
Такая ситуация может привести к блокировке системных зависимостей, которые де-факто угрожают свободе разработки и имеют серьезные последствия для Debian, его исходных и последующих версий.
CTTE удалось поменять зависимость и выиграть время на тонкую установку systemd поверх sysvinit, но даже этот процесс был утомительным и полным драмы. В конце концов, неделю назад Ян Джексон подал в отставку. [...]
Я ухожу из Технического комитета с немедленным вступлением в силу.
Хотя важно, чтобы мнения 30-40% участников проекта, которые согласны со мной, и впредь были представлены в ТС, я сам явно слишком противоречив в этом вопросе, чтобы делать это. Я должен отойти в сторону, чтобы попытаться уменьшить степень персонализации разговоров об управлении проектом. [...]
Devuan был рожден из-за спора по поводу решения использовать Debian как систему инициализации по умолчанию. Официальная позиция Debian на Systemd полна претензий , что другие развенчали . Заинтересованные читатели могут продолжить обсуждение этой горячей темы в споре Systemd . Тем не менее, мы рекомендуем вам сохранять спокойствие и спокойный голос. В Devuan нам больше интересно программировать их неправильно, чем оглядываться назад. [...]
Некоторые веб-сайты и статьи, посвященные противоречиям в systemd, были созданы:
В Hacker News много интересных дискуссий:
Аналогичные тенденции наблюдаются и в других дистрибутивах:
Выскочка следует философии Unix DOTADIW - «Делай одно и делай хорошо». Это замена традиционного демона init. Он не делает ничего, кроме запуска и остановки служб. Другие задачи делегируются другим специализированным подсистемам.
systemd делает гораздо больше. Помимо запуска и остановки сервисов, он также управляет паролями, логинами, терминалами, управлением питанием, сбросом настроек, обработкой журналов, точками монтирования файловой системы, сетями и многим другим - смотрите файл NEWS для некоторых функций.
В соответствии с презентацией Lennart Poettering в 2014 году на GNOME.asia, озаглавленной « Перспектива для systemd« Что было достигнуто »» и «Что ждет впереди», вот основные цели systemd, области, которые уже были охвачены, и те, которые еще продолжались:
Наши цели
- Превращение Linux из пакета с битами в конкурентоспособную операционную систему общего назначения.
- Создание ОС следующего поколения в Интернете. Объединение бессмысленных различий между дистрибутивами.
Вернуть инновации в основную ОС
Рабочий стол, Сервер, Контейнер, Встроенный, Мобильный, Облако, Кластер,. , , Эти области ближе друг к другу, чем вы думаете
- Уменьшение сложности администратора, надежность без надзора
- Все самоанализ
- Автоматическое обнаружение, подключи и играй ключ
- Мы исправляем вещи там, где они сломаны, никогда не обматывая их
Что мы уже покрываем:
система инициализации, ведение журнала, управление входом в систему, управление устройством, управление временными и нестабильными файлами, регистрация двоичного формата, сохранение / восстановление подсветки, сохранение / восстановление rfkill, загрузочная диаграмма, чтение с головы, настройка зашифрованного хранилища, обнаружение раздела EFI / GPT, виртуальная машина / контейнер регистрация, управление минимальными контейнерами, управление именами хостов, управление локалями, управление временем, управление случайным начальным числом, управление переменными sysctl, управление консолью,. , ,
Над чем мы работаем:
- управление сетью
- Systemd-networkd
- Локальный кэш DNS, ответчик mDNS, ответчик LLMNR, проверка DNSSEC
- МПК в ядре
- kdbus, sd-bus
- Синхронизация времени с NTP
- Systemd-timesyncd
- Больше интеграции с контейнерами
- Песочница Сервисов
- Песочница приложений
- Формат образа ОС
- Формат изображения контейнера
- Формат изображения приложения
- GPT с авто-обнаружением
- Системы без состояния, инстанцируемые системы, сброс настроек к заводским
- / usr это ОС
- / etc - это (необязательно) конфигурация
- / var это (необязательно) состояние
- Инициализация и обновления атомарного узла
- Интеграция с облаком
- Управление услугами через узлы
- Проверяемые образы ОС
- Весь путь до прошивки
- Загрузка загрузки
Как отмечает fpmurphy1 в комментариях: «Следует отметить, что systemd за годы расширила сферу своей деятельности, намного превосходя просто запуск системы».
Я попытался включить большую часть соответствующей информации здесь. Здесь я сравниваю общие функции Upstart и systemd при использовании в качестве систем инициализации, как это было задано в вопросе, и я упоминаю только те особенности systemd, которые выходят за рамки системы init, поскольку их нельзя сравнивать с Startup, но их присутствие важно чтобы понять разницу между этими двумя проектами. Соответствующая документация должна быть проверена для получения дополнительной информации.
Более подробную информацию можно найти по адресу:
Команда LinOxide создала системную таблицу Systemd vs SysV Init Linux .
service <foo> start/stop/restart/status
все еще работает просто отлично. Как и большинство программ Unix, systemd обеспечивает совместимость команд с хорошо известными настройками по умолчанию.
И upstart, и systemd являются попытками решить некоторые проблемы с ограничениями традиционной системы инициализации SysV. Например, некоторые службы должны запускаться после других служб (например, вы не можете монтировать файловые системы NFS до тех пор, пока не будет запущена сеть), но единственный способ в SysV - это установить ссылки в каталоге rc # .d. такой, что один перед другим. Добавьте к этому, вам может понадобиться изменить нумерацию позже, когда зависимости будут добавлены или изменены. Upstart и Systemd имеют более интеллектуальные настройки для определения требований. Кроме того, существует проблема с тем, что все является своего рода сценарием оболочки, и не все пишут лучшие сценарии инициализации. Это также влияет на скорость запуска.
Некоторые из преимуществ systemd я вижу:
Я знаю один недостаток, заключающийся в том, что для использования преимуществ предварительного выделения сокетов / FH в systemd нужно будет пропатчить многие демоны, чтобы SystemH передавал им FH.
Увидел systemd
упомянутое сегодня на Arch General ML . Так что читайте об этом. H Online, как всегда, является отличным источником для технологии Linux, и я нашел свое место, чтобы начать исследование Systemd как альтернативы SysV Init и Upstart . Однако статья H Online (в данном случае) не очень полезна для чтения, реальная польза от нее в том, что она дает ссылки на полезные материалы.
Реальный ответ в объявлении systemd . Что дает некоторые важные моменты о том, что не так с SysV initd, и что нужно делать новым системам
Чтобы начать меньше.
И начать больше параллельно.
Похоже, его основной план состоит в том, чтобы запускать службы только по мере необходимости и запускать сокет для этой службы, чтобы нужная служба могла подключаться к созданному сокету задолго до того, как демон будет полностью подключен. Очевидно, сокет будет хранить небольшое количество буферизованных данных, что означает, что в течение задержки данные не будут потеряны, он будет обработан, как только демон будет в сети.
Другая часть плана, по-видимому, заключается в том, чтобы не сериализовать файловые системы, а вместо этого монтировать их по требованию, чтобы вы не ожидали монтирования своей /home/
и т. Д. (Не путать с /etc
), и / или fsck
когда вы можете стартовые демоны как /
и /var/
т. д. уже смонтированы. Он сказал, что собирается использовать autofs для этой цели.
Он также имеет целью создание .desktop
дескрипторов инициализации стиля в качестве замены для сценариев. Это предотвратит тонны медленных sh
процессов и даже больше вил процессов от таких вещей , как sed
и grep
что часто используется в сценариях оболочки.
Они также планируют не запускать некоторые службы до тех пор, пока их не попросят, и, возможно, даже отключить их, если они больше не нужны, модуль Bluetooth и демон нужны только при использовании устройства Bluetooth, например. Другой приведенный пример - демон ssh. Это то, на что способен inetd. Лично я не уверен, что мне это нравится, поскольку это может означать задержку, когда они мне нужны, а в случае с ssh я думаю, что это означает возможную уязвимость безопасности, если бы мой inetd был скомпрометирован, то была бы вся система. Однако мне сообщили, что использовать это для взлома этой системы невозможно, и если я захочу, я могу отключить эту функцию для каждой службы и другими способами.
Другой особенностью, очевидно, будет возможность запуска на основе временных событий, либо через регулярно запланированный интервал, либо в определенное время. Это похоже на то, что crond
и atd
делают сейчас. Хотя мне сказали, что он не будет поддерживать пользователя "cron". Лично это звучит как самая бессмысленная вещь. Я думаю, что это было написано / придумано людьми, которые не работают в многопользовательских средах, для пользователя cron нет особой цели, если вы единственный пользователь в системе, кроме того, что он не работает от имени пользователя root. Я работаю на многопользовательских системах ежедневно, и правило всегда заключается в запуске пользовательских сценариев от имени пользователя. Но, может быть, у меня нет предвидения, которое у них есть, и оно никоим образом не сделает так, чтобы я не мог бежать crond
или atd
, таким образом, это никому не мешало, кроме разработчиков, я полагаю.
Большой недостаток systemd заключается в том, что некоторые демоны нужно будет модифицировать, чтобы в полной мере использовать его. Они будут работать сейчас, но они будут работать лучше, если они будут написаны специально для его модели сокетов.
Похоже, что по большей части проблема людей systemd с выскочкой - это система событий, и они считают, что это не имеет смысла или не является ненужным. Возможно, их слова выразились лучше всего.
Или, проще говоря: тот факт, что пользователь только что запустил D-Bus, никоим образом не является признаком того, что NetworkManager тоже нужно запускать (но именно это и сделал бы Upstart). С другой стороны, все верно: когда пользователь запрашивает NetworkManager, это определенно указывает на то, что D-Bus также должен быть запущен (что, безусловно, ожидают большинство пользователей, верно?).
Хорошая система инициализации должна запускать только то, что нужно, и то, что по требованию. Лениво или распараллелено и заранее. Однако он не должен запускаться больше, чем необходимо, особенно не все установлено, что может использовать эту службу.
Как я уже сказал, это обсуждается гораздо более подробно в объявлении systemd .
Одна вещь, которую большинство из вас забыло, это организация процессов в cgroups .
Таким образом, если systemd что-то запустил, он поместит эту вещь в свою собственную cgroup, и нет никакого (непривилегированного) средства для выхода процесса из этой cgroup. Вот последствия этого:
Чтобы очень подробно взглянуть на systemd, начиная с первых черновиков проекта (и детальной критики существующих систем инициализации, включая upstart, и того, как systemd предлагает их исправить), перейдите на его домашнюю страницу . Со временем в LWN было опубликовано несколько статей о стартапах . Просто имейте в виду, что любое упоминание о systemd (или pulseaudio) вызывает бесконечные пламенные войны.
IMVHO (и как пользователь Fedora) я очень доволен этим. Что-то в этой линии давно пора было справиться со сложностью современных систем Linux. Некоторое время Fedora использовала upstart, но никогда не выходила за рамки того, чтобы быть изумительной заменой sysvinit, выполняя в основном неизмененные сценарии инициализации. Его обещание упрощения конфигурации загрузки происходит за счет вновьручная настройка взаимозависимостей, и это просто не работает. systemd вычисляет зависимости самостоятельно (или просто позволяет запускать вещи независимо от зависимостей, они сами разбираются). Другое большое преимущество (некоторые говорят, что это серьезный недостаток) заключается в том, что он использует специфичные для Linux функции для защиты (в частности, cgroups позволяет изолировать демона и всех его потомков, что позволяет легко отслеживать, ограничивать ресурсы или уничтожать их по мере необходимости). группа, есть много других).
Журналирование - Systemd буквально напоминает папку WinSXS, когда дело доходит до ведения журналов, она создает копии копий, если вы вручную не удалите или не уменьшите размер файла, который он будет постоянно уничтожать на вашем диске. Я называю это печенье загрузчика.