システムがSysV、Upstart、またはSystemd initsystemを使用しているかどうかを確認する方法

システムがSysV、Upstart、またはSystemd initsystemを使用しているかどうかを確認する方法

どのinitsystemが使用されているかを簡単に知る方法はありますか(たとえば、最も近いシステムDebian wheezyまたはFedoraシステム)。私はそれがinitsystemをFedora 21使用していることを知っていますが、systemdそれについて読んですべての関連スクリプト/symlinkが/etc/systemd/Debian squeezeCentOS 6 or 7

そのようなinitsystemを検証するためにどのような技術がありますか?

答え1

init プロセスには常に PID 1 が割り当てられます。/procファイルシステムは、PIDが指定された実行可能ファイルへのパスを取得する方法を提供します。

言い換えれば:

nathan@nathan-desktop:~$ sudo stat /proc/1/exe
  File: '/proc/1/exe' -> '/sbin/upstart'

ご覧のとおり、私のUbuntu 14.10システムのinitプロセスはUpstartです。 Ubuntu 15.04はsystemdを使用しているため、このコマンドを実行すると次のようになります。

nathan@nathan-gnome:~$ sudo stat /proc/1/exe
  File: '/proc/1/exe' -> '/lib/systemd/systemd'

システムから/sbin/init結果が出たら、ファイルの数を数えます。

nathan@nathan-gnome:~$ sudo stat /proc/1/exe
  File: '/proc/1/exe' -> '/sbin/init'
nathan@nathan-gnome:~$ stat /sbin/init
  File: ‘/sbin/init’ -> ‘/lib/systemd/systemd’

また、これを実行して詳細を確認することもできます。

[user@centos ~]$ /sbin/init --version
init (upstart 0.6.5)
Copyright (C) 2010 Canonical Ltd.

答え2

システムをナビゲートして指標を見つけることができます。 1つの方法は、3つのディレクトリがあることを確認することです。

  • /usr/lib/systemdsystemd ベースのシステムを使用していることを伝えます。

  • /usr/share/upstartこれはUpstartベースのシステムを使用していることを示す良い指標です。

  • /etc/init.dボックスの履歴にSysV initがあることを知らせます。

問題は、これがヒューリスティックなので、特定の指標を別々に考慮するのではなく、他のデータと一緒に考慮する必要があることです。今見ているUbuntu 14.10ボックスには3つのディレクトリがすべて含まれています。なぜ? UbuntuはこのバージョンからUpstartからsystemdに切り替えましたが、以前のバージョンとの互換性のためにUpstartとSysV initを維持するためです。

結局のところ、最高の答えは「経験」だと思います。 CentOS 7システムにログインしてシステム化されていることがわかります。これをどのように学びますか?再生、RTFMingなどの経験値はすべて同じ方法で取得されます。

私はこれが非常に満足のいく答えではないことを知っていますが、市場が分裂して非標準的なデザインを生成するときに起こります。これは、カラー出力をls許可する-Cかどうかをどのように知ることができるかを尋ねるのと同じです。--colorやはり答えは「経験」だ。

答え3

実際、これはかなり難しい質問です。最大の課題の1つは、人々がこれを行うことを望む最も一般的な場所が、人々が物を設置または変更する可能性が最も高い場所であることです。もう一つは微妙ですが、非常に重要な違いがあるということです。インストールされたシステム管理ツールセット現在実行中のシステム管理ツールセット次回起動時に実行されるシステム管理ツールのセット

もちろん、パッケージマネージャを使用してインストールする項目を決定できます。ただし、複数のシステムを並べてインストールできるため、状況が複雑になります。

たとえば、Debian Linux では以下をインストールできます。システムパッケージとして提供されますが、別途インストールsystemd-sysvアクティブシステム用のパッケージにします。その目的が体系化されており、システムベネットパッケージを同時にインストールできます。実際、Debian Linux コミュニティはすでに Debian 8 から別の名前 ( /lib/sysvinit/init, /lib/systemd/systemd, /sbin/runit-init, /sbin/minit,/sbin/system-managerなど) を持つ各プログラムに移動するアクションを取っており、このため「非アクティブ」パッケージは Debian 8 で競合しません。名前/sbin/init/sbin/initその後、次回の起動時に実行するように「Activation Package」で設定されたエントリへのシンボリックリンクがあります。

