Linuxサーバーをインストールした直後は、用途に関係なく多くのサービスが自動起動しています。使わないサービスはCPUやメモリをわずかに消費し続けるだけでなく、不要なネットワークポートを開いたままにするという点でセキュリティ上の問題でもあります。サーバー構築直後の「サービス棚卸し」は、性能とセキュリティ両面に効く必須作業です。
旧来の chkconfig や service コマンドはSysV init向けの仕組みです。現代のディストリビューション(RHEL/Rocky 7以降・Ubuntu 16.04以降・Debian 8以降)はすべてsystemdに移行しているため、systemctl で一元管理するのが正しいアプローチです。本記事ではsystemdベースの環境を前提に手順を解説します。
起動中・自動起動が有効なサービスをまず把握する
何が動いているかを確認せずに止めると、依存するサービスまで巻き込んで停止させてしまう可能性があります。作業の第一歩は現状把握です。
現在起動中のサービスを一覧表示するには次のコマンドを使います。
# 起動中のサービスを一覧表示
systemctl list-units --type=service --state=running
次回起動時に自動で立ち上がるよう設定(enabled)されているサービスを確認するには以下を実行します。
# 自動起動が有効なサービスを一覧表示
systemctl list-unit-files --type=service --state=enabled
サービス名に心当たりがなければ systemctl status <サービス名> を実行してください。出力の Description 欄にそのサービスの役割が表示されるため、止めてよいかどうかの判断材料になります。
サービスを即時停止し、再起動後も無効にする
サービスを完全に止めるには「今すぐ止める(stop)」と「次回起動時も自動起動しないようにする(disable)」の2操作が必要です。stop だけではサーバーを再起動すると元に戻ります。逆に disable だけでは今現在動いているサービスは止まりません。
両方を一度にまとめて実行するには --now オプションを使います。これが最も確実で手間の少ない方法です。
# 停止 + 自動起動無効化を同時に実行(推奨)
sudo systemctl disable --now <サービス名>
# 例: cups(印刷サービス)を止める場合
sudo systemctl disable --now cups
ステップを分けて確認しながら進めたい場合は、次のように2段階で行います。
# ① 今すぐ停止(この操作だけでは再起動後に元に戻る)
sudo systemctl stop <サービス名>
# ② 次回起動時から自動起動しないよう設定
sudo systemctl disable <サービス名>
作業後は必ずステータスを確認します。
systemctl status <サービス名>
出力の中に Active: inactive (dead) と Loaded: ... disabled; が表示されていれば、停止と無効化の両方が正しく完了しています。
停止候補になりやすい主なサービス
どのサービスを止めるかはサーバーの用途によって異なります。ただし、サーバー用途では不要になりやすいものとして以下が代表的です。止める前に、その環境で実際に使われていないことを必ず確認してください。
# 印刷サービス(ヘッドレスサーバーでは不要なことが多い)
sudo systemctl disable --now cups cups-browsed
# Bluetooth(物理サーバー・仮想マシンでは不要なことが多い)
sudo systemctl disable --now bluetooth
# mDNS / Avahi(ローカルホスト名解決が不要な場合)
sudo systemctl disable --now avahi-daemon
# モデム管理(クラウド・仮想環境では不要)
sudo systemctl disable --now ModemManager
postfix はローカルのメール配送に使われることがあり、cron や atd の実行結果をroot宛に送る経路になっている場合もあります。完全に不要だと確信できる環境でなければ、慎重に判断してください。
依存関係を確認してから止める
systemdのサービスには Requires・Wants といった依存関係が設定されているものがあります。あるサービスを止めると、それに依存している別のサービスが連動して停止することがあります。止める前に逆方向の依存関係を確認する習慣をつけておくと安全です。
# 「このサービスに依存しているユニット」を表示(逆依存の確認)
systemctl list-dependencies --reverse <サービス名>
ある運用現場では avahi-daemon を止めたところ、ローカルで動かしていたmDNS依存のアプリが名前解決できなくなり、一時的にサービス障害が起きたケースがありました。依存関係の確認は手間を惜しまず実施することをおすすめします。
二度と起動させたくないサービスには mask を使う
disable は自動起動を無効にするだけで、手動で systemctl start を実行すれば再起動できます。他の管理者が誤って有効化するリスクが気になる場合や、絶対に起動させたくないサービスには mask が有効です。
# サービスを完全に無効化(手動起動も不可にする)
sudo systemctl mask <サービス名>
# mask を解除する場合
sudo systemctl unmask <サービス名>
mask を実行すると、ユニットファイルが /dev/null へのシンボリックリンクに置き換えられます。start を試みると「Unit is masked」エラーになるため、意図しない起動を確実に防げます。通常の運用では disable で十分ですが、セキュリティ要件が厳しい環境では mask を選択肢に加えてください。
作業後の確認と元に戻す手順
サービスを無効化したら、実際にサーバーを再起動して設定が維持されているか確認するのが確実です。再起動後に以下を実行し、disabled のまま inactive になっているかを確認します。
# 再起動後のステータス確認
systemctl status <サービス名>
# enabled / disabled の状態だけを素早く確認
systemctl is-enabled <サービス名>
本番サーバーで再起動が難しい場合でも、少なくとも systemctl is-enabled で disabled が返ることを確認しておきましょう。
間違えて必要なサービスを止めてしまった場合は enable --now で元の状態に戻せます。この操作は冪等なので、すでに起動していても問題ありません。
# 自動起動を再び有効にして即時起動
sudo systemctl enable --now <サービス名>
不要なサービスの整理はサーバー構築直後の必須作業ですが、一度に大量に止めるより1サービスずつ依存関係を確認しながら進めるほうが、後処理のコストを大幅に減らせます。変更前にはどのサービスを止めたかをメモしておくと、問題が起きたときの切り戻しがスムーズです。
<PR>この記事に関連するおすすめ書籍
systemdによるサービス管理の仕組みを図解で理解できる一冊。どの常駐サービスを止めてよいかの判断力が身につきます。
「コマンドは打てる。次は”現場で通用する型”を最短で身につけたい」——そんなあなたへ。
ネットの断片的なTipsをコピペするだけでは、体系的な運用スキルはなかなか積み上がりません。リナックスマスター.JPの無料メルマガ「リナマガ」では、現場で実際に使うLinuxサーバー運用の考え方を、順を追って実務目線でお届けしています。いま登録された方には、安全なサーバー構築の「型」をまとめた『Linuxサーバー構築入門マニュアル(図解60P)』を完全無料でプレゼント中です。
>> 図解60P『Linux入門マニュアル』を無料で受け取る
(メルマガ登録は10秒・いつでも解除OK)
※ 「独学の時間がもったいない」「プロから現場の技術を最短で学びたい」という本気の方には、2日で実務レベルが身につく初心者向けハンズオンセミナーもご用意しています。

コメント