回答:
ここでの回答のほとんどは5年前のものなので、いくつかの更新の時間です。
Ubuntuはデフォルトでupstartを使用していましたが、昨年systemdを支持して放棄しました-参照:
そのため、Ubuntu wikiにUpstartユーザー向けのSystemdという素晴らしい記事があります-upstartとsystemdの非常に詳細な比較とupstartからsystemdへの移行ガイド。
(Ubuntu wikiによれば、インストールしupstart-sysv
て実行することで、デフォルトで現在のバージョンのUbuntuでまだupstartを実行できますがsudo update-initramfs -u
、systemdプロジェクトの範囲を考慮すると、実際にどのように動作するか、systemdがアンインストール可能。)
以下の「コマンドとスクリプト」セクションの情報のほとんどは、その記事で使用されているいくつかの例から適合しています(これは、Creative Commons Attribution-ShareAlike 3.0 Licenseの Stack Exchangeユーザーコントリビューションと同様にライセンスされています)。
一般的なコマンドと簡単なスクリプトの簡単な比較を次に示します。詳細な説明については、以下のセクションを参照してください。この回答は、質問にあるように、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
コマンド置換は、プルリクエスト#1022にsystemdにマージされました:
Lennart Poetteringによれば、「suは本当に壊れた概念だ」からです。
彼がいることを説明して、「あなたは以前のようにsuとsudoを使用することができますが、それは完全な形で動作することを期待していません」。
su
-like動作を実現する公式の方法は次のとおりです。
machinectl shell
レナート・ポエタリング は、#825の議論でさらに説明しています 。
「まあ、これについては長い議論がありましたが、問題はsuが何をすべきかが非常に不明確であるということです。 、そしてそのためにそれを使用することは問題ありませんが、それは完全なログインではなく、1つと間違われるべきではありません。」-レナート・ポタリング
こちらもご覧ください:
次のようなコマンド:
期待どおりに動作しなくなりました。たとえばnohup
、セッションからログアウトした後にプロセスが実行し続けることを確認するPOSIXコマンドです。それはもはや機能していないにsystemdに。また、のようなプログラムscreen
とは、tmux
特別な方法で呼び出されるか、そうでなければ必要があるあなたがそれらを実行するプロセスが殺されます(最初の場所での画面やtmuxのを実行しているの主な理由は、通常は殺され、それらのプロセスを取得していない間)。
これは間違いではなく、意図的な決定であるため、将来修正される可能性はありません。これが、レナート・ポエタリングがこの問題について言ったことです。
私の見解では、ログアウト後にデフォルトで任意のユーザーコードが制限されないままでいるということは、実際のところUNIXではかなり奇妙でした。これは多くのOSの人々の間で長い間議論されてきましたが、これは可能ですが、確かにデフォルトではありませんが、これまでスイッチを切り替えてデフォルトからオプションに切り替えることを誰も敢えてしませんでした。ログアウト後にユーザーセッションをクリーンアップしないことは、見苦しくてややハッキングされているだけでなく、セキュリティ上の問題でもあります。 systemd 230は最終的にスイッチを切り替え、最終的にユーザーがログアウトしたときにすべてを正しくクリーンアップします。
詳細については、以下をご覧ください。
ある意味では、systemdは逆方向に動作します-upstartジョブではできるだけ早く開始し、systemdジョブでは必要なときに開始します。結局のところ、両方のシステムでほぼ同じ順序で同じジョブを開始できますが、いわば反対方向から見ていると考えます。
ここではどのように成り上がりユーザーのためにsystemdはそれを説明します:
Upstartのプロセス(ジョブ)を開始するためのモデルは「貪欲なイベントベース」です。つまり、起動イベントが発生するすべての利用可能なジョブができるだけ早く開始されます。起動中に、upstartは、startupやrcSなどの初期イベントを「ツリールート」として合成し、それらで初期サービスが開始し、前者が実行されると後のサービスが開始します。新しいジョブは、構成ファイルを/ etc / init /にインストールするだけでアクティブになります。
systemdのプロセス(ユニット)を起動するモデルは「遅延依存ベース」です。つまり、ユニットは、他の起動ユニットがそれに依存している場合にのみ起動します。ブート中に、systemdは「ルートユニット」(default.target、grubでオーバーライド可能)を開始し、その後、一時的に展開して依存関係を開始します。新しいユニットは、アクティブになるために、ブートシーケンスのユニット(通常はmulti-user.target)の依存関係として自分自身を追加する必要があります。
ウィキペディアによると、最近のいくつかのデータ:
(最新情報については、ウィキペディアを参照してください)
過去に、systemdを避けるためにDebianのフォークが提案されました。Devuan GNU + Linuxが作成されました-にsystemdなしのDebianのフォーク(おかげでするfpmurphy1コメントでそれを指摘するために)。
この論争の詳細については、以下を参照してください。
既にご存知のように、Ian Jacksonが推進したInit GR Debian投票は、Debianの遺産とそのユーザーをsystemdなだれから保護するのに役立ちませんでした。
この状況は、開発の自由を事実上脅かし、Debian、その上流および下流に深刻な結果をもたらすsystemd依存関係のロックを予想しています。
CTTEは依存関係を交換し、sysvinitを介したsystemdの微妙なインストールに時間を費やすことができましたが、このプロセスでさえ疲れ果て、ドラマでいっぱいでした。最終的に、一週間前、イアン・ジャクソンは辞任した。[...]
私はすぐに技術委員会を辞任します。
私の意見に賛同するプロジェクトの30〜40%の意見が引き続きTCに掲載されることが重要ですが、私自身はこの点で明らかに物議を醸しすぎてそうはなりません。プロジェクトのガバナンスに関する会話がパーソナライズされる程度を減らすために、私は脇に出るべきです。[...]
Devuanは、Debianのデフォルトの初期化システムとして使用する決定についての論争から生まれました。systemdでの公式のDebianの立場は、他の人が暴かれたという主張でいっぱいです。興味のある読者は、systemd論争でこのホットなトピックについて議論し続けることができます。ただし、頭を冷静に保ち、声を冷静に保つことをお勧めします。Devuanでは、振り返るよりも間違ったプログラミングに興味があります。[...]
systemdの論争に特化したいくつかのWebサイトと記事が作成されました。
ハッカーニュースに関する興味深い議論がたくさんあります。
他のディストリビューションでも同様の傾向が見られます。
upstartは、DOTADIWのUnixの哲学、「Do One Thing and Do It Well」に従っています。これは、従来のinitデーモンに代わるものです。サービスの開始と停止以外には何もしません。他のタスクは、他の特殊なサブシステムに委任されます。
systemdはそれ以上のことを行います。サービスの開始と停止に加えて、パスワード、ログイン、端末、電源管理、工場出荷時設定へのリセット、ログ処理、ファイルシステムマウントポイント、ネットワークなどを管理します。一部の機能については、NEWSファイルを参照してください。
よる達成し、何が待ち受けているされているものにsystemdのための展望 GNOME.asiaで2014年にレナート・ポエッタリングによるプレゼンテーションを、ここに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には、これまでのシステム起動の単にそれを超えて年間の仕事のその範囲を拡大していることを指摘すべきです。」
ここに関連情報のほとんどを含めようとしました。ここでは、質問で尋ねられているように、initシステムとして使用されるUpstartとsystemdの一般的な機能を比較しています。また、initdシステムの範囲を超えるsystemdの機能についてのみ言及しています。これら2つのプロジェクトの違いを理解するため。詳細については、関連するドキュメントを確認してください。
詳細については、次を参照してください。
LinOxideチームは、作成したSysVの初期のLinux早見対にsystemdを。
service <foo> start/stop/restart/status
引き続き正常に動作します。ほとんどのUNIXソフトウェアと同様に、systemdは、よく知られているデフォルトとのコマンド互換性を提供します。
upstartとsystemdはどちらも、従来のSysV initシステムの制限に関する問題のいくつかを解決しようとする試みです。たとえば、一部のサービスは他のサービスの後に開始する必要があります(たとえば、ネットワークが実行されるまでNFSファイルシステムをマウントできません)が、SysVでそれを処理する唯一の方法はrc#.dディレクトリにリンクを設定することですこのように、一方が他方より先になります。それに加えて、依存関係が追加または変更されたときに、すべての番号を付け直す必要があるかもしれません。UpstartとSystemdには、要件を定義するためのよりインテリジェントな設定があります。また、すべてがなんらかのシェルスクリプトであり、誰もが最高のinitスクリプトを作成するわけではないという問題もあります。また、起動の速度にも影響します。
systemdのいくつかの利点は次のとおりです。
私が知っている欠点の1つは、systemdのソケット/ FH事前割り当てを利用するには、systemdによってFHが渡されるように多くのデーモンにパッチを適用する必要があることです。
Saw systemd
は今日Arch General MLで言及しました。読んでください。H Onlineは相変わらずLinuxテクノロジーの優れた情報源であり、SystemdをSysV InitおよびUpstartの代替として研究し始める私の場所を見つけました。ただし、H Onlineの記事(この場合)はあまり有用ではありません。その背後にある実際の用途は、有用な読み取りへのリンクを提供することです。
本当の答えはsystemdの発表にあります。これは、SysV initdの何が問題なのか、新しいシステムが何をする必要があるのかについてのいくつかの重要なポイントを提供します
少ないスタート。
さらに並行して開始します。
これを行う主な計画は、必要なときにだけサービスを開始し、そのサービスのソケットを開始して、デーモンが完全にオンラインになるずっと前に作成されたソケットに接続できるようにすることです。どうやらソケットは少量のバッファリングされたデータを保持するようです。つまり、遅延中にデータが失われることはなく、デーモンがオンラインになるとすぐに処理されます。
計画の別の部分は、あなたがあなたを待っているしていない、そのようなファイルシステムをシリアライズ、代わりにもオンデマンドでそれらをマウントしないためにあると思われる/home/
、など(と混同しないように/etc
マウントするために)、および/またはfsck
あなたができた場合/
and /var/
などの起動デーモンはすでにマウントされています。このためにautofsを使用する予定であると述べました。
また.desktop
、スクリプトの代替としてスタイルinit記述子を作成するという目標もあります。これは遅いのトン防ぐことができますsh
のようなものから、プロセスの過程、さらにフォークをsed
し、grep
それは多くの場合、シェルスクリプトで使用されています。
また、彼らは要求されるまで一部のサービスを開始しないことを計画しており、おそらく不要になった場合はシャットダウンすることさえあります。例えば、bluetoothデバイスやデーモンは、bluetoothデバイスを使用している場合にのみ必要です。別の例として、sshデーモンがあります。これは、inetdで可能なことです。個人的に私はこれが好きなのかどうかわかりません、それは必要なときにレイテンシーを意味するかもしれないし、sshの場合、私のinetdが危うくなった場合、システム全体が危険にさらされる可能性があることを意味すると思います。ただし、これを使用してこのシステムを侵害することは実行不可能であり、必要に応じてサービスごとに他の方法でこの機能を無効にできることを知りました。
別の機能は明らかに、定期的にスケジュールされた間隔または特定の時間のいずれかで、時間イベントに基づいて開始する機能です。これはcrond
、atd
今や何に似ています。私はユーザー「cron」をサポートしないと言われましたが。個人的には、これは最も意味のないことのように聞こえます。これはマルチユーザー環境で働いていない人によって書かれた/考えられたと思います。あなたがシステム上で唯一のユーザーである場合、rootとして実行していないことを除いてcronを使用する目的はあまりありません。私は毎日マルチユーザーシステムで作業しており、ルールは常にユーザーとしてユーザースクリプトを実行します。しかし、多分私は彼らが先見の明を持っていない、と私は実行できないように、それは決してそれを作るだろうcrond
かatd
、それは誰を傷つけることはありませんが、開発者が、私は考えます。
systemdの大きな欠点は、いくつかのデーモンを十分に活用するために変更する必要があることです。それらは今は動作しますが、そのソケットモデル用に特別に書かれていればより良く動作します。
systemdの新興企業の問題の大部分はイベントシステムであり、彼らはそれが意味をなさないか不要であると信じているようです。おそらく彼らの言葉が最高だろう。
または、もっと簡単に言うと、ユーザーがD-Busを開始したばかりであるという事実は、NetworkManagerも開始する必要があることを示すものではありません(しかし、これはUpstartが行うことです)。逆に言うと、ユーザーがNetworkManagerを要求した場合、これは間違いなくD-Busを起動する必要があることを示しています(これは、ほとんどのユーザーが期待するとおりです)。
優れたinitシステムは、必要なものだけを開始し、オンデマンドで開始する必要があります。遅延的または並列化され、事前に。ただし、必要以上に起動することはできません。特に、そのサービスを使用できるすべてがインストールされているわけではありません。
よく忘れてしまったことの1つは、cgroupのプロセスの編成です。
したがって、systemdが何かを開始した場合、このことは独自のcgroupに入れられ、プロセスがそのcgroupをエスケープする(非特権)手段はありません。その結果は次のとおりです。
最初の設計ドラフトから始まるsystemdの非常に詳細な外観(およびupstartを含む既存のinitシステムの詳細な批評、およびsystemdによる修正方法の提案)については、ホームページにアクセスしてください。時間の経過とともに、スタートアップに関するいくつかの記事がLWNで公開されました。systemd(またはpulseaudio)に言及すると、終わりのない火炎戦争が引き起こされることに注意してください。
IMVHO(そしてFedoraユーザーとして)私はそれにとても満足しています。この行の一部は、現在のLinuxシステムの複雑さを処理するために長い間遅れていました。Fedoraはしばらくの間upstartを使用していましたが、sysvinitの派手な代替品の段階から抜け出すことはなく、ほとんど変更されていないinitスクリプトを実行していました。ブート構成を簡素化するという約束には、次のコストがかかります。再び相互依存関係を手動で設定すると、それは機能しません。systemdの数字はそれ自体で依存関係を解決します(または、依存関係に関係なく開始することを許可するだけで、それらは自動的に整理されます)。別の大きな利点(深刻な欠点であると言う人もいます)は、Linux固有の機能を柄に活用することです(特にcgroupsはデーモンとそのすべての子孫を分離できるため、監視、リソースの制限、または次のようにそれらを強制終了できます)グループ;他にもたくさんあります)。
ジャーナリング-Systemdは文字通りWinSXSフォルダーに似ており、手動で削除したり、ドライブで食べ続けるファイルサイズを縮小しない限り、コピーのコピーを作成します。ブートローダーCookieと呼びます。