Systemdは、Linuxシステムのinitシステムおよびシステムマネージャーであり、LSBおよびSysVと互換性があります。 systemdスイートを使用して、Linuxシステムのシステムスタートアップサービスとリソースを管理および最適化できます。これは、システム管理者がシステムを稼働させ、プロセスを最適化し、デバッグし、システムサービスのトラブルシューティングを行うための実用的なツールです。
この記事は、systemdシリーズガイドに基づいて構築され、システムユニットの管理方法、ファイルシステムのマウント、トラブルシューティング、およびシステムを操作する際のヒントとコツを示します。
私たちの最初のsystemdガイドは、systemdがLinuxシステム管理者にとって実用的なツールである理由を強調しています。 2つ目は、systemdタイマーを使用してシステムタスクをスケジュールし、面倒なシステムブートタスクを自動化する方法を示しています。
Linuxの起動
レトロなLinuxユーザーとして、Fedoraシステムが起動し、診断メッセージのページがログインプロンプトの前にスクロールするとき、私は常に存在していました(まだ存在しています)。これらのページには、起動プロセス、ファイルシステムのマウントなどに関する情報が含まれています。スタートアップサービスを管理および最適化する方法を理解するために、電源オンボタンを押してからログインプロンプトが表示されるまでの間に何が発生するかを簡単に見てみましょう。
ブートプロセスは、システムハードウェアを初期化するハードウェアブート、カーネルをロードしてからsystemdをロードするOSブート、およびsystemdがシステムのプロセスを準備するLinuxスタートアップから始まります。カーネルがホストの制御をsystemdに移すと、起動プロセスが開始されます。この時点で、システム管理者はサービス、ユニット、ソケット、D-Busアクティベーションを管理し、プロセス、デーモン、およびファイルシステムのマウントポイントを追跡できます。
システムコンポーネント
以下は、Linuxの起動を管理するために使用できるsystemdソフトウェアスイートの構成要素です。
- systemd-boot –UEFIブートマネージャー。
- systemd-firstboot –最初の起動前の基本的なシステム設定の初期化を管理します。
- systemd-logind –セッション管理ツール。
- systemd-networkd –ネットワーク構成を管理します。
- systemd-sysusers –システムユーザーグループを作成し、起動時にユーザーをグループに追加するためのツール。
- systemd / Journal —システムログを管理します。
- systemd / Timers —.serviceファイルまたはイベントを制御するためのタイマー。
Systemctl
systemdを管理するには、systemctlコマンドを使用します。このコマンドは、SysVinitのサービスとchkconfigの両方の機能を利用します。これを使用して、システムサービスとリソースの表現であるシステムユニットを管理できます。
# systemctl daemon-reload
システム化されたユニット管理
systemdの単位は、サービス(.service)、マウントポイント(.mount)、デバイス(.device)、またはソケット(.socket)です。 Systemctlは、ユニットを管理するためのさまざまなコマンドを提供します。
次のコマンドを使用して、システムの状態を分析します。
$ systemctl status #Show system status $ systemctl or #List running units $ systemctl list-units #List running units $ systemctl --failed #List failed units $ systemctl list-unit-files #List installed unit files1 $ systemctl status pid #Show process status for a PID
次のコマンドを使用して、ユニットのステータスを確認します。
$ systemctl help unit #Show a manual page associated with a unit $ systemctl status unit #Status of a unit $ systemctl is-enabled unit #Check whether a Unit is enabled
次のコマンドを使用して、ユニットを起動およびリロードします。
systemctl start unit #start a unit immediately systemctl stop unit #stop a unit immediately systemctl restart unit #restart a unit systemctl reload unit #reload a unit and configurations systemctl daemon-reload #reload systemd manager configuration
次のコマンドを使用して、ユニットをマスクします。
systemctl mask unit #mask a Unit to make it impossible to start systemctl unmask unit #Unmask a unit
次のコマンドを使用して、ユニットを有効にします。
systemctl enable Unit #enable a Unit to start automatically at boot systemctl enable --now unit #enable a Unit to start automatically and immediately at boot systemctl disable unit #disable a Unit to no longer start at boot systemctl reenable unit #disable and enable anew
ユニットファイルの編集
Linuxは、システム内の複数の場所からユニットファイルをロードします。 [systemctl show –property =UnitPath]コマンドを実行して、完全なリストを表示できます。
- / usr / lib / systemd / system /:インストールされたパッケージによって提供されるユニット。
- / etc / systemd / system /:システム管理者によってインストールされたユニット。
ユニットファイルの例:
/etc/systemd/system/unit.d/example_unit.conf [Unit] Requires=new dependency After=new dependency
依存関係の処理
ユニットファイルを正しく設計することにより、ユニットの依存関係を解決できます。
たとえば、ユニットAが起動する前にユニットBを実行する必要がある場合。次に、Requires=BとAfter=BをAの[Unit]セクションに追加します。
# /etc/systemd/system/unit.d/example_unit.conf [Unit] Requires=B After=B
依存関係がオプションの場合は、Wants=BとAfter=Bを追加します。
/etc/systemd/system/unit.d/example_unit.conf [Unit] Requires=B After=B Wants=B
注:依存関係は、ターゲットではなくサービスに置かれます。
サービスの種類
[Service]セクションのType=パラメータを使用して、カスタムサービスファイルにさまざまなスタートアップサービスタイプを設定できます。
/etc/systemd/system/unit.d/example_unit.conf [Unit] Requires=B After=B Wants=B [Service] Type=simple
- Type =simple(デフォルト):systemdは、サービスがすぐに起動すると見なします。
- Type =forking:systemdは、プロセスがフォークして親が終了すると、サービスが開始されたと見なします。
- Type =oneshot:単一のジョブを実行して終了するスクリプトに使用できます。 RemainAfterExit =yesを設定して、プロセスが終了した後もsystemdがサービスをアクティブと見なすことができるようにすることができます。
- Type =idle:systemdは、すべてのジョブがディスパッチされるまでサービスバイナリの実行を遅らせます。
- Type =notify:Type =simpleのように使用できますが、デーモンは準備ができたときにsystemdに通知します。
- Type =dbus:指定されたBusNameがDBusのシステムバスに表示されると、サービスは準備完了と見なされます。
置換ユニットファイル
[/ usr / lib / systemd / system /]内のユニットファイルを、同様の名前で新しいユニットファイルを作成し、ユニットを再度有効にしてシンボリックリンクを更新することで置き換えることができます。
# systemctl reenable Unit
または、[#systemctl edit –full Unit]コマンドを実行して、エディターでユニットファイルを開き、編集が終了すると自動的に再ロードすることもできます。
# systemctl edit --full Unit
ドロップインファイル
ドロップインユニットファイルを作成するには、ディレクトリ/etc/systemd/system/unit.d/を作成し、新しい.confファイルを配置します。このファイルは、新しい構成オプションを上書きまたは追加します。 systemdはこれらのファイルを解析し、元のユニットファイルの上に適用します。
または、次のコマンド[#systemctl edit unit]を実行して、ファイル/etc/systemd/system/unit.d/new_override.confをテキストエディタで開き、ユニットファイルを自動的に再読み込みします。
ユニットファイルの変更を元に戻す
次のコマンドを使用して、systemctleditコマンドを使用してユニットに加えた変更を元に戻します。
# systemctl revert unit
ユニットに依存関係を追加する
/etc/systemd/system/unit.d/newcustomdependency.conf [Unit] Requires=new customdependency After=new customdependency
電力管理
Systemdには、システムを再起動または電源オフするためのさまざまなコマンドが用意されています。
systemctl reboot #shut down and reboot the system systemctl poweroff #shut down and power-off the system systemctl suspend #suspend the system systemctl hibernate #put the system into hibernation systemctl hybrid-sleep #put the system into hybrid-sleep state
ファイルシステムとパーティションをマウントする
systemdは、/ etc/fstabで指定されたパーティションとファイルシステムのマウントを担当します。ユニットファイルに必要なすべてのパラメータを定義することにより、ファイルシステムを管理またはマウントできます。ファイルシステムとマウントポイントの詳細を含めます。 Systemdを使用すると、マウントユニットを操作する際の柔軟性が高まります。ファイルシステムの構成とマウントに/etc/fstabファイルを使用します。このプロセスでは、systemd-fstab-generatorツールを使用して、fstabファイルのデータからマウントユニットを作成します。
systemdマウントユニットを作成する
この図は、btrfsファイルシステムを実行しているFedora33にあります。
ボリュームグループに空き容量があることを確認してください。
# lsblk
使用可能なマウントユニットファイルのリスト:
[root@foss]# systemctl list-unit-files -t mount OR [root@foss]# systemctl status *mount
systemd .mountユニットファイルを作成します:
blkidコマンドを使用してファイルシステムのUUIDを確認します。
[root@foss]# blkid /dev/sda2 /dev/sda2: LABEL="fedoraworkstation33" UUID="688a6af2-xxx-4da4-xxx-878c5b0f063b" UUID_SUB="690a86e7-yyyy-9a92-4bc6-49cca4yyyy8df" BLOCK_SIZE="4096" TYPE="btrfs" PARTUUID="0byyyb88-02"
etc / systemd/systemディレクトリに新しいファイル[var-lib-docker.mount]を作成します。以下に構成データを追加します。ユニットファイル名とマウントポイントは同一である必要があることに注意してください。
# vi /etc/systemd/system/var-lib-docker.mount [Unit] Description=docker mount [Mount] What=/dev/disk/by-uuid/688a6af2-77e1-4da4-bc63-878c5b0f063b Where=/var/lib/docker Type=btrfs Options=defaults [Install] WantedBy=multi-user.target
「what」引数は、UUID、LABEL、およびディスクへのパスを取ることができることに注意してください。
[Unit]セクションの説明は、systemctl-tmountで表示されるマウント名を提供します。 [Mount]セクションの構成データには、fstabファイルの同じデータが含まれています。
ブート後にマウントユニットを起動できるようにします:
[root@foss]# systemctl enable var-lib-docker.mount Created symlink /etc/systemd/system/multi-user.target.wants/var-lib-docker.mount → /etc/systemd/system/var-lib-docker.mount.
このコマンドは、/ etc / systemd / systemディレクトリにシンボリックリンクを作成し、マウントユニットを後続のすべてのブートにマウントできるようにします。
ファイルシステムを起動してマウントします:
# systemctl start var-lib-docker.mount
ファイルシステムがマウントされていることを確認します:
# systemctl status var-lib-docker.mount ● var-lib-docker.mount - Docker mount Loaded: loaded (/etc/systemd/system/var-lib-docker.mount; enabled; vendor preset: disabled) Active: inactive (dead) Where: /var/lib/docker What: /dev/disk/by-uuid/688a6af2-77e1-4da4-bc63-878c5b0f063b
Dockerサービスユニットファイルを変更して、マウントサービスが呼び出された後にのみサービスが開始されるようにすることもできます。
# cat /usr/lib/systemd/system/docker.service [Unit] Description=docker service unit file After=network.target var-lib-docker.mount # Added mount unit for docker service to wait Requires=docker.socket
再起動して、マウントサービスユニットのステータスを確認します。
# systemctl reboot # systemctl status var-lib-docker.mount
[var-lib-docker]マウントポイントを確認します:
# mount | grep var-lib-docker
ヒントとコツ
ネットワークが稼働した後にサービスを実行する
次の依存関係を.serviceファイルに追加することで、サービスの開始からネットワークが稼働するまで遅延させることができます。
/etc/systemd/system/test_foo.service [Unit] Wants=network-online.target After=network-online.target
さらに、サービスがDNSクエリを実行する必要がある場合は、nss-lookup.targetを追加できます。
/etc/systemd/system/test_foo.service [Unit] Wants=network-online.target After=network-online.target nss-lookup.target ...
次のコマンドを使用して、どのサービスがnss-lookup.targetをプルしているのかを確認します。
# systemctl list-dependencies --reverse nss-lookup.target
systemdGUI構成ツールをインストールする
次のGUIツールを使用してsystemdを操作することもできます。
- SystemdGenie –KDEに基づくsystemd管理ツールです。
- Systemadm –systemdユニット用のグラフィカルブラウザです。
systemdの最適化
Systemdは、最新のデスクトップ環境で2秒未満の高速起動時間を提供します。ただし、次の手順でコードを記述しなくても、さらに最適化できます。
- まず、システムでinitrdを使用する場合は、initrdをバイパスすることを検討してください。
- カーネルコマンドラインにselinux=0を追加して、SELinuxの無効化と監査を検討してください。ただし、システム管理者はセキュリティ上の理由からSElinuxをオンのままにしておくことを推奨していることに注意してください。
- Syslogをアンインストールして、代わりにジャーナルを使用することを検討してください。 Journalは、新しいsystemdシステムのデフォルトのロギングツールです。
- コンソールの出力が遅い場合は、コマンドラインでquietフラグを使用し、システムデバッグログを無効にします。
- cronを削除し、代わりにsystemdタイマーを使用することを検討してください。
- ConsoleKitをプルしないGNOME40のような最新のデスクトップ環境を使用します。
- 不要なブートプロセスまたはサービスを確認して無効にします。起動時に開始するプロセスの数を減らすと、システムの起動が速くなります。
- SysV initスクリプトなどのシェルベースのサービスを削除し、ユニットファイルに置き換えてください。
- Type=forkingとorderingの依存関係の使用は避けてください。代わりに、可能な限り、それらをソケットアクティベーションおよびType=simpleに置き換えてください。これにより、サービスのより並列化された起動が可能になります。
トラブルシューティング
失敗したサービスを調査する
次のコマンドを使用して、開始に失敗したsystemdサービスを検索します。
# systemctl --state=failed
サービスの診断
SYSTEMD_LOG_LEVEL環境変数をdebugに設定することで、サービスに関するトラブルシューティング情報をさらに取得することもできます。
たとえば、systemd-networkdデーモンをデバッグモードで実行するには、サービスのドロップインファイルと次の追加ファイルを追加します。構成。
[Service] Environment=SYSTEMD_LOG_LEVEL=debug
または、次のコマンドを使用して環境変数を手動で設定することもできます。
# SYSTEMD_LOG_LEVEL=debug /lib/systemd/systemd-networkd
設定が完了したら、サービスを再起動し、-f / –followオプションを使用してサービスジャーナルを監視し、すべてのログを表示します。
システムログ
システムログには、起動時間、サービスの起動時刻、システムジョブ、バックグラウンドサービス、失敗したアクティビティなどのシステムアクティビティの履歴が保存されます。 Systemdは、エラー、メッセージ、考えられる解決策の「カタログ」を維持し、見過ごされる可能性のあるログメッセージの重要なコンテキストを強調表示します。 journalctlコマンドを使用してsystemdログを確認できます。
$ journalctl --pager-end
フラグ–pager-endは、journalctl出力の最後からログレビューを開始します。
追加のリソース
- Systemd.unitのマニュアルページ。
- Fedoraプロジェクトのシステムガイド。
- Freedesktop.orgのsystemdの説明。
- SystemdArchWiki。
まとめ
systemdは、systemdユニットを使用してLinuxの起動を管理するための堅牢な方法を提供します。この記事では、systemctlコマンドを使用してユニットファイルを編集し、systemdユニットを管理するさまざまな方法に焦点を当てています。新しいファイルシステムをマウントし、起動時に開始できるようにするために、新しいsystemdマウントユニットを作成する方法を強調しました。最後に、systemdの最適化のヒントと、失敗したサービスのトラブルシューティング方法を共有しました。