银河麒麟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.service和tuned.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文件
  • 别忘记相同参数覆盖的问题
相关推荐
布裘3 天前
【银河麒麟】V4桌面图标消失,右击鼠标没反应排查
运维·银河麒麟·桌面环境
归真仙人6 天前
【UE项目迁移银河麒麟(Linux)局域网会话搜索失败排查】
ue5·ue4·vr·unreal engine·银河麒麟
Linux技术支持工程师8 天前
银河麒麟 V10 出问题了该看哪个日志?secure 找不到、journalctl 查不到历史,一次解决
信创·银河麒麟·journalctl·日志排查·国产化运维
DolphinDB9 天前
持续升级!DolphinDB 全面完成银河麒麟 V11 兼容性认证
时序数据库·信创·银河麒麟·dolphindb
布裘14 天前
【银河麒麟】服务器系统开机黑屏故障排查与修复
linux·运维·服务器·银河麒麟·无法启动
小白不想画工图21 天前
银河麒麟V10系统安装QT5.12
linux·开发语言·qt·银河麒麟
Quincy_Freak1 个月前
银河麒麟终端数据处理标准化实践:SQLiteGo 效能评估与落地路径
sqlite·数据库管理·大数据分析·银河麒麟·aarch64·sqlitego
Quincy_Freak3 个月前
银河麒麟 SQLite 实操:Excel 导入与 SQL 语法编辑功能详解摘要
数据库·arm·数据库管理·大数据分析·银河麒麟·aarch64·sqlitego
Quincy_Freak3 个月前
信创内网数据规范实践:银河麒麟下SQLite本地数据安全管理方案
数据库·sqlite·arm·数据库管理·大数据分析·银河麒麟·aarch64
thethefighter3 个月前
会计档案管理系统功能支撑
银河麒麟·档案管理系统·单机版·nhdeep·信创版·会计档案·会计档案管理系统