当前位置: 首页 > news >正文

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
http://www.dtcms.com/a/407020.html

相关文章:

  • android网站开发教程建筑行业网站开发
  • 网站建设一般收费广告设计公司图片
  • C++项目:仿muduo库高并发服务器---------LoopThreadPool模块和TcpServer模块的实现
  • S7-200 SMART GET/PUT 指令深度解析:从参数到故障排查(S7 协议的客户端 - 服务器通信)上
  • C++11之异常
  • 网站开发软硬件网站建设应注意什么
  • wordpress全站注明国外代理ip地址 免费
  • LightDM 深度解析:图形登录管理器的机制、TTY 映射与嵌入式调试实战
  • Dlib库 人脸应用实例 疲劳监测
  • 11.2. Linux 防火墙管理
  • VMware+RockyLinux+ikuai+docker+cri-docker+k8s 自用 实践笔记(三)
  • 基于全基因组做UGT基因家族,发Top期刊(纯生信)
  • 网店网站模板wordpress get_pages
  • 自己做视频网站的流程关键词排名点击软件首页
  • h5免费建站网站自动化采集
  • C语言字符串函数详解:字符处理、strlen、strcpy、strcat等使用与模拟实现
  • Alibaba Cloud Linux 3 +Docker 部署 ThinkPHP6 (宝塔环境)
  • ps免费素材网站有哪些wordpress虚拟3d网站
  • springBoot 集成Neo4j 实战演示
  • 深圳专业网站建设平台网页深圳龙华区发达吗
  • 正点原子【第四期】Linux之驱动开发学习笔记-6.1 pinctrl和gpio子系统
  • 网站要跟换域名怎么做wordpress支持大数据处理
  • 【LeetCode 每日一题】165. 比较版本号
  • 实验一 中断功能实验
  • 网站建设合同细节品牌注册号是哪个
  • 用Requests+BeautifulSoup实现天气预报数据采集:从入门到实战
  • 叫别人做网站要给什么东西长春哪家网站做的好
  • 怎样给网站做流量二级域名做网站域名
  • C语言⽂件操作讲解(1)
  • 记录commandlinerunner错误解决