跳至主要內容

Linux Kernel Build:Linux 内核编译

Someone大约 2 分钟ServerLinuxLinux

1. 预备工作

阿里云开源镜像站下载内核:阿里云open in new window。下载内核和patch包。

安装必要的软件

#安装必要的软件
apt-get install kernel-package build-essential libncurses5-dev fakeroot
#解压缩内核
tar -xzf linux-4.x.x.tar.gz

把内核目录linux-4.x.x和补丁patch都复制到/usr/src,然后进入/usr/src

cp linux-x.x /usr/src -rf
cp patch-x.x /user/src
cd /usr/src

2. 准备编译

#复制当前内核的config文件到linux-x.x/下
cp linux-headers-$(uname -r)/.config linux-x.x/
cd linux-x.x/
make menuconfig

选择load→OK→Save→OK→EXIT→EXIT的执行顺序。

3. 开始编译

# 编译启动映像,N表示CPU核数,单核为2.双核为4,以此类推
make bzImage -jN
#编译模块
make modules -jN
#安装模块
make modules-install
#安装内核
make install

4. 更新grub

# 4.5.0为版本号
mkinitramfs 4.5.0 -o /boot/initrd.img-4.5.0
update-grub2

内核与内核模块

内核模块

一般内核模块放置在lib/modules/$(uname -r)/kernel当中,包括arch, drivers和net等子文件。

在新建模块的时候,会遇到模块的依赖性问题,在 lib/modules/$(uname -r/modules.dep) 文件中存储,这个文件的创建使用 depmod [-Ane] 命令:

depmod [-Ane]
-A: 查找到新模块再更新该文件
-n: 不写入modules, 但在屏幕上输出
-e: 显示出当前已加载但不可执行的模块名称

举例:如果我做好了一个网卡驱动程序,文件名为a.ko,则更新内核模块:

cp a.ko /lib/modules/$(uname -r )/kernel/drivers/net
depmod

内核模块的查看

lsmod命令可查看已加载的模块,查看内核模块的信息,使用modinfo

modinfo [-adln] [module_name|filename]
-a: 仅列出作者名称
-d: 仅description
-l: 仅列出授权
-n: 列出该模块的详细路径

e.g. 列出ath模块的路径:modinfo -n ath

内核模块的加载与删除

modprobe命令可解决依赖性并决定需要加载的模块,优于insmod

对于删除模块:

rmmmod [-fw] module_name
-f: 强势删除,无论是否被使用
-w: 若该模块在使用,则等待该模块使用完后再删除

但是通常情况下,不推荐使用insmodrmmod命令,万一模块存在依赖属性的问题时,将无法直接加载或删除该模块,所以使用modprobe来处理加载模块的问题:

modprobe [-lcfr] module_name
-r: 删除某个模块