当前位置:首页>Linux>自己动手编译C语言编写的Linux最新版本内核,原来只要三步很简单!

自己动手编译C语言编写的Linux最新版本内核,原来只要三步很简单!

  • 2026-09-19 23:26:26
自己动手编译C语言编写的Linux最新版本内核,原来只要三步很简单!

「从今天起,好好学习,天天向上」

每天一分钟,积少成多,从C语言修炼成长为计算机高手。

「纯干货系列,不玩虚的,纸上学来终觉浅,自己动手干才是王道!」

【~~小白一名,如有错漏,请各位包涵,偶将虚心学习~~】

自己动手编译C语言编写的Linux最新版本内核

最新版本的内核往往提供更多的功能和安全补丁,那么如何在不重装系统的前提下编译安装最新内核。

Linux内核当前主要是C语言编写,刚好也可以了解C语言编译工具链。

安装内核是很重要的技能哈,不过就算是计算机专业的学生,毕业前估计也没几人真正做过这个实验哈!

大家看到这篇文章前,自己都亲自编译安装过吗?欢迎留言讨论哦。

最终成果如下:

实验环境

我的电脑是MAC+VMware Linux虚拟机,大家其实用Windows + VMware Linux也是一样,不过注意MAC当前是ARM芯片架构、Windows主要是X86_64。

Linux发行版,主要就是Ubuntu、Debian、CentOS等,这里选用Ubuntu,请注意配置必要高一些,虚拟机内存8GB以上,硬盘100GB以上。

$ cat /etc/issue
Ubuntu 24.04.3 LTS \n \l

$ lsb_release -a
No LSB modules are available.
Distributor ID:    Ubuntu
Description:    Ubuntu 24.04.3 LTS
Release:    24.04
Codename:    noble

$ uname -a
Linux ccoder-VMware20-1 6.14.0-36-generic 
#36~24.04.1-Ubuntu SMP PREEMPT_DYNAMIC Wed Oct 15 15:22:32 UTC 2 aarch64 aarch64 aarch64 GNU/Linux

$ gcc --version
gcc (Ubuntu 13.3.0-6ubuntu2~24.04.1) 13.3.0

$ make --version
GNU Make 4.3

安装过程

安装编译依赖和工具

# 更新软件源
sudo apt update

# 安装必要的构建工具和依赖
sudo apt install -y \
  build-essential libncurses-dev bison flex \
  libssl-dev libelf-dev bc dwarves zstd \
  libdw-dev gawk fakeroot zlib1g-dev

上面工具和依赖很多,不同内核版本所需要的依赖也不同,如果想了解某个依赖包具体是干什么,可以使用命令apt info查看。

~$ apt info build-essential
Package: build-essential
Version: 12.10ubuntu1
Priority: optional
Build-Essential: yes
Section: devel
Origin: Ubuntu
Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com>
Original-Maintainer: Matthias Klose <doko@debian.org>
Bugs: https://bugs.launchpad.net/ubuntu/+filebug
Installed-Size: 17.4 kB
Depends: libc6-dev | libc-dev, gcc (>= 4:12.3), g++ (>= 4:12.3), make, dpkg-dev (>= 1.17.11)
Task: xubuntu-desktop, ubuntustudio-photography, ubuntukylin-desktop, ubuntukylin-desktop, ubuntukylin-desktop-minimal, ubuntu-mate-core, ubuntu-mate-desktop, ubuntu-budgie-desktop-minimal, ubuntu-budgie-desktop, ubuntu-budgie-desktop-raspi, ubuntu-unity-desktop, edubuntu-desktop-gnome-minimal, edubuntu-desktop-gnome, edubuntu-desktop-gnome-raspi, ubuntucinnamon-desktop-minimal, ubuntucinnamon-desktop
.......

下载内核源码

虚拟机中的内核是6.14.0,下载一个更新的内核版本安装,直接去linux内核官网https://kernel.org,这个网站真的很重要!

2026.8.15日,当前最新的稳定版本是7.1.8,压缩包不大,160MB左右,下载下来:linux 7.1.8内核源码


# 切换到当前用户目录

~$ cd ~

# 下载

~$ wget https://cdn.kernel.org/pub/linux/kernel/v7.x/linux-7.1.8.tar.xz

# 解压

~$ tar xfv linux-7.1.8.tar.xz

