背景

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

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

过程

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

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

然后:

sysctl -p

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

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后,其最终生效的文件是哪个呢?

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

系统版本说明

# 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

查看服务状态:

# 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隐式调用的,会在系统启动时,自动执行一次,其加载配置文件路径为:

/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服务

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

/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. 除了同名的配置文件,其他所有的配置文件与目录无关,统一按照文件名的字典顺序处理。为了便于排序,建议给配置文件都加上两位十进制数字的文件名前缀,这样会先加载数字小的,后加载数字大的文件,同样,相同参数后加载会覆盖先加载的

示例:

有以下几个配置文件:

/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]设置系统为某模式,例如,本系统为:

    # tuned-adm activeCurrent active profile: virtual-guest

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

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

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

    # 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,若指定文件,则表示加载指定文件,例如:

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文件
  • 别忘记相同参数覆盖的问题

银河麒麟v10 sysctl内核参数加载顺序的思考的更多相关文章

  1. sysctl -p 重新加载文件/etc/sysctl.conf -a 所有参数 -w 临时指定

    sysctl命令用于运行时配置内核参数,这些参数位于/proc/sys目录下.sysctl配置与显示在/proc/sys目录中的内核参数.可以用sysctl来设置或重新设置联网功能,如IP转发.IP碎 ...

  2. .NET 6应用程序适配国产银河麒麟V10系统随记

    最近想在麒麟系统上运行.NET 6程序,经过一番折腾最终完成了,简单记录一下. 目标系统: CPU: aarch64架构(ARM64) 操作系统:银河麒麟V10高级服务器系统 银河麒麟V10系统(以下 ...

  3. linux内核被加载的过程

    二,linux内核被加载的过程 一,linux安装时遇到的概念解析 内核必须模块vmlinz(5M左右)不认识硬盘,原本是需要写跟loader中一样的内容,来加载非必要模块. 内核非必要的功能被编译为 ...

  4. sysctl内核参数

    sysctl命令用来配置与显示/proc/sys目录中的内核参数.如果想使参数长期保存,可以通过编辑/etc/sysctl.conf文件来实现. -a 显示所有的系统参数 -p 从指定的文件加载系统参 ...

  5. 银河麒麟V10 SP1服务器操作系统-单用户模式与救援模式调试方法

    单用户模式 单用户模式:该模式下系统并没有完全运行进来,只是部分程序运行,包括网络服务,ssh服务等部分服务未运行,因此无法通过远程登录到操作系        统.进入单用户方式进行系统维护由是ROO ...

  6. ASM:《X86汇编语言-从实模式到保护模式》第13章:保护模式下内核的加载,程序的动态加载和执行

    ★PART1:32位保护模式下内核简易模型 1. 内核的结构,功能和加载 每个内核的主引导程序都会有所不同,因为内核都会有不同的结构.有时候主引导程序的一些段和内核段是可以共用的(事实上加载完内核以后 ...

  7. Crystal框架配置参数加载机制详解?

    前言 定义 配置参数定义的形式 配置参数文件定义在哪里? 配置参数加载的优先级 如何使用配置参数? 最佳实践 Jar项目中如何定义配置参数? War项目中如何定义或重载Jar包中的配置参数? 开发人员 ...

  8. Python_动态参数、名称空间、作用域、作用域链、加载顺序、函数的嵌套、global、nonlocal

    1.动态参数 当实参数量与形参数量相等时,参数传递正常. def func1(a, b, c): pass func1(1, 2, 3) 当实参数量与形参数量不相等时,则会报错. def func1( ...

  9. CSS样式表、JS脚本加载顺序与SpringMVC在URL路径中传参数与SpringMVC 拦截器

    CSS样式表和JS脚本加载顺序 Css样式表文件要在<head>中先加载,这样网页显示时可以第一次就渲染出正确的布局和样式,网页就不会闪烁,或跳变 JS脚本尽可能放在<body> ...

  10. 动态参数 名称空间 作用域 作用域链 加载顺序 函数的嵌套 global nonlocal 等的用法总结

    03,动态参数 *args,**kwargs # 用户传入到函数中的实参数量不定时,或者是为了以后拓展,# 此时要用到动态参数*args,**kwargs(万能参数.)# *args接收的是所有的位置 ...

随机推荐

  1. Mac安装Kafka(依赖zookeeper)

    版本 kafka_2.11-2.0.0 flume1.8.0 一.软件下载 http://kafka.apache.org/downloads.htmltar -zxf kafka_2.11-2.0. ...

  2. ruoyi-vue 界面框架构造

    界面框架: 我采用了flex布局,先分左右,然后右侧再分上下. 步骤: 1. 首先实现简单的菜单 1.1 菜单是个菜单项数组 [] 1.2 菜单项结构 例子 { id:'001', name: '历史 ...

  3. TOGAF 内容元模型综合指南

    介绍 开放群组架构框架 (TOGAF) 是一种广泛使用的企业架构框架,它提供了一种结构化的方法来设计.规划.实施和管理企业信息技术架构.TOGAF 内容元模型是该框架的重要组成部分,它提供了一种标准化 ...

  4. 机器学习 | 强化学习(7) | 融合学习与规划(Integrating Learning and Planning)

    7-融合学习与规划(Integrating Learning and Planning) 1.导论 基于模型的强化学习(Model-Based Reinforcement Learning) 在上一个 ...

  5. 「四」vim执行外部命令、文件另存为、文件提取合并、打开类命令、光标后插入内容、替換、复制粘贴、查找设置

    vim执行外部命令 查看当前目录文件::! command 另存为 完整内容: :w filename 选择性内容: v:选择内容. :w filename 文件提取合并 向当前文件插入文件内容: : ...

  6. npm配置

    在 Node.js 中,npm(Node Package Manager)是 JavaScript 包的默认管理工具.要查看 npm 的配置,你可以使用 npm config 命令配合不同的子命令来获 ...

  7. Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库

    #div_digg { float: right; font-size: 12px; margin: 10px; text-align: center; width: 120px; position: ...

  8. jmespath 使用及案例

    什么是jmespath jmespath 是python里面的一个库 主要在httprunner框架里使用 2.使用语法 列表: with_jmespath(jmes_path,var_name) m ...

  9. WARN  Issues with peer dependencies found,pnpm peer dependencies auto-install

    前言 pnpm 也需要设置自动安装对等依赖项 解决 pnpm 使用 npm 的配置格式,所以应该以与 npm 相同的方式设置配置: pnpm config set auto-install-peers ...

  10. 解决本地代理问题 git 或者 curl Failed to connect to 127.0.0.1 port 1087 after 8 ms: Connection refused

    问题出现原因 git配置了代理 本地配置了代理 执行这个命令可以看到自己的代理设置: env | grep -I proxy 临时更改代理 在当前终端执行以下命令,就可以临时将代理取消掉 export ...