GNU/Linux >> Linux の 問題 >  >> Linux

systemdを愛することを学ぶ

systemd(はい、文の先頭であってもすべて小文字)は、initおよびSystemVinitスクリプトの最新の代替品です。それだけではありません。

ほとんどのシステム管理者のように、私がinitプログラムとSystemVについて考えるとき、私はLinuxの起動とシャットダウンについて考えますが、サービスが起動して実行された後の管理のように、他のことはあまり考えません。 initと同様に、systemdはすべてのプロセスの母であり、Linuxホストを生産的な作業を実行できる状態にする責任があります。 systemdで想定されている機能の一部は、古いinitプログラムよりもはるかに広範囲であり、ファイルシステムのマウント、ハードウェアの管理、タイマーの処理、必要なシステムサービスの開始と管理など、実行中のLinuxホストの多くの側面を管理することです。生産的なLinuxホストを用意する。

この一連の記事は、私の3巻のLinuxトレーニングコースからの抜粋に一部基づいています。 Linuxの使用と管理:ゼロからシステム管理者 、起動時と起動終了後の開始時の両方でsystemdの機能を調べます。

Linuxブート

Linuxホストをオフ状態から実行状態に移行する完全なプロセスは複雑ですが、オープンでわかりやすいものです。詳細に入る前に、ホストハードウェアがオンになってから、システムがユーザーがログインできるようになるまでの概要を簡単に説明します。ほとんどの場合、「起動プロセス」は単一のエンティティとして説明されています。しかし、それは正確ではありません。実際、完全な起動および起動プロセスには3つの主要な部分があります。

  • ハードウェアブート: システムハードウェアを初期化します
  • Linuxブート: Linuxカーネルをロードしてからsystemd
  • Linuxの起動: systemdが生産的な作業のためにホストを準備する場所

Linuxの起動シーケンスは、カーネルがinitまたはsystemdのいずれかをロードした後に開始されます。これは、ディストリビューションが古い起動を使用するか、新しい起動を使用するかに応じて異なります。 initおよびsystemdプログラムは、他のすべてのプロセスを開始および管理し、それぞれのシステムでは「すべてのプロセスの母」として知られています。

ハードウェアブートとLinuxブートをLinuxスタートアップから分離し、それらの間の境界点を明示的に定義することが重要です。これらの違いと、Linuxシステムを生産性の高い状態にするためにそれぞれが果たす役割を理解することで、これらのプロセスを管理し、ほとんどの人が「ブート」と呼ぶときに問題が発生している場所をより適切に特定できます。

>

起動プロセスは3段階の起動プロセスに従い、Linuxコンピューターを運用状態にして生産的な作業に使用できるようにします。カーネルがホストの制御をsystemdに移すと、起動プロセスが開始されます。

systemdの論争

systemdは、Linuxシステムの稼働を維持する責任を負うシステム管理者やその他の人々から幅広い反応を呼び起こすことができます。 systemdが多くのLinuxシステムで非常に多くのタスクを引き継いでいるという事実は、開発者とシステム管理者の特定のグループの間で反発と不和を引き起こしました。

SystemVとsystemdは、Linuxの起動シーケンスを実行する2つの異なる方法です。 SystemVの開始スクリプトとinitプログラムは古い方法であり、targetsを使用するsystemdは新しい方法です。最新のLinuxディストリビューションのほとんどは、起動、シャットダウン、およびプロセス管理に新しいsystemdを使用していますが、そうでないものもあります。 1つの理由は、一部のディストリビューションメンテナと一部のシステム管理者が新しいsystemdよりも古いSystemVメソッドを好むことです。

どちらにも利点があると思います。

SystemVを好む理由

SystemVの方がオープンなので、私はSystemVを好みます。起動はBashスクリプトを使用して実行されます。カーネルがコンパイルされたバイナリであるinitプログラムを開始した後、initは rc.sysinitを起動します。 スクリプト。多くのシステム初期化タスクを実行します。 rc.sysinitの後 完了すると、initは /etc/rc.d/rcを起動します スクリプト。これにより、 /etc/rc.d/rcX.dのSystemV開始スクリプトで定義されたさまざまなサービスが開始されます。 、ここで「X」は開始されているランレベルの番号です。

