银河麒麟v10 sysctl内核参数加载顺序的思考

背景

最近很多伙伴想使用银河麒麟高级服务器系统v10来部署最新版本的k8s集群,可能遇到了各式各样的问题,于是准备使用kylinOS v10重温一遍kubeadm部署最新版本k8s的流程,也是替大家踩踩坑。

在进行服务器基础配置优化时,到内核参数修改这一步,引发了一些新的思考。

过程

在修改内核参数时,我很熟练的执行了以下命令:

bash 复制代码
cat > /etc/sysctl.d/k8s.conf << EOF
net.ipv4.ip_forward = 1
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.conf.all.route_localnet = 1
vm.overcommit_memory=1
vm.panic_on_oom=0
vm.swappiness = 0
fs.inotify.max_user_watches=89100
fs.file-max=52706963
fs.nr_open=52706963
net.netfilter.nf_conntrack_max=2310720
net.ipv4.tcp_keepalive_time = 600
net.ipv4.tcp_keepalive_probes = 3
net.ipv4.tcp_keepalive_intvl =15
net.ipv4.tcp_max_tw_buckets = 36000
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_max_orphans = 327680
net.ipv4.tcp_orphan_retries = 3
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_max_syn_backlog = 16384
net.ipv4.tcp_max_syn_backlog = 16384
net.ipv4.tcp_timestamps = 0
net.core.somaxconn = 16384
EOF

然后:

bash 复制代码
sysctl -p 

然后随便验证了一个ip_forward的参数,发现其值还是0:

bash 复制代码
cat /proc/sys/net/ipv4/ip_forward
0

突然就想到,我执行sysctl -p在不加任何参数的情况下,是同步/etc/sysctl.conf 文件的,而kylinOS v10默认的/etc/sysctl.conf文件中,ip_forward的值设置为0,所以其参数值并没有被修改。

引发的思考

既然我执行sysctl -p 时仅同步/etc/sysctl.conf文件,那如果我reboot后,其最终生效的文件是哪个呢?

以前没有深究过系统重启后内核参数的加载顺序问题,正好趁这次机会,好好学习一下完整的加载流程。

系统版本说明

bash 复制代码
# nkvers 
############## Kylin Linux Version #################
Release:
Kylin Linux Advanced Server Release V10 (Trading)

Kernel:
4.19.90-89.18.v2401.ky10.x86_64

Build:
Kylin Linux Advanced Server
Release V10 SP3 2403/(Trading)-x86_64-Build03/20240813
#################################################

内核参数加载顺序的深究

通过一些官方的相关文档和前辈的指导,基本摸清了重启后的加载顺序,详情如下。

内核参数加载的相关服务

系统重启后,与内核参数加载的服务,一共有两个,分别是systemd-sysctl.servicetuned.service

查看服务状态:

bash 复制代码
# systemctl status systemd-sysctl.service 
● systemd-sysctl.service - Apply Kernel Variables
   Loaded: loaded (/usr/lib/systemd/system/systemd-sysctl.service; static; vendor preset: disabled)

# systemctl status tuned.service 
● tuned.service - Dynamic System Tuning Daemon
   Loaded: loaded (/usr/lib/systemd/system/tuned.service; enabled; vendor preset: enabled)

一般情况下,这两个服务都会生效,有时tuned.service会被设置为disable,不让其开启自启,我们先来介绍以下这两个服务单元的生效规则和配置文件范围。

systemd-sysctl.service服务

此服务时是系统初始化阶段sysinit.target隐式调用的,会在系统启动时,自动执行一次,其加载配置文件路径为:

