一、内核的编译安装
-
获取内核源码
-
选择合适的版本:
- 首先要根据需求选择合适的内核版本。如果是用于一般的服务器稳定运行,可能会选择长期支持(LTS)版本;如果是用于测试新功能或对最新技术感兴趣,可以选择最新的主线版本。可以从官方网站The Linux Kernel Archives查看各种内核版本的发布信息。
- 例如,Linux 5.10 是一个比较稳定的长期支持版本,适合大多数服务器环境;而 Linux 6.x 版本可能包含更新的技术和功能,适合开发和测试环境。
-
下载方式:
- wget 命令下载:确定版本后,使用
wget命令从官方仓库下载内核源码。假设要下载 Linux 5.10.0 版本,命令如下:
- wget 命令下载:确定版本后,使用
-
wget https://cdn.kernel.org/pub/linux/kernel/v5.x/linux - 5.10.0.tar.xz
- curl 命令下载(可选):除了
wget,也可以使用curl命令下载。例如:
curl -O https://cdn.kernel.org/pub/linux/kernel/v5.x/linux - 5.10.0.tar.xz
- 解压源码:
- 下载完成后,需要将源码包解压到合适的目录,通常是
/usr/src。假设下载的是linux - 5.10.0.tar.xz,解压命令如下:
- 下载完成后,需要将源码包解压到合适的目录,通常是
sudo tar -xvf linux - 5.10.0.tar.xz -C /usr/src
- 解压后,进入内核源码目录,例如:
cd /usr/src/linux - 5.10.0
-
编译与安装
-
准备编译环境:
- 在编译内核之前,需要安装一些必要的工具和依赖包。在基于 CentOS 或 RHEL 的系统中,使用
yum命令安装:
- 在编译内核之前,需要安装一些必要的工具和依赖包。在基于 CentOS 或 RHEL 的系统中,使用
-
sudo yum install -y gcc make ncurses - devel kernel - devel kernel - headers elfutils - libelf - devel binutils - devel
- 在 Debian 或 Ubuntu 系统中,使用
apt - get命令安装相应的工具和依赖:
sudo apt - get update
sudo apt - get install -y gcc make libncurses5 - dev linux - headers - $(uname - r) build - essential
-
配置内核:
- 清理旧配置(可选):如果之前在这个目录下进行过内核编译,为了避免冲突,可以使用
make mrproper命令清理旧的配置文件和编译产生的中间文件。例如:
- 清理旧配置(可选):如果之前在这个目录下进行过内核编译,为了避免冲突,可以使用
收起
bash
复制
make mrproper
- 生成默认配置:使用
make defconfig命令生成一个基于当前系统架构的默认内核配置文件。例如:
make defconfig
- 自定义配置(可选):如果需要自定义内核配置,可以使用
make menuconfig命令打开一个基于文本菜单的内核配置界面。在这个界面中,可以通过方向键和回车键来浏览和选择各种内核选项,如设备驱动、文件系统、网络协议等。例如:
make menuconfig
- 例如,若想启用某个特定的文件系统支持,可以在
File systems选项下找到对应的文件系统并将其设置为[*](编译进内核)或[M](编译为模块)。配置完成后,保存并退出界面。 -
编译内核和模块:
- 编译内核:根据系统的 CPU 核心数,使用
make - j <number - of - cores>命令来加速内核编译过程。假设系统有 4 个 CPU 核心,可以这样编译:
- 编译内核:根据系统的 CPU 核心数,使用
make - j4
- 这个过程可能需要较长时间,具体取决于系统性能和内核配置的复杂程度。
- 编译内核模块:在完成内核编译后,使用
make modules命令编译内核模块。例如:
make modules
-
安装内核和模块:
- 安装内核模块:使用
sudo make modules_install命令将编译好的内核模块安装到系统的标准模块目录下。例如:
- 安装内核模块:使用
sudo make modules_install
- 安装内核:使用
sudo make install命令安装内核。例如:
sudo make install
- 更新引导程序:
- 使用
sudo grub2 - mkconfig - o /boot/grub2/grub.cfg命令更新 GRUB 引导配置文件,以便系统能够识别新安装的内核。在基于 Debian 或 Ubuntu 系统中,可能需要使用update - grub命令来更新引导配置。例如:
- 使用
sudo grub2 - mkconfig - o /boot/grub2/grub.cfg
-
重启并验证:
- 重启系统:使用
sudo reboot命令重启系统。例如:
- 重启系统:使用
sudo reboot
- 验证新内核:系统重启后,使用
uname - r命令查看当前使用的内核版本,确认是否为新安装的内核。例如:
uname - r
二、内核模块管理
-
内核模块概述
-
定义与作用:
- 内核模块是一段可以动态加载到内核或从内核中卸载的代码。它是 Linux 内核可扩展性的重要体现,允许在系统运行过程中添加或删除特定的功能,而无需重新编译整个内核。例如,当需要支持一个新的文件系统或者新的硬件设备驱动时,可以通过加载相应的内核模块来实现。
- 内核模块能够有效地节省内存空间。如果所有的功能都静态编译到内核中,那么内核会变得非常庞大。而通过模块的方式,只有在需要使用某个功能时才加载对应的模块,这样可以使内核在内存中的占用更加灵活高效。
-
模块的类型:
- 设备驱动模块:这是最常见的一种内核模块类型。例如,当插入一个新的 USB 设备时,对应的 USB 设备驱动模块会被加载,以实现操作系统与该设备的通信。这些模块负责处理硬件设备的各种操作,如读取设备状态、发送和接收数据等。
- 文件系统模块:用于支持不同类型的文件系统。例如,当需要访问一个 NTFS 格式的磁盘分区时,加载 NTFS 文件系统模块后,系统就能够正确地读写该分区上的文件。不同的文件系统如 ext4、xfs、vfat 等都有对应的内核模块。
- 网络协议模块:用于实现各种网络协议。比如,IPsec 模块用于实现网络安全协议,为网络通信提供加密和认证功能;还有一些用于实现特定网络服务的模块,如 NFS(网络文件系统)模块,它允许在网络上共享文件。
-
-
查看内核模块
-
lsmod 命令:
- 这是查看已加载内核模块的最简便方法。当执行
lsmod命令时,它会列出当前内核中已经加载的模块名称、大小以及被使用的次数等信息。例如:
- 这是查看已加载内核模块的最简便方法。当执行
-
$ lsmod
Module Size Used by
vfat 20480 1
fat 73728 1 vfat
- 其中,第一列是模块名称,第二列是模块大小(单位为字节),第三列是该模块被其他模块或进程使用的次数。在这个例子中,
vfat模块大小为 20480 字节,被使用了 1 次,并且它被fat模块所使用。 - cat /proc/modules:
/proc是一个虚拟文件系统,其中/proc/modules文件包含了当前加载的内核模块信息。通过cat /proc/modules命令可以查看和lsmod类似的内容。
- 加载与卸载
- 加载内核模块:
- modprobe 命令:这是加载内核模块的主要方式,它会自动处理模块的依赖关系。例如,要加载一个名为
my_module的模块,可以使用以下命令:
- modprobe 命令:这是加载内核模块的主要方式,它会自动处理模块的依赖关系。例如,要加载一个名为
- 加载内核模块:
sudo modprobe my_module
- 如果
my_module依赖于其他模块,modprobe会先加载那些依赖模块。 - insmod 命令:
insmod也可以用来加载内核模块,但它不会自动处理模块依赖关系。例如:
sudo insmod /path/to/my_module.ko
- 这里
/path/to/my_module.ko是模块文件的实际路径。使用insmod时,如果模块有依赖关系,需要手动先加载依赖的模块。 - 卸载内核模块:
- rmmod 命令:用于卸载一个指定的内核模块。例如,要卸载之前加载的
my_module,可以使用:
- rmmod 命令:用于卸载一个指定的内核模块。例如,要卸载之前加载的
sudo rmmod my_module
- 注意,
rmmod命令在卸载模块时,如果模块正在被使用(lsmod命令中Used by列的值不为 0),卸载操作会失败。 - modprobe - r 命令:和
rmmod类似,用于卸载内核模块,但它会尝试先卸载依赖该模块的其他模块。例如:
sudo modprobe - r my_module
- 修改内核参数
- /proc/sys 目录:
- 这个目录下的文件可以用于查看和修改内核参数。例如,
/proc/sys/net/ipv4/ip_forward这个文件用于控制 IP 转发功能。如果文件内容为0,表示 IP 转发功能关闭;如果将其修改为1,则开启 IP 转发功能。可以使用以下命令进行修改:
- 这个目录下的文件可以用于查看和修改内核参数。例如,
- /proc/sys 目录:
echo 1 > /proc/sys/net/ipv4/ip_forward
- 不过,这种修改在系统重启后会丢失,因为
/proc是一个虚拟文件系统,它反映的是当前内核的状态。 -
sysctl 命令:
- 用于在运行时配置内核参数。它可以读取和修改
/proc/sys目录下的参数。例如,要查看net.ipv4.ip_forward参数的值,可以使用:
- 用于在运行时配置内核参数。它可以读取和修改
sysctl net.ipv4.ip_forward
- 要修改这个参数的值,可以使用:
sysctl -w net.ipv4.ip_forward = 1
- 为了使修改在系统重启后仍然生效,可以将参数修改命令添加到
/etc/sysctl.conf文件中。例如,在/etc/sysctl.conf文件中添加一行net.ipv4.ip_forward = 1,然后运行sysctl -p命令使配置生效。
三、部分操作(作业)
1.内核的编译安装
我这里内核是3.10,因为安装wireguard无法使用,原因是内核版本太低, 网上浏览了几篇帖子之后了解到内核>=5.6版本是自带wireguard,所以这里我选择升级内核
先了解一下要升级的内核版本
kernel-ml 中的ml是英文【 mainline stable 】的缩写,elrepo-kernel中罗列出来的是最新的稳定主线版本。
kernel-lt 中的lt是英文【 long term support 】的缩写,elrepo-kernel中罗列出来的长期支持版本。
我这里选择安装kernel-ml版本,ml为长期稳定版本,lt为长期维护版本
检查内核版本
uname -r
查看kernel rpm包
rpm -qa |grep kernel
cat <<EOF > /etc/yum.repos.d/elrepo.repo
重建yum缓存 及查看仓库包数量
yum clean all && yum makecache && yum repolist

