一、内核模块管理
1.1 内核源码与模块路径
内核源码路径:
ls /usr/src/kernels/$(uname -r)/
ls /usr/src/kernels/2.6.32-279.el6.x86_64/
建议不要删除内核源码,因为有些软件在编译安装时需要使用内核源码。
Linux 系统的基本组成:
linux = boot + kernel + fs
内核模块(可理解为驱动)路径:
ls /lib/modules/$(uname -r)/kernel
输出目录及含义:
| 目录 | 含义 |
|---|---|
arch/ |
架构平台相关 |
crypto/ |
加密相关 |
drivers/ |
驱动相关 |
fs/ |
文件系统 |
kernel/ |
内核核心 |
lib/ |
库 |
net/ |
网络 |
sound/ |
声音 |
由内核源码编译出来的模块按分类放在上述目录中。
1.2 模块查看与信息
查看当前已装载的模块:
lsmod
查看特定模块信息:
modinfo cdrom
输出示例:
filename: /lib/modules/2.6.32-431.el6.x86_64/kernel/drivers/cdrom/cdrom.ko
license: GPL
srcversion: 6C1B1032B5BB33E30110371
depends:
vermagic: 2.6.32-431.el6.x86_64 SMP mod_unload modversions
parm: debug:bool
parm: autoclose:bool
parm: autoeject:bool
parm: lockdoor:bool
parm: check_media_type:bool
parm: mrw_format_restart:bool
1.3 确认网卡模块名称
通过 dmesg 查看网卡模块名称:
dmesg | grep eth
输出示例:
e1000 0000:02:01.0: eth0: (PCI:66MHz:32-bit) 00:0c:29:72:3e:33
e1000 0000:02:01.0: eth0: Intel(R) PRO/1000 Network Connection
e1000 0000:02:05.0: eth1: (PCI:66MHz:32-bit) 00:0c:29:72:3e:3d
e1000 0000:02:05.0: eth1: Intel(R) PRO/1000 Network Connection
e1000: eth0 NIC Link is Up 1000 Mbps Full Duplex, Flow Control: None
eth0: no IPv6 routers present
上例中网卡模块名为 e1000。
1.4 模块的装载与删除
| 命令 | 说明 |
|---|---|
rmmod <模块名> |
删除模块 |
modprobe <模块名> |
装载模块,只需写模块名 |
insmod <模块绝对路径> |
装载模块,必须写绝对路径 |
rmmod vmci
modprobe vmci
insmod /lib/modules/2.6.32-279.el6.x86_64/misc/vmci.ko
1.5 模块操作示例:删除并恢复网卡模块
删除网卡模块后网络立即不可用,重新装载后恢复:
mii-tool eth0
# eth0: negotiated 100baseTx-FD flow-control, link ok
rmmod r8169
mii-tool eth0
# SIOCGMIIPHY on 'eth0' failed: No such device
modprobe r8169
二、内核编译
2.1 什么是内核编译
对内核源码的功能进行定制。内核源码可从 www.kernel.org 下载。
当前系统使用的内核源码:
ls /usr/src/kernels/$(uname -r)
2.2 什么情况下需要编译内核
- 系统需要支持某个功能,但内核默认不支持,又不想升级成新系统,则需要编译内核。
- 开发了一个模块,需要内核的支持,也需要编入内核。
2.3 内核编译需要考虑的因素
- 自己定制的内核运行更快,具有更少的代码。
- 把不需要的功能编译进内核可能会有被漏洞利用的风险。
- 将某种功能编译成模块方式,比直接编译进内核速度要慢。
2.4 内核编译步骤
第一步:准备内核源码并解压
tar xf /var/www/html/index.html/soft/kernel/linux-4.4.tar.xz -C /usr/src/kernels/
cd /usr/src/kernels/linux-4.4/
第二步:清理源码树
make mrproper
该命令清除当前内核源码中的编译痕迹,使之干净,类似于编译软件时的 make clean。
第三步:配置内核选项
有多种配置界面可选:
| 命令 | 说明 |
|---|---|
make config |
基于文本的传统配置界面,不推荐使用 |
make menuconfig |
基于 ncurses-devel 库的文本选单方式(需安装 ncurses-devel) |
make oldconfig |
在原来的内核配置基础上进行修改 |
make xconfig |
基于 X Windows 的图形配置界面,基于 Qt(需安装 avahi-qt3-devel) |
使用 make menuconfig 时,如果终端窗口太小会报错:
It must be at least 19 lines by 80 columns.
配置界面中选项的含义:
| 符号 | 含义 |
|---|---|
* |
编入内核 |
M |
编成模块 |
| 空 | 不编入内核 |
有三种括号类型:
| 括号 | 含义 |
|---|---|
方括号 [ ] |
要么编进,要么不编 |
尖括号 < > |
三种选择:编进、不编、编成模块 |
圆括号 ( ) |
多选一 |
定制完成后保存,所有选择结果会保存到 .config 文件中,可用 vi 打开查看。
第四步:编译内核
make
编译过程相当漫长。
第五步:安装模块
make modules_install
将编译后的模块复制到 /lib/modules/<内核新版本>/ 目录下,之后即可用 modprobe、insmod 装载使用。
第六步:安装内核
make install
拷贝 vmlinuz、initramfs 到 /boot/ 目录下,并自动修改 GRUB 配置。
编译完成后,重启系统,在 GRUB 菜单中选择新内核进入系统进行验证。
2.5 RPM 方式安装内核(RHEL 5 时代)
| 内核类型 | 说明 |
|---|---|
| PAE(Physical Address Extend) | 物理地址扩展,使 32 位系统可以使用大于 4G 的内存 |
| xen | Xen 虚拟化使用的内核(半虚拟化需要修改内核) |
rpm -ivh /share/yum/Server/kernel-PAE-2.6.18-164.el5.i686.rpm
rpm -ivh /share/yum/Server/kernel-xen-2.6.18-164.el5.i686.rpm
2.6 作业
- 写出安装一个以
.src.rpm结尾的软件包的命令步骤。 - 写出编译一个源码包的安装步骤。
此处评论已关闭