Linux 内核编译,打包
1. 桌面内核编译
a. 环境准备
# 更新apt软件源
sudo apt update # 安装编译软件环境
apt install git fakeroot build-essential ncurses-dev xz-utils libssl-dev bc flex libelf-dev bison dwarves u-boot-tools xxd libncurses5-dev openssl
示意:
- fakeroot:fake root 环境模拟工具
- build-essential:基本的编译工具和环境,包括:C, C++, gcc, and g++
- ncurses-dev:为基于文本的终端提供API的编程库
- xz-utils:提供快速的文件压缩和解压缩
- libssl-dev:支持SSL和TSL加密数据,保证网络连接的安全性
- bc(Basic Calculator):一种支持语句交互式执行的数学脚本语言
- flex(Fast Lexical Analyzer Generator):生成将字符转换为标记的词法分析程序
- libelf-dev:发布用于管理ELF文件(可执行文件、核心转储和目标代码)的共享库
- bison:GNU解析器生成器,将语法描述转换为C程序
b. 下载源代码
wget https://cdn.kernel.org/pub/linux/kernel/v6.x/linux-6.9.4.tar.xz
tar -xvf linux-6.9.4.tar.xz
cd linux-6.9.4/
c. 按需修改内核编译配置
使用当前系统的.config文件作为模板
make defconfig # 使用默认配置文件
cp arch/arm64/configs/defconfig .config # 选择使用某一个配置
配置内核,如果没什么需求就直接save,然后exit
make menuconfig
中间可以加入自己需要的源码补丁。。。
d. 编译 && 安装
ⅰ. 方法1—deb包安装
# 安装依赖
apt install -y debhelper dh-virtualenv# 使用make bindeb-pkg进行编译
make -j$(nproc) bindeb-pkg # 交叉编译(需要先安装交叉编译器)
make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- -j$(nproc) bindeb-pkg# 指定内核版本
make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- -j$(nproc) KERNELRELEASE="5.4.96-39" bindeb-pkg
执行完成之后,在源码目录的上层会生成3个文件
- linux-headers-5.4.96-39_5.4.96-39-3_arm64.deb
- linux-image-5.4.96-39_5.4.96-39-3_arm64.deb
- linux-libc-dev_5.4.96-39-3_arm64.deb
# 安装新内核
sudo dpkg -i *.deb# 更新grub
sudo update-grub
ⅱ. 方法2—make install安装
# 编译和安装
sudo make -j$(nproc)
sudo make modules -j$(nproc)
# sudo make INSTALL_MOD_STRIP=1 modules_install -j8
sudo make modules_install -j$(nproc)
sudo make install -j$(nproc)# 更新grub
sudo update-grub
ⅲ. 内核打包
分别是:.config,bzImage,System.map 和系统/lib/modules/linux-3.12.5目录
- 拷贝/lib/modules/ 到目标系统的/lib/modules/下
- 拷贝 arch/ arm64/boot/zImage 到目标系统/boot下
- 拷贝System.map 到目标系统/boot下
(可以参考arch/arm64/boot/install.sh安装脚本)
补充: 几种内核镜像文件关系
- vmlinux: 编译出来的最原始的内核文件,未压缩。
- zImage: bzImage 是vmlinux经过gzip压缩后的文件(内核比较小采用zimage 大内核采用bzimage)。
- uImage: U-boot专用的映像文件,在zImage之前加上一个长度为0x40的tag(文件的类型、加载位置、生成时间、大小等信息)
e. 卸载内核
查看自己安装过的内核版本,在里面我们可以找到对应的headers与image。
dpkg --get-selections | grep image
卸载image和headers
# 先卸载headers:
sudo apt-get purge linux-headers-6.9.2
# 接着卸载image:
apt-get purge linux-image-6.9.2
# 更新grub
sudo update-grub
2. 安装交叉编译环境
a. 下载交叉编译工具链
- 工具链官方路径:
http://releases.linaro.org/components/toolchain/binaries/
- 也可以到国内源网站下载更快:
https://mirrors.tuna.tsinghua.edu.cn/armbian-releases/_toolchain
arm64用的工具链是包含aarch64关键字,选择最新版本下载并解压:
wget https://mirrors.tuna.tsinghua.edu.cn/armbian-releases/_toolchain/gcc-linaro-7.4.1-2019.02-x86_64_aarch64-linux-gnu.tar.xz
tar -xvf gcc-linaro-7.4.1-2019.02-x86_64_aarch64-linux-gnu.tar.xz
b. 安装交叉编译环境
创建一个路径来存放工具链:/usr/bin/toolchain,整个目录拷贝到路径下:
mkdir /usr/bin/toolchain
cp gcc-linaro-7.4.1-2019.02-x86_64_aarch64-linux-gnu /usr/bin/toolchain/ -rf
设置环境变量,加入工具链存放的路径
export PATH=$PATH:/usr/bin/toolchain/gcc-linaro-7.4.1-2019.02-x86_64_aarch64-linux-gnu/bin/
echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/:/usr/bin/toolchain/gcc-linaro-7.4.1-2019.02-x86_64_aarch64-linux-gnu/bin/
判断工具链加入是否正常
后续在make时需要指定架构和编译器
make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu-
3. 服务器编译
a. 环境准备
yum -y install gcc bc gcc-c++ ncurses ncurses-devel cmake elfutils-libelf-devel openssl-devel
- 安装dwarves
# 克隆dwarves源码到本地
git clone https://gitee.com/zhangjinyu/dwarves.git# 安装编译dwarves相关的工具包
yum install cmake# 开始编译
cd dwarves/
mkdir build
cd build
cmake -D__LIB=lib ..
make install# 查看pahole版本
pahole --version# 如若提示以下报错信息:
pahole: error while loading shared libraries: libdwarves_emit.so.1: cannot open shared object file: No such file or directoryvim /etc/ld.so.conf
追加:/usr/local/lib
# 重新加载动态库链接
执行命令:/sbin/ldconfig
- https://blog.csdn.net/fish332/article/details/134884806
b. 编译
make -j26
make modules_install -j26
make install
4. 参考连接:
- 添加系统调用https://blog.csdn.net/weixin_43976553/article/details/115932436
- Linux内核编译教程:从下载源码到模块加载详解-CSDN博客
- https://blog.csdn.net/ludaoyi88/article/details/115633849
- https://blog.csdn.net/zklth/article/details/6920148