??部門已經(jīng)有固定下來的內核編譯方式。遷出完整代碼后日熬,加載環(huán)境變量文件,直接make即可重新編譯內核阵具。修改了某個模塊碍遍,直接到模塊目錄下make即可生成模塊,很方便阳液。最近想嘗試在centos下進行內核開發(fā)怕敬,查閱了幾個centos內核編譯wiki說明。感覺比較零散帘皿,于是整理出來方便后續(xù)查閱和分享东跪。
下載內核源碼
$ uname -r
3.10.0-514.26.2.el7.x86_64
有兩種方式可以下載centos與當前內核版本一致的源碼:
方式1:使用yumdownloader自動下載
$ sudo yum install yum-utils
$ sudo yumdownloader --source kernel
kernel-3.10.0-514.26.2.el7.src.rpm
要注意的是kernel源碼下載速度可能很慢,需要掛VPN下載鹰溜,否則可能會下載失敗虽填。
方式2:手工從鏡像網(wǎng)站下載
由于軟件源鏡像站點只保留二進制軟件包,所以我們要去centos軟件包歸檔站點“http://vault.centos.org”去下載內核源碼曹动。下載地址:http://vault.centos.org/7.3.1611/updates/Source/SPackages/kernel-3.10.0-514.26.2.el7.src.rpm斋日。
編譯內核源碼
??注意:官方強烈建議不要以root身份編譯內核源碼。主要原因是編譯過程中可能有對系統(tǒng)文件的修改操作墓陈,如果用root編譯就可能在你不知情的情況下直接修改了恶守。用普通用戶編譯過程中,要是有對系統(tǒng)文件的修改贡必,會因權限不足而報錯兔港。詳見參考“[5] Building Source RPM as non-root under CentOS ”。
- 以普通用戶創(chuàng)建編譯rpm所需的基礎目錄結構
$ mkdir -p ~/rpmbuild/{BUILD,BUILDROOT,RPMS,SOURCES,SPECS,SRPMS}
$ echo '%_topdir %(echo $HOME)/rpmbuild' > ~/.rpmmacros
- 安裝編譯內核所需軟件包
$ sudo yum install kernel-devel
$ sudo yum install rpm-build redhat-rpm-config asciidoc hmaccalc perl-ExtUtils-Embed pesign xmlto
$ sudo yum install audit-libs-devel binutils-devel elfutils-devel elfutils-libelf-devel
$ sudo yum install ncurses-devel newt-devel numactl-devel pciutils-devel python-devel zlib-devel
- 安裝內核源碼
$ rpm -i kernel-3.10.0-514.26.2.el7.src.rpm 2>&1 | grep -v exist
$ cd ~/rpmbuild/SPECS
$ rpmbuild -bp --target=$(uname -m) kernel.spec
現(xiàn)在可以在“~/rpmbuild/BUILD/kernel*/linux*”看到完整的內核源代碼了仔拟。
- 內核編譯設置
$ cd ~/rpmbuild/BUILD/kernel-*/linux-*/
$ cp /boot/config-`uname -r` .config
$ cp /usr/src/kernels/`uname -r`/Module.symvers .
$ cp /usr/src/kernels/`uname -r`/System.map .
$ cp /usr/src/kernels/`uname -r`/vmlinux.id .
??這里拷貝了當前內核的配置到源碼目錄衫樊。因為只是要編譯自己的內核模塊,所以直接復用當前內核的配置利花。避免了重新編譯整個內核科侈,以及內核版本校驗導致新模塊加載錯誤的問題。
$ make prepare
$ make modules_prepare
- 編譯新增模塊
$ cd ~/rpmbuild/BUILD/kernel-*/linux-*/
$ mkdir modules
- 增加加載/移除時會打印提示信息的hello模塊
hello/hello.c
#include <linux/init.h>
#include <linux/kernel.h>
#include <linux/module.h>
static int hello_init(void)
{
printk(KERN_ERR "Module init: Hello linux kernel.\n");
return (0);
}
static void hello_exit(void)
{
printk(KERN_ERR "Module exit: Bye-bye linux kernel.\n");
}
module_init(hello_init);
module_exit(hello_exit);
hello/Makefile
obj-m += hello.o
all:
make -C $(PWD) M=$(PWD) modules
clean:
make -C $(PWD) M=$(PWD) clean
$ make M=modules/hello
$ sudo cp modules/hello/hello.ko /lib/modules/`uname -r`/extra
- 新模塊加載/移除
$ cd /lib/modules/`uname -r`/extra
$ sudo insmod hello.ko
$ sudo rmmod hello
$ tail -f /var/log/messages
“
* localhost kernel: Module init: Hello linux kernel.
* localhost kernel: Module exit: Bye-bye linux kernel.
”
messages打印出了模塊加載/移除時的提示信息炒事,新增模塊工作正常兑徘。
參考
[1] SystemTap on CentOS,https://sourceware.org/systemtap/wiki/SystemTapOnCentOS
[2] 我需要內核的源代碼羡洛,https://wiki.centos.org/zh/HowTos/I_need_the_Kernel_Source
[3] 我需要創(chuàng)建一個自設的內核挂脑,https://wiki.centos.org/zh/HowTos/Custom_Kernel
[4] 創(chuàng)建你自己的內核模塊藕漱,https://wiki.centos.org/zh/HowTos/BuildingKernelModules
[5] Building Source RPM as non-root under CentOS,http://www.owlriver.com/tips/non-root/
修訂記錄
2017-11-05 PM:從網(wǎng)易博客遷移至簡書崭闲;
2017-07-16 PM:初稿肋联;
版權聲明:自由轉載-非商用-非衍生-保持署名(創(chuàng)意共享3.0許可證)