web-dev-qa-db-ja.com

Upstartとsystemdの長所/短所は何ですか?

systemd はホットな新しい init ブロック上のシステムで、 pstart と同じように数年前に表示されます。それぞれの長所と短所は何ですか?また、それぞれは他のinitシステムとどのように比較されますか?

187
tshepang

2016年アップデート

ここでの回答のほとんどは5年前​​のものなので、いくつかの更新の時間です。

Ubuntuはデフォルトでupstartを使用していましたが、systemdを支持して昨年それを放棄しました-参照:

そのため、Ubuntu wikiに素敵な記事 Systemd for Upstart Users があります-upstartとsystemdの非常に詳細な比較、およびupstartからsystemdへの移行ガイド。

buntu wikiによるとupstart-sysvをインストールしてSudo update-initramfs -uを実行することで、デフォルトで現在のバージョンのUbuntuでupstartを実行できますが、systemdプロジェクトのスコープを考慮してください実際の動作や、systemdをアンインストールできるかどうかはわかりません。)

以下の「コマンドとスクリプト」セクションの情報のほとんどは、その記事で使用されているいくつかの例を基にしています(これは、 Creative Commons Attribution-ShareAlike 3.0 License のもとでStack Exchangeユーザーコントリビューションと同様に便利にライセンスされます) 。

一般的なコマンドと単純なスクリプトの簡単な比較を以下に示します。詳細な説明については、以下のセクションをご覧ください。この回答は、質問で尋ねられたように、Upstartベースのシステムの古い動作とsystemdベースのシステムの新しい動作を比較していますが、「Upstart」とタグ付けされたコマンドは必ずしもUpstart固有ではないことに注意してください。システム化されていないすべてのLinuxおよびUnixシステムに共通です。

コマンド

Suを実行する:

  • pstart:su
  • systemd:machinectl Shell

(以下の「suコマンド置換」セクションを参照)

ランニングスクリーン:

  • pstart:screen
  • systemd:systemd-run --user --scope screen

(以下の「バックグラウンドプロセスの予期しない強制終了」セクションを参照)

Tmuxの実行:

  • pstart:tmux
  • systemd:systemd-run --user --scope tmux

(以下の「バックグラウンドプロセスの予期しない強制終了」セクションを参照)

ジョブfooの開始:

  • pstart:start foo
  • systemd:systemctl start foo

ジョブfooを停止しています:

  • pstart:stop foo
  • systemd:systemctl stop foo

ジョブfooの再開:

  • pstart:restart foo
  • systemd:systemctl restart foo

ジョブのリスト:

  • pstart:initctl list
  • systemd:systemctl status

ジョブfooの構成を確認しています:

  • pstart:init-checkconf /etc/init/foo.conf
  • systemd:systemd-analyze verify /lib/systemd/system/foo.service

ジョブの環境変数のリスト:

  • pstart:initctl list-env
  • systemd:systemctl show-environment

ジョブの環境変数を設定します。

  • pstart:initctl set-env foo=bar
  • systemd:systemctl set-environment foo=bar

ジョブの環境変数を削除しています:

  • pstart:initctl unset-env foo
  • systemd: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

スクリプト

pstart script/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コマンドの置換

suコマンドの置き換えは、プルリクエスト#1022でsystemdにマージされました。

lennart Poetteringによれば、 "suは本当に壊れた概念" だからです。

彼は "以前と同じようにsuとSudoを使用できますが、-完全に機能することを期待しないでください" と説明しています。

suのような動作を実現する公式の方法は次のとおりです。

machinectl Shell

#825を発行するためのディスカッションでは、さらに Lennart Poetteringによって説明されています です。

「まあ、これについて長い議論がありましたが、問題はsuが何をすることになっているのかが非常に不明確であるということです。[...]短い話:suは本当に壊れた概念です。それは一種のシェルを与えるでしょう、それを使用することは問題ありませんが、完全なログインではないため、間違えてはいけません。」 -Lennart Poettering

以下も参照してください。

バックグラウンドプロセスの予期しない強制終了

次のようなコマンド:

