tanke25616429のアウトプット

IT技術の基本を勉強したことをアウトプットします。Linux、Kubernetes、クラウド中心です。百番煎じくらいだけど誰かの役に立てばそれはそれでうれしい。

カーネルパラメータの設定方法(CentOS 8)

カーネルパラメータの設定箇所

世の中の記事では、net.ipv4.ip_forwardをはじめとしたカーネルパラメータは/etc/sysctl.confに記述するとあるが、ほかのファイルに分散されて書かれていることがある。 筆者の手元にある、CentOS 8では以下のように書かれていた。

[root@localhost ~]# cat /etc/sysctl.conf
# sysctl settings are defined through files in
# /usr/lib/sysctl.d/, /run/sysctl.d/, and /etc/sysctl.d/.
#
# Vendors settings live in /usr/lib/sysctl.d/.
# To override a whole file, create a new file with the same in
# /etc/sysctl.d/ and put new settings there. To override
# only specific settings, add a file with a lexically later
# name in /etc/sysctl.d/ and put new settings there.
#
# For more information, see sysctl.conf(5) and sysctl.d(5).

To override a whole file, create a new file with the same in /etc/sysctl.d/ and put new settings there.とあるので、/etc/sysctl.dに自分がデフォルトから変えたいカーネルパラメータを記述したファイルを置くと思われる。 /etc/sysctl.dを見てみる。99-sysctl.confというファイルのみが置かれているが、/etc/sysctl.confへのシンボリックリンクになっている。

[root@localhost ~]# ls -lhtra /etc/sysctl.d/99-sysctl.conf
lrwxrwxrwx. 1 root root 14 Apr 23  2020 /etc/sysctl.d/99-sysctl.conf -> ../sysctl.conf

つまり、/etc/sysctl.confのファイルも含め、/etc/sysctl.d配下に置かれたファイルがユーザ設定として上書きされる。

Vendors settings live in /usr/lib/sysctl.d/とあるので、CentOSディストリビューションに同梱されているアプリケーションの設定に関わるカーネルパラメータがここにあると想定される。

[root@localhost ~]# ls -lhtr /usr/lib/sysctl.d/
total 24K
-rw-r--r--. 1 root root  246 May 11  2019 50-libkcapi-optmem_max.conf
-rw-r--r--. 1 root root  636 Apr 23  2020 50-pid-max.conf
-rw-r--r--. 1 root root 1.3K Apr 23  2020 50-default.conf
-rw-r--r--. 1 root root  524 Apr 23  2020 50-coredump.conf
-rw-r--r--. 1 root root 1.8K Apr 24  2020 10-default-yama-scope.conf
-rw-r--r--. 1 root root  499 May 28  2020 60-libvirtd.conf

デフォルトでは/run/sysctl.dは存在しなかった。

[root@localhost ~]# ls -lhtr /run/sysctl.d
ls: cannot access '/run/sysctl.d': No such file or directory

設定例

試しにパケット転送を制御するカーネルパラメータであるnet.ipv4.ip_forwardを設定してみる。デフォルトではオフ(=0)になっている。なお、カーネルパラメータは<TUNABLE_CLASS>.<PARAMETER>=<TARGET_VALUE>という形式になる。この例では<TUNABLE_CLASS>netipv4<PARAMETER>ip_forward<TARGET_VALUE>が0か1、という具合である*1

[root@localhost ~]# sysctl -a | grep net.ipv4.ip_forward
net.ipv4.ip_forward = 0
net.ipv4.ip_forward_update_priority = 1
net.ipv4.ip_forward_use_pmtu = 0

/proc/sys/<TUNABLE_CLASS>/<PARAMETER>カーネルパラメータの<TARGET_VALUE>のみが記載されたテキストファイルがあり*2、それでも確認可能*3

[root@localhost ~]# cat /proc/sys/net/ipv4/ip_forward
0

設定ファイルを作成し*4、設定を反映する。

[root@localhost ~]# echo "net.ipv4.ip_forward = 1" > /etc/sysctl.d/net.ipv4.ip_forward.conf
[root@localhost ~]# cat /etc/sysctl.d/net.ipv4.ip_forward.conf
net.ipv4.ip_forward = 1
[root@localhost ~]# sysctl -p /etc/sysctl.d/net.ipv4.ip_forward.conf
net.ipv4.ip_forward = 1

設定が反映されている。

[root@localhost ~]# sysctl -a | grep net.ipv4.ip_forward
net.ipv4.ip_forward = 1
net.ipv4.ip_forward_update_priority = 1
net.ipv4.ip_forward_use_pmtu = 0
[root@localhost ~]# cat /proc/sys/net/ipv4/ip_forward
1

ちなみに、再起動後も反映されている。

[root@localhost ~]# reboot
(略)
localhost login: root
Password:
Last login: Fri Jan 15 19:49:21 on ttyS0
[root@localhost ~]# sysctl -a | grep net.ipv4.ip_forward
net.ipv4.ip_forward = 1
net.ipv4.ip_forward_update_priority = 1
net.ipv4.ip_forward_use_pmtu = 0
[root@localhost ~]# cat /proc/sys/net/ipv4/ip_forward
1

参考にしたもの

第5章 ランタイム時のカーネルパラメーターの設定 Red Hat Enterprise Linux 8 | Red Hat Customer Portal

IPフォワード(IP Forward) | Linux技術者認定 LinuC | LPI-Japan

*1:ipv4は分類上、ではなく<TUNABLE_CLASS>のほうに属するというのは筆者の予測が入っている(出典がないので)。

*2:<TUNABLE_CLASS>が階層化されている場合は、ディレクトリも階層化されている。まさに、この例だとnetディレクトリの中にipv4ディレクトリがあるというように階層化されている。

*3:ここの値を書き換えてもカーネルパラメータの変更はできるが再起動したら元に戻る。

*4:ファイル名は何でもよい