sysctl 入門 - カーネルパラメータの確認と永続化

sysctl 入門 - カーネルパラメータの確認と永続化

この記事で解決できること

  • sysctlカーネルパラメータを確認・変更 できる
  • sysctl -w一時変更/etc/sysctl.d による 永続化 を使い分けられる
  • 設定が反映されない原因(優先順位・読込タイミング)を切り分けられる

結論(実務の型)

  • 確認sysctl <key>(一覧は sysctl -a
  • 一時変更sudo sysctl -w key=value(再起動で消える)
  • 永続化/etc/sysctl.d/99-custom.conf に書いて sudo sysctl --system

前提(対象環境)

  • Ubuntu 22.04 / 24.04、RHEL 系 9 など systemd 採用ディストリビューション
  • パッケージ: procpsprocps-ng)に含まれる sysctl(8)
  • パラメータ変更には基本的に root 権限(sudo)が必要

sysctl とは何か?

結論: sysctl は実行中カーネルの動作パラメータを /proc/sys/ 経由で確認・変更するツール。キー名はディレクトリ階層に対応する。

sysctl はカーネルが公開する調整可能パラメータ(チューナブル)を読み書きするコマンドだ。実体は仮想ファイルシステム /proc/sys/ 配下のファイルで、sysctl はそれを人間が扱いやすい key = value 形式で操作する薄いラッパーにあたる。

キー名のドットは、ディレクトリ区切りに 1 対 1 で対応する。

# この 2 つは同じ対象を指す
sysctl net.ipv4.ip_forward
cat /proc/sys/net/ipv4/ip_forward
net.ipv4.ip_forward = 0
0

主な名前空間(先頭の階層)は次のとおり。

プレフィックス 管轄領域 代表的なパラメータ
net. ネットワーク net.ipv4.ip_forward / net.core.somaxconn
vm. 仮想メモリ vm.swappiness / vm.overcommit_memory
fs. ファイルシステム fs.file-max / fs.inotify.max_user_watches
kernel. カーネル全般 kernel.hostname / kernel.pid_max

現在の値をどう確認するのか?

結論: 単一値は sysctl <key>、全体は sysctl -a。スクリプトで値だけ欲しいときは -n で名前を省く。

# 単一パラメータ
sysctl vm.swappiness
vm.swappiness = 60
# 全パラメータ(数千行。grep と組み合わせる)
sysctl -a | grep somaxconn
net.core.somaxconn = 4096

値のみを取り出したいときは -n(名前を表示しない)を使う。シェルスクリプトで条件分岐する際に有効だ。

sysctl -n vm.swappiness
60

sysctl -a は root でないと一部パラメータが「permission denied」で読めないことがある。完全な一覧が必要なら sudo sysctl -a を使う。

一時的に値を変更するには?

結論: sudo sysctl -w key=value で即時反映できるが再起動で失われる。動作確認・検証フェーズ向けの手段。

-w(write)で実行中カーネルの値を書き換える。反映は即時だが、再起動すると初期値に戻る

# IP フォワーディングを一時的に有効化
sudo sysctl -w net.ipv4.ip_forward=1
net.ipv4.ip_forward = 1

/proc/sys/ へ直接書き込んでも同じ結果になる。

echo 1 | sudo tee /proc/sys/net/ipv4/ip_forward

sysctl -w はあくまで一時変更。「設定したのに再起動で消えた」は永続化漏れが原因。恒久的に適用するなら次の「永続化」を必ず実施する。

設定を永続化するには?

結論: /etc/sysctl.d/ にドロップインファイルを置き sudo sysctl --system で反映する。/etc/sysctl.conf 直編集より drop-in が推奨。

永続化は設定ファイルに key = value 形式で記述する。現代の systemd 系ディストリビューションでは、/etc/sysctl.conf を直接編集するより /etc/sysctl.d/ 配下にドロップインファイルを作るのが推奨される(パッケージ管理・差分管理がしやすい)。

ファイル名は慣習的に NN-name.confNN は 2 桁の数字)の形式にする。数字が優先順位を決める(後述)。

# 例: スワップを抑え、IP フォワーディングを有効化
sudo tee /etc/sysctl.d/99-custom.conf <<'EOF'
# カスタムカーネルパラメータ
vm.swappiness = 10
net.ipv4.ip_forward = 1
EOF

