これは、なにをしたくて書いたもの?
Linuxのカーネルパラメーターを表示したり変更したりするやり方を、いつも忘れるのでいい加減にメモしておこうかなと。
環境
今回の確認環境は、こちらです。
$ lsb_release -a No LSB modules are available. Distributor ID: Ubuntu Description: Ubuntu 20.04.1 LTS Release: 20.04 Codename: focal $ uname -srvmpio Linux 5.4.0-64-generic #72-Ubuntu SMP Fri Jan 15 10:27:54 UTC 2021 x86_64 x86_64 x86_64 GNU/Linux
Ubuntu Linux 20.04 LTSです。
sysctlとsysctl.conf
今回のインプットは、こちら。
sysctl
、sysctl.conf
のドキュメントです。
sysctl.conf(5) - Linux manual page
ヘルプの確認。
$ sysctl --help Usage: sysctl [options] [variable[=value] ...] Options: -a, --all display all variables -A alias of -a -X alias of -a --deprecated include deprecated parameters to listing -b, --binary print value without new line -e, --ignore ignore unknown variables errors -N, --names print variable names without values -n, --values print only values of the given variable(s) -p, --load[=<file>] read values from file -f alias of -p --system read values from all system directories -r, --pattern <expression> select setting that match expression -q, --quiet do not echo variable set -w, --write enable writing a value to variable -o does nothing -x does nothing -d alias of -h -h, --help display this help and exit -V, --version output version information and exit For more details see sysctl(8).
また、/etc/sysctl*
なディレクトリやファイルはこのようになっています。
$ find /etc/sysctl* -type f /etc/sysctl.conf /etc/sysctl.d/README.sysctl /etc/sysctl.d/10-magic-sysrq.conf /etc/sysctl.d/10-kernel-hardening.conf /etc/sysctl.d/10-console-messages.conf /etc/sysctl.d/10-zeropage.conf /etc/sysctl.d/10-network-security.conf /etc/sysctl.d/10-ptrace.conf /etc/sysctl.d/10-link-restrictions.conf /etc/sysctl.d/10-ipv6-privacy.conf
現在のカーネルパラメーターを表示する
現在のカーネルパラメーターをすべて表示するには、sysctl -a
を使います。
$ sudo sysctl -a
なお、パラメーターを表示するのにsudo
を付けなくてもいいのですが、一部権限で見れないものがあったりするので、今回は一律
sudo
を付けています。
特定のパラメーターを表示する場合は、sysctl
の後にその名前を指定します。
$ sudo sysctl vm.max_map_count vm.max_map_count = 65530
今回のエントリでは、カーネルパラメーターの例としてはvm.max_map_count
を使うことにします。
-n
を付けると、値だけになります。
$ sudo sysctl -n vm.max_map_count 65530
-N
を付けると、名前だけになります。
$ sudo sysctl -N vm.max_map_count vm.max_map_count
また、/proc/sys
配下を見てもOKです。
$ cat /proc/sys/vm/max_map_count 65530
現在の値の確認は、こんな感じですね。
カーネルパラメーターを変更する
次に、カーネルパラメーターの変更を行います。
カーネルパラメーターを変更する際には、その変更を永続化するケースと、一時的な変更(再起動すると戻ってしまう)とするケースの
2つがあります。
変更を永続化する
変更を永続化する場合、/etc/sysctl.conf
に対象のパラメーターと値を記述します。
こんな感じです。項目名 = 値
で指定します。=
の前後にスペースがあってもかまいません。
/etc/sysctl.conf
vm.max_map_count = 262144
もちろん、書いただけでは変わりません。
$ sudo sysctl vm.max_map_count vm.max_map_count = 65530
sysctl -p
での反映が必要です。
$ sudo sysctl -p
反映されました。
$ sudo sysctl vm.max_map_count vm.max_map_count = 262144
OSを再起動しても、/etc/sysctl.conf
に記載した内容になっています。
$ sudo reboot ... $ sudo sysctl vm.max_map_count vm.max_map_count = 262144
ちなみに、もとに戻したい場合は/etc/sysctl.conf
ファイルに書いた項目を削除してsysctl -p
を実行してもすぐには意味がありません。
デフォルト値でよければ/etc/sysctl.conf
に記載した項目を削除してsysctl -p
に変更後、OSを再起動します。
それ以外の値にしたかったら、あらためて設定しましょう。
Ubuntu Linux(およびDebian)の場合
Ubuntu Linux(およびDebian)の場合、/etc/sysctl.d
ディレクトリ配下に.conf
拡張子のファイルを作成してカーネルパラメーターを
設定することもできます。
ファイル名はなんでもよいのですが、拡張子は.conf
である必要があります。ファイルの書き方はsysctl.conf
と同じです。
/etc/sysctl.d/README.sysctl
Kernel system variables configuration files Files found under the /etc/sysctl.d directory that end with .conf are parsed within sysctl(8) at boot time. If you want to set kernel variables you can either edit /etc/sysctl.conf or make a new file. The filename isn't important, but don't make it a package name as it may clash with something the package builder needs later. It must end with .conf though. My personal preference would be for local system settings to go into /etc/sysctl.d/local.conf but as long as you follow the rules for the names of the file, anything will work. See sysctl.conf(8) man page for details of the format. After making any changes, please run "service procps reload" (or, from a Debian package maintainer script "deb-systemd-invoke restart procps.service").
今回は、/etc/sysctl.d/local.conf
というファイルで用意します。
/etc/sysctl.d/local.conf
vm.max_map_count = 262144
この変更を反映するには、sysctl -p
を実行しても効果がありません。procps
というサービスを再起動します。
$ sudo systemctl restart procps
反映されました。
$ sudo sysctl vm.max_map_count vm.max_map_count = 262144
再起動しても、ファイルに記述していればその設定は残ります。
$ sudo reboot ... $ sudo sysctl vm.max_map_count vm.max_map_count = 262144
記載した項目と値を削除してprocps
を再起動しても効果がないのは、sysctl -p
の時と同じです。
デフォルト値に戻すのならOSを再起動、そうでないなら値を改めて設定しましょう。
変更を一時的なものにする
次は、カーネルパラメーターを変更しますが、その変更は一時的なものにします。要するに、再起動すると元に戻ります。
まずは、今の値を表示。
$ sudo sysctl vm.max_map_count vm.max_map_count = 65530
一時的にカーネルパラメーターを変更するには、sysctl -w [項目名]=[値]
で指定します。sysctl.conf
と違い、こちらは=
の前後に
スペースがあってはいけません。
$ sudo sysctl -w vm.max_map_count=262144 ## または ### $ sudo sysctl vm.max_map_count=262144 vm.max_map_count = 262144
以前は-w
オプションが必要だみたいなことが書かれていたのですが、今のmanを見るとその記述はありませんし、実際に反映も
行われますね。
variable=value
To set a key, use the form variable=value where variable is the key and value is the value to set it to. If the value contains quotes or characters which are parsed by the shell, you may need to enclose the value in double quotes.
確認。
$ sudo sysctl vm.max_map_count vm.max_map_count = 262144
値が変わりました。
再起動すると、デフォルト値に戻ることも確認できます。
$ sudo reboot ... $ sudo sysctl vm.max_map_count vm.max_map_count = 65530
ちなみに、即時に変更しつつその内容を永続化する場合は、以下のようにsysctl -w
の内容を/etc/sysctl.conf
に追記するという
方法もあるようです。
$ sudo sh -c 'sysctl -w vm.max_map_count=262144 >> /etc/sysctl.conf' $ sudo sysctl vm.max_map_count vm.max_map_count = 262144 $ sudo reboot ... $ sudo sysctl vm.max_map_count vm.max_map_count = 262144
sysctl -w
を使う方法以外では、/proc/sys
配下に直接書き込むという方法もあります。
$ sudo sh -c 'echo 262144 > /proc/sys/vm/max_map_count'
確認。
$ sudo sysctl vm.max_map_count vm.max_map_count = 262144
こちらも、再起動するとデフォルト値に戻ります。
$ sudo reboot ... $ sudo sysctl vm.max_map_count vm.max_map_count = 65530
ひととおり確認できたのではないでしょうか。