CLOVER🍀

That was when it all began.

Linuxのカーネルパラメーターを表示・変更する

これは、なにをしたくて書いたもの?

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のドキュメントです。

Man page of SYSCTL

Man page of SYSCTL.CONF

sysctl(8) - Linux manual page

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

ひととおり確認できたのではないでしょうか。