その他のLinuxリソース

  • Linuxコマンドのチートシート
  • 高度なLinuxコマンドのチートシート
  • 無料のオンラインコース:RHELの技術概要
  • Linuxネットワーキングのチートシート
  • SELinuxチートシート
  • Linuxの一般的なコマンドのチートシート
  • Linuxコンテナとは何ですか?
  • 最新のLinux記事

initプログラム自体を除いて、これらのプログラムはすべてオープンで簡単に理解できるスクリプトです。これらのスクリプトを読んで、起動プロセス全体で何が起こっているかを正確に知ることは可能ですが、実際に多くのシステム管理者がそれを行っているとは思いません。各開始スクリプトには、特定の順序で目的のサービスを開始するように番号が付けられています。サービスはシリアルに開始され、一度に1つのサービスのみが開始されます。

systemdは、RedHatのLennartPoetteringとKaySieversによって開発されたもので、ソースコードにアクセスしないと理解できない、コンパイル済みの大規模なバイナリ実行可能ファイルの複雑なシステムです。オープンソースなので、「ソースコードへのアクセス」は難しくなく、便利さは劣ります。 systemdは、Linux哲学の複数の信条に対する重大な反論を表しているようです。バイナリとして、systemdは、システム管理者が表示したり、簡単に変更したりするために直接開かれていません。 systemdは、SystemVよりもはるかに多くのステータス情報を提供しながら、実行中のサービスの管理など、すべてを実行しようとします。また、ハードウェア、プロセス、プロセスのグループ、ファイルシステムのマウントなども管理します。 systemdは、最新のLinuxホストのほぼすべての側面に存在し、システム管理のためのワンストップツールになっています。これはすべて、プログラムは小さく、各プログラムは1つのことを実行し、それをうまく実行する必要があるという信条に明らかに違反しています。

なぜsystemdを好むのか

スタートアッププロセスの現在の段階に応じて、可能な限り多くのサービスを並行して開始するため、スタートアップメカニズムとしてsystemdを好みます。これにより、全体的な起動が高速化され、SystemVよりも速くホストシステムがログイン画面に表示されます。

systemdは、実行中のLinuxシステムのほぼすべての側面を管理します。 SystemVよりもはるかに多くのステータス情報を提供しながら、実行中のサービスを管理できます。また、ハードウェア、プロセスとプロセスのグループ、ファイルシステムのマウントなどを管理します。 systemdは、最新のLinuxオペレーティングシステムのほぼすべての側面に存在し、システム管理のためのワンストップツールになっています。 (これは聞き覚えがありますか?)

systemdツールはコンパイルされたバイナリですが、すべての構成ファイルがASCIIテキストファイルであるため、ツールスイートは開いています。スタートアップ構成は、さまざまなGUIおよびコマンドラインツールを使用して変更できます。また、特定のローカルコンピューティング環境のニーズに合わせてさまざまな構成ファイルを追加または変更できます。

実際の問題

両方のスタートアップシステムが気に入らなかったと思いましたか?私はそうします、そして私はどちらかで働くことができます。

私の意見では、SystemVとsystemdの間のほとんどの論争の本当の問題と根本的な原因は、sysadminレベルで選択の余地がないということです。 SystemVとsystemdのどちらを使用するかは、さまざまなディストリビューションの開発者、メンテナー、パッケージャーによってすでに選択されていますが、それには十分な理由があります。 initシステムをすくい取って置き換えることは、その極端で侵襲的な性質により、配布設計プロセスの外で取り組むのが難しい多くの結果をもたらします。

この選択が私のためになされたという事実にもかかわらず、私のLinuxホストは起動して動作します。これは、私が通常最も気にかけていることです。エンドユーザーとして、さらにはシステム管理者としても、私の主な関心事は、自分の仕事、本やこの記事の作成、更新のインストール、すべてを自動化するスクリプトの作成などの作業を実行できるかどうかです。自分の仕事ができる限り、ディストリビューションで使用される開始シーケンスはあまり気にしません。

起動時やサービス管理時に問題が発生した場合は気になります。ホストで使用されているスタートアップシステムに関係なく、イベントのシーケンスに従って障害を見つけて修正するのに十分な知識があります。

