编译内核的目的
对现有内核添加新的功能 就是向内核添加新模块
对现有系统添加新的内核
对现有内核进行升级
选择内核版本
以次版本号为偶数的为准,奇数版属于测试版或开发版 不稳定
新内核可以去 http://www.kernel.org/ 下载
介绍
技术上说Linux是一个内核。“内核”指的是一个提供硬件抽象层、磁盘及文件系统控制、多任务等功能的系统软件。一个内核不是一套完整的操作系统。一套基于Linux内核的完整操作系统叫作Linux操作系统,或是GNU/Linux。
微内核和单内核
微内核是将所有功能独立出来,内核只负责通信(消息传递),优点是灵活,缺点是消息传递过多影响性能,可自由加载卸载模块
单内核是将所有功能换成一体,内核可直接调用函数,无需消息传递.优点简单高效,缺点不好维护
,不能独立卸载与加载新的模块,WINDOWS NT与MAC OS则是典型的单内核
linux则是他们的混合物,汲取双方的优点于一身.既可直接调用函数 又可随时按需加载卸载模块
1.升级内核
安装检查 需要安装开发库和开发工具里的包
[root@stu32 ~]# rpm -qa | grep "ncurses"
ncurses-devel-5.5-24.20060715
ncurses-5.5-24.20060715
下载 linux-2.6.29.tar.gz
[root@stu32 src]# tar xvjf linux-2.6.29.tar.gz
内核帮助文档
Documentation/
介绍 devices.txt
# ll /dev/sda
brw-r----- 1 root disk 8, 0 06-04 07:45 /dev/sda
# rm -rf /dev/sda
# mknod -m 640 /dev/sda b 8 0
# man mknod
# chown :disk /dev/sda
# ll /dev/sda
brw-r----- 1 root disk 8, 0 06-04 10:10 /dev/sda
#
cd /usr/src/linux-2.6.29
make mrproper # 清理代码数(会将.o和.ko删除)
make menuconfig # 配置内核模块 会自动从/boot/config-version加载现机器的内核配置
make # 开始编译
make modules_install # 安装模块 模块的位置 /lib/modules/KERNEL-VERSION/kernel
maks install # 安装内核及相关文件到 /boot/ 下 并修改启动菜单
2.模块
lsmod 查看系统中已加载的模块
管理模块
rmmod 卸载模块
insmod 加载模块
加载模块要写模块的绝对路径
modinfo 查看模块的详细信息
-l 查看所有模块
modprobe --show-depends lp 查依赖关系
模块有依赖性
卸载一个模块必须先将依赖着它的模块先卸载掉 加载模块也必须先加载依赖关系
# modinfo lp | grep depends
depends: parport
# modinfo parport_pc | grep depends
depends: parport
#
# rmmod parport
ERROR: Module parport is in use by lp,parport_pc
# rmmod lp
# rmmod parport_pc
# rmmod parport
#
让系统自动来完善依赖关系(只能在加载时,卸载无效,还需手动)
# lsmod | grep -e lp -e parport
# modprobe lp
# lsmod | grep -e lp -e parport
parport_pc 29157 1
lp 15849 0
parport 37513 2 parport_pc,lp
#
# modprobe -r parport
FATAL: Module parport is in use.
modprobe 是通过 /lib/modules/2.6.18-53.el5/modules.* 来维护依赖关系的
当这些文件丢失或新添了模块时 可以手动重新产生依赖关系
depmod
3.为原内核添加新模块的方法:
安装前的检查
[root@stu32 ~]# rpm -qa | grep "ncurses\|rpm-build"
ncurses-devel-5.5-24.20060715
ncurses-5.5-24.20060715
rpm-build-4.4.2-47.el5
[root@stu32 ~]#
# rpm -ivh kernel-2.6.18-53.el5.src.rpm
# cd /usr/src/redhat/SPECS
# rpmbuild -bp --target=$(uname -m) kernel-2.6.spec
# cd /usr/src/redhat/BUILD/kernel-2.6.18/linux-2.6.18.i686
# uname -r
2.6.18-53.el5
# head -n 5 Makefile
VERSION = 2
PATCHLEVEL = 6
SUBLEVEL = 18
#EXTRAVERSION = -prep
EXTRAVERSION = -53.el5
# make menuconfig
# make M=fs/ntfs/
错误1
ERROR: Kernel configuration is invalid.
include/linux/autoconf.h or include/config/auto.conf are missing.
Run 'make oldconfig && make prepare' on kernel src to fix it.
解决方法
# make oldconfig && make prepare
再次编译模块
# make M=fs/ntfs/
错误2
/bin/sh: scripts/mod/modpost: 没有那个文件或目录
make[1]: *** [__modpost] 错误 127
make: *** [modules] 错误 2
解决方法
# make scripts
# make M=fs/ntfs/
Building modules, stage 2.
MODPOST
CC fs/ntfs/ntfs.mod.o
LD [M] fs/ntfs/ntfs.ko
# cp fs/ntfs/ntfs.ko /lib/modules/2.6.18-53.el5/kernel/fs/ntfs/
# depmod -a
# modprobe ntfs
# lsmod | grep ntfs
ntfs 187284 0