Linux内核编译

2021-12-03
#linux #kernel

Linux 5.15.5内核编译

先去官网下载最新内核源码,预先安装好以下这些库

sudo apt install libssl-dev libncurses5-dev flex bison libelf-dev libssl-dev dwarves

make menuconfig进行编译前配置,主要要打开下面修改选项,这样可以更容易的调试,若要使用llvm,则加上LLVM=1

kernel hacking –> Compile-time checks and compiler options –> Compile the kernel with debug info
kernel hacking –> Compile-time checks and compiler options –> Provide GDB scripts for kernel debugging

为了加速编译,可以关闭下面用不到的功能

Networking support
Virtualization
File systems -> CD-ROM/DVD Filesystems
File systems -> DOS/FAT/EXFAT/NT Filesystems

编辑.config,关闭校验签名的功能

CONFIG_SYSTEM_REVOCATION_LIST=n
CONFIG_SYSTEM_TRUSTED_KEYS=""
CONFIG_SYSTEM_TRUSTED_KEYRING=n

编译

make bzImage -j 12
make headers_install INSTALL_HDR_PATH=./headers

得到输出文件arch/x86/boot/bzImage,可以把这个文件单独移出来。

交叉编译

sudo apt install binutils-aarch64-linux-gnu gcc-aarch64-linux-gnu
# 其中要选择对应硬件信息,qemu上运行可以选择
make ARCH=arm64 CROSS_COMPILE=/usr/bin/aarch64-linux-gnu- menuconfig

# 同上修改.config,关闭签名

make ARCH=arm64 CROSS_COMPILE=/usr/bin/aarch64-linux-gnu- -j12
# 导出头文件
make headers_install ARCH=arm64 INSTALL_HDR_PATH=./headers

编译busybox

官网下载最新源码

make menuconfig打开Settings -> Build static binary (no shared libs)

交叉编译时Settings -> Cross compiler prefix 设为aarch64-linux-gnu-

然后make && make install

得到生成文件夹_install

制作最小根文件系统

_install拷贝一份。进入文件夹执行以下命令。

mkdir proc dev sys
cat << EOF > init
#!/bin/sh
mount -t proc none /proc
mount -t sysfs none /sys
mount -t devtmpfs devtmpfs /dev
echo -e "\nBoot took \$(cut -d' ' -f1 /proc/uptime) seconds\n"
setsid cttyhack setuidgid 1000 sh
umount /proc
umount /sys
poweroff -d 0 -f
EOF
chmod 755 init
sudo chown -R root:root *

一个最小的文件系统就做好了,然后将其打包起来,先进入该文件夹,然后用下面的命令

find . | cpio -o --format=newc | gzip -9 > ../initrd.cpio.gz

生成initrd.cpio.gz文件

Qemu运行和调试

安装:sudo apt install qemu-system-x86

启动:

qemu-system-x86_64 -kernel ./bzImage -initrd ./initrd.cpio.gz -append "console=ttyS0" -enable-kvm -nographic

一些常用快捷键: Ctrl+A X 退出;Ctrl+A H 打开帮助。

aarch64下

qemu-system-aarch64 -machine virt -cpu cortex-a53 -smp 1 -m 2G -kernel ./Image -initrd ./initrd.cpio -append "console=ttyAMA0" -nographic

Ccache加速编译

安装ccache:sudo apt install ccache

ccache -d ~/.ccache # 配置ccache缓存路径
ccache -M 50G # 配置ccache缓存上限

内核make时加上环境变量HOSTCC="ccache gcc"CROSS_COMPILE="ccache "(不要忘记ccache后面的空格)

缓存后一次全新编译只要4min。