~$ cd linux-7.1.8/

编译前需要生成内核配置

内核配置非常多,涉及内核模块各种特性的设置,最简单的方式,也是为了兼容,参考当前的内核配置。

当前内核配置文件位置:

ls /boot/config-$(uname -r)

more /boot/config-$(uname -r)

将当前内核的配置文件复制一份到新内核源码解压的目录:

~$ cd linux-7.1.8/

~/linux-7.1.8$ pwd
/home/ccoder/linux-7.1.8

~/linux-7.1.8$ ls /boot/config-$(uname -r)
/boot/config-6.14.0-36-generic

~/linux-7.1.8$ cp /boot/config-6.14.0-36-generic .config

注意:由于当前Ubuntu自带内核是在Ubuntu私有的服务器构建,带有内核签名证书,但是我们从官网下载的最新内核不可能有Ubuntu的私有证书去签名,因此必须关闭选项。

~/linux-7.1.8$ cat  .config | grep pem
CONFIG_MODULE_SIG_KEY="certs/signing_key.pem"
CONFIG_SYSTEM_TRUSTED_KEYS="debian/canonical-certs.pem"
CONFIG_SYSTEM_REVOCATION_KEYS="debian/canonical-revoked-certs.pem"

# 使用脚本关闭.config相关选项
~/linux-7.1.8$ scripts/config --disable SYSTEM_TRUSTED_KEYS
~/linux-7.1.8$ scripts/config --disable SYSTEM_REVOCATION_KEYS

# 关闭模块签名,因为certs/signing_key.pem私钥文件也不存在
~/linux-7.1.8$ scripts/config --disable MODULE_SIG

基于当前目录下.config文件,生成即将编译内核需要的配置文件,这样编译时候,就不会弹出交互命令。

~$ cd linux-7.1.8/
~/linux-7.1.8$ make olddefconfig

编译和安装

编译时间比较长,根据机器配置,我这边的虚拟机编译了2个多小时。

# 默认编译全部模块和内核镜像,模块和文件散落在各个目录
# $(nproc)取当前系统的处理器数量,我的虚拟机是2个。
make -j$(nproc)

几种常见的编译选项对比,这里实验为了完整,我选择了最简单、最普通的默认方式。

make -j2相当于make -j2 all,编译内核镜像vmlinuz和内核模块以及辅助文件,编译后的文件散落在各个子目录,安装需要拷贝文件,卸载需要手工删除文件。

make -j2 bindeb-pkg直接在源码的父目录生成干净的deb安装包,安装和卸载都是使用dpkg工具,和普通的软件安装一样。

bindeb-pkg和deb-pkg区别这里也分享下:顾名思义,bindeb-pkg仅包括二进制包,deb-pkg除了二进制包还将源码打包,根据需要选择,如果是体验安装新内核,直接使用bindeb。

# 如果仅仅是安装内核,可以直接使用
# 生成二进制的内核不包括源码,另外安装使用deb包管理和卸载方便
make -j$(nproc) bindeb-pkg LOCALVERSION=-custom

编译完成以后,生成文件如下,主要在目录arch/目录下,由于我的计算机是ARM64架构,所以在对应的arm64子目录中,如果是x86架构就在x86目录中。

编译后可引导的内核镜像:vmlinuz文件目录,也就17M。

~$ pwd
/home/ccoder/linux-7.1.8/arch/arm64/boot
~$ ls
dts    install.sh  vmlinux.bin  vmlinuz.efi      vmlinuz.o
Image  Makefile    vmlinuz      vmlinuz.efi.elf  zboot-header.o

~$ ll -h vmlinuz
-rw-rw-r-- 1 ccoder ccoder 17M Aug 15 14:31 vmlinuz

其它文件:

  • • vmlinux:源码根目录中,带调试符号,未压缩的内核,550MB。
  • • 内核模块:在各个源码子目录下生成对应的模块编译后的.ko文件。

完整安装过程如下:

cd linux-7.1.8/

# 1. 编译
make -j2

# 2. 安装模块(先装模块,再装内核)
# 直接将编译后的新版本内核模块拷贝到对应的新目录中
# /lib/modules/7.1.8/*
sudo make modules_install

# 3. 安装内核
# 将新编译的内核文件安装到/boot/vmlinuxz-7.1.8目录下
# 但是并没有
sudo make install

