前言
在Debian系统或者其他linux系统中,如果想更新当前系统的内核版本要如何操作,或者想在linux开源社区下载一套内核代码,然后编译出来替换更新原来的内核版本要怎么做?这里介绍更新linux5.10.x的内核版本的方法,其他内核版本也可以参考,可能会有微小差异。
大体步骤:
更新和编译新内核并替换原有内核的步骤如下:
1、安装必要的软件包
2、获取内核源代码
3、配置内核
4、编译内核和模块
5、安装编译好的内核
6、更新引导配置
注意:这些步骤需要root权限操作,请小心操作。
下面是详细步骤:
1. 安装必要的软件包
首先,更新系统并安装编译内核所需的软件包。
c
sudo apt update
sudo apt install build-essential libncurses-dev bison flex libssl-dev libelf-dev
2. 获取内核源代码
方法一:
可以直接从kernel.org下载,例如:
bash
cd /usr/src
sudo wget https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.10.247.tar.xz
sudo tar -xvf linux-5.10.247.tar.xz
cd linux-5.10.247
或者windows环境下从以下链接下载:
c
https://cdn.kernel.org/pub/linux/kernel/v5.x/
部分截图如下:(比如直接下载5.10.247的内核版本)

方法二:
也可以从内核官方网站下载源代码,或者使用Debian的内核源代码包。
c
sudo apt install linux-source
通常,这会将内核源代码压缩包放在/usr/src/目录下。解压它:
c
cd /usr/src
sudo tar -xaf linux-source-*.tar.xz
cd linux-source-*
3. 配置内核
如果只需要编译当前版本的内核源码来替换,比如不需要更改内核版本,只需要添加部分模块的驱动,此时可以基于当前内核的配置来配置新内核(下载当前系统相同的内核版本的代码)。当前内核的配置通常可以在/boot/目录下找到,例如执行 ls -l /boot/config-$(uname -r) 命令查看。
c
root@debian:~# ls -l /boot/config-$(uname -r)
-rw-r--r-- 1 root root 130064 1月 20 17:09 /boot/config-5.10.0
将当前配置复制到内核源代码目录:
c
sudo cp /boot/config-$(uname -r) .config
然后运行make oldconfig来更新配置,它会询问你新内核中的新选项。
c
sudo make oldconfig
也可以使用菜单界面进行配置(需要ncurses库):
sudo make menuconfig
我这里是X86 64bit平台,所以使用如下指令即可配置内核defconfig:
c
# 针对x86 64bit架构的平台
make x86_64_defconfig
4. 编译内核和模块
使用以下命令编译内核和模块。-j参数指定并行编译的作业数。
c
sudo make -j32 //具体线程数根据自己的CPU核心数选择
5. 安装编译好的内核
5.1 安装内核模块:
c
sudo make modules_install
举例:
c
root@debian:/home/debian/linux-5.10.247# sudo make modules_install
INSTALL drivers/net/phy/fixed_phy.ko
INSTALL drivers/net/phy/microchip.ko
INSTALL drivers/net/phy/smsc.ko
INSTALL drivers/net/ppp/bsd_comp.ko
INSTALL drivers/net/ppp/ppp_deflate.ko
INSTALL drivers/net/ppp/ppp_generic.ko
INSTALL drivers/net/slip/slhc.ko
INSTALL drivers/net/slip/slip.ko
INSTALL drivers/net/usb/asix.ko
INSTALL drivers/net/usb/ax88179_178a.ko
INSTALL drivers/net/usb/catc.ko
INSTALL drivers/net/usb/cdc_eem.ko
INSTALL drivers/net/usb/cdc_ether.ko
INSTALL drivers/net/usb/cdc_mbim.ko
INSTALL drivers/net/usb/cdc_ncm.ko
INSTALL drivers/net/usb/dm9601.ko
INSTALL drivers/net/usb/gl620a.ko
INSTALL drivers/net/usb/hso.ko
INSTALL drivers/net/usb/huawei_cdc_ncm.ko
INSTALL drivers/net/usb/ipheth.ko
INSTALL drivers/net/usb/kaweth.ko
INSTALL drivers/net/usb/lan78xx.ko
INSTALL drivers/net/usb/mcs7830.ko
INSTALL drivers/net/usb/net1080.ko
INSTALL drivers/net/usb/pegasus.ko
INSTALL drivers/net/usb/plusb.ko
INSTALL drivers/net/usb/r8152.ko
INSTALL drivers/net/usb/rndis_host.ko
INSTALL drivers/net/usb/rtl8150.ko
INSTALL drivers/net/usb/smsc75xx.ko
INSTALL drivers/net/usb/smsc95xx.ko
INSTALL drivers/net/usb/sr9700.ko
INSTALL drivers/net/usb/sr9800.ko
INSTALL drivers/net/usb/usbnet.ko
INSTALL drivers/nvme/host/nvme-core.ko
INSTALL drivers/nvme/host/nvme-fabrics.ko
INSTALL drivers/nvme/host/nvme-fc.ko
INSTALL drivers/nvme/host/nvme-tcp.ko
INSTALL drivers/nvme/host/nvme.ko
INSTALL drivers/thermal/intel/x86_pkg_temp_thermal.ko
INSTALL drivers/usb/class/cdc-wdm.ko
INSTALL fs/efivarfs/efivarfs.ko
INSTALL net/ipv4/netfilter/iptable_nat.ko
INSTALL net/ipv4/netfilter/nf_log_arp.ko
INSTALL net/ipv4/netfilter/nf_log_ipv4.ko
INSTALL net/ipv6/netfilter/nf_log_ipv6.ko
INSTALL net/netfilter/nf_log_common.ko
INSTALL net/netfilter/xt_LOG.ko
INSTALL net/netfilter/xt_MASQUERADE.ko
INSTALL net/netfilter/xt_addrtype.ko
INSTALL net/netfilter/xt_mark.ko
INSTALL net/netfilter/xt_nat.ko
DEPMOD 5.10.247
5.2 安装内核镜像:
c
sudo make install
举例:
c
root@debian:/home/debian/linux-5.10.247# make install
sh ./arch/x86/boot/install.sh 5.10.247 arch/x86/boot/bzImage \
System.map "/boot"
run-parts: executing /etc/kernel/postinst.d/apt-auto-removal 5.10.247 /boot/vmlinuz-5.10.247
run-parts: executing /etc/kernel/postinst.d/initramfs-tools 5.10.247 /boot/vmlinuz-5.10.247
update-initramfs: Generating /boot/initrd.img-5.10.247
W: Possible missing firmware /lib/firmware/i915/skl_huc_2.0.0.bin for built-in driver i915
W: Possible missing firmware /lib/firmware/i915/skl_guc_33.0.0.bin for built-in driver i915
W: Possible missing firmware /lib/firmware/i915/bxt_huc_2.0.0.bin for built-in driver i915
W: Possible missing firmware /lib/firmware/i915/bxt_guc_33.0.0.bin for built-in driver i915
W: Possible missing firmware /lib/firmware/i915/kbl_huc_4.0.0.bin for built-in driver i915
W: Possible missing firmware /lib/firmware/i915/kbl_guc_33.0.0.bin for built-in driver i915
W: Possible missing firmware /lib/firmware/i915/glk_huc_4.0.0.bin for built-in driver i915
W: Possible missing firmware /lib/firmware/i915/glk_guc_33.0.0.bin for built-in driver i915
W: Possible missing firmware /lib/firmware/i915/kbl_huc_4.0.0.bin for built-in driver i915
W: Possible missing firmware /lib/firmware/i915/kbl_guc_33.0.0.bin for built-in driver i915
W: Possible missing firmware /lib/firmware/i915/cml_huc_4.0.0.bin for built-in driver i915
W: Possible missing firmware /lib/firmware/i915/cml_guc_33.0.0.bin for built-in driver i915
W: Possible missing firmware /lib/firmware/i915/icl_huc_9.0.0.bin for built-in driver i915
W: Possible missing firmware /lib/firmware/i915/icl_guc_33.0.0.bin for built-in driver i915
W: Possible missing firmware /lib/firmware/i915/ehl_huc_9.0.0.bin for built-in driver i915
W: Possible missing firmware /lib/firmware/i915/ehl_guc_33.0.4.bin for built-in driver i915
W: Possible missing firmware /lib/firmware/i915/tgl_huc_7.5.0.bin for built-in driver i915
W: Possible missing firmware /lib/firmware/i915/tgl_guc_35.2.0.bin for built-in driver i915
W: Possible missing firmware /lib/firmware/i915/tgl_huc_7.5.0.bin for built-in driver i915
W: Possible missing firmware /lib/firmware/i915/tgl_guc_35.2.0.bin for built-in driver i915
W: Possible missing firmware /lib/firmware/i915/bxt_dmc_ver1_07.bin for built-in driver i915
W: Possible missing firmware /lib/firmware/i915/skl_dmc_ver1_27.bin for built-in driver i915
W: Possible missing firmware /lib/firmware/i915/kbl_dmc_ver1_04.bin for built-in driver i915
W: Possible missing firmware /lib/firmware/i915/glk_dmc_ver1_04.bin for built-in driver i915
W: Possible missing firmware /lib/firmware/i915/cnl_dmc_ver1_07.bin for built-in driver i915
W: Possible missing firmware /lib/firmware/i915/icl_dmc_ver1_09.bin for built-in driver i915
W: Possible missing firmware /lib/firmware/i915/tgl_dmc_ver2_08.bin for built-in driver i915
W: Possible missing firmware /lib/firmware/i915/rkl_dmc_ver2_02.bin for built-in driver i915
W: Possible missing firmware /lib/firmware/tigon/tg3_tso5.bin for built-in driver tg3
W: Possible missing firmware /lib/firmware/tigon/tg3_tso.bin for built-in driver tg3
W: Possible missing firmware /lib/firmware/tigon/tg357766.bin for built-in driver tg3
W: Possible missing firmware /lib/firmware/tigon/tg3.bin for built-in driver tg3
W: Possible missing firmware /lib/firmware/e100/d102e_ucode.bin for built-in driver e100
W: Possible missing firmware /lib/firmware/e100/d101s_ucode.bin for built-in driver e100
W: Possible missing firmware /lib/firmware/e100/d101m_ucode.bin for built-in driver e100
W: Possible missing firmware /lib/firmware/rtl_nic/rtl8125b-2.fw for built-in driver r8169
W: Possible missing firmware /lib/firmware/rtl_nic/rtl8125a-3.fw for built-in driver r8169
W: Possible missing firmware /lib/firmware/rtl_nic/rtl8107e-2.fw for built-in driver r8169
W: Possible missing firmware /lib/firmware/rtl_nic/rtl8107e-1.fw for built-in driver r8169
W: Possible missing firmware /lib/firmware/rtl_nic/rtl8168fp-3.fw for built-in driver r8169
W: Possible missing firmware /lib/firmware/rtl_nic/rtl8168h-2.fw for built-in driver r8169
W: Possible missing firmware /lib/firmware/rtl_nic/rtl8168h-1.fw for built-in driver r8169
W: Possible missing firmware /lib/firmware/rtl_nic/rtl8168g-3.fw for built-in driver r8169
W: Possible missing firmware /lib/firmware/rtl_nic/rtl8168g-2.fw for built-in driver r8169
W: Possible missing firmware /lib/firmware/rtl_nic/rtl8106e-2.fw for built-in driver r8169
W: Possible missing firmware /lib/firmware/rtl_nic/rtl8106e-1.fw for built-in driver r8169
W: Possible missing firmware /lib/firmware/rtl_nic/rtl8411-2.fw for built-in driver r8169
W: Possible missing firmware /lib/firmware/rtl_nic/rtl8411-1.fw for built-in driver r8169
W: Possible missing firmware /lib/firmware/rtl_nic/rtl8402-1.fw for built-in driver r8169
W: Possible missing firmware /lib/firmware/rtl_nic/rtl8168f-2.fw for built-in driver r8169
W: Possible missing firmware /lib/firmware/rtl_nic/rtl8168f-1.fw for built-in driver r8169
W: Possible missing firmware /lib/firmware/rtl_nic/rtl8105e-1.fw for built-in driver r8169
W: Possible missing firmware /lib/firmware/rtl_nic/rtl8168e-3.fw for built-in driver r8169
W: Possible missing firmware /lib/firmware/rtl_nic/rtl8168e-2.fw for built-in driver r8169
W: Possible missing firmware /lib/firmware/rtl_nic/rtl8168e-1.fw for built-in driver r8169
W: Possible missing firmware /lib/firmware/rtl_nic/rtl8168d-2.fw for built-in driver r8169
W: Possible missing firmware /lib/firmware/rtl_nic/rtl8168d-1.fw for built-in driver r8169
run-parts: executing /etc/kernel/postinst.d/unattended-upgrades 5.10.247 /boot/vmlinuz-5.10.247
run-parts: executing /etc/kernel/postinst.d/zz-update-grub 5.10.247 /boot/vmlinuz-5.10.247
Generating grub configuration file ...
Found background image: /usr/share/images/desktop-base/desktop-grub.png
Found linux image: /boot/vmlinuz-5.10.247
Found initrd image: /boot/initrd.img-5.10.247
Found linux image: /boot/vmlinuz-5.10.247.old
Found initrd image: /boot/initrd.img-5.10.247
Found linux image: /boot/vmlinuz-5.10.0-247-amd64
Found initrd image: /boot/initrd.img-5.10.0-247-amd64
Found linux image: /boot/vmlinuz-5.10.0-37-amd64
Found initrd image: /boot/initrd.img-5.10.0-37-amd64
Found linux image: /boot/vmlinuz-5.10.0-13-amd64
Found initrd image: /boot/initrd.img-5.10.0-13-amd64
Found linux image: /boot/vmlinuz-5.10.0
Found initrd image: /boot/initrd.img-5.10.0
Found linux image: /boot/vmlinuz-5.10.0.old
Found initrd image: /boot/initrd.img-5.10.0
Warning: os-prober will be executed to detect other bootable partitions.
Its output will be used to detect bootable binaries on them and create new boot entries.
Adding boot menu entry for UEFI Firmware Settings ...
done
root@debian:/home/debian/linux-5.10.247#
这一步操作将会把内核映像和System.map文件复制到/boot/目录,并更新grub配置。
/boot/具体包含如下文件:
c
安装内核会更新内核目录下的/boot/,自动生成对应内核版本的相关文件,包括以下内容:
config-5.10.0-247
initrd.img-5.10.0-247
System.map-5.10.0-247
vmlinuz-5.10.0-247
6. 更新引导配置
如果你使用的是GRUB引导加载程序,运行以下命令更新GRUB配置,主要是更新这个文件的内容:/boot/grub/grub.cfg,执行sudo update-grub 命令之后会自动更新文件,里面是加载不同版本的内核顺序还有文件系统的uuid等信息
c
sudo update-grub
举例
c
root@debian:~# sudo update-grub
Generating grub configuration file ...
Found background image: /usr/share/images/desktop-base/desktop-grub.png
Found linux image: /boot/vmlinuz-5.10.247
Found initrd image: /boot/initrd.img-5.10.247
Found linux image: /boot/vmlinuz-5.10.0-37-amd64
Found initrd image: /boot/initrd.img-5.10.0-37-amd64
Found linux image: /boot/vmlinuz-5.10.0-13-amd64
Found initrd image: /boot/initrd.img-5.10.0-13-amd64
Found linux image: /boot/vmlinuz-5.10.0
Found initrd image: /boot/initrd.img-5.10.0
Warning: os-prober will be executed to detect other bootable partitions.
Its output will be used to detect bootable binaries on them and create new boot entries.
Adding boot menu entry for UEFI Firmware Settings ...
done
7. 重启系统
重启计算机以使用新内核。
c
sudo reboot
8. 验证
重启后,使用以下命令检查内核版本:
uname -r
注意事项
在编译内核之前,确保你有足够的磁盘空间(至少10-20GB)。
编译内核可能需要较长时间,具体取决于你的系统性能。
如果新内核无法启动,你可以在GRUB菜单中选择旧内核启动,在系统进内核之前可以选择进哪个版本的内核。
删除旧内核(可选,正常保留旧版本的内核不影响)
如果新内核工作正常,你可以删除旧内核以释放空间。但是,建议保留至少一个旧内核作为备份。
- 列出已安装的内核:
c
dpkg --list | grep linux-image
- 删除旧内核(将linux-image-x.x.x替换为具体的版本):
c
sudo apt purge linux-image-x.x.x
- 更新GRUB:
c
sudo update-grub
以上就是在Debian系统中编译并更新内核的基本步骤。可以根据实际需要具体需求调整配置。
遇到的问题点
1、根据芯片平台和架构来选择defconfig(可以拷贝原来内核的config来使用,在/boot/目录)
我这里是hygon x86 64bit平台,所以选用defconfig是x86_64_defconfig,并且确认这个config文件已经配置了CPU的宏,比如 CONFIG_CPU_SUP_HYGON=y 。
c
make x86_64_defconfig
2、新版本内核加载之后卡住了,只打印了部分log,然后出现如下报错:
c
SetUefiImageMemoryAttributes - 0x000000007A64B000 - 0x000000000000D000 (0x0000000000000000)
[ 0.772600] zhaoxin_rng: The CPU isn't support XSTORE.
[ 0.791686] hub 6-0:1.0: config failed, hub doesn't have any ports! (err -19)
[ 0.806625] snd_hda_intel 0000:01:00.1: Cannot probe codecs, giving up
[ 0.813926] snd_hda_intel 0000:03:00.3: no codecs found!
Gave up waiting for suspend/resume device
Gave up waiting for root file system device. Common problems:
- Boot args (cat /proc/cmdline)
- Check rootdelay= (did the system wait long enough?)
- Missing modules (cat /proc/modules; ls /dev)
ALERT! UUID=1b563e79-0778-4894-a6e0-d316499d1389 does not exist. Dropping to a shell!
BusyBox v1.30.1 (Debian 1:1.30.1-6+deb11u1) built-in shell (ash)
Enter 'help' for a list of built-in commands.
分析:从报错分析,系统无法启动的根本原因,是内核在启动过程中无法找到并挂载根文件系统(即"根分区")。前面几条关于驱动(Zhaoxin RNG、USB集线器、声卡)的报错通常是警告或非致命错误,它们不会直接导致启动失败,但反映了潜在的硬件识别或驱动兼容性问题,后续系统起来之后需要解决,优先级没那么高。
首先,最紧急的是解决"根文件系统不存在"的问题,经过分析是内核的nvme驱动未加载(当前系统的存储盘使用的是nvme的ssd M.2的固态硬盘条子),导致找不到文件系统分区。
解决办法:配置.config文件配置内核编译nvme驱动
c
#
# NVME Support
#
CONFIG_NVME_CORE=m
CONFIG_BLK_DEV_NVME=m
CONFIG_NVME_MULTIPATH=y
CONFIG_NVME_HWMON=y
CONFIG_NVME_FABRICS=m
CONFIG_NVME_RDMA=m
CONFIG_NVME_FC=m
CONFIG_NVME_TCP=m
CONFIG_NVME_TARGET=m
# CONFIG_NVME_TARGET_PASSTHRU is not set
# CONFIG_NVME_TARGET_LOOP is not set
CONFIG_NVME_TARGET_RDMA=m
CONFIG_NVME_TARGET_FC=m
# CONFIG_NVME_TARGET_FCLOOP is not set
CONFIG_NVME_TARGET_TCP=m
# end of NVME Support
然后更新内核,按照上面的步骤更新,首先修改完 .config文件,然后编译内核,然后安装内核模块,然后安装内核即可重启验证。
更新内核之后就可以起来了,有对应nvme驱动的打印,所以如果找不到文件系统大概率是这个问题:
c
SetUefiImageMemoryAttributes - 0x000000007A64B000 - 0x000000000000D000 (0x0000000000000000)
[ 0.779388] zhaoxin_rng: The CPU isn't support XSTORE.
[ 0.797646] hub 6-0:1.0: config failed, hub doesn't have any ports! (err -19)
[ 0.811177] snd_hda_intel 0000:01:00.1: Cannot probe codecs, giving up
[ 0.818532] snd_hda_intel 0000:03:00.3: no codecs found!
/dev/nvme0n1p2: recovering journal
/dev/nvme0n1p2: Clearing orphaned inode 7471136 (uid=116, gid=124, mode=0100700, size=4096)
/dev/nvme0n1p2: Clearing orphaned inode 7471132 (uid=116, gid=124, mode=0100700, size=24576)
/dev/nvme0n1p2: Clearing orphaned inode 7471124 (uid=0, gid=0, mode=0100700, size=4096)
/dev/nvme0n1p2: clean, 541697/15540224 files, 5086738/62133248 blocks
SELinux: Could not open policy file <= /etc/selinux/targeted/policy/policy.33: No such file or directory
3、r8152的 usb 网卡不通,网卡未注册
检查发现驱动未编译进内核或者编译成ko模块且加载
解决办法:编译成ko模块且加载驱动ko
.config文件配置打开网卡驱动的宏定义
c
CONFIG_USB_RTL8152=m
加载驱动之后。确认
c
root@debian:~# lsmod | grep 8152 //驱动模块已经加载
r8152 90112 0
root@debian:~#
root@debian:~#
root@debian:~#
root@debian:~#
root@debian:~# ifconfig //网卡已经注册
enxf0d7afc728b8: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.12.24 netmask 255.255.255.0 broadcast 192.168.11.255
inet6 fe80::f2d7:afff:fec7:28b8 prefixlen 64 scopeid 0x20<link>
ether f0:d7:af:c7:28:b8 txqueuelen 1000 (Ethernet)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0