查看yum仓库中的内核包
yum list --showduplicate kernel*

这里有两个选择,安装内核,这里不指定版本的话安装的是最新版本
yum install -yinstall kernel-ml.x86_64
指定版本
yum install -y kernel-ml-6.9.7-1.el7.elrepo.x86_64
这里我是从官网下载的 6.9.7 版本

查看启动内核
cat /etc/grub2.cfg | grep menuentry|awk -F "\'" '$1=="menuentry " {print i++ " : " $2}'
根据情况 更换适合命令
设置启动内核
grub2-set-default 0
这里我没有启动,后面手动启动
重启,查看是否生效
reboot

检查内核版本
uname -r
手动启动 6.9.7 版本


2.内核模块管理
查找本机的内核模块存放位置。
cd /lib/modules/3.10.0-514.e17.x86 64/kernel
ls
在这个目录下存放着多个目录,每个目录中都保存着很多模块文件。读者可以进入任意一个目录查看模块。例如,进入drivers目录查看驱动模块的文件。
cd drivers
ls
在drivers目录下还有很多子目录,每个子目录中都包含多个模块。例如,在/drivers/acpi目录下存放着acpi高级配置和电源管理接口模块,进入acpi查看相应模块,
cd acpi
ls
由输出结果可知,在该目录下存放着多个模块,其中,ko是模块的扩展名。

1. 查看内核模块
1.1 lsmod 命令






1.2 modinfo 命令
2.加载与卸载(modprobe)
3.修改内核参数
[roote localhost ~]# cat /proc/sys/net/core/rmem default
212992
[root@localhost~]# cat /proc/sys/net/core/wmem default
212992
两个缓存的大小均为2122992,现在修改两个缓存大小,在/etc/sysctl.conf文件中加入两行代码:
net.core.wmem default=300000
net.core.rmem default=300000
修改之后执行下面的命令使更改立即生效:
[root@localhost ~]# sysct1-P
net,core, wmem default=300000
net, core, rmem default=300000

989

被折叠的 条评论
为什么被折叠?



