Skip to content

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 生成好的启动菜单(不要手动改)

查看

  1. 当前正在运行的内核
    bash
    uname -r
  2. 已安装的内核
    • Debian / Ubuntu / Linux Mint
      bash
      dpkg --list | grep linux-image
    • RHEL / CentOS / Fedora
      bash
      rpm -qa | grep kernel-core
      # 或
      dnf list installed kernel
  3. 可安装但未安装的内核
    • Debian / Ubuntu / Mint
      bash
      apt update
      apt list linux-image*
    • RHEL / CentOS / Fedora
      bash
      dnf list kernel --available
  4. 启动菜单里的内核
    bash
    grep menuentry /boot/grub/grub.cfg

安装

  • Debian/Ubuntu/Mint
    bash
    sudo apt update
    sudo apt install linux-image-generic
    # 或指定版本
    sudo apt install linux-image-6.5.0-xx-generic
  • RHEL/CentOS/Fedora
    bash
    sudo dnf install kernel

安装完必须更新 grub,才能在启动菜单看到新内核:

bash
# Debian 系
sudo update-grub

# RHEL 系
sudo grub2-mkconfig -o /boot/grub2/grub.cfg

删除旧内核(安全方法)

  • Debian/Ubuntu/Mint
    bash
    sudo apt remove linux-image-6.5.0-10-generic
    sudo apt autoremove
  • RHEL/CentOS/Fedora
    bash
    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_DEFAULT="Linux Mint 21, 内核 5.15.0-76"
    然后更新 grub。
  • RHEL/CentOS/Fedora
bash
sudo grub2-set-default '标题名字'
sudo grub2-mkconfig -o /boot/grub2/grub.cfg

临时切换

最简单的方法是在重启时选择内核,可能在 Advanced Options (高级选项)中。如果想折腾命令行,就按如下方法做吧!

  • Debian/Ubuntu/Mint
    bash
    sudo grub-reboot "你要的内核标题"
    sudo reboot
  • RHEL/CentOS/Fedora
    bash
    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