bash 复制代码
/run/sysctl.d/*.conf
/etc/sysctl.d/*.conf
/usr/local/lib/sysctl.d/*.conf
/usr/lib/sysctl.d/*.conf
/lib/sysctl.d/*.conf
/etc/sysctl.conf

tuned.service服务

此服务可设置为开机自启,也可取消,自由控制,其加载配置文件路径为:

bash 复制代码
/usr/lib/tuned/balanced/tuned.conf
/usr/lib/tuned/desktop/tuned.conf
/usr/lib/tuned/latency-performance/tuned.conf
/usr/lib/tuned/network-latency/tuned.conf
/usr/lib/tuned/network-throughput/tuned.conf
/usr/lib/tuned/powersave/tuned.conf
/usr/lib/tuned/recommend.d/50-tuned.conf
/usr/lib/tuned/throughput-performance/tuned.conf
/usr/lib/tuned/virtual-guest/tuned.conf
/usr/lib/tuned/virtual-host/tuned.conf

配置文件加载顺序

理论上软件包应将自带的配置文件安装在/usr/lib/目录下,/etc目录仅供系统管理员使用。

一般情况下,当tuned.service服务设置为enable时,加载顺序是先加载systemd-sysctl.service服务对应的配置文件,再加载tuned.service服务的配置文件。

多个文件中有相同内核参数的配置时,后加载的会将先加载的值覆盖掉,这是一个固定的规则!

每个服务又有这么多的配置文件生效路径,那他们的加载顺序是怎样的呢?

systemd-sysctl.service加载顺序

  1. 配置文件必须符合filename.conf格式,不同目录下的同名配置文件,仅以优先级最高的目录中的配置文件为准。目录优先级顺序如下:/etc > /run > /usr/local/lib > /usr/lib > /lib
  2. 读取完以上目录下的配置后,最后读取/etc/sysctl.conf。虽然/etc/sysctl.conf的读取优先级最低,但由于相同内核参数下,后加载会覆盖先加载的值,故最终生效的是/etc/sysctl.conf文件的值
  3. 除了同名的配置文件,其他所有的配置文件与目录无关,统一按照文件名的字典顺序处理。为了便于排序,建议给配置文件都加上两位十进制数字的文件名前缀,这样会先加载数字小的,后加载数字大的文件,同样,相同参数后加载会覆盖先加载的

示例:

有以下几个配置文件:

bash 复制代码
/usr/lib/sysctl.d/10-default-yama-scope.conf
/usr/lib/sysctl.d/50-pid-max.conf
/etc/sysctl.d/99-sysctl.conf
/usr/lib/sysctl.d/kylin.conf

读取顺序一定是:

/usr/lib/sysctl.d/10-default-yama-scope.conf --> /usr/lib/sysctl.d/50-pid-max.conf --> /etc/sysctl.d/99-sysctl.conf --> /usr/lib/sysctl.d/kylin.conf --> /etc/sysctl.conf

tuned.service加载顺序

  1. 如果tuned.service是enable状态,则其后于systemd-sysctl.service加载。

  2. tuned分为多种模式,每种模式对应其配置文件,tuned-adm active可查看系统使用的哪种模式,tuned-adm list profiles查看系统支持的模式,tuned-adm profile [name]设置系统为某模式,例如,本系统为:

    bash 复制代码
    # tuned-adm activeCurrent active profile: virtual-guest

    则其对应加载的配置文件为:/usr/lib/tuned/virtual-guest/tuned.conf

  3. 对应的tuned.conf文件加载完毕后,tuned服务还会执行sysctl --system命令,如果配置的参数和之前加载的配置文件有相同内核参数,同样会覆盖。

    sysctl --system执行加载顺序如下:

    bash 复制代码
    # sysctl --system | grep Applying
    * Applying /usr/lib/sysctl.d/10-default-yama-scope.conf ...
    * Applying /usr/lib/sysctl.d/50-coredump.conf ...
    * Applying /usr/lib/sysctl.d/50-default.conf ...
    * Applying /usr/lib/sysctl.d/50-libkcapi-optmem_max.conf ...
    * Applying /usr/lib/sysctl.d/50-pid-max.conf ...
    * Applying /etc/sysctl.d/99-sysctl.conf ...
    * Applying /etc/sysctl.d/k8s.conf ...
    * Applying /usr/lib/sysctl.d/kylin.conf ...
    * Applying /etc/sysctl.conf ...

临时主动加载配置文件

系统中还可以使用sysctl -p来主动加载指定内核参数配置文件生效,其后不指定任何文件时,默认加载/etc/sysctl.conf,若指定文件,则表示加载指定文件,例如:

bash 复制代码
sysctl -p /etc/sysctl.d/k8s.conf

银河麒麟系统中需要注意的点

银河麒麟系统中默认有个/usr/lib/sysctl.d/kylin.conf内核参数配置文件,其中已经配置诸多优化参数,其命名规则加载顺序较为靠后,所以在配置与其文件相同的参数项时,需要注意:

  1. 将文件命名修改为在kylin.conf其后加载
  2. 也可以选择直接修改kylin.conf中的配置
  3. 直接配置到/etc/sysctl.conf中

总结

  • tuned.service后于systemd-sysctl.service加载
  • 不同目录同名配置文件取目录优先级高的,非同名统一按照文件名的字典顺序加载
  • 优先级越高越先加载,越低越后加载,/etc/sysctl.conf最后加载
  • 别忘记/usr/lib/sysctl.d/kylin.conf文件
  • 别忘记相同参数覆盖的问题
相关推荐
段ヤシ.2 天前
银河麒麟(内核CentOS8)安装rbenv、ruby2.6.5和rails5.2.6
linux·centos·银河麒麟·rbenv·ruby2.6.5·rails 5.2.6
塔克拉玛攻城狮5 天前
一文详解银河麒麟配置容器运行时及gVisor(runsc)、Kata(runv)详细指南
docker·kubernetes·containerd·银河麒麟
鱼月半15 天前
基于3A4000及CentOS的银河麒麟V10离线源码编译安装VLC
银河麒麟·vlc
mzak25 天前
vscode集成deepseek实现辅助编程(银河麒麟系统)【详细自用版】
linux·vscode·编辑器·银河麒麟·deepseek
大桶矿泉水1 个月前
RK3588使用笔记:debian/ubuntu/麒麟系统下基础功能配置(不定期更新)
ubuntu·rk3588·银河麒麟
BlackPercy4 个月前
[银河麒麟] Geogebra
银河麒麟·geogebra
SZ1701102314 个月前
银河麒麟 SSH Vscode连接
vscode·ssh·银河麒麟
筑梦之路5 个月前
银河麒麟v10 二进制kubeadm+containerd搭建k8s集群(证书100年)—— 筑梦之路
国产化·kubeadm·银河麒麟
wqqqianqian6 个月前
国产linux系统(银河麒麟,统信uos)使用 PageOffice 实现word文件在线留痕
word·在线·uos·国产·银河麒麟·pageoffice·痕迹