找回密码
立即注册
搜索
热搜: Java Python Linux Go
发回帖 发新帖

1890

积分

0

好友

237

主题
发表于 2025-12-30 02:27:38 | 查看: 23| 回复: 0

Linux 内核是一种开源的类 Unix 操作系统宏内核。

Linux 内核是操作系统的主要组件,它作为计算机硬件与其上运行的进程之间的核心接口,负责两者之间的通信并高效地管理资源。可以将其比喻为果实硬壳中的种子,控制着硬件的所有主要功能。

内核具体负责哪些工作呢?其核心职责主要涵盖以下四项:

  • 内存管理:追踪记录有多少内存存储了什么以及存储在哪里。
  • 进程管理:确定哪些进程可以使用中央处理器(CPU)、何时使用以及持续多长时间。
  • 设备驱动程序:充当硬件与进程之间的调解程序或解释程序。
  • 系统调用和安全防护:从进程接受服务请求。

在理想状态下,内核对用户是不可见的。它在自己的空间(称为内核空间)中工作,负责分配内存并跟踪所有内容的存储位置。用户所看到的应用程序则运行在用户空间中。这些应用通过系统调用接口(SCI)与内核进行交互。

Linux内核结构功能模块图
图:Linux内核结构功能示意图

1. 内核简介

单内核体系设计、但充分借鉴了微内核设计体系的优点,为内核引入模块化机制。

Linux 内核的重要组成部分,主要有以下几部分:

  • kernel (内核核心):
    • 通常为 bzImage 格式。
    • 一般位于 /boot 目录下,文件名为 vmlinuz-VERSION-RELEASE
  • kernel object (内核对象):
    • 通常位于 /lib/modules/VERSION-RELEASE/ 目录。
    • 在配置时,[ ] 代表 N,表示不编译进内核;[M] 代表 M,表示编译为模块文件;
    • 代表 Y,表示编译进内核。
  • 辅助文件 (ramdisk):
    • initrd
    • initramfs

2. 内核模块

2.1 uname 命令

使用格式

  • uname [OPTION]...

参数解释

  • -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 输出的字段从左到右依次为:

  1. 模块名称
  2. 模块大小(字节)
  3. 被依赖的次数
  4. 依赖该模块的其他模块(如果有)
# 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 命令

语法格式

  • sysctl(选项)(参数)

命令参数

  • -w parameter=VALUE:临时修改某个内核参数。
  • -p [/path/to/conf_file]:从配置文件(默认为 /etc/sysctl.conf)加载参数设置,使其生效。
  • -a:打印当前所有可用的内核参数变量和值。

参数类型

  • /proc/sys/ 下的参数有些是只读的(输出信息),有些是可写的(用于配置内核功能)。

两种修改方式

  1. 使用 sysctl 命令:
    sysctl -w kernel.hostname=mail.example.com
  2. 使用 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 前提准备

  1. 准备开发环境:安装必要的开发包组,如 Server Platform DevelopmentDevelopment Tools
  2. 获取硬件信息:了解目标主机的 CPU (lscpu)、PCI设备 (lspci)、USB设备 (lsusb) 和块设备 (lsblk) 等信息。
  3. 获取内核源代码:从 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) 编译

  • 全量编译:make [-j #]# 为并行编译任务数。
  • 部分编译:

    # 编译某个子目录
    make drivers/net/
    
    # 编译某个特定模块
    make drivers/net/ethernet/intel/e1000/e1000.ko
  • 交叉编译:make ARCH=arm64
  • 清理编译文件:
    • make clean:清理大多数编译生成文件,保留配置。
    • make mrproper:清理所有编译生成文件及配置。
    • make distclean:更彻底的清理。

希望这篇关于Linux内核核心概念与实用操作的指南能帮助你更好地理解和管理系统。技术学习之路漫长,持续探索是关键。




上一篇:企业培训平台实战:逻辑漏洞导致未授权访问(用户名枚举与文件泄露)
下一篇:LCD液晶显示器核心技术:结构组成、背光原理与面板类型详解
您需要登录后才可以回帖 登录 | 立即注册

手机版|小黑屋|网站地图|云栈社区 ( 苏ICP备2022046150号-2 )

GMT+8, 2026-1-11 11:55 , Processed in 0.223425 second(s), 40 queries , Gzip On.

Powered by Discuz! X3.5

© 2025-2025 云栈社区.

快速回复 返回顶部 返回列表