# 4. 生成初始化内存文件系统包含根文件系统驱动 initramfs
# 这一步可以省略,因为上面的步骤已经生成。
# sudo update-initramfs -c -k $(make kernelrelease)

# 5. 更新GRUB引导菜单,make install这一步也可以省略
# sudo update-grub

# 6. 重启
sudo reboot

make install过程中,输出信息如下:

~$ sudo make install
  INSTALL /boot
run-parts: executing /etc/kernel/postinst.d/initramfs-tools 7.1.8 /boot/vmlinuz-7.1.8
update-initramfs: Generating /boot/initrd.img-7.1.8
run-parts: executing /etc/kernel/postinst.d/unattended-upgrades 7.1.8 /boot/vmlinuz-7.1.8
run-parts: executing /etc/kernel/postinst.d/update-notifier 7.1.8 /boot/vmlinuz-7.1.8
run-parts: executing /etc/kernel/postinst.d/xx-update-initrd-links 7.1.8 /boot/vmlinuz-7.1.8
I: /boot/initrd.img is now a symlink to initrd.img-7.1.8
run-parts: executing /etc/kernel/postinst.d/zz-shim 7.1.8 /boot/vmlinuz-7.1.8
run-parts: executing /etc/kernel/postinst.d/zz-update-grub 7.1.8 /boot/vmlinuz-7.1.8
Sourcing file `/etc/default/grub'
Generating grub configuration file ...
Found linux image: /boot/vmlinuz-7.1.8
Found initrd image: /boot/initrd.img-7.1.8
Found linux image: /boot/vmlinuz-6.14.0-36-generic
Found initrd image: /boot/initrd.img-6.14.0-36-generic
Warning: os-prober will not be executed to detect other bootable partitions.
Systems on them will not be added to the GRUB boot configuration.
Check GRUB_DISABLE_OS_PROBER documentation entry.
Adding boot menu entry for UEFI Firmware Settings ...
done

重启之后,查看当前的内核版本

以下几种方式都可以验证:

$ uname -r
7.1.8

$ cat /proc/version
Linux version 7.1.8 (ccoder@ccoder-VMware20-1) (gcc (Ubuntu 13.3.0-6ubuntu2~24.04.1) 13.3.0, GNU ld (GNU Binutils for Ubuntu) 2.42) #1 SMP PREEMPT_DYNAMIC Sat Aug 15 14:29:15 CST 2026

$ uname -v
#1 SMP PREEMPT_DYNAMIC Sat Aug 15 14:29:15 CST 2026

$ cat /proc/sys/kernel/ostype
Linux
$ cat /proc/sys/kernel/osrelease
7.1.8

错误

1.虚拟机启动提示:kernel panic. system is deadloced on memory,分析可知initrd.img过大,内存不足。

查看/boot目录下发现,新编译文件过大,要么增加内存(从4G增加到8G)可以正常,要么重新编译或者剥离调试符号。

$ ls -alh | grep initrd
lrwxrwxrwx  1 root root   16 Aug 15 17:51 initrd.img -> initrd.img-7.1.8
-rw-r--r--  1 root root  71M Nov 25  2025 initrd.img-6.14.0-36-generic
-rw-r--r--  1 root root 868M Aug 15 17:59 initrd.img-7.1.8
lrwxrwxrwx  1 root root   28 Nov 25  2025 initrd.img.old -> initrd.img-6.14.0-36-generic

cd ~/linux-7.1.8

# 1. 重新安装模块(剥离符号)
# 删除模块中带的调试符号信息,这样无法调试内核,但是可以减少体积
sudo make INSTALL_MOD_STRIP=1 modules_install

# 2. 重新生成 initramfs
sudo update-initramfs -c -k $(make kernelrelease)

# 3. 检查 initrd 大小 大小里面减少到78M
ls -lh /boot/initrd.img-$(make kernelrelease)

# 4. 更新 GRUB
sudo update-grub

# 5. 重启测试
sudo reboot

---------- End ----------

【特别声明:本公众号文章均为作者原创或授权发布,部分内容和图片来源于网络,请放心食用,观点仅供学习参考,水平有限如有错漏,请海涵~~】

「喜欢C请 点赞    点击右下角 在看」

最新文章

随机文章