SystemVの交換

SystemVをもう少し新しいものに置き換える試みは以前からありました。約2つのリリースで、FedoraはUpstartと呼ばれるものを使用して古いSystemVを置き換えましたが、initを置き換えず、私が気付いた変更はありませんでした。 UpstartはSystemVを取り巻く問題に大きな変更を加えなかったため、この方向への取り組みはすぐに中止され、systemdが支持されました。

ほとんどのLinux開発者が古いSystemVスタートアップを置き換えることは良い考えであることに同意しているという事実にもかかわらず、多くの開発者とシステム管理者はそのためのsystemdを嫌います。人々がsystemdで抱えている、または抱えていたいわゆる問題をすべて再ハッシュするのではなく、ほとんどすべてをカバーするはずの2つの優れた記事を紹介します。 Linuxカーネルの作成者であるLinusTorvaldsは、無関心のようです。 2014年のZDNetの記事で、Linuxのsystemdに関するLinusTorvaldsなど 、Linusは彼の気持ちをはっきりと示しています。

「実際、systemd自体について特に強い意見はありません。コア開発者の中には、バグや互換性についてあまりにも大げさだと思う問題があり、設計の詳細のいくつかは非常識だと思います(私はたとえば、バイナリログは嫌いです)が、これらは詳細であり、大きな問題ではありません。」

Linusについてよく知らない場合は、彼が何かを好きではない場合、彼は非常に率直で、明確で、その嫌いについて非常に明確であると言えます。彼は物事に対する嫌悪感に対処する方法で、より社会的に受け入れられるようになりました。

2013年に、Poetteringは長いブログ投稿を書き、systemdについての神話を暴き、それを作成する理由のいくつかについて洞察を提供しました。これは非常に良い読み物であり、私はそれを強くお勧めします。

systemdタスク

コンパイルプロセス中に使用されるオプション(このシリーズでは考慮されていません)に応じて、systemdには、特に次のタスクを実行する最大69のバイナリ実行可能ファイルを含めることができます。

  • systemdプログラムはPID1として実行され、可能な限り多くのサービスのシステム起動を並行して提供します。これにより、副作用として、全体的な起動時間が短縮されます。また、シャットダウンシーケンスも管理します。
  • systemctlプログラムは、サービス管理用のユーザーインターフェイスを提供します。
  • 下位互換性のために、SystemVおよびLSB開始スクリプトのサポートが提供されています。
  • サービス管理とレポートは、SystemVよりも多くのサービスステータスデータを提供します。
  • ホスト名、日付、ロケール、ログインユーザーのリスト、実行中のコンテナーと仮想マシン、システムアカウント、ランタイムディレクトリと設定、単純なネットワーク構成を管理するデーモン、ネットワーク時刻の同期など、基本的なシステム構成用のツールが含まれています、ログ転送、および名前解決。
  • ソケット管理を提供します。
  • systemdタイマーは、システムの起動、systemdの起動、タイマーが最後に開始された時刻などに関連するスクリプトの実行を含む、高度なcronのような機能を提供します。
  • タイマー仕様で使用される日付と時刻を分析するためのツールを提供します。
  • 階層認識を使用してファイルシステムをマウントおよびアンマウントすると、マウントされたファイルシステムをより安全にカスケードできます。
  • 削除を含む一時ファイルの積極的な作成と管理を可能にします。
  • D-Busへのインターフェースは、デバイスが接続または削除されたときにスクリプトを実行する機能を提供します。これにより、プラグアンドプレイであるかどうかに関係なく、すべてのデバイスをプラグアンドプレイとして扱うことができ、デバイスの処理が大幅に簡素化されます。
  • 起動シーケンスを分析するツールを使用して、最も時間がかかるサービスを見つけることができます。
  • システムログメッセージを保存するためのジャーナルと、ジャーナルを管理するためのツールが含まれています。
アーキテクチャ

これらのタスクなどは、多数のデーモン、制御プログラム、および構成ファイルによってサポートされています。図1は、systemdに属する多くのコンポーネントを示しています。これは、高レベルの概要を提供するために設計された簡略図であるため、個々のプログラムまたはファイルのすべてが含まれているわけではありません。また、データフローについての洞察も提供していません。データフローは非常に複雑であるため、この一連の記事のコンテキストでは役に立たない演習になります。

