不要なSystemdサービスとタイマーを無効化するためのベストプラクティス
Linuxホストを壊さずに、不要なsystemdサービス、ソケット、タイマーを安全に特定、停止、無効化、マスクする方法。
不要なSystemdサービスとタイマーを無効化するためのベストプラクティス
不要なsystemdサービスやタイマーは、起動を遅くし、メモリを消費し、使用していないリスナーを公開する可能性があります。目標はLinuxホストを骨抜きにすることではなく、マシンの役割に合わないユニットを特定し、安全に無効化することです。
このガイドでは、サービス、ソケット、タイマーに関する実践的なレビュープロセスを、各変更の前後に実行できるコマンドとともに説明します。
Systemdユニットタイプの理解
何かを無効化する前に、systemdが管理するさまざまなタイプのユニットを理解することが不可欠です。それらの影響と管理方法は異なります。
- サービス(
.service): 最も一般的なユニットタイプで、デーモンやアプリケーションの実行を担当します(例:sshd.service、nginx.service)。 - タイマー(
.timer): 時間指定に基づいて他のユニット(多くの場合サービス)の実行をスケジュールするために使用され、従来のcronジョブを置き換えます(例:apt-daily.timer)。 - ソケット(
.socket): ネットワークまたはIPCソケットを管理し、多くの場合ソケットアクティベーションに使用されます。これは、関連するソケットでトラフィックを受信したときにのみサービスが起動することを意味します(例:ssh.socket)。
フェーズ1: 実行中および有効化されているユニットの特定
最初のステップは、現在アクティブなものと、自動的に起動するように設定されているものを把握することです。
すべてのアクティブユニットの一覧表示
システム上で現在実行中のものを確認するには、systemctl list-unitsを使用します。
systemctl list-units --type=service --state=running
systemctl list-units --type=timer --state=active
すべての有効化されたユニットの一覧表示(起動時に起動するように設定されたユニット)
enabledとマークされたユニットは再起動後も持続します。これらを確認することは起動の最適化に重要です。
systemctl list-unit-files --type=service | grep enabled
systemctl list-unit-files --type=timer | grep enabled
依存関係の確認
無効化したいユニットが重要なシステム機能の依存関係である場合、それを無効にすると必須サービスが壊れる可能性があります。特定のユニットが必要とするものや、それに依存するものを確認できます。
systemctl list-dependencies <unit_name.service>
フェーズ2: ユニットの安全な無効化とマスク
不要と思われるユニット(例:サーバー上のBluetoothサービス、特定のプリンターサービス)を特定したら、それを停止するための適切な方法を選択する必要があります。
1. サービスの停止(一時的)
次の起動時の動作に影響を与えずに、すぐにサービスを停止したい場合のみ、stopを使用します。
sudo systemctl stop <unit_name.service>
2. サービスの無効化(将来の起動を防ぐ)
ユニットを無効にすると、将来自動的に起動しなくなります。現在実行中のサービスを停止するわけではありません。別途--nowを渡すか、stopを実行する必要があります。
sudo systemctl disable <unit_name.service>
sudo systemctl disable --now <unit_name.service>
3. サービスのマスク(最も強力な方法)
マスクは、ユニットの起動を防ぐ最も強力な方法です。マスクされると、systemdはユニットファイルから/dev/nullへのシンボリックリンクを作成します。これにより、依存関係チェーンを含むあらゆるプロセスが、たとえ別の有効なサービスが明示的にそれを必要としても、ユニットを起動できなくなります。
マスクは注意して使用し、通常は絶対に実行すべきでないと確信しているユニットにのみ使用します。
sudo systemctl mask <unit_name.service>
# マスクを解除するには:
sudo systemctl unmask <unit_name.service>
タイマーとソケットの管理
タイマーは、トリガーするサービスが不要な場合、一般的に無効化する必要があります。ソケットは、ソケットアクティベーションを使用している場合、関連するサービスが要求されるまでリソースを消費しないため、そのままにしておくことがよくあります。ただし、ソケットに関連付けられたサービスが不要な場合、サービスを無効化するだけで十分なことがよくあります。
# 特定のタイマーを無効化
sudo systemctl disable <unit_name.timer>
# 特定のソケットユニットを停止して無効化
sudo systemctl stop <unit_name.socket>
sudo systemctl disable <unit_name.socket>
フェーズ3: 実践的な例とベストプラクティス
これらの概念を適用するには、システムの役割(例:デスクトップ vs サーバー)を慎重に考慮する必要があります。
例1: サーバーでのCUPS(印刷システム)の無効化
Linuxマシンが印刷ハードウェアのないヘッドレスサーバーの場合、CUPSサービスはしばしば不要なオーバーヘッドです。サービスと関連するタイマーの両方を無効化する必要があります。
# 最初にステータスを確認
systemctl status cups.service
# サービスを無効化して停止
sudo systemctl disable --now cups.service
# 関連するディスカバリーサービスが存在する場合は無効化
sudo systemctl disable --now cups-browsed.service
例2: 不要なSnapdサービスへの対処(DNF/APTをネイティブで使用している場合)
一部のディストリビューションはsnapdをインストールします。スナップを使用していない場合は、その主要なサービスコンポーネントを停止して無効化することを検討してもよいでしょう。
sudo systemctl stop snapd.service
sudo systemctl disable snapd.service snapd.socket
⚠️ ディストリビューション固有のサービスに関する警告: ディストリビューションのコアパッケージマネージャー(例:
systemd-networkdやNetworkManagerコンポーネント)によって直接提供されるサービスを無効化する場合は、細心の注意を払ってください。無効化する前にユニットの機能を徹底的に調査してください。そうしないと、ネットワーク接続の喪失やシステムの不安定性につながる可能性があります。
ベストプラクティスのまとめ
- 常に最初に調査する:
disableまたはmaskを実行する前に、特定の.serviceまたは.timerユニットがディストリビューション上で何を行うかをオンラインで検索してください(例:「ModemManager.serviceとは?」)。 disableをmaskより優先する: 起動シーケンスからの標準的な削除にはdisableを使用します。maskは、持続的に問題があるユニットや、完全に排除したいセキュリティリスクのために予約します。- 依存関係を確認する: ユニットAを無効にするとユニットB(必要なもの)が壊れる場合、Aを再度有効にするか、Bの代替メカニズムを見つける必要があります。
- 再起動テスト: 重要な変更を行った後、システムを再起動(
sudo reboot)して、システムが正常に起動し、必須サービスが引き続き動作することを確認します。
変更の確認
コマンドを実行した後は、常にユニットが有効化されておらず、期待通りに実行されていないことを確認します。
# 無効化後のステータスを確認
systemctl status <unit_name.service>
# 出力には 'Loaded: loaded (...; disabled; vendor preset: disabled)' と表示されるはずです
systemdのクリーンアップは、他の本番環境の変更と同様に扱ってください。ユニットを調査し、不明な場合は一時的に停止し、テスト後にのみ無効化し、どのパスでも起動してはならないユニットにはmaskを予約します。これにより、定期的なメンテナンスを復旧作業に変えることなく、より軽量なホストを実現できます。