PIDの再考1.パヌト4









Upstartに぀いお



たず、Upstartコヌドが非垞に奜きであり、非垞によく文曞化されおおり、ナビゲヌトしやすいこずを匷調しおおきたす。 䞀般に、他のプロゞェクト私のものを含むは圌の䟋から孊ぶべきです。



私はこれを蚀いたしたが、Upstartで䜿甚されおいるアプロヌチに抂ね同意するずは蚀えたせん。 しかし、初心者向けには、Upstartに぀いおもう少し説明したす。



Upstartはsysvinitずコヌドを共有せず、その機胜はアドオンであり、よく知られおいるSysVスクリプトずある皋床の互換性を提䟛したす。 その䞻な機胜はむベント指向のアプロヌチです。プロセスの開始ず停止はシステム内のむベントに結び付けられ、ネットワヌクむンタヌフェヌスのアクセシビリティやプログラムの起動など、さたざたなこずがむベントずしお機胜したす。



Upstartは、これらのむベントを通じおサヌビスをシリアル化したす。syslogで開始された信号が送信された堎合、D-Busを開始するための信号ずしお䜿甚され、Syslogが䜿甚できるようにしたす。 さらに、 dbus-started信号が送信されるず、NetworkManagerが起動されたす。これは、D-Busなどを䜿甚できるようになったためです。



このようにしお、管理者が存圚し理解しおいる珟圚の実際の䟝存関係は、䞀連のむベントず動䜜ルヌルに単玔に倉換および゚ンコヌドされたず蚀うかもしれたせん管理者/開発者が心配する各論理ルヌル「 a needs b 」は、「実行a when bは開始し、「 bが停止したらaを停止」したす。 状況によっおは、これは単玔に物事を単玔化したものです。Upstart自䜓のコヌドの堎合です。 それでも、この単玔化は実際には有害であるず私は䞻匵したす。 たず、論理的な䟝存関係は消えたせん。Upstartファむルを䜜成する人は、これらの論理的な䟝存関係を䞀連のむベントず動䜜ルヌルに手動で倉換するように匷制されたす実際、各䟝存関係には2぀のルヌルがありたす。 その結果、䟝存関係に基づいお䜕をすべきかをマシンに把握させる代わりに、ナヌザヌは䟝存関係をむベント/動䜜のルヌルの単玔なセットに手動で倉換する必芁がありたす。 たた、䟝存関係情報は決しお゚ンコヌドされないため、実行時に利甚できたせん。぀たり、これがなぜ発生したのか、たずえばbが開始されたずきに開始された理由を芋぀けようずしおいる管理者圌は芋぀ける機䌚がありたせん。



さらに、むベントのシステムはすべおの䟝存関係を逆さたにしたす。 䜜業量を最小限に抑える代わりに蚘事の冒頭で述べたように、適切なロヌディングシステムが行うべきです、実際に行う必芁がある䜜業量を増やしたす。 たたは、蚀い換えるず、明確な目暙を持ち、目暙を達成するために本圓に必芁なこずだけを行うのではなく、圌は䞀歩を螏み出し、このステップを完了した埌、圌に続く可胜性のあるすべおのステップを実行したす。



簡単に蚀えば、ナヌザヌがD-Busを起動したずいう事実は、NetworkManagerを起動する必芁があるこずを瀺すものではありたせんただし、これはUpstartが実際に行うこずです。 反察の堎合、このステヌトメントも真です。ナヌザヌがNetworkManagerを芁求するず、これは明らかにD-Busを起動する必芁があるこずを瀺したすほずんどのナヌザヌはこれを芋るず思いたすよね。



適切なブヌトシステムは、必芁なものだけをオンデマンドで実行する必芁がありたす。 そしお、「遅延」ロヌドを䜿甚するか、事前に䞊行凊理を䜿甚したす。 それでも、必芁以䞊に起動するべきではありたせん。特に、むンストヌルされおいおサヌビスを䜿甚できるすべおのものを起動する必芁はありたせん。



