どのinitsystemが使用されているかを簡単に知る方法はありますか(たとえば、最も近いシステムDebian wheezy
またはFedora
システム)。私はそれがinitsystemをFedora 21
使用していることを知っていますが、systemd
それについて読んですべての関連スクリプト/symlinkが/etc/systemd/
。Debian squeeze
CentOS 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/systemd
systemd ベースのシステムを使用していることを伝えます。/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/init
upstartまたはシステム5がinit
実行されているときに同じコンテンツを指します。一部のシステムでは、/sbin/init
systemdが実行されている場合も同様です。前述のように、Debian Linux 群衆はすべてのプログラムが異なる名前を持つことを望んでいます。しかし、これはDebianに限定されています。遠く一般から来て、プログラムが呼び出されたときに
/sbin/init
実際には役に立ちません(ブートローダのinitramfsステップを介して)。 Felix von Leitnerのminitだけが実際にDebian 8にパッケージされており、独自の名前で呼び出されます。- 制御APIファイルの存在は
/dev/initctl
System 5に限定されませんinit
。 systemdsystemd-initctl
には、このサービスを提供する(プロセス#1ではない)サーバーがあります。ヨアキム・ニールセンfinit
サービングもしてみてください。 (もっと興味深くするために、Debianには今/run/initctl
。https://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を公開します。
- これは悪名領域に属しません。「インターフェースの安定性を確保」そして明日や気まぐれに変わることもあります。
- 同様のD-Busサーバーでも同様です。システムガスケット。
- 役に立たないことも同じだ。
/run/systemd/private
同じものが存在することを保証することはできず、同じものが無駄に繰り返される可能性があります。
ノッシュ検出
system-manager
~へおやつディレクトリを作成します/run/system-manager
。しかし、これはシステムチェックと同じ弱点も持っています。
その他のビスタター:
- noshのデザインは
system-manager
ファイルシステムにパイプやソケットを生成せず、最初からRPC APIもありません。 - noshには
service-manager
通常APIソケットがありますが、/run/service-manager/control
noshを実行することもできます。提供する他のシステム管理者の下の管理者なので、人々に何も伝えません。システム管理者はプロセス#1として実行されます。ただし、名前自体を設定するわけではありません。 system-control version
systemctl version
nosh(systemd互換性シムがインストールされている場合)およびinitctl version
(upstart互換性シムがインストールされている場合)からエクスポートされたバージョン文字列は、ツールセットの存在のみを示します。これは、実行中のシステムにクエリを実行しないためです。
スタートアップ企業の検出
Upstart自体はinitctl
D-Busを介してAPI呼び出しを行い、正式な確認は実行可能でありinitctl
、出力のどこかに「upstart」文字列が含まれていることを確認することです。
ただし、systemd APIと同様に:
- APIが明日利用可能になるか、勝手に変更されないという保証はありません。
- 特定の互換性フィラーが存在しないか、将来も存在しないという保証はありません。
実際、互換スペーサーがすでに存在しています。 nosh には upstart
initctl
、start
およびコマンドの shim を提供する upstart 互換性パッケージがあります。幸いにも(意図的ですが)ガスケットで「upstart」という音が出ません。stop
status
initctl
root~#initctl バージョン Nosh バージョン 1.14 ルート~#
答え4
プログラムでこれに定義されたAPIを使用することもできます。 Systemdには、実行中のsystemdインスタンスに正常に接続できることを確認するlibsystemdが付属しています。