sysctl (日本語) - ArchWiki

# sysctl (日本語)

sysctl は稼働中のカーネルパラメータを確認・変更するためのツールです (公式リポジトリの procps-ng パッケージ)。sysctl は procfs (`/proc/` の仮想プロセスファイルシステム) で実装されています。

## 設定

Note: バージョン 207 から、systemd は `/etc/sysctl.d/*` と `/usr/lib/sysctl.d/*` の設定だけを適用するようになっています。`/etc/sysctl.conf` をカスタマイズしていた場合は、ファイルの名前を `/etc/sysctl.d/99-sysctl.conf` のように変更する必要があります。

sysctl のプリロード/設定ファイルは `/etc/sysctl.d/99-sysctl.conf` に作成することができます。systemd では、`/etc/sysctl.d/` と `/usr/lib/sysctl.d/` はカーネルの sysctl パラメータにどちらも使えるディレクトリです。名前と元のディレクトリによって処理される順番が決まります。最後のパラメータによって前の方のパラメータが置き換えられるので順番は重要です。例えば、`/usr/lib/sysctl.d/50-default.conf` に書かれたパラメータは `/etc/sysctl.d/50-default.conf` や両方のディレクトリよりも後に処理される設定ファイルにある同じパラメータによって置き換えられます。

全ての設定ファイルを手動でロードするには、次を実行します:

    # sysctl --system

適用される階層が出力されます。単一のパラメータファイルを指定してロードすることも可能です:

    # sysctl -p filename.conf

詳しくは the new configuration files や systemd の sysctl.d man ページ を見て下さい。

利用可能なパラメータは `/proc/sys/` 以下に並んでいます。例えば、`kernel.sysrq` パラメータはファイルシステム上の `/proc/sys/kernel/sysrq` ファイルにあたります。`sysctl -a` コマンドを使うことで現在利用可能な値を全て表示することができます。

Note: カーネルドキュメントをインストールしている場合 (linux-docs)、sysctl 設定に関する詳細な情報が `/usr/lib/modules/$(uname -r)/build/Documentation/sysctl/` で読めます。sysctl 設定を変更する前にこれらを一読することが強く推奨されています。

設定の変更はファイルの操作によるか `sysctl` ユーティリティを使って行います。例えば、一時的にマジック SysRq キーを有効にするには:

    # sysctl kernel.sysrq=1

もしくは:

    # echo "1" > /proc/sys/kernel/sysrq

再起動後も変更を維持させるには、`/etc/sysctl.d/99-sysctl.conf` や他の `/etc/sysctl.d/` 内の適用されるパラメータファイルに適切な行を追加・編集してください。

Tip: 適用することができるパラメータがロードされないカーネルモジュールに依存していることもあります。例えば `/proc/sys/net/bridge/*` のパラメータは `bridge` モジュールに依存しています。モジュールが実行時に (または再起動後) ロードされない場合、パラメータはひっそりと適用されないことになります。カーネルモジュール#ロードを見て下さい。

## セキュリティ

セキュリティ#カーネルの防御を見て下さい。

## ネットワーク

### パフォーマンスを向上させる

Warning: This may cause dropped frames with load-balancing and NATs, only use this for a server that communicates only over your local network.

    # reuse/recycle time-wait sockets
    net.ipv4.tcp_tw_reuse = 1
    net.ipv4.tcp_tw_recycle = 1

### TCP/IP スタックの防御

以下では IPv4 プロトコルでカーネルのネットワークセキュリティを厳しくするオプションのパラメータセットを示しています。同一の効果がある IPv6 パラメータも存在します。

ユースケースによって、例えばルーターとして使用するシステムで、他のパラメータが役に立ったり必要になることもあります。

    #### ipv4 networking and equivalent ipv6 parameters ####

    ## TCP SYN cookie protection (default)
    ## helps protect against SYN flood attacks
    ## only kicks in when net.ipv4.tcp_max_syn_backlog is reached
    net.ipv4.tcp_syncookies = 1

    ## protect against tcp time-wait assassination hazards
    ## drop RST packets for sockets in the time-wait state
    ## (not widely supported outside of linux, but conforms to RFC)
    net.ipv4.tcp_rfc1337 = 1

    ## tcp timestamps
    ## + protect against wrapping sequence numbers (at gigabit speeds)
    ## + round trip time calculation implemented in TCP
    ## - causes extra overhead and allows uptime detection by scanners like nmap
    ## enable @ gigabit speeds
    net.ipv4.tcp_timestamps = 0
    #net.ipv4.tcp_timestamps = 1

    ## log martian packets
    net.ipv4.conf.all.log_martians = 1

    ## ignore echo broadcast requests to prevent being part of smurf attacks (default)
    net.ipv4.icmp_echo_ignore_broadcasts = 1

    ## ignore bogus icmp errors (default)
    net.ipv4.icmp_ignore_bogus_error_responses = 1

    ## send redirects (not a router, disable it)
    net.ipv4.conf.all.send_redirects = 0

    ## ICMP routing redirects (only secure)
    #net.ipv4.conf.all.secure_redirects = 1 (default)
    net/ipv4/conf/default/accept_redirects=0
    net/ipv4/conf/all/accept_redirects=0
    net/ipv6/conf/default/accept_redirects=0
    net/ipv6/conf/all/accept_redirects=0

## 仮想メモリ

Linux カーネルの仮想メモリ (VM) サブシステムの制御やダーティデータのディスクへの書き出しを調整するパラメータがいくつか存在します。詳しくは Linux カーネルドキュメントを見て下さい。

    # Contains, as a percentage of total system memory, the number of pages at which
    # a process which is generating disk writes will start writing out dirty data.
    vm.dirty_ratio = 3

    # Contains, as a percentage of total system memory, the number of pages at which
    # the background kernel flusher threads will start writing out dirty data.
    vm.dirty_background_ratio = 2

コメントで説明されているように、これらの値を設定する際は RAM の合計量を考慮する必要があります。

- `vm.dirty_ratio` のデフォルトは 10 です (RAM の 10%)。RAM が 1GB の半分のときは RAM の 10% というのがコンセンサスで (つまり 10% は 50 MB 以下) 磁気ディスクならば合理的な値です。ただし RAM が大きい、例えば 16 GB のときは (10% は 1.6 GB 以下) 磁気ディスクにライトバックするのに数秒かかるのであまり良くありません。この場合に合理的な値は 3 です (16*0.03 ~ 491 MB)。

- `vm.dirty_background_ratio` は同じように、メモリが少ない時はデフォルトの 5 (% の RAM) が丁度良いですが、システムの RAM の量によって調整するべきです。

## トラブルシューティング

### 定期的にシステムがフリーズする

ダーティバイトを十分小さい値に設定 (例えば 4M):

    vm.dirty_background_bytes = 4194304
    vm.dirty_bytes = 4194304

`kernel.io_delay_type` を変更してみる (x86 のみ):

- 0 - IO_DELAY_TYPE_0X80
- 1 - IO_DELAY_TYPE_0XED
- 2 - IO_DELAY_TYPE_UDELAY
- 3 - IO_DELAY_TYPE_NONE

## 参照

- sysctl(8) と sysctl.conf(5) の man ページ
- Linux カーネルドキュメント (`<kernel source dir>/Documentation/sysctl/`)
- カーネルドキュメント: IP Sysctl
- SysCtl.conf Tweaked for Security and Cable Speed [1]

Category:

- Kernel (日本語)