13 内核与模块
概念
- 内核模块 (Kernel Module):一段可以在 Linux 内核运行时动态加载/卸载的代码,相当于内核的“插件”,用来扩展功能(比如硬件驱动、虚拟化 KVM、文件系统等),不需要重启整个内核就能生效。
- 内核空间 vs 用户空间:模块跑在内核空间,直接操作硬件/核心功能;普通程序跑在用户空间,权限受限。
- 模块依赖:很多模块需要依赖其他模块才能工作(比如
kvm_amd依赖kvm),modprobe会自动处理依赖,比底层的insmod更方便。
内核管理
相关文件/目录
/boot内核文件、initramfs、grub 配置都在这里。/boot/vmlinuz-*真正的内核镜像/boot/initrd.img-*或/boot/initramfs-*.img启动初期的临时根文件系统(包含驱动、模块)/lib/modules/内核版本/该内核对应的所有模块/etc/default/grub启动菜单全局配置/boot/grub2/grub.cfg或/boot/grub/grub.cfg生成好的启动菜单(不要手动改)
查看
- 当前正在运行的内核bash
uname -r - 已安装的内核
- Debian / Ubuntu / Linux Mintbash
dpkg --list | grep linux-image - RHEL / CentOS / Fedorabash
rpm -qa | grep kernel-core # 或 dnf list installed kernel
- Debian / Ubuntu / Linux Mint
- 可安装但未安装的内核
- Debian / Ubuntu / Mintbash
apt update apt list linux-image* - RHEL / CentOS / Fedorabash
dnf list kernel --available
- Debian / Ubuntu / Mint
- 启动菜单里的内核bash
grep menuentry /boot/grub/grub.cfg
安装
- Debian/Ubuntu/Mintbash
sudo apt update sudo apt install linux-image-generic # 或指定版本 sudo apt install linux-image-6.5.0-xx-generic - RHEL/CentOS/Fedorabash
sudo dnf install kernel
安装完必须更新 grub,才能在启动菜单看到新内核:
bash
# Debian 系
sudo update-grub
# RHEL 系
sudo grub2-mkconfig -o /boot/grub2/grub.cfg删除旧内核(安全方法)
- Debian/Ubuntu/Mintbash
sudo apt remove linux-image-6.5.0-10-generic sudo apt autoremove - RHEL/CentOS/Fedorabash
sudo dnf remove kernel-6.5.0-10.el9
永远至少保留 2 个内核,不要删当前运行的。
切换
切换默认内核
先看 grub 菜单项
bash
grep menuentry /boot/grub/grub.cfg输出类似:
menuentry 'Linux Mint 21, 内核 5.15.0-78'
menuentry 'Linux Mint 21, 内核 5.15.0-76'设置永久默认
- Debian/Ubuntu/Mint 将
/etc/default/grub中的GRUB_DEFAULT=0改成你要的完整名字,例如:然后更新 grub。GRUB_DEFAULT="Linux Mint 21, 内核 5.15.0-76" - RHEL/CentOS/Fedora
bash
sudo grub2-set-default '标题名字'
sudo grub2-mkconfig -o /boot/grub2/grub.cfg临时切换
最简单的方法是在重启时选择内核,可能在 Advanced Options (高级选项)中。如果想折腾命令行,就按如下方法做吧!
- Debian/Ubuntu/Mintbash
sudo grub-reboot "你要的内核标题" sudo reboot - RHEL/CentOS/Fedorabash
sudo grub2-reboot "标题名字" sudo reboot
内核模块管理——modprobe
相关案例见 Virtualbox 虚拟机启动错误一节。
相关目录
| 路径 | 作用 |
|---|---|
/lib/modules/$(uname -r)/ | 系统内核模块的实际存放位置 |
/etc/modprobe.d/ | 模块配置文件目录(黑名单、参数等) |
/etc/modules-load.d/ | 开机自动加载模块的配置目录 |
/usr/lib/modprobe.d/ | 系统默认模块配置(不要直接修改) |
查看模块状态
| 命令 | 作用 | 示例 |
|---|---|---|
lsmod | 列出所有已加载的内核模块 | lsmod | grep kvm(过滤虚拟化相关模块) |
modinfo <模块名> | 查看模块的详细信息(作者、依赖、参数等) | modinfo kvm_amd |
modprobe --show-depends <模块名> | 查看模块的依赖关系 | modprobe --show-depends kvm_amd |
加载/卸载模块
临时
| 命令 | 作用 |
|---|---|
sudo modprobe <模块名> | 加载模块,自动处理依赖。不需要写 .ko 后缀,比如 sudo modprobe kvm_amd |
sudo rmmod <模块名> | 卸载模块。必须先卸载依赖它的模块。 |
sudo modprobe -r <模块名> | 递归卸载模块。相较于rmmod,可自动处理依赖关系 |
永久
禁用(黑名单)
bash
# 1. 创建黑名单配置文件(文件名自定义,只要 .conf 结尾)
sudo echo "blacklist <模块名>" >> /etc/modprobe.d/blacklist-<自定义名>.conf
# 2. 更新启动镜像(让配置在开机时生效)
sudo update-initramfs -u开机时加载某模块
bash
# 1. 把模块名写入加载列表
sudo echo "<模块名>" >> /etc/modules-load.d/<自定义名>.conf
# 2. 更新启动镜像
sudo update-initramfs -u