サーバー設定作業の途中でサービスの自動起動を誤って変えてしまった、あるいは「もともとどの設定が正しかったのか」わからなくなった場合、systemctl preset を使うと対象サービスの自動起動設定をパッケージ既定値に一発で戻せます。
# 例:chronyd の自動起動設定を既定値に戻す(root 権限が必要)
sudo systemctl preset chronyd
# 変更後の状態を確認
systemctl is-enabled chronyd
以下では、状態の確認方法・手動での切り替え・preset の仕組み・一括リセット時の注意点の順に解説します。
現在の自動起動状態を確認する
作業に入る前に、変更対象のサービスが現在どのような状態にあるかを把握しておきます。特定サービスだけ確認するなら is-enabled、全体を見渡すなら list-unit-files が便利です。
# 特定サービスの自動起動状態を確認
systemctl is-enabled chronyd
# → enabled / disabled / static / masked などが返る
# インストール済みの全サービスを一覧表示
systemctl list-unit-files --type=service
# enabled / disabled に絞り込む
systemctl list-unit-files --type=service | grep -E "^[^ ]+ +(enabled|disabled)"
返り値の意味は以下のとおりです。static は「他のユニットから依存参照されることで起動するが、単独では自動起動しない」状態です。masked は強制的に無効化された状態で、enable しても有効になりません。マスクされているサービスを有効化するには、先に sudo systemctl unmask <サービス名> でマスクを解除する必要があります。
自動起動を手動で有効・無効にする
特定のサービスだけ自動起動を切り替えるには systemctl enable / systemctl disable を使います。--now オプションを付けると、設定変更と同時に即時起動・停止も行われるため、再起動を待たずに状態を反映させたい場面で重宝します。
# 自動起動を有効にする(次回起動から反映)
sudo systemctl enable chronyd
# 有効化して今すぐ起動も行う
sudo systemctl enable --now chronyd
# 自動起動を無効にする
sudo systemctl disable chronyd
# 無効化して今すぐ停止も行う
sudo systemctl disable --now chronyd
手動で enable / disable を繰り返すうちに「本来の既定値はどちらだったか」が不明になるケースがあります。そのような場合に活用するのが、次に説明する preset です。
preset でパッケージ既定値に戻す仕組み
systemctl preset は、ディストリビューションやパッケージが用意したプリセット定義ファイルを参照し、enable か disable かを自動で適用するコマンドです。定義ファイルは /usr/lib/systemd/system-preset/ 以下の *.preset ファイルに記述されています。
# プリセット定義ファイルを確認する
ls /usr/lib/systemd/system-preset/
# 内容を確認する(AlmaLinux 9 / Rocky Linux 9 の例)
cat /usr/lib/systemd/system-preset/90-default.preset
# 対象サービスを既定値に戻す
sudo systemctl preset chronyd
# 複数サービスをまとめて戻すことも可能
sudo systemctl preset sshd chronyd firewalld
ある運用現場では、新規サーバーの構築作業中に手順書のコピペミスで sshd の自動起動が外れた状態のまま納品されたことがありました。再起動後に SSH 接続できなくなって発覚したケースで、次回からは systemctl preset sshd を構築完了チェックリストに加えるようになったそうです。
プリセット定義に記載されていないサービスは preset を実行しても何も変わりません。サードパーティ製パッケージや自作のサービスユニットはプリセット未登録であることが多く、その場合は手動で enable / disable を判断します。
全サービスを一括リセットする場合の注意点
すべてのサービスのプリセットを一度に適用したい場合は systemctl preset-all を使います。ただし、手動で追加した enable 設定も含めてすべて上書きされるため、本番環境での実行は十分に注意が必要です。
# 実行前に現在の状態を記録しておく(preset-all には --dry-run がない)
systemctl list-unit-files --type=service > /tmp/before-preset-all.txt
# 全サービスを既定値にリセット(本番環境では要注意)
sudo systemctl preset-all
# 適用後の状態と比較する
systemctl list-unit-files --type=service > /tmp/after-preset-all.txt
diff /tmp/before-preset-all.txt /tmp/after-preset-all.txt
preset-all は --dry-run に相当するオプションを持たないため、実行前に必ず現在の状態をファイルへ保存してください。誤って適用した場合の復旧は、diff の出力を見ながら個別に enable / disable を再実行するしかなく、手間がかかります。定期的な初期化が目的の場合は、対象サービスを個別に指定する運用が安全です。
旧来の環境からの移行で押さえるコマンド対応
CentOS 6 以前の chkconfig ベースの環境から移行した担当者向けに、主要コマンドの対応関係を整理します。
# 【状態確認】
# chkconfig --list → systemctl list-unit-files --type=service
# chkconfig --list ntpd → systemctl is-enabled chronyd
# 【自動起動の切り替え】
# chkconfig ntpd on → systemctl enable chronyd
# chkconfig ntpd off → systemctl disable chronyd
# chkconfig ntpd reset → systemctl preset chronyd
# 【サービスの操作】
# service ntpd status → systemctl status chronyd
# service ntpd restart → systemctl restart chronyd
旧来の chkconfig reset に相当するのが systemctl preset です。ランレベル(0〜6)の概念は systemd ではターゲット(multi-user.target、graphical.target など)に置き換わっています。chkconfig でランレベルごとに on/off を細かく指定していたケースは、systemd ではユニットファイル内の WantedBy= ディレクティブで対象ターゲットを指定する形になります。
AlmaLinux 9 / Rocky Linux 9 / Ubuntu 22.04 以降では chkconfig コマンド自体がデフォルトでインストールされていません。既存の構築スクリプトや手順書に chkconfig が残っている場合は、systemctl ベースへの書き直しを計画的に進めることをお勧めします。
「コマンドは打てる。次は”現場で通用する型”を最短で身につけたい」——そんなあなたへ。
ネットの断片的なTipsをコピペするだけでは、体系的な運用スキルはなかなか積み上がりません。リナックスマスター.JPの無料メルマガ「リナマガ」では、現場で実際に使うLinuxサーバー運用の考え方を、順を追って実務目線でお届けしています。いま登録された方には、安全なサーバー構築の「型」をまとめた『Linuxサーバー構築入門マニュアル(図解60P)』を完全無料でプレゼント中です。
>> 図解60P『Linux入門マニュアル』を無料で受け取る
(メルマガ登録は10秒・いつでも解除OK)
※ 「独学の時間がもったいない」「プロから現場の技術を最短で学びたい」という本気の方には、2日で実務レベルが身につく初心者向けハンズオンセミナーもご用意しています。