書いただけでは反映されない。明示的に読み込ませる。

# このファイルだけ読み込む
sudo sysctl -p /etc/sysctl.d/99-custom.conf

# あるいは全設定ファイルを標準ディレクトリから再読込
sudo sysctl --system
* Applying /etc/sysctl.d/99-custom.conf ...
vm.swappiness = 10
net.ipv4.ip_forward = 1

反映の確認を忘れない。書き込み後は必ず sysctl <key> で実値を読み戻し、期待値と一致するか確認する。

sysctl vm.swappiness net.ipv4.ip_forward

起動時は systemd-sysctl.service がこれらのファイルを自動的に適用するため、永続化さえしておけば再起動後も値は維持される。

設定ファイルの優先順位は?

結論: 複数ディレクトリのファイルをファイル名の辞書順でマージし、同名キーは辞書順で後のファイルが勝つ。/etc/ が同名ファイルでは最優先。

sysctl --system は次のディレクトリから *.conf を読み込む。

優先度 ディレクトリ 用途
/etc/sysctl.d/ 管理者のカスタム設定
/run/sysctl.d/ 実行時に生成される一時設定
/usr/lib/sysctl.d/ パッケージ同梱のデフォルト

ルールは 2 段階だ。

  1. ファイル名の辞書順でマージされる(ディレクトリをまたいで比較)。同じキーが複数ファイルにあれば、ファイル名が辞書順で後(大きい)の方が勝つ。だから 99-custom.conf のように大きい番号を付けると上書きしやすい。
  2. 同名ファイルが複数ディレクトリに存在する場合、/etc/ のものが /run//usr/lib/ のものを上書きする(無効化したいときは /etc/sysctl.d/ に同名の空ファイルを置く)。
# どのファイルがどのキーを設定しているか追う
grep -Rn swappiness /etc/sysctl.conf /etc/sysctl.d/ /usr/lib/sysctl.d/ /run/sysctl.d/ 2>/dev/null

/etc/sysctl.conf も読み込み対象だが、これは歴史的な単一ファイル。新規設定は drop-in(/etc/sysctl.d/*.conf)に分けた方が、どの設定がどこ由来か追いやすい。

よく使うパラメータの実例

結論: メモリ・ネットワーク・ファイルディスクリプタ系が実務頻出。意味を理解せず値だけコピペしない。

パラメータ 役割 よく使う値の例
vm.swappiness スワップの積極度(0〜100、低いほどRAM優先) DB サーバで 10
vm.overcommit_memory メモリオーバーコミット方針 Redis 等で 1
net.ipv4.ip_forward パケット転送(ルータ/コンテナで必須) 1
net.core.somaxconn accept キューの最大長 高負荷 Web で 4096
fs.file-max システム全体のファイルハンドル上限 大量接続サーバで増やす
fs.inotify.max_user_watches inotify 監視数上限 IDE/ビルドツールで増やす

反映されないときの切り分け

結論: 「権限」「読込忘れ」「上書き」「キー不在」の 4 点を順に確認する。

  • 権限不足: sysctl -w には sudo が必要。Operation not permitted は権限かコンテナ制約(特権なしコンテナでは多くの sysctl が書込不可)。
  • 読込忘れ: ファイルを書いただけでは未反映。sudo sysctl --system(または -p)を実行したか確認する。
  • 他ファイルの上書き: 値が戻る場合、辞書順で後のファイルが上書きしている。grep -R <key> /etc/sysctl.d /usr/lib/sysctl.d で犯人を特定する。
  • キー名の誤り / 不在: sysctl: cannot stat ... はキー名のタイプミスか、対象モジュール未ロード。sysctl -e で未知キーのエラーを無視しつつ、正しい名前を sysctl -a | grep で探す。
# 起動時適用ログを確認(systemd 系)
journalctl -u systemd-sysctl

まとめと次に読む

sysctl は「確認は sysctl <key>、一時変更は -w、永続化は /etc/sysctl.d/ + --system」という 3 つの型を押さえれば実務は回る。一時変更で検証してから永続化する順序と、変更後の値の読み戻し確認を習慣にすれば事故は防げる。