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 採用ディストリビューション
- パッケージ:
procps(procps-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.conf(NN は 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 段階だ。
- ファイル名の辞書順でマージされる(ディレクトリをまたいで比較)。同じキーが複数ファイルにあれば、ファイル名が辞書順で後(大きい)の方が勝つ。だから
99-custom.confのように大きい番号を付けると上書きしやすい。 - 同名ファイルが複数ディレクトリに存在する場合、
/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/ビルドツールで増やす |
パラメータの意味を理解せずに「チューニング設定例」を丸ごとコピペするのは危険。本番に入れる前にステージングで sysctl -w の一時変更で挙動を確認し、問題なければ永続化する、という順序を守る。
反映されないときの切り分け
結論: 「権限」「読込忘れ」「上書き」「キー不在」の 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