systemdの完全な説明は、それ自体で本を取ります。図1のsystemdコンポーネントがどのように組み合わされているかについての詳細を理解する必要はありません。さまざまなLinuxサービスの管理を可能にし、ログファイルとジャーナルを処理できるようにするプログラムとコンポーネントについて知っていれば十分です。しかし、systemdが一部の批評家によって主張されているモノリシックな怪物ではないことは明らかです。

systemd as PID 1

systemdはPID1です。古いSystemV3initプログラムよりもはるかに広範な機能の一部は、ファイルシステムのマウントや、生産的なLinuxホストに必要なシステムサービスの開始と管理など、実行中のLinuxホストの多くの側面を管理することです。起動シーケンスに関連しないsystemdのタスクはすべて、この記事の範囲外です(ただし、このシリーズの後半で説明するものもあります)。

まず、systemdは / etc / fstabで定義されたファイルシステムをマウントします 、スワップファイルまたはパーティションを含みます。この時点で、 / etcにある構成ファイルにアクセスできます。 、それ自体を含む。構成リンク/etc/systemd/system/default.targetを使用します 、ホストを起動する必要がある状態またはターゲットを決定します。 default.target fileは、真のターゲットファイルへのシンボリックリンクです。デスクトップワークステーションの場合、これは通常、 graphics.targetになります。 、これはSystemVのランレベル5に相当します。サーバーの場合、デフォルトは multi-user.targetである可能性が高くなります 、これはSystemVのランレベル3に似ています。 emergency.target シングルユーザーモードに似ています。ターゲットとサービスはsystemdユニットです。

次の表(図2)は、systemdターゲットと古いSystemVスタートアップランレベルを比較しています。 systemdは、下位互換性のためにsystemdターゲットエイリアスを提供します。ターゲットエイリアスを使用すると、スクリプト(および多くのシステム管理者)が init 3などのSystemVコマンドを使用できます。 ランレベルを変更します。もちろん、SystemVコマンドは解釈と実行のためにsystemdに転送されます。

systemdターゲット SystemVランレベル ターゲットエイリアス 説明
default.target このターゲットは、常に multi-user.targetへのシンボリックリンクでエイリアス化されます またはgraphical.target 。 systemdは常にdefault.targetを使用します システムを起動します。 default.target hallt.targetにエイリアスしないでください 、 poweroff.target 、または restart.target
graphics.target 5 runlevel5.target Multi-user.target GUIを使用
4 runlevel4.target 未使用。ランレベル4は、SystemVの世界のランレベル3と同じでした。このターゲットは、デフォルトの multi-user.target を変更せずに、ローカルサービスを開始するように作成およびカスタマイズできます。 。
multi-user.target 3 runlevel3.target すべてのサービスが実行されていますが、コマンドラインインターフェイス(CLI)のみ
2 runlevel2.target マルチユーザー、NFSなし、ただし他のすべての非GUIサービスは実行中
rescue.target 1 runlevel1.target 最も基本的なサービスのみが実行されているファイルシステムとメインコンソール上のレスキューシェルのマウントを含む基本的なシステム
emergency.target S シングルユーザーモード-サービスは実行されていません。ファイルシステムがマウントされていません。これは最も基本的なレベルの操作であり、ユーザーがシステムと対話するためにメインコンソールで緊急シェルのみが実行されます。
hallt.target 電源を切らずにシステムを停止します
restart.target 6 runlevel6.target 再起動
poweroff.target 0 runlevel0.target システムを停止し、電源をオフにします

各ターゲットには、構成ファイルに記述されている一連の依存関係があります。 systemdは、必要な依存関係を開始します。これは、特定のレベルの機能でLinuxホストを実行するために必要なサービスです。ターゲット構成ファイルにリストされているすべての依存関係がロードされて実行されると、システムはそのターゲットレベルで実行されます。図2では、最も機能性の高いターゲットがテーブルの上部にあり、機能性はテーブルの下部に向かって低下しています。