期待どおりに機能しなくなりました。たとえば、Nohupは、セッションからログアウトした後もプロセスが引き続き実行されるようにするPOSIXコマンドです。 機能しなくなりました systemdで。また、screentmuxのようなプログラムは、特別な方法などで呼び出す必要があります これらを使用して実行するプロセスは強制終了されます (これらのプロセスは強制終了されません)通常、最初に画面またはtmuxを実行する主な理由です)。

これは間違いではなく、意図的な決定であるため、将来修正される可能性はほとんどありません。これがLennart Poetteringです この問題について この問題について:

私の見解では、実際にはUNIXのかなり奇妙なことでした。デフォルトでは、ログアウト後、任意のユーザーコードが無制限にとどまることができました。これは多くのOSの人々の間で古くから議論されてきましたが、これは可能であるはずですが、デフォルトではないはずですが、スイッチをデフォルトからオプションに切り替えることは誰もしませんでした。ログアウト後にユーザーセッションをクリーンアップしないことは、醜くてややハックであるだけでなく、セキュリティの問題でもあります。 systemd 230は、ようやくスイッチを切り替え、デフォルトでは、ユーザーがログアウトしたときにデフォルトですべてを正しくクリーンアップします。

詳細については、以下を参照してください。

高度なスタートアップのコンセプト

ある方法でsystemdは逆方向に動作します-upstartジョブでは可能な限り早く開始し、systemdジョブでは必要なときに開始します。結局のところ、同じジョブを両方のシステムでほぼ同じ順序で開始できますが、いわば反対の方向から見ていると考えます。

これが Systemd for Upstart Users が説明する方法です。

pstartプロセス(ジョブ)を開始するためのモデルは「貪欲なイベントベース」です。 e。起動イベントが発生する使用可能なすべてのジョブは、できるだけ早く開始されます。起動中、upstartは、startupやrcSなどのいくつかの初期イベントを「ツリールート」として合成し、初期のサービスはそれらで開始され、後のサービスは前者の実行時に開始されます。新しいジョブは、構成ファイルを/ etc/init /にインストールしてアクティブにするだけです。

systemdプロセス(ユニット)を開始するためのモデルは「遅延依存関係ベース」です。 e。ユニットは、他の開始ユニットがそれに依存している場合にのみ開始します。ブート中に、systemdは「ルートユニット」(default.target、grubでオーバーライドできる)を開始します。これにより、依存関係が一時的に拡張され、開始されます。新しいユニットは、アクティブになるために、ブートシーケンスのユニット(通常はmulti-user.target)の依存関係としてそれ自体を追加する必要があります。

ディストリビューションでの使用

ウィキペディアによると最近のいくつかのデータ:

デフォルトでupstartを使用するディストリビューション:

デフォルトでsystemdを使用するディストリビューション:

(最新情報については Wikipedia を参照してください)

Upstartもsystemdも使用しないディストリビューション:

論争

過去 systemdを回避するためにDebianのフォークが提案されましたDevuan GNU + Linux が作成されました-systemdなしのDebianのフォーク(コメントで指摘してくれた fpmurphy1 に感謝します)。

この論争の詳細については、以下を参照してください。

ご存じの方も多いと思いますが、Ian Jacksonが推進したInit GR Debian投票は、Debianの遺産とそのユーザーをsystemdの雪崩から保護するのに役立ちませんでした。

この状況は、事実上開発の自由を脅かしており、Debian、その上流および下流に深刻な結果をもたらすsystemd依存関係のロックを予測しています。

CTTEは、依存関係を交換して、sysvinitを介したsystemdの微妙なインストールで時間を稼ぐことができましたが、このプロセスでさえ、疲れ果ててドラマチックでした。最終的に、1週間前に、イアンジャクソンは辞任しました。 [...]

私はすぐに技術委員会を辞任します。

私に同意するプロジェクトの30〜40%の見解が引き続きTCに表示されることが重要ですが、私自身は、現時点では明らかに議論の余地があるため、そうすることはできません。私は、プロジェクトのガバナンスに関する会話がパーソナライズされる範囲を減らすように努める必要があります。 [...]

