Linux 内核开发环境搭建
因为一直想从事安全方面的工作,所以,我也要学习和熟悉Linux内核,以及内核相关的开发。
在研究内核的开始,就必须构建一套开发环境,这个是每个程序员好像做某个特定事情之前,必须要经历的步骤。
我选用的Ubuntu18.04作为开发机,然后采用了linux-4.19.157这个版本的内核。
第一步就是下载内核,直接在 https://www.kernel.org/ 下载,选择你需要的内核下载下来就好。
解压内核文件, sudo tar -xavf linux-4.19.157.tar.xz,然后为自己开发机安装相关开发编译工具。
- sudo apt-get install gcc make libncurses5-dev openssl libssl-dev
- sudo apt-get install build-essential
- sudo apt-get install pkg-config
- sudo apt-get install libc6-dev
- sudo apt-get install bison
- sudo apt-get install flex
- sudo apt-get install libelf-dev
然后构建一个默认的内核编译配置文件,将/boot/config-XXXXXX-generic这个文件复制你的内核源码根目录,并改为 .config 。
sudo cp /boot/config-4.15.0-20-generic ~/linux-4.19.157/.config
执行 sudo make menuconfig后,直接Exit,采用默认选项。
紧接着就开始编译,命令是:
sudo make 和 sudo make modules_install
这里根据机器的不同,需要等待编译完成。
编译完成后,你需要将编译好的内核,替换现在的内核。然后拷贝内核到系统目录,具体的操作步骤:
- sudo mv ~/linux-4.19.157 ~/../../usr/src/
- cd usr/src/linux-4.19.157
- sudo make install
- sudo mkinitramfs -o /boot/initrd.img-4.19.157
- sudo update-initramfs -c -k 4.19.157
- sudo update-grub2
这个时候,基本的内核编译和安装操作已经完成了。你可以重启一下,然后使用uname -a查看下当前的内核版本是否为你编译的。
接下来,就是要测试开发环境。
一个Sample内核模块程序:
#include <linux/init.h>
#include <linux/module.h>
MODULE_LICENSE("Dual BSD/GPL");
static int hello_init(void)
{
printk(KERN_ALERT "Hello world, By Garfield!\n");
return 0;
}
static void hello_exit(void)
{
printk(KERN_ALERT "Goodbye , Garfield.\n");
}
module_init(hello_init);
module_exit(hello_exit);
然后编写一个makefile文件
ifneq ($(KERNELRELEASE),)
CONFIG_MODULE_SIG=n
obj-m:=hello.o
else
PWD:=$(shell pwd)
KDIR:=/lib/modules/$(shell uname -r)/build
all:
$(MAKE) -C $(KDIR) M=$(PWD)
clean:
rm -rf *.o *.mod.c *.ko *.symvers *.order *.markers
endif
其中,CONFIG_MODULE_SIG=n这一句话很重要。如果你没有这一句话,在新的内核版本中,内核是无法被加载,加载后,会提示: altera_cvp:module verification failed : signature and/or required key missing – tainting kernel
然后,你就可以使用make编译刚刚的代码了。如果提示:*** /lib/modules/*/build Stop…则需要去映射一下内核源码。
具体操作为:
- 首先进入 lib/modules/xxxxx/ 然后查看是否有build这个目录,如果有,就删除。 sudo rm build
- 然后将源码映射过去,使用命令 ln -sv /usr/src/kernels/xxxx/ /lib/modules/xxxx/build
然后再次编译,理论上就会通过了。
最后,就是3个内核加载,删除,查看的命令了。内核输出的日志,用sudo dmesg查看,清楚日志则为sudo dmesg -c。
- insmod: 将模块插入内核中,使用方法:#insmod XXX.ko
- rmmod: 将模块从内核中删除,使用方法:#rmmod XXX.ko
- lsmod: 列表显示所有的内核模块,可以和grep指令结合使用。使用方法:#lsmod | grep XXX
Categories: Garfield's Diary