最埌に、むベントロゞックを䜿甚するこずの本圓の利点はありたせん。 Upstartに衚瀺されるむベントのほずんどは実際には時間どおりではなく、ある皋床のランタむムサヌビスの開始、実行、停止があるように思えたす。 デバむスが接続され、䜿甚可胜になり、再び切断されたす。 接続プロセス䞭のマりントポむントは、完党に接続および切断されたす。 電源ケヌブルが接続され、システムの電源がオンになり、電源ケヌブルが切断されたす。 ブヌトシステムたたはプロセス、オブザヌバヌは、時間厳守に察応するためにむベントの最小数を制埡する必芁がありたす。そのほずんどは、開始、条件、および停止のシヌケンスです。 繰り返しになりたすが、この情報は単䞀のむベントに焊点を圓お、ランタむム䟝存関係を無芖するため、Upstartでは䜿甚できたせん。



今、私は䜕らかの圢で䞊で述べた問題のいく぀かが、Upstartの最新の倉曎、特に、Upstartルヌルファむルのstart onlocal-filesystem and net-device-up IFACE = loなどの条件に基づく構文によっお解決されたこずを認識しおいたすああ。 しかし、私にずっおこれは、コヌドに重倧な欠陥があるシステムを修正する詊みのように思えたす。



これらすべおを残しお、Upstartは、䞀郚の゜リュヌションが曖昧に芋えおも䞊蚘参照、倚くの未実珟機胜䞊蚘も参照がある堎合でも、サヌビスの優れた「看護垫」です。



Upstart、sysvinit、launchd以倖のブヌトシステムがありたす。 それらのほずんどは、Upstartたたはsysvinitをほずんど提䟛したせん。 最も興味深いラむバルは、サヌビス間の正しい䟝存関係を維持するSolaris SMFです。 ただし、倚くの堎合、それらは耇雑すぎお、XMLの䜿い過ぎや、よく知られおいるものの新しい甚語に぀いお少し孊問的に蚀っおみたしょう。 たた、 契玄システムなどの特定のSolaris機胜ず密接に関連しおいたす。



すべおをたずめる



ですから、良いPID 1がどのように振る舞うべきか、そしお珟圚のほずんどのシステムが䜕をすべきかを説明し、犬が埋葬されおいる堎所を芋぀ける前に、今が2番目の䌑憩の良い時期です。 だから、新しいコヌヒヌを泚いでください。 それは䟡倀がありたす。



おそらく、理想的なブヌトシステムの芁件ず機胜ずしお䞊蚘で提案したものが、 systemdず呌ばれるこれたでの実隓的なブヌトシステムで実際に利甚できるようになったず思いたす。 そしお再び、 ここにコヌドがありたす。 そしお、その機胜ずその背埌にある合理性の粒の簡単な抂芁です。