Devuanは、Debianのデフォルトのinitシステムとして使用する決定についての論争から生まれました。 systemdでのDebianの公式ポジション は、 他の人々が暴力を振るった の主張に満ちています。興味のある読者は、このホットなトピックについて systemdの論争 で議論を続けることができます。ただし、頭を冷やし、声を市民に保つことをお勧めします。デブアンでは、振り返るよりも間違ったプログラミングをすることに関心があります。 [...]

Systemdの論争に特化したいくつかのWebサイトと記事が作成されました。

Hacker Newsにはたくさんの興味深い議論があります:

他のディストリビューションでも同様の傾向が見られます:

哲学

pstartは、DOTADIWのUnix哲学「1つのことを実行し、それをうまく実行する」に従います。これは、従来のinitデーモンに置き換わるものです。サービスの開始と停止以外は何もしません。他のタスクは、他の特殊なサブシステムに委任されます。

systemdはそれだけではありません。サービスの開始と停止に加えて、パスワード、ログイン、端末、電源管理、工場出荷時のリセット、ログ処理、ファイルシステムマウントポイント、ネットワークなどを管理します。 [〜#〜]ニュース[〜# 〜] 一部の機能のファイル。

拡張計画

systemdの展望Perspective for systemd What has beeneveives hased and What Lies Ahead 2014年のGNOME.asiaでのLennart Poetteringによるプレゼンテーションによると、systemdの主な目的、すでに取り上げられた分野、およびまだ進行中:

systemdの目的:

私たちの目的

  • Linuxをビットバッグから競争力のある汎用オペレーティングシステムに変えます。
  • インターネットの次世代OSの構築ディストリビューション間の無意味な違いを統合する
  • イノベーションをコアOSに戻す

  • デスクトップ、サーバー、コンテナ、組み込み、モバイル、クラウド、クラスター、 。 。これらの領域は、あなたが考えているよりも接近している

  • 管理者の複雑さ、信頼性を監督なしで軽減
  • 内省可能なすべて
  • 自動検出、プラグアンドプレイが鍵
  • 壊れた部分は修正します。テープで固定することはありません

すでにカバーされているエリア:

すでにカバーしていること:

initシステム、ジャーナルロギング、ログイン管理、デバイス管理、一時ファイルおよび揮発性ファイルの管理、バイナリ形式の登録、バックライトの保存/復元、rfkillの保存/復元、ブートチャート、先読み、暗号化されたストレージのセットアップ、EFI/GPTパーティションの検出、仮想マシン/コンテナー登録、最小限のコンテナ管理、ホスト名管理、ロケール管理、時間管理、ランダムシード管理、sysctl変数管理、コンソール管理、 。 。

進行中の作業:

現在取り組んでいること:

  • ネットワーク管理
  • systemd-networkd
  • ローカルDNSキャッシュ、mDNSレスポンダー、LLMNRレスポンダー、DNSSEC検証
  • カーネルのIPC
  • kdbus、sd-bus
  • NTPとの時刻同期
  • systemd-timesyncd
  • コンテナーとの統合を強化
  • サービスのサンドボックス化
  • アプリのサンドボックス
  • OSイメージ形式
  • コンテナイメージ形式
  • アプリ画像フォーマット
  • 自動検出付きのGPT
  • ステートレスシステム、インスタンス化可能なシステム、出荷時設定へのリセット
  • / usrはOSです
  • / etcは(オプションの)構成です
  • / varは(オプションの)状態です
  • 原子ノードの初期化と更新
  • クラウドとの統合
  • ノード間のサービス管理
  • 検証可能なOSイメージ
  • ファームウェアまで
  • ブートローディング

この回答の範囲

fpmurphy1 がコメントに記載されているように、「systemdは長年にわたって、単にシステムの起動の範囲をはるかに超えて、その作業範囲を拡大したことを指摘しておく必要があります。」

ここに関連情報のほとんどを含めようとしました。ここでは、質問で尋ねられたように、initstartシステムとして使用した場合のUpstartとsystemdの共通機能を比較しています。また、startupと比較できないためinitシステムの範囲を超えるsystemdの機能についてのみ言及しますが、それらの存在は重要ですこれら2つのプロジェクトの違いを理解します。詳細については、関連ドキュメントを確認してください。

より詳しい情報

より多くの情報はで見つけることができます:

エクストラ

LinOxide チームは Systemd vs SysV Init Linux Cheatsheet を作成しました。

92
rsp

Upstartとsystemdはどちらも、従来のSysV initシステムの制限に関する問題のいくつかを解決するための試みです。たとえば、一部のサービスは他のサービスの後に開始する必要があります(たとえば、ネットワークが実行されるまでNFSファイルシステムをマウントできません)が、SysVでこれを処理する唯一の方法は、rc#.dディレクトリにリンクを設定することです一方が他方の前になるように。さらに、依存関係が追加または変更されたときに、後ですべての番号を付け直す必要がある場合があります。 UpstartとSystemdには、要件を定義するためのよりインテリジェントな設定があります。また、すべてが何らかのシェルスクリプトであり、誰もが最高のinitスクリプトを作成するわけではないという事実にも問題があります。これは、起動の速度にも影響します。

私が見ることができるsystemdの利点のいくつか:

  • 開始されたすべてのプロセスは、独自のcgroupまたは特定のcgroupを取得します。
  • Xinetdがそのサービスに対して行う方法と同様に、サービスのソケットとファイルハンドルの事前作成により、依存サービスをより速く開始できます。たとえば、systemdは、syslogの/ dev/logのファイルハンドルを開いたままにし、/ dev/logに送信する後続のサービスは、syslogdが引き継ぐ準備ができるまでメッセージをバッファーします。
  • 実際にサービスを開始するために実行されるプロセスが少なくなります。これは、サービスを起動するためのシェルスクリプトを記述していないことを意味します。これは速度の改善であり、(IMO)そもそも簡単に設定できるものです。

私が知っている1つの欠点は、systemdのソケット/ FHの事前割り当てを利用するには、systemdからFHが渡されるように多くのデーモンにパッチを適用する必要があることです。

68
jsbillings

Arch General ML について本日言及したsystemdを見た。それを読んでください。 The H Online 相変わらずLinuxテクノロジーの優れた情報源であり、研究を開始する場所を見つけた場所です Systemd as SysV Init and Upstart Alternative 。ただし、H Onlineの記事(この場合)はあまり役に立ちませんが、その背後にある実際の用途は、役立つ読みへのリンクを提供することです。

本当の答えは systemdのアナウンス にあります。これは、SysV initdの何が問題で、新しいシステムが何をする必要があるかについて、いくつかの重要なポイントを与えます。

  • 少ないスタートから。
  • さらに並行して開始します。

これを行う主な計画は、必要なときにだけサービスを開始し、そのサービスのソケットを開始して、デーモンが完全にオンラインになるずっと前に、必要なサービスが作成されたソケットに接続できるようにすることです。どうやら、ソケットはバッファされた少量のデータを保持することを意味します。つまり、遅延中にデータが失われることはなく、デーモンがオンラインになるとすぐに処理されます。

計画の別の部分は、ファイルシステムをシリアル化しないことですが、代わりにオンデマンドでそれらをマウントし、/home/などを待たないようにします(/etcと混同しないでください)。 //var/などがすでにマウントされているので、デーモンを起動する可能性がある場合は、マウントするか、fsckを実行します。この目的のためにautofsを使用するつもりだったと述べています。

また、.desktopスタイルのinit記述子をスクリプトの代わりとして作成することも目的としています。これにより、シェルスクリプトでよく使用されるshsedなどからの、大量の遅いgrepプロセスや、さらに多くのプロセスフォークが防止されます。

彼らはまた、要求されるまでいくつかのサービスを開始しないことを計画し、おそらく不要になった場合はサービスを停止することさえします。たとえば、Bluetoothデバイスとデーモンは、たとえばBluetoothデバイスを使用している場合にのみ必要です。もう1つの例は、sshデーモンです。これは、inetdで可能なことです。個人的に私はこれが好きかどうか確信がありません。必要なときにレイテンシを意味する可能性があるためです。また、sshの場合、システム全体が侵害された場合にセキュリティの脆弱性が存在する可能性があることを意味すると思います。ただし、これを使用してこのシステムに違反することは不可能であり、必要に応じて、サービスごとに、または他の方法でこの機能を無効にできることを知っています。

別の機能は明らかに、定期的にスケジュールされた間隔または特定の時間のいずれかで、タイムイベントに基づいて開始する機能になるでしょう。これは、crondatdが現在行っていることと似ています。私はそれがユーザー「cron」をサポートしないと言われましたが。個人的にこれは最も無意味なことのように聞こえます。これはマルチユーザー環境で作業しない人によって書かれた/考えられたと思います。システムで唯一のユーザーである場合、rootとして実行しないこと以外にcronを使用する目的はあまりありません。私は毎日マルチユーザーシステムで作業しており、ルールは常にユーザーとしてユーザースクリプトを実行します。しかし、私は彼らが行う先見力を持っていないかもしれません、そしてそれは決して私がcrondまたはatdを実行できないようにすることはありません。私が思う開発者。

Systemdの大きな欠点は、一部のデーモンを最大限に活用するために変更する必要があることです。現在は機能しますが、ソケットモデル用に特別に作成されている場合は、より適切に機能します。

Systemdの人々の新興企業の問題の大部分はイベントシステムであり、彼らはそれが意味をなさない、または不必要であると信じているようです。おそらく彼らの言葉がそれを最もよく表すでしょう。

または、もっと簡単に言うと、ユーザーがD-Busを開始したばかりという事実は、NetworkManagerも開始する必要があることを示すものでは決してありません(ただし、これはUpstartが行うことです)。それは逆です。ユーザーがNetworkManagerを要求した場合、それは間違いなくD-Busも開始する必要があることを示しています(これは、ほとんどのユーザーが期待していることですよね?)。
優れた初期化システムは、必要なものとそのオンデマンドのみを開始する必要があります。遅延または並列化して事前に。ただし、必要以上に起動しないでください。特に、そのサービスを使用する可能性のあるすべてのインストール済み環境が起動するわけではありません。

すでに述べたように、これは systemdのアナウンス でより包括的に説明されています。

29
xenoterracide

まあ、あなたのほとんどが忘れてしまったことの1つは、プロセスの編成 cgroups です。

そのため、systemdが何かを開始した場合、それはそれを独自のcgroupに配置し、プロセスがそのcgroupをエスケープする(権限のない)手段はありません。その結果は次のとおりです。

  • 多くのユーザーがいる大規模なシステムの管理者は、悪意のあるユーザー/プロセスを識別する新しい効率的な方法を持っています。
  • "Wonder autocgroup patch" により、CPUスケジューリングの優先順位をより適切に決定できます。
11
enaut

Systemdの詳細については、最初の設計ドラフト(およびupstartを含む既存のinitシステムの詳細な批評、およびsystemdがそれらを修正する方法を提案)から始めて、その ホームページ にアクセスしてください。時間の経過とともに、スタートアップに関するいくつかの記事が [〜#〜] lwn [〜#〜] で公開されています。 systemd(またはpulseaudio)について言及すると、いつまでも続くフレームウォーが発生することに注意してください。

IMVHO(およびFedoraユーザーとして)私はvery満足しています。この行の何かは、現在のLinuxシステムの複雑さを処理するために長い間遅れていました。 Fedoraはしばらくの間upstartを使用しましたが、ほとんど変更されていないinitスクリプトを実行して、sysvinitのファンシーな置き換えの段階から抜け出すことはできませんでした。ブート設定を単純化するという約束は、再び相互依存関係を手動で設定することを犠牲にしていますが、それだけでは機能しません。 systemdの図は、それ自体が依存します(または、依存関係に関係なく開始することを許可するだけで、それらは自動的に分類されます)。別の大きな利点(深刻な欠点であると言う人もいます)は、Linux固有の機能を活用することです(特にcgroupsは、デーモンとそのすべての子孫を分離できるため、リソースの監視、制限、または強制終了が簡単です)グループ;他にもたくさんあります)。

8
vonbrand

ジャーナリング-Systemdは、文字列の記録に関しては文字通りWinSXSフォルダーに似ています。手動で削除したり、ドライブで食べ続けるファイルサイズを縮小しない限り、コピーのコピーを作成します。私はそれをブートローダークッキーと呼びます。

3
Bert