systemdは、レガシーSystemV initディレクトリも調べて、そこにスタートアップファイルが存在するかどうかを確認します。その場合、systemdはそれらを構成ファイルとして使用して、ファイルによって記述されたサービスを開始します。非推奨のネットワークサービスは、FedoraでSystemVスタートアップファイルをまだ使用しているサービスの良い例です。

図3(下)は、起動マニュアルページから直接コピーされたものです。これは、systemdの起動中のイベントの一般的なシーケンスと、起動を成功させるための基本的な順序付けの要件のマップを示しています。

|
 cryptsetup-pre.target 

(様々な低レベルV
APIはマウントVFS:(各種のcryptsetupデバイスを...)
mqueueを、configfs、| |
debugfs、...)v |
| cryptsetup.target |
| (さまざまなスワップ| | remote-fs-pre.target
|デバイス...)| | | |
| | | | | v
| v local-fs-pre.target | | | (ネットワークファイルシステム)
| swap.target | | v v |
| | v | remote-cryptsetup.target |
| | (様々な低レベル(各種マウントと| | |
| |サービス:udevd、fsckのサービス...)| | remote-fs.target
| | TMPFILES、ランダム| | | /
| |シード、sysctl、...)v | | /
| | | local-fs.target | | /
| | | | | | /
\ ____ | ______ | _______________ ______ | ___________ / | /
\ / | /
v | /
sysinit.target | /
| | /
______________________ / | \ _____________________ | /
/ | | | \ | /
| | | | | | /
v v | v | | /
(さまざまな(さまざまな|(さまざまな| /
タイマー...)パス...)|ソケット...)| |
| | | | | |
v v | v | |
timers.target paths.target | sockets.target | |
| | | | v |
v \ _______ | _____ /rescue.service |
\ | / | |
V V |
basic.target rescue.target |
| |
________v____________________ |
/ | \ |
| | | |
V V V |
ディスプレイ - (様々なシステム(各種システム|
manager.serviceサービスサービス)|
| |
| |のために必要なグラフィカルなUI) v v
| | multi-user.target
emergency.service | | |
| \ _____________ | _____________ /
v \ | /
emergency.targetターゲットv

sysinit.target およびbasic.target ターゲットは、スタートアッププロセスのチェックポイントと見なすことができます。 systemdの設計目標の1つは、システムサービスを並行して開始することですが、特定のサービスと機能ターゲットは、他のサービスとターゲットを開始する前に開始する必要があります。これらのチェックポイントは、そのチェックポイントに必要なすべてのサービスとターゲットが満たされるまで合格できません。

sysinit.target 依存するすべてのユニットが完了すると、に到達します。これらのユニット、ファイルシステムのマウント、スワップファイルの設定、udevの起動、ランダムジェネレータシードの設定、低レベルサービスの開始、暗号化サービスの設定(1つ以上のファイルシステムが暗号化されている場合)はすべて完了する必要がありますが、 sysinit.target 、これらのタスクは並行して実行できます。

sysinit.target システムがわずかに機能するために必要であり、 basic.target に移動できるようにするために必要な、すべての低レベルのサービスとユニットを起動します 。

sysinit.targetの後 が満たされると、systemdは次の目標を達成するために必要なすべてのユニットを開始します。基本ターゲットは、次のすべてのターゲットに必要なユニットを開始することにより、いくつかの追加機能を提供します。これには、さまざまな実行可能ディレクトリ、通信ソケット、タイマーへのパスなどの設定が含まれます。

最後に、ユーザーレベルのターゲットである multi-user.target またはgraphical.target 、初期化できます。 multi-user.target グラフィカルターゲットの依存関係を満たす前に到達する必要があります。図3で下線が引かれたターゲットは、通常のスタートアップターゲットです。これらの目標の1つに到達すると、起動が完了します。 multi-user.target の場合 がデフォルトの場合、コンソールにテキストモードのログインが表示されます。 graphics.targetの場合 がデフォルトの場合、グラフィカルログインが表示されます。表示される特定のGUIログイン画面は、デフォルトのディスプレイマネージャによって異なります。

起動のマニュアルページでは、初期RAMディスクへの起動とsystemdのシャットダウンプロセスについても説明し、提供しています。