systemdは、システム党䜓を実行および管理したす名前に泚意しおください...。 䞊蚘の機胜党䜓ず、さらにいく぀かを実装したす。 すべおはナニットの抂念に基づいおいたす。 ナニットにはタむプず名前がありたす。 ナニットは通垞、ファむルシステムから構成をダりンロヌドするため、ナニット名はファむル名です。 䟋 avahi.serviceナニットは、同じ名前の蚭定ファむルを読み取りたす。もちろん、Avahiデヌモンをカプセル化するナニットでもありたす。 ナニットにはいく぀かのタむプがありたす。



  1. サヌビスこれは最も明癜なタむプのナニットです起動、停止、過負荷、再初期化が可胜なデヌモン。 SysVずの互換性のために、独自の構成ファむルをサポヌトするだけでなく、叀兞的なSysVブヌトスクリプトを読み取る機胜も備えおいたす。特に、LSBヘッダヌが存圚する堎合は解析したす。 したがっお、/ etc / init.dは 、構成ファむルの別の゜ヌスにすぎたせん
  2. ゜ケットこのナニットタむプは、ファむルシステムたたはむンタヌネット䞊の゜ケットをカプセル化したす。

    珟時点では、ストリヌミング、デヌタグラム、シリアルパケットのタむプのAF_INET 、 AF_INET6 、 AF_UNIX゜ケットをサポヌトしおいたす。 車䞡などの埓来のFIFOもサポヌトしおいたす。 各゜ケットナニットには、察応するサヌビスナニットがあり、゜ケットたたはFIFOぞの最初の接続が受信されるずすぐに開始されたす。 䟋 nscd.socketは、着信接続でnscd.serviceを開始したす。
  3. デバむスこのナニットタむプは、Linuxシステム䞊のデバむスをカプセル化したす。 デバむスがudevルヌルでマヌクされおいる堎合、systemdのデバむスナニットに衚瀺されたす。 udevを䜿甚しお蚭定されたプロパティは、 デバむスナニットの䟝存関係を確立するための構成゜ヌスずしお䜿甚できたす。
  4. マりントこのナニットタむプは、ファむルシステム䞊のマりントポむントをカプセル化したす。 systemdは、すべおのマりントポむントがラむフパス䞊でさらに接続されおいる間監芖し、マりントポむントの接続ず切断にも䜿甚できたす。 / etc / fstabは、SysVブヌトスクリプトをサヌビスタむプのナニットの远加構成゜ヌスずしお䜿甚できるように、マりントポむントの远加゜ヌスずしお䜿甚されたす 。
  5. automountこのナニットタむプは、ファむルシステムの自動マりントポむントをカプセル化したす。 各自動マりントナニットには、自動接続フォルダぞのアクセスが詊行されるずすぐに開始接続する察応するマりントナニットがありたす。
  6. タヌゲットこのタむプのナニットは、ナニットを論理的にグルヌプ化するために䜿甚されたす。実際に䜕か䟿利なこずをする代わりに、単に他のナニットを参照し、その結果、それらを䞀緒に制埡できたす。 たずえば、埓来のSysVシステムでランレベル5の圹割を果たすmulti-user.target 、たたはbluetoothドングルがシステムに接続されるずすぐに芁求されるbluetooth.targetであり、単にすべおのbluetooth関連サヌビスを開始したすそれ以倖の堎合は実行されたせん䟋ずしおbluetoothdずobexd
  7. スナップショットこのタむプのナニットはタヌゲットに䌌おおり、本質的には䜕も行いたせん。その唯䞀の目的は他のナニットを参照するこずです。 スナップショットを䜿甚しお、ブヌトシステムのすべおのサヌビスずナニットの状態を保存/ロヌルバックできたす。 䞻に2぀のケヌスで䜿甚するこずを目的ずしおいたす。ナヌザヌが䞀時的に「緊急シェル」などの特定の状態に移行できるようにするこずです。 珟圚のサヌビスの䞭断ず前の状態に戻る簡単な方法、すなわち 䞀時的に停止されたすべおのサヌビスを開始したす。 たた、システムを䞀時停止する簡単な方法ずしお䜿甚するこずもできたすスリヌプシステムがスリヌプモヌドになるず正しく動䜜しないサヌビスが倚くあり、倚くの堎合、スリヌプする前にこれらのサヌビスを停止し、終了埌にスリヌプモヌドからシステムを開始するこずをお勧めしたす。


これらすべおのナニットは、盞互に䟝存関係を持぀こずができたす正ず負の䞡方、぀たり「芁件」ず「競合」。デバむスは、デバむスが利甚可胜になるずすぐに察応するサヌビスが開始されるこずに留意しお、サヌビスに䟝存する堎合がありたす。 マりントポむントは、接続されおいるデバむスに暗黙的に䟝存しおいたす。 マりントポむントには、それらを移怍する他のマりントポむントぞの暗黙的な䟝存関係もありたすたずえば、マりントポむント/ home / lennartには暗黙的にマりントポむント/ homeがありたす など。



機胜の短いリストは次のずおりです。



  1. 生成されるプロセスごずに、環境、リ゜ヌス制限、䜜業ディレクトリずルヌトディレクトリ、umask、キラヌOOM蚭定、ナむスレベル、IOクラスず優先床、CPUポリシヌず優先床、CPUぞのアトラクション、ナヌザヌID、グルヌプID、サむドグルヌプのID、読み取り/曞き蟌みフォルダヌず非アクセスフォルダヌ、䞀般/プラむベヌト/セカンダリマりントフラグ、オプション/制限のセット、セキュリティ属性、CPUスケゞュヌラヌ蚭定、プラむベヌト/ tmpスペヌス、さたざたなサブシステムのcgroup。 たた、stdin / stdout / stderrサヌビスをsyslog、/ dev / kmsg、たたは任意のTTYに簡単に接続できたす。 入力のためにTTYに接続されおいる堎合、systemdは、プロセスがTTYぞの排他的アクセス暩を持っおいるこずを確認したす。アクセスを埅機するか匷制したす。
  2. 実行䞭の各プロセスは独自のcgroupを取埗したすデバッグサブシステムは他の目的に䜿甚されず、単にプロセスをグルヌプ化するだけなので、珟圚はデバッグサブシステムでのみ。systemdの蚭定は非垞に簡単です。 libcgroupsナヌティリティを䜿甚しおみたしょう。
  3. 構成ファむルは、よく知られおいる.desktopファむルに厳密に埓う構文を䜿甚したす。 これは単玔な構文であり、倚くのラむブラリに存圚するパヌサヌです。 たた、サヌビスの説明でi18nの既存のツヌルを参照するこずもできたす。 管理者ず開発者は、新しい構文を孊ぶ必芁はありたせん。
  4. 前述のずおり、SysVダりンロヌドスクリプトずの互換性を維持しおいたす。 LSBおよびRed Hatのchkconfigヘッダヌがあればそれを利甚したす。 それらが提瀺されおいない堎合、/ etc / rc.dの起動優先順䜍など、利甚可胜な情報から最適なものを絞り蟌もうずしたす。 SysVブヌトスクリプトは远加の構成゜ヌスずしお䜿甚されるため、systemdぞの移行パスが簡玠化されたす。 オプションで、サヌビスのクラシックPIDファむルを読み取っお、マスタヌサヌビスプロセスを特定できたす。 LSBヘッダヌを取埗し、それらをsystemd䟝存関係システムに倉換するこずに泚意しおください。 泚意散挫Upstartはこの皮の情報を収集しお䜿甚するこずはできたせん。 LSB SysVスクリプトが優先されるシステムでUpstartを䜿甚しおダりンロヌドするず、systemdず同じシステム䞊にありたすが、䞊列化されたせん。 実際、Upstartの堎合、すべおのSysVブヌトスクリプトは1぀のタスクずしお䞀緒に実行されたすが、systemdの堎合は別の構成゜ヌスであり、すべおネむティブのsystemdサヌビスずしお個別に管理および指定されたす。
  5. 同様に、既存の/ etc / fsta bを読み取り、远加の構成゜ヌスず芋なしたす。 fstabオプションcomment =を䜿甚しお、/ etc / fstabの芁玠をsystemd制埡のマりントポむントずしおマヌクするこずもできたす。
  6. 同じナニットが耇数の構成゜ヌスで構成されおいる堎合たずえば、ファむル/etc/systemd/system/avahi.serviceおよび/etc/init.d/avahiがある堎合 、ネむティブ構成ファむルが優先され、叀い構成ファむルは無芖され、パッケヌゞが蚱可されたすSysVスクリプトずsystemd構成ファむルの䞡方をしばらく䜿甚したす。
  7. シンプルなテンプレヌト/むンスタンスメカニズムをサポヌトしおいたす。 たずえば、6぀のgettyの 6぀の構成ファむルをサポヌトする代わりに、 getty @ tty2.serviceなどに察しお䜜成されるgetty @ .serviceむンスタンスを1぀サポヌトするだけです。 むンタヌフェヌス郚分は、䟝存関係匏、぀たり dhcpd@eth0.serviceサヌビスがavahi-autopid@eth0.serviceを開始するこずは簡単に゚ンコヌドできたす

    文字列の䞀郚-eth0-をマスクしたたたにしたす。
  8. ゜ケットをアクティブ化するために、埓来のinetdモヌドずの完党な互換性ず、launchdのアクティブ化方法をシミュレヌトする非垞にシンプルなモヌドをサポヌトしおいたす。これは新しいサヌビスに掚奚される方法です。 Inetdモヌドでは、デヌモンに1぀の゜ケットのみを転送できたすが、ネむティブサポヌトモヌドでは、必芁な数のファむル蚘述子を転送できたす。 接続ごずに1぀のむンスタンスだけでなく、接続ごずに1぀のむンスタンスもサポヌトしたす。 最初のモヌドでは、接続パラメヌタヌを䜿甚しお、起動されるサヌビスのcgroupを呌び出し、䞊蚘のテンプレヌトロゞックを䜿甚したす。 䟋 sshd.socketは、cgroup sshd @ .service / 192.168.0.1-4711-192.168.0.2-22ず呌ばれるsshd@192.168.0.1-4711-192.168.0.2-22サヌビスを生成できたす぀たり、IPアドレスずポヌト番号むンスタンス名に䜿甚されたす。AF_UNIX゜ケットの堎合、PIDずクラむアント接続識別子を䜿甚したす。 このようなメカニズムにより、管理者はサヌビスのさたざたなむンスタンスを識別したり、ランタむムを個別に制埡したりするこずができたす。 ネむティブ゜ケット転送モヌドは、アプリケヌションに非垞に簡単に実装できたす。 $ LISTEN_FDS倉数が蚭定されおいる堎合、転送された゜ケットの数が含たれ、デヌモンはハンドル3から始たる.serviceファむルで瀺されおいるように゜ヌトされた゜ケットを芋぀けるこずができたすよく曞かれたデヌモンはfstat getsocketnameは、耇数の゜ケットが送信される堎合に各゜ケットを識別するために䜿甚したす。 さらに、環境倉数は通垞、子プロセスに継承されるため、 $ LISTEN_PID倉数をファむル蚘述子が受け取るデヌモンのPID倀に蚭定したす。 さらに、このような゜ケット転送ロゞックは、デヌモンに非垞に簡単に実装できたす。 これを䜿甚する方法を瀺すラむセンス付きのリファレンス実装をBSDに提䟛したす。 このスキヌムを実装するいく぀かのデヌモンを移怍したした。
  9. ある皋床、 / dev / initctlずの互換性を提䟛したす。 実際、この互換性は、これらの叀いリク゚ストをD-Busリク゚ストに単玔に倉換するFIFOアクティブ化サヌビスで実珟されたす。 基本的に、これは、Upstartおよびsysvinitからの叀いshutdown 、 poweroff、および同様のコマンドがsystemdで匕き続き機胜するこずを意味したす。
  10. たた、 utmpずwtmpの互換性も提䟛したす。 おそらく、既存のutmpおよびwtmpよりもわずかに優れたバヌゞョンです。
  11. systemdは、ナニット間のいく぀かのタむプの䟝存関係をサポヌトしたす。 After / Beforeを䜿甚しお、ナニットのアクティブ化順序を劚げるこずができたす。 たた、完党に盎亀するRequiresおよびWantsは 、必須たたは必須ではない、積極的に芁求される䟝存関係で衚されたす。 たた、 Conflictsがあり 、これは吊定的に必芁な䟝存関係に倉換されたす。 最埌に、䜿甚頻床の䜎い䟝存関係のタむプも3぀ありたす。
  12. systemdには最小限のトランザクションシステムがありたす。 ぀たり、ナニットが開始たたは停止する堎合は、サヌビスずそのすべおの䟝存関係を䞀時トランザクションに远加したす。 次に、トランザクションが完了しおいるこずを確認したす぀たり、すべおのナニットのAfter / Beforeを゜ヌトするこずは埪環的な性質を持たない。 そうでない堎合は、修正しお、トランザクションから䞍芁なゞョブを削陀しおください。これにより、再垰が削陀される可胜性がありたす。 たた、systemdは、サヌビスを起動するこずができる重芁でないゞョブを保留しようずしおいたす。 必須ではないク゚リずは、盎接関係しおいないが、 Wantsなどの䟝存関係を介しお取埗されるク゚リです。 最埌に、既にキュヌに远加されおいるゞョブず矛盟するゞョブがあるかどうかを確認したす。これにより、トランザクションが䞭断される可胜性がありたす。 すべおのバズずトランザクションに䞀貫性があり統合、その圱響が最小化されおいる堎合、今埌のタスクずマヌゞされ、起動キュヌに远加されたす。 実際には、これは、芁求された操䜜を実行する前に、実行する意味があるかどうかを確認し、可胜な堎合は修正し、実際に解決できない状況が発生した堎合は「降䌏」するこずを意味したす。
  13. 開始/停止時間、および開始および監芖する各プロセスのPIDおよび終了コヌドを蚘録したす。 このデヌタを䜿甚しお、abrtd、audited、syslogのサヌビスずそのデヌタを盞互接続できたす。 デヌモンのクラッシュを匷調衚瀺し、syslog、abrtd、およびauditdの適切なナヌザヌむンタヌフェむスぞの簡単なナビゲヌションを提䟛するナヌザヌむンタヌフェむスを想像しおください。珟圚の起動時にこのデヌモンに察しお生成された情報が衚瀺されたす。
  14. 私たちは、い぀でもダりンロヌドプロセスの再実行をサポヌトしおいたす。 デヌモンの状態は、再実行前にシリアラむズされ、実行埌にデシリアラむズされたす。 このようにしお、ブヌトシステムの曎新を容易にし、ブヌトデヌモンを最終デヌモンに転送する簡単な方法を提䟛したす。 autofsのオヌプン゜ケットずマりントポむントは、垞にシリアル接続できるように正しくシリアル化されおいるため、クラむアントはブヌトシステムが再起動するこずに気付かないこずさえありたす。 たた、サヌビスの状態のほずんどが仮想FS cgroupで゚ンコヌドされおいるずいう事実により、シリアル化されたデヌタにアクセスせずに実行を継続するこずはできたせん。 再起動コヌドパスは、実際にはブヌトシステムの構成再ロヌドコヌドパスず非垞によく䌌おおり、再実行実行頻床は䜎いが構成の再ロヌドおそらくより頻繁に開始されるずしおもテストされたす。
  15. ブヌトシステムからブヌトスクリプトを削陀し始め、Cで基本的なシステムセットアップの䞀郚を曞き留めお、systemdに盎接転送したした。 これには、ファむルシステムAPI / proc 、 / sys 、 / devなどの仮想ファむルシステムの接続ずホスト名の蚭定も含たれたす。
  16. サヌバヌの状態は、D-Busを介しお監芖および監芖されたす。 ただ完成しおいたせんが、はるかに進んでいたす。
  17. 今のずころ、゜ケットベヌスずバスベヌスのアクティベヌションを匷調したいので、゜ケットずサヌビス間の䟝存関係をサポヌトしたす。 たた、これらのタむプのサヌビスが準備完了を知らせる方法をいく぀かサポヌトしおいたすフォヌクしお開始プロセスを停止するステヌタス぀たり、 daemonizeの埓来の動䜜を蚭定し、蚭定されたサヌビス名が衚瀺されるたでバスを監芖したす。
  18. systemdによっおプロセスが生成されるたびに確認を求める察話モヌドがありたす。 カヌネル起動匕数でsystemd.confirm_spawn = 1を枡すこずで有効にできたす。
  19. カヌネルパラメヌタヌsystemd.default =を䜿甚するず、systemdブヌトを開始するナニットを指定できたす。 通垞、 multi-user.targetのようなものを指定したすが、タヌゲットの代わりに単䞀のサヌビスを指定するこずもできたす。 箱からの䟋ずしお、 非垞に有甚なinit = / bin / bashに類䌌したemergency.serviceを提䟛したすが、ブヌトシステムを実行する利点があるため、緊急シェルから完党なシステムをブヌトする機胜を提䟛したす。
  20. たた、サヌビスを開始/停止/怜査できる最小限のナヌザヌむンタヌフェむスもありたす。 完党なナヌザヌむンタヌフェむスにはほど遠いですが、デバッグツヌルずしおは䟿利です。 Valauu eeee !!で曞かれおおり、 systemadmずいう名前が付いおいたす。




systemdは倚くの特定のLinux機胜を䜿甚し、POSIXに限定されないこずを蚀わなければなりたせん。 これにより、他のオペレヌティングシステムに転送するように蚭蚈されたシステムが提䟛できない巚倧な機胜にアクセスできたす。



継続するには...



All Articles