Linux 内核是一种开源的类 Unix 操作系统宏内核。
Linux 内核是操作系统的主要组件,它作为计算机硬件与其上运行的进程之间的核心接口,负责两者之间的通信并高效地管理资源。可以将其比喻为果实硬壳中的种子,控制着硬件的所有主要功能。
内核具体负责哪些工作呢?其核心职责主要涵盖以下四项:
- 内存管理:追踪记录有多少内存存储了什么以及存储在哪里。
- 进程管理:确定哪些进程可以使用中央处理器(CPU)、何时使用以及持续多长时间。
- 设备驱动程序:充当硬件与进程之间的调解程序或解释程序。
- 系统调用和安全防护:从进程接受服务请求。
在理想状态下,内核对用户是不可见的。它在自己的空间(称为内核空间)中工作,负责分配内存并跟踪所有内容的存储位置。用户所看到的应用程序则运行在用户空间中。这些应用通过系统调用接口(SCI)与内核进行交互。

图:Linux内核结构功能示意图
1. 内核简介
单内核体系设计、但充分借鉴了微内核设计体系的优点,为内核引入模块化机制。
Linux 内核的重要组成部分,主要有以下几部分:
- kernel (内核核心):
- 通常为
bzImage 格式。
- 一般位于
/boot 目录下,文件名为 vmlinuz-VERSION-RELEASE。
- kernel object (内核对象):
- 通常位于
/lib/modules/VERSION-RELEASE/ 目录。
- 在配置时,
[ ] 代表 N,表示不编译进内核;[M] 代表 M,表示编译为模块文件; 代表 Y,表示编译进内核。
- 辅助文件 (ramdisk):
2. 内核模块
2.1 uname 命令
使用格式
参数解释
-n 显示节点名称
-r 显示 VERSION-RELEASE
-s 内核名称
-v 内核版本
-m 硬件名称
-i 硬件平台
-p 处理器类型
-o 操作系统
使用示例
# uname -m
i686
# uname -r
2.6.32-573.22.1.el6.i686
# uname -a
Linux MyServer 2.6.32-573.22.1.el6.i686 ... i686 i386 GNU/Linux
2.2 lsmod 命令
显示当前已加载的内核模块。
命令定义
- 显示的内容来源于
/proc/modules 文件。
- 通常结合
grep 使用来查询特定模块,例如:lsmod | grep -i ext4。
查看原始模块信息
# cat /proc/modules
iptable_filter 2173 0 - Live 0xed9b2000
ip_tables 9567 1 iptable_filter, Live 0xed9a9000
ext3 203718 1 - Live 0xed962000
...
搜索特定模块
# lsmod | grep ext4
ext4 339812 2
jbd2 75927 1 ext4
mbcache 6017 2 ext3,ext4
字段含义
lsmod 输出的字段从左到右依次为:
- 模块名称
- 模块大小(字节)
- 被依赖的次数
- 依赖该模块的其他模块(如果有)
# lsmod
Module Size Used by
iptable_filter 2173 0
ip_tables 9567 1 iptable_filter
...
2.3 modinfo 命令
显示模块的详细描述信息。
命令定义
modinfo 可以列出指定模块的信息,即使该模块尚未加载。
- 若参数是模块名而非文件名,它会像
modprobe 一样在 /lib/modules/version 目录中搜索。
语法
modinfo [选项] [ modulename|filename... ]
常用选项
-n 只显示模块文件路径
-p 显示模块参数
-a 显示作者信息
-d 显示描述信息
-l 显示许可证信息
实战演示
# modinfo ext4
filename: /lib/modules/2.6.32-573.22.1.el6.i686/kernel/fs/ext4/ext4.ko
license: GPL
description: Fourth Extended Filesystem
author: Remy Card, Stephen Tweedie, Andrew Morton, Andreas Dilger, Theodore and others
...
2.4 modprobe 命令
智能地装载或卸载内核模块,自动处理依赖关系。
命令定义
- 配置文件:
/etc/modprobe.conf 或 /etc/modprobe.d/*.conf
- 依赖解决:依赖
/lib/modules/$(uname -r)/modules.dep 文件。该文件可由 depmod 命令生成,列出了模块间的依赖关系。
语法
modprobe [ -c ]
modprobe [ -l ] [ -t dirname ] [ wildcard ]
modprobe [ -r ] [ -v ] [ -n ] [ -i ] [ modulename … ]
关键选项
-v:显示详细过程,常用于调试。
-r:移除模块(会同时移除其依赖模块)。
-n:与 -v 联用进行干跑测试,不实际执行操作。
-a:装载命令行中列出的所有模块。
-l:列出所有可用模块(已废弃,建议使用 find)。
2.5 depmod 命令
生成内核模块依赖关系文件(modules.dep)及系统信息映射文件的工具。
语法
depmod [-adeisvV][-m <文件>][--help][模块名称]
常用参数
-a:分析所有可用的模块。
-v:执行时显示详细信息。
2.6 insmod 和 rmmod 命令
低级模块操作命令,不自动处理依赖关系。
insmod 命令
- 向 Linux 内核中插入指定模块文件。
insmod [ filename ] [ module options... ]
rmmod 命令
- 从内核中删除指定模块。
rmmod [ modulename ]
- 选项:
-f:强制删除(需要内核支持)。
-w:等待模块不再被使用后删除。
3. /proc 目录
内核通过 proc 伪文件系统输出其内部状态、统计信息以及可配置参数。
# ls /proc/
1 1173 22 29855 35 47 60 ... uptime
3.1 sysctl 命令
语法格式
命令参数
-w parameter=VALUE:临时修改某个内核参数。
-p [/path/to/conf_file]:从配置文件(默认为 /etc/sysctl.conf)加载参数设置,使其生效。
-a:打印当前所有可用的内核参数变量和值。
参数类型
/proc/sys/ 下的参数有些是只读的(输出信息),有些是可写的(用于配置内核功能)。
两种修改方式
- 使用
sysctl 命令:
sysctl -w kernel.hostname=mail.example.com
- 使用
echo 重定向(针对大多数参数):
echo "www.example.com" > /proc/sys/kernel/hostname
常见配置参数举例
net.ipv4.ip_forward:控制IP转发 (/proc/sys/net/ipv4/ip_forward)。
vm.drop_caches:清理页面缓存 (/proc/sys/vm/drop_caches)。
kernel.hostname:系统主机名 (/proc/sys/kernel/hostname)。
3.2 修改配置文件
内核参数的永久修改需要通过编辑 /etc/sysctl.conf 文件,然后执行 sysctl -p 来生效。
# cat /etc/sysctl.conf
# Kernel sysctl configuration file for Red Hat Linux
# Controls IP packet forwarding
net.ipv4.ip_forward = 0
# Controls source route verification
net.ipv4.conf.default.rp_filter = 1
...
3.3 实战演示
# 查看所有可读变量
sysctl -a
# 临时修改参数
sysctl -w kernel.sysrq=0
sysctl -w net.ipv4.conf.default.accept_redirects=0
# 屏蔽Ping请求(配置文件中添加)
net.ipv4.icmp_echo_ignore_all = 1
# 使配置文件中的改动生效
/sbin/sysctl -p
4. /sys 目录
sysfs 伪文件系统,输出内核识别出的各硬件设备的属性信息及内核可调整的硬件工作特性。
4.1 udev
udev 是运行在用户空间的设备管理器。
- 它根据
/sys/ 提供的信息和 /etc/udev/rules.d/ 及 /usr/lib/udev/rules.d/ 目录下的规则文件,动态地在 /dev 目录下创建设备节点。
4.2 ramdisk 文件的制作
当内核的 initramfs 文件丢失或损坏时,可以重新制作。
方法一:使用 mkinitrd (CentOS 6)
mv /boot/initramfs-$(uname -r).img /root/backup/ # 备份原文件
mkinitrd /boot/initramfs-$(uname -r).img $(uname -r)
方法二:使用 dracut (较新系统)
dracut /boot/initramfs-$(uname -r).img $(uname -r)
4.3 查看 ramdisk 内容
initramfs 文件是一个经过压缩的 cpio 归档文件。
# 查看文件类型
file /boot/initramfs-2.6.32-504.el6.x86_64.img
# 解压查看内容(以.gz为例)
cd /boot
mv initramfs-2.6.32-504.el6.x86_64.img initramfs-2.6.32-504.el6.x86_64.img.gz
gzip -d initramfs-2.6.32-504.el6.x86_64.img.gz
file initramfs-2.6.32-504.el6.x86_64.img # 此时应显示为cpio归档
# 解压cpio归档
mkdir initrd
cd initrd
cpio -id < ../initramfs-2.6.32-504.el6.x86_64.img
ls # 查看微型根文件系统内容
5. 编译内核
5.1 前提准备
- 准备开发环境:安装必要的开发包组,如
Server Platform Development 和 Development Tools。
- 获取硬件信息:了解目标主机的 CPU (
lscpu)、PCI设备 (lspci)、USB设备 (lsusb) 和块设备 (lsblk) 等信息。
- 获取内核源代码:从 www.kernel.org 下载所需版本的内核源码包。
5.2 简易安装内核
这种方法基于现有系统的配置模板,适合快速为当前系统编译一个同版本的新内核。
# 1. 解压源码并创建链接
tar xf linux-3.10.67.tar.xz -C /usr/src
cd /usr/src
ln -sv linux-3.10.67 linux
cd linux
# 2. 复制当前系统配置作为模板
cp /boot/config-$(uname -r) .config
# 3. 打开图形界面配置内核选项(可选,可在此增减模块)
make menuconfig
# 4. 使用screen防止编译中断,并用多线程编译
screen
make -j $(nproc) # nproc为CPU线程数
# 5. 安装模块和内核
make modules_install
make install # 此命令会安装bzImage、生成initramfs并更新grub配置
# 6. 重启并选择新内核启动
reboot
若想深入了解计算机基础相关知识,可以参考相关的操作系统与体系结构原理。
5.3 详解编译内核
(1) 配置内核选项
- 更新模式配置(在现有
.config基础上修改):
make config:命令行问答式。
make menuconfig:文本图形界面(推荐)。
make gconfig / make xconfig:图形界面。
- 全新配置模式:
make defconfig:使用默认配置。
make allnoconfig:所有选项均设为“no”。
(2) 编译
希望这篇关于Linux内核核心概念与实用操作的指南能帮助你更好地理解和管理系统。技术学习之路漫长,持续探索是关键。