虽然以前也编译过内核,但是关于内核配置选项特别是有关本机驱动这块还是不熟悉,因为没有通过确定有效的途径知道当前工作正常的内核中到底使用了什么驱动模块来控制硬件,最近看到一本书《Linux kernel in a netshell》,感觉讲的还不错,所以记下笔记。
1.编译内核的工具
gcc
binutils(ld) binutils是gcc的工具链,用来链接目标文件以及汇编。
make
util-linux-ng(fdformat)
module-init-tools(depmod)
tune2fs
NFS(showmount)
udev udev是Linux中用来管理/dev目录的工具,它维护/dev目录下所有的设备文件。
2.下载wget/curl
3.编译
$make defconfig defconfig是i386计算机上的默认配置,也就是Linus Torvalds计算机中的配置。
$make config 最原始的配置方式
$make menuconfig 文本字符界面配置
$make xconfig X Window配置界面
$make 编译Kernel
4.高级编译选项
make -jN N设置为你CPU内核数的两倍,代表编译内核所用的线程数量。
$make drivers/usb/serial 只编译目录drivers/usb/serial,但是不会生成模块映像文件
$make M=drivers/usb/serial 同上,但是会生成模块文件,但是不会影响已经编译好的内核,如果想要改变已经编译好的内核,则需要重新执行
$make
$make drivers/usb/serial/visor.ko 只编译个别文件
$make -O=/path/to/output/ 将输出重定向到另一个目录,注意configure也必须使用-O重定向输出。
$make ARCH=x86_64 defconfig 设置目标计算机体系结构
$make ARCH=arm CROSS_COMPILE=/usr/bin/... 设置交叉编译。
$make CC="ccache gcc" 设置编译器变量CC
5.配置内核 1)查找当前内核配置文件.config,在许多发行版中,内核配置文件最有可能位于/usr/src/linux/下和/proc/config.gz文件。例如在我的ubuntu(karmic koala)中,有/usr/src/linux-headers-2.6.31-16-generic/.config 2)查看特定驱动的模块 这里以网卡为例,使用ifconfig可以看到本机网卡,lo是回环地址,eth0...等是真正工作的网卡。 $ifconfig $ls /sys/class/net/ 上面两种方法都可以查看本机网卡。现在我们要找到网卡驱动在内核中使用哪个模块来控制。 3)找到相应的内核模块 $basename `readlink /sys/class/net/eth0/device/driver/module` 在我的电脑上输出是8139too,表示网卡驱动模块名是8139too。 4)查找相应模块在配置内核中的选项 $cd /usr/src/linux-headers-2.6.31-16/ 注意这里不是16-generic,因为后者是中的大部分都是前者的链接。 $find -type f -iname "makefile"|xargs grep -i "8139too" 输出是./drivers/net/Makefile:obj-$(CONFIG_8139TOO) +=8139too.o 5)配置内核中的选项 $make menuconfig 然后按下'/‘键,输入搜索内容8139too,即可得到相关的配置选项。