删除不必要的内核模块

· 浏览次数 : 0

小编点评

**Pod配置文件(pod0.yaml):** ```yaml apiVersion: v1 kind: Pod metadata: name: podtest spec: containers: - image: hub.c.163.com/library/nginx:latest name: podtest resources: {} dnsPolicy: ClusterFirst restartPolicy: Always nodeSelector: yy: xx ``` **lsmod 命令:** ``` root@k8scludes1:~/systemsafe# which lsmod/sbin/lsmod搜索/sbin/lsmod /sbin/lsmod ``` **结果:** ``` i2c_piix4 128 0 删除模块:modprobe -r i2c_piix4 ``` **说明:** * `yy` 是标签名为 `yy` 的节点的标识符。 * `i2c_piix4` 是内核模块的名字。 * `128` 是模块的尺寸。 * `0` 表示模块已删除。

正文

一.系统环境

本文主要基于Kubernetes1.22.2和Linux操作系统Ubuntu 18.04。

服务器版本 docker软件版本 Kubernetes(k8s)集群版本 kube-bench版本 CPU架构
Ubuntu 18.04.5 LTS Docker version 20.10.14 v1.22.2 0.6.7 x86_64

Kubernetes集群架构:k8scludes1作为master节点,k8scludes2,k8scludes3作为worker节点。

服务器 操作系统版本 CPU架构 进程 功能描述
k8scludes1/192.168.110.128 Ubuntu 18.04.5 LTS x86_64 docker,kube-apiserver,etcd,kube-scheduler,kube-controller-manager,kubelet,kube-proxy,coredns,calico k8s master节点
k8scludes2/192.168.110.129 Ubuntu 18.04.5 LTS x86_64 docker,kubelet,kube-proxy,calico k8s worker节点
k8scludes3/192.168.110.130 Ubuntu 18.04.5 LTS x86_64 docker,kubelet,kube-proxy,calico k8s worker节点

二.前言

在现代的云计算环境中,Kubernetes 无疑是最重要的技术之一。而作为 Kubernetes 的运行环境,Linux 操作系统也显得尤为重要。本文将讲解如何去除不必要的内核模块,以提高系统的性能和稳定性。

本文是在kubernetes环境下进行操作的,关于Kubernetes(k8s)集群的安装部署,可以查看博客《Ubuntu 安装部署Kubernetes(k8s)集群》https://www.cnblogs.com/renshengdezheli/p/17632858.html。

三.内核模块简介

内核模块是 Linux 内核的一部分,它是一个内核功能的集合,可以在不重新编译内核的情况下加载和卸载。内核模块为系统提供了许多功能,但同时也增加了系统的复杂性和开销。在不必要的内核模块没有被禁用的情况下,它们可能会消耗系统的资源,降低系统的性能。

对于容器来说,修改容器里的内核参数,实际上修改的是宿主机的内核参数,宿主机加载某个内核模块,容器里也会加载该内核模块。

操作系统默认有很多内核模块,有些内核模块我们根本用不着,如果某个内核模块存在漏洞,在pod里利用该漏洞,控制服务器干坏事,就存在安全隐患,所以对于没有必要的内核模块是没必要加载的。

Linux内核会根据需要从磁盘自动加载内核模块。与Kubernetes特别相关的是,即使没有特权的进程也可以通过创建适当类型的套接字来加载某些与网络协议相关的内核模块。这可能使攻击者可以利用管理员认为未使用的内核模块中的安全漏洞。

四.删除不必要的内核模块

创建目录存放文件。

root@k8scludes1:~# mkdir systemsafe   

root@k8scludes1:~# cd systemsafe/

创建systemsafe命名空间。

root@k8scludes1:~/systemsafe# kubectl create ns systemsafe

切换命名空间到systemsafe,现在还没有pod。

root@k8scludes1:~/systemsafe# kubens systemsafe   

root@k8scludes1:~/systemsafe# kubectl get pod
No resources found in systemsafe namespace.

查看node节点的标签。

root@k8scludes1:~/systemsafe# kubectl get nodes --show-labels
NAME         STATUS   ROLES                  AGE   VERSION   LABELS
k8scludes1   Ready    control-plane,master   30d   v1.22.2   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=k8scludes1,kubernetes.io/os=linux,node-role.kubernetes.io/control-plane=,node-role.kubernetes.io/master=,node.kubernetes.io/exclude-from-external-load-balancers=
k8scludes2   Ready    <none>                 30d   v1.22.2   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=k8scludes2,kubernetes.io/os=linux
k8scludes3   Ready    <none>                 30d   v1.22.2   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=k8scludes3,kubernetes.io/os=linux

