「从今天起,好好学习,天天向上」
每天一分钟,积少成多,从C语言修炼成长为计算机高手。
「纯干货系列,不玩虚的,纸上学来终觉浅,自己动手干才是王道!」
【~~小白一名,如有错漏,请各位包涵,偶将虚心学习~~】
最新版本的内核往往提供更多的功能和安全补丁,那么如何在不重装系统的前提下编译安装最新内核。
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其它文件:
完整安装过程如下:
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 rebootmake 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.81.虚拟机启动提示: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请 点赞
点击右下角 在看
」