現在実行中の項目を決定し、次のプログラム実行の準備は、さまざまなレベルの誤検出リスクとさまざまなレベルの文書化を通じて、一連のツールセット固有のテストでのみ実行できます。具体的には、現在どのSystem Managerが実行されているかを確認するには、プロセスリストまたはSystem Managerが公開したさまざまなAPIを調べる必要があります。しかし、罠がまったくないわけではありません。

一般的に購入しない

確かに起こる日から始めましょういいえ働く

  • /proc/1/exe/sbin/initupstartまたはシステム5がinit実行されているときに同じコンテンツを指します。一部のシステムでは、/sbin/initsystemdが実行されている場合も同様です。

    前述のように、Debian Linux 群衆はすべてのプログラムが異なる名前を持つことを望んでいます。しかし、これはDebianに限定されています。遠く一般から来て、プログラムが呼び出されたときに/sbin/init実際には役に立ちません(ブートローダのinitramfsステップを介して)。 Felix von Leitnerのminitだけが実際にDebian 8にパッケージされており、独自の名前で呼び出されます。

  • 制御APIファイルの存在は/dev/initctlSystem 5に限定されませんinit。 systemdsystemd-initctlには、このサービスを提供する(プロセス#1ではない)サーバーがあります。ヨアキム・ニールセンfinitサービングもしてみてください。 (もっと興味深くするために、Debianには今/run/initctlhttps://superuser.com/a/888936/38062もっと学ぶ。 )
  • systemd、upstart、System 5 rc、およびOpenRCは、/etc/init.d/最初の2つのケースでは、以前のバージョンとの互換性のためにすべてのプロセスを実行します。その存在が特定のシステムの存在を示すものではありません。

検出システム5init

皮肉なことに、説明通りhttps://unix.stackexchange.com/a/196197/5132、一方通行少なくともDebian Linuxではシステム5の存在を検出するための条件は存在するかどうかinitである/etc/inittab。しかし:

  • のようなDebianパッケージです/etc/inittab
  • 問題全体の一部は、/etc/inittabシステム5を使用してもこの問題がまだ存在することです。init過去のいつでもこれは、パッケージを削除してもその構成ファイルは削除されないためです。 (Debian 7のいくつかのパッケージが/etc/inittab
  • これはリバーステストです。

検出システム

"公式の"方法で実行されているシステム管理者としてsystemdを確認するには、起動/run/systemd/system時にsystemd自体によって生成されたディレクトリです/run

しかし、これはただできない。このチェックは傷ついた、なぜなら それは役に立たないこのディレクトリも作成します。

他の非公式検査は機能しません。

  • systemdは、バージョン名とバージョン番号も含むD-Busを介して完全なRPC APIを公開します。
  • /run/systemd/private同じものが存在することを保証することはできず、同じものが無駄に繰り返される可能性があります。

ノッシュ検出

system-manager~へおやつディレクトリを作成します/run/system-manager。しかし、これはシステムチェックと同じ弱点も持っています。

その他のビスタター:

  • noshのデザインはsystem-managerファイルシステムにパイプやソケットを生成せず、最初からRPC APIもありません。
  • noshにはservice-manager通常APIソケットがありますが、/run/service-manager/controlnoshを実行することもできます。提供する他のシステム管理者の下の管理者なので、人々に何も伝えません。システム管理者はプロセス#1として実行されます。ただし、名前自体を設定するわけではありません。
  • system-control versionsystemctl versionnosh(systemd互換性シムがインストールされている場合)およびinitctl version(upstart互換性シムがインストールされている場合)からエクスポートされたバージョン文字列は、ツールセットの存在のみを示します。これは、実行中のシステムにクエリを実行しないためです。

スタートアップ企業の検出

Upstart自体はinitctlD-Busを介してAPI呼び出しを行い、正式な確認は実行可能でありinitctl、出力のどこかに「upstart」文字列が含まれていることを確認することです。

ただし、systemd APIと同様に:

  • APIが明日利用可能になるか、勝手に変更されないという保証はありません。
  • 特定の互換性フィラーが存在しないか、将来も存在しないという保証はありません。

    実際、互換スペーサーがすでに存在しています。 nosh には upstart initctlstartおよびコマンドの shim を提供する upstart 互換性パッケージがあります。幸いにも(意図的ですが)ガスケットで「upstart」という音が出ません。stopstatusinitctl

    root~#initctl バージョン
    Nosh バージョン 1.14
    ルート~#

答え4

プログラムでこれに定義されたAPIを使用することもできます。 Systemdには、実行中のsystemdインスタンスに正常に接続できることを確認するlibsystemdが付属しています。

関連情報