systemdは、完全なスタートアップまたは指定されたユニットの依存関係を一覧表示するツールも提供します。ユニットは、httpdやsshdなどの特定のサービスから、タイマー、マウント、ソケットなどに及ぶ、制御可能なsystemdリソースエンティティです。次のコマンドを試して、結果をスクロールしてください。

 systemctl list-dependencies graphical.target 

これにより、システムをグラフィカルターゲット実行モードにするために必要な最上位のターゲットユニットリストが完全に拡張されることに注意してください。 -allを使用します 他のすべてのユニットも拡張するオプション。

 systemctl list-dependencies --all graphical.target 

less の検索ツールを使用して、「target」、「slice」、「socket」などの文字列を検索できます。 コマンド。

では、次のことを試してください。

 systemctl list-dependencies multi-user.target 

および

 systemctl list-dependencies rescue.target 

および

 systemctl list-dependencies local-fs.target 

および

 systemctl list-dependencies dbus.service 

このツールは、作業中のホストの起動依存関係の詳細を視覚化するのに役立ちます。先に進んで、1つ以上のLinuxホストのスタートアップツリーを探索してください。ただし、systemctlのマニュアルページには次の注記が含まれているため、注意してください。

"このコマンドは、サービスマネージャによって現在メモリにロードされているユニットのみを一覧表示することに注意してください。特に、このコマンドは、依存関係を一覧表示しないため、特定のユニットのすべての逆依存関係を包括的に一覧表示するのには適していません。現在ロードされていないユニットによって宣言されています。」

最終的な考え

systemdに深く入り込む前でさえ、それが強力で複雑であることは明らかです。また、systemdが単一の、巨大な、モノリシックで、認識できないバイナリファイルではないことも明らかです。むしろ、特定のタスクを実行するように設計された多数の小さなコンポーネントとサブコマンドで構成されています。

このシリーズの次の記事では、systemdの起動、systemdの構成ファイル、デフォルトのターゲットの変更、および単純なサービスユニットの作成方法について詳しく説明します。

リソース

インターネット上にはsystemdに関する多くの情報がありますが、その多くは簡潔で、鈍感で、誤解を招くものですらあります。この記事に記載されているリソースに加えて、次のWebページでは、systemdの起動に関するより詳細で信頼性の高い情報を提供しています。

  • Fedora Projectには、systemdに関する優れた実用的なガイドがあります。 systemdを使用してFedoraコンピューターを構成、管理、および保守するために知っておく必要のあるほとんどすべてが含まれています。
  • Fedora Projectには、古いSystemVコマンドを同等のsystemdコマンドと相互参照する優れたチートシートもあります。
  • systemdの詳細な技術情報とその作成理由については、Freedesktop.orgのsystemdの説明をご覧ください。
  • Linux.comの「Moresystemdfun」は、より高度なsystemd情報とヒントを提供します。

また、systemdの設計者であり主要な開発者であるLennart Poetteringによる、Linuxシステム管理者向けの一連の詳細な技術記事もあります。これらの記事は2010年4月から2011年9月の間に書かれましたが、当時と同じように関連性があります。 systemdとそのエコシステムについて書かれた他のすべての優れた点の多くは、これらの論文に基づいています。

  • PID1を再考する
  • 管理者向けsystemd、パートI
  • 管理者向けsystemd、パートII
  • 管理者向けsystemd、パートIII
  • 管理者向けsystemd、パートIV
  • 管理者向けsystemd、パートV
  • 管理者向けsystemd、パートVI
  • 管理者向けsystemd、パートVII
  • 管理者向けsystemd、パートVIII
  • 管理者向けsystemd、パートIX
  • 管理者向けsystemd、パートX
  • 管理者向けsystemd、パートXI

Linux
  1. 2021年にLinuxを愛する10の理由

  2. プログラマーがLinuxパッケージを愛する理由

  3. Linuxでのコーディングが好きな5つの理由

  1. systemdLinuxシステムでのrc.localの置き換え

  2. LinuxでSystemdサービスを作成する方法

  3. Linux – Fsckスクリプトの場所?

  1. awkを学ぶための実用的なガイド

  2. Linuxを学ぶことは私たちの愛を伝える方法です

  3. Linuxで起動アプリケーションのリストを取得する