给k8scludes3节点设置一个标签yy=xx。

root@k8scludes1:~/systemsafe# kubectl label nodes k8scludes3 yy=xx  

查看标签为yy=xx的节点。

root@k8scludes1:~/systemsafe# kubectl get node -l yy=xx
NAME         STATUS   ROLES    AGE   VERSION
k8scludes3   Ready    <none>   30d   v1.22.2

编写pod配置文件,使用nginx镜像创建一个pod,nodeSelector:yy: xx 表示pod运行在标签为yy=xx的节点上。

root@k8scludes1:~/systemsafe# vim pod0.yaml

root@k8scludes1:~/systemsafe# cat pod0.yaml
apiVersion: v1
kind: Pod
metadata:
  creationTimestamp: null
  labels:
    run: podtest
  name: podtest
spec:
  #当需要关闭容器时,立即杀死容器而不等待默认的30秒优雅停机时长。
  terminationGracePeriodSeconds: 0
  nodeSelector:
    yy: xx
  containers:
  - image: hub.c.163.com/library/nginx:latest
    #imagePullPolicy: IfNotPresent:表示如果本地已经存在该镜像,则不重新下载;否则从远程 Docker Hub 下载该镜像
    imagePullPolicy: IfNotPresent
    name: podtest
    resources: {}
  dnsPolicy: ClusterFirst
  restartPolicy: Always
status: {}

创建pod。

root@k8scludes1:~/systemsafe# kubectl apply -f pod0.yaml
pod/podtest created

查看pod,podtest就运行在k8scludes3节点上。

root@k8scludes1:~/systemsafe# kubectl get pod -o wide
NAME      READY   STATUS    RESTARTS   AGE   IP             NODE         NOMINATED NODE   READINESS GATES
podtest   1/1     Running   0          18s   10.244.1.122   k8scludes3   <none>           <none>

lsmod(list modules)命令用于显示已载入系统的模块。

执行 lsmod 指令,会列出所有已载入系统的模块,比如:drm 401408 4 vmwgfx,drm_kms_helper,ttm

  • 第1列:表示模块的名称,如drm表示drm模块;
  • 第2列:表示模块的大小,如401408表示drm模块的大小为401408字节;
  • 第3列:表示依赖于该模块的个数,如4表示有4个模块依赖drm模块;
  • 第4列:表示依赖模块的内容。

查看lsmod命令的绝对路径。

root@k8scludes1:~/systemsafe# which lsmod
/sbin/lsmod

搜索/sbin/lsmod是由哪个软件包安装的,kmod: /sbin/lsmod表示/sbin/lsmod由kmod软件包安装的。

root@k8scludes1:~/systemsafe# dpkg -S /sbin/lsmod
kmod: /sbin/lsmod

进入pod里。

root@k8scludes1:~/systemsafe# kubectl exec -it podtest -- bash

#更新软件源
root@podtest:/# apt-get update

#安装kmod
root@podtest:/# apt-get install kmod

#容器里加载的模块为128个
root@podtest:/# lsmod | wc -l
128

#退出pod
root@podtest:/# exit
exit

因为podtest运行在k8scludes3上,在k8scludes3节点上查看加载的模块,可以发现:容器里加载的模块和宿主机里加载的模块是一样的,都是128个。

root@k8scludes3:~# lsmod | wc -l
128

以i2c_piix4模块为例。

root@k8scludes3:~# lsmod | grep i2c_piix4
i2c_piix4              24576  0

删除模块:modprobe -r i2c_piix4 ,宿主机modprobe -r i2c_piix4 删除模块之后,pod里i2c_piix4也被删除了。

root@k8scludes3:~# modprobe -r i2c_piix4

root@k8scludes3:~# lsmod | grep i2c_piix4

加载模块,宿主机modprobe i2c_piix4 加载模块之后,pod里i2c_piix4模块也加载了。

root@k8scludes3:~# modprobe i2c_piix4

注意:宿主机才有权限加载内核模块,pod里没权限。

/etc/modprobe.d/目录里,可以设置内核模块不自动加载。

root@k8scludes1:~/systemsafe# cd /etc/modprobe.d/

root@k8scludes1:/etc/modprobe.d# ls
amd64-microcode-blacklist.conf  blacklist.conf           blacklist-framebuffer.conf   dkms.conf                       iwlwifi.conf
blacklist-ath_pci.conf          blacklist-firewire.conf  blacklist-rare-network.conf  intel-microcode-blacklist.conf  mdadm.conf

可以通过设置 blacklist 模块名 来防止系统自动加载内核模块,比如 blacklist pcspkr 系统就不会自动加载pcspkr模块。

root@k8scludes1:/etc/modprobe.d# cat blacklist.conf | grep blacklist | head -4
blacklist evbug
blacklist usbmouse
blacklist usbkbd
blacklist eepro100

五.总结

删除不必要的内核模块可以提高系统的性能和稳定性。通过以上步骤,我们可以轻松地去除不必要的内核模块,优化系统的性能。

与删除不必要的内核模块相似的内容:

删除不必要的内核模块

删除不必要的内核模块,lsmod,删除模块:modprobe -r i2c_piix4,加载模块:modprobe i2c_piix4 ,blacklist evbug

驱动开发:内核监控Register注册表回调

在笔者前一篇文章`《驱动开发:内核枚举Registry注册表回调》`中实现了对注册表的枚举,本章将实现对注册表的监控,不同于32位系统在64位系统中,微软为我们提供了两个针对注册表的专用内核监控函数,通过这两个函数可以在不劫持内核API的前提下实现对注册表增加,删除,创建等事件的有效监控,注册表监视通常会通过`CmRegisterCallback`创建监控事件并传入自己的回调函数,与该创建对应的是

给自家的小米电视精简优化

我家人其实已经忍家里的小米电视很久了,开机太慢,分类繁多,还有广告; 但是又不希望失去它的智能性,比如自带的小爱同学,又能互联很多智能设备。 近年来大环境比较卷,没啥自己的时间来仔细研究这些。 总而言之,不想太折腾,不想root,但是想换用清爽一些的桌面,删除不必要的应用和广告。 早先试过直接安装第

[转帖]Redis系列(十七)、Redis中的内存淘汰策略和过期删除策略

我们知道Redis是分布式内存数据库,基于内存运行,可是有没有想过比较好的服务器内存也不过几百G,能存多少数据呢,当内存占用满了之后该怎么办呢?Redis的内存是否可以设置限制? 过期的key是怎么从内存中删除的?不要怕,本篇我们一起来看一下Redis的内存淘汰策略是如何释放内存的,以及过期的key

[转帖]并发delete导致oracle死锁问题的解决

项目中有一个批处理任务,用来删除数据库中过期的数据(包括说话人的语音、模型、记录等),当程序被分布式部署后,就会有多个批处理线程同时进行删除,不过不同的线程,会根据元信息表得到不同的说话人信息,从而删除不同的数据,并不存在竞争的问题,但是,当项目使用oracle数据库在线上运行时,却频繁出现了ORA

Kubernetes 的 NameSpace 无法删除应该怎么办?

概述 有时候我们操作不规范,或者删除的先后顺序有问题,或者某项关键服务没有启动,导致 Kubernetes 经常会出现无法删除 NameSpace 的情况。这种情况下我们应该怎么办? 规范删除流程 其实,很多时候出现这种情况,主要是因为我们的删除操作不规范,典型的有下面几种情况: 删除的先后顺序有问

数据库中用户删除不掉总是报错,依赖如何处理干净?

摘要:本文主要介绍如何进行用户的各种依赖识别与清理,并简单介绍下推荐的权限管理方式。 本文分享自华为云社区《GaussDB(DWS) 用户删除不掉时候总是报错,依赖如何处理干净?》,作者:Malick 。 数据库的使用中,有时会遇到某些用户离职,或者角色变更时,要对其账号进行销户,权限进行回收等操作

flutter 系列之:flutter 中的幽灵offstage

简介 我们在使用flutter的过程中,有时候需要控制某些组件是否展示,一种方法是将这个组件从render tree中删除,这样这个组件就相当于没有出现一样,但是有时候,我们只是不想展示这个widget,但是这个组件还是存在的,并且可以接受键盘输入,还可以使用CPU。它和真正的组件唯一不同的就是他是

文心一言 VS 讯飞星火 VS chatgpt (107)-- 算法导论10.1 5题

五、用go语言,栈插入和删除元素只能在同一端进行,队列的插入操作和删除操作分别在两端进行,与它们不同的,有一种双端队列(deque),其插入和删除操作都可以在两端进行。写出4个时间均为 O(1)的过程,分别实现在双端队列的两端插入和删除元素的操作,该队列是用一个数组实现的。 文心一言: 在 Go 语

鸿蒙HarmonyOS实战-ArkTS语言基础类库(容器类库)

前言 容器类库是指一组用于存储和管理数据的数据结构和算法。它们提供了各种不同类型的容器,如数组、链表、树、图等,以及相关的操作和功能,如查找、插入、删除、排序等。 容器类库还可以包含其他数据结构和算法,如堆、树、图等,以及相关的操作和功能,如排序、查找、遍历等。它们可以用于解决各种不同的问题和场