ubuntu 18.04 升级 Linux 5.4 内核

目前在用的系统是 ubuntu 18.04.4 版本,内核版本如下:

1
2
3
qiushao@qiushao-pc:~$ uname -a
Linux qiushao-pc 5.3.0-28-generic #30~18.04.1-Ubuntu SMP Fri Jan 17 06:14:09 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux
qiushao@qiushao-pc:~$

cpu 是: amd 3900x, 主板是: 华硕X570, cpu,主板是比较新的, 5.3 版本的内核还有很多问题,比如说耳机口不能用,蓝牙连接不稳定等。一开始我还以为是硬件本身的问题,还以为是我自己装机时接错线了。前两天看 manjaro 出了新的版本,内核是 5.4 的。就安装到另一个分区尝试了一下,发现耳机,蓝牙的问题都没有。猜测是新版本的内核对主板的支持更完善了。于是想试试给 ubuntu 升级下内核到 5.4 版本,看看能不能解决耳机,蓝牙的问题。

1. 下载官方编译好的内核

升级内核有两种方法:1. 自己下载源码编译;2. 使用官方编译好的内核。一般来说最好都是使用官方编译好的。
官方编译的内核可以从这里下载:https://kernel.ubuntu.com/~kernel-ppa/mainline/
因为我的目的是升级到 5.4 版本的内核,找到 5.4 的最新版本是 5.4.23:https://kernel.ubuntu.com/~kernel-ppa/mainline/v5.4.23/
页面前面有一段描述:

Build for amd64 succeeded (see BUILD.LOG.amd64):
linux-headers-5.4.23-050423_5.4.23-050423.202002281329_all.deb
linux-headers-5.4.23-050423-generic_5.4.23-050423.202002281329_amd64.deb
linux-headers-5.4.23-050423-lowlatency_5.4.23-050423.202002281329_amd64.deb
linux-image-unsigned-5.4.23-050423-generic_5.4.23-050423.202002281329_amd64.deb
linux-image-unsigned-5.4.23-050423-lowlatency_5.4.23-050423.202002281329_amd64.deb
linux-modules-5.4.23-050423-generic_5.4.23-050423.202002281329_amd64.deb
linux-modules-5.4.23-050423-lowlatency_5.4.23-050423.202002281329_amd64.deb

generic 用于支持通用硬件系统, lowlatency 用于低延迟硬件系统,amd64用于64位系统。我们的电脑一般用 generic 就行了, 不用下载 lowlatency 相关的安装包。只需要下载下面几个安装包即可:

1
2
3
4
wget https://kernel.ubuntu.com/~kernel-ppa/mainline/v5.4.23/linux-headers-5.4.23-050423_5.4.23-050423.202002281329_all.deb
wget https://kernel.ubuntu.com/~kernel-ppa/mainline/v5.4.23/linux-headers-5.4.23-050423-generic_5.4.23-050423.202002281329_amd64.deb
wget https://kernel.ubuntu.com/~kernel-ppa/mainline/v5.4.23/linux-image-unsigned-5.4.23-050423-generic_5.4.23-050423.202002281329_amd64.deb
wget https://kernel.ubuntu.com/~kernel-ppa/mainline/v5.4.23/linux-modules-5.4.23-050423-generic_5.4.23-050423.202002281329_amd64.deb

2. 安装内核

进入下载内核的目录,然后执行以下命令即可:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
qiushao@qiushao-pc:~/Downloads/kernel$ ls
linux-headers-5.4.23-050423_5.4.23-050423.202002281329_all.deb linux-image-unsigned-5.4.23-050423-generic_5.4.23-050423.202002281329_amd64.deb
linux-headers-5.4.23-050423-generic_5.4.23-050423.202002281329_amd64.deb linux-modules-5.4.23-050423-generic_5.4.23-050423.202002281329_amd64.deb
qiushao@qiushao-pc:~/Downloads/kernel$
qiushao@qiushao-pc:~/Downloads/kernel$ sudo dpkg -i *.deb
(Reading database ... 244666 files and directories currently installed.)
Preparing to unpack linux-headers-5.4.23-050423_5.4.23-050423.202002281329_all.deb ...
Unpacking linux-headers-5.4.23-050423 (5.4.23-050423.202002281329) over (5.4.23-050423.202002281329) ...
Preparing to unpack linux-headers-5.4.23-050423-generic_5.4.23-050423.202002281329_amd64.deb ...
Unpacking linux-headers-5.4.23-050423-generic (5.4.23-050423.202002281329) over (5.4.23-050423.202002281329) ...
Preparing to unpack linux-image-unsigned-5.4.23-050423-generic_5.4.23-050423.202002281329_amd64.deb ...
Unpacking linux-image-unsigned-5.4.23-050423-generic (5.4.23-050423.202002281329) over (5.4.23-050423.202002281329) ...
Preparing to unpack linux-modules-5.4.23-050423-generic_5.4.23-050423.202002281329_amd64.deb ...
Unpacking linux-modules-5.4.23-050423-generic (5.4.23-050423.202002281329) over (5.4.23-050423.202002281329) ...
Setting up linux-headers-5.4.23-050423 (5.4.23-050423.202002281329) ...
Setting up linux-headers-5.4.23-050423-generic (5.4.23-050423.202002281329) ...
Setting up linux-modules-5.4.23-050423-generic (5.4.23-050423.202002281329) ...
Setting up linux-image-unsigned-5.4.23-050423-generic (5.4.23-050423.202002281329) ...
Processing triggers for linux-image-unsigned-5.4.23-050423-generic (5.4.23-050423.202002281329) ...
/etc/kernel/postinst.d/initramfs-tools:
update-initramfs: Generating /boot/initrd.img-5.4.23-050423-generic
W: Possible missing firmware /lib/firmware/rtl_nic/rtl8125a-3.fw for module r8169
I: The initramfs will attempt to resume from /dev/nvme0n1p4
I: (UUID=5d386fca-a168-4aae-9b13-425eae5932ea)
I: Set the RESUME variable to override this.
/etc/kernel/postinst.d/zz-update-grub:
Sourcing file `/etc/default/grub'
Generating grub configuration file ...
Found linux image: /boot/vmlinuz-5.4.23-050423-generic
Found initrd image: /boot/initrd.img-5.4.23-050423-generic
Found linux image: /boot/vmlinuz-5.3.0-28-generic
Found initrd image: /boot/initrd.img-5.3.0-28-generic
Found linux image: /boot/vmlinuz-5.0.0-37-generic
Found initrd image: /boot/initrd.img-5.0.0-37-generic
Found Manjaro Linux (19.0.1) on /dev/nvme0n1p3
Adding boot menu entry for EFI firmware configuration
done
qiushao@qiushao-pc:~/Downloads/kernel$
qiushao@qiushao-pc:~/Downloads/kernel$ reboot

3. 重启验证

重启后,查看一下内核的版本信息:

1
2
3
qiushao@qiushao-pc:~$ uname -a
Linux qiushao-pc 5.3.0-28-generic #30~18.04.1-Ubuntu SMP Fri Jan 17 06:14:09 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux
qiushao@qiushao-pc:~$

奇怪了啊,怎么还是 5.3 版本的内核呢!再看一下之前的安装日志也没有任何错误提示啊。又重复安装一遍,发现还是一样的问题。
到 /boot 目录下看看:

1
2
3
4
5
qiushao@qiushao-pc:/boot$ ls
config-5.0.0-37-generic efi initrd.img-5.3.0-28-generic memtest86+.elf System.map-5.3.0-28-generic vmlinuz-5.3.0-28-generic
config-5.3.0-28-generic grub initrd.img-5.4.23-050423-generic memtest86+_multiboot.bin System.map-5.4.23-050423-generic vmlinuz-5.4.23-050423-generic
config-5.4.23-050423-generic initrd.img-5.0.0-37-generic memtest86+.bin System.map-5.0.0-37-generic vmlinuz-5.0.0-37-generic
qiushao@qiushao-pc:/boot$

看起来已经有 5.4 的内核在里面了。为什么没有用新的内核来启动呢?
不信邪了,再 reboot 一次看看。在 reboot 到 grub 选择要启动的系统时突然猜测到了原因。因为前两天才再另外一个分区上安装的 manjaro, 所以目前系统上的 grub 启动菜单其实是 manjaro 所在的分区的。而系统的启动内核是由 grub 指定的。而我没有在 manjaro 系统里面更新 grub, 所以还是使用旧版本的内核。系统的分区信息如下:
partitions

  • partition 1 : uefi 分区, 指向的启动分区为 partition 3
  • partition 2 : ubuntu / 分区, 里面有 /boot/grub/grub.cfg 启动菜单配置文件
  • partition 3 : manjaro / 分区, 里面也有 /boot/grub/grub.cfg 启动菜单配置文件
  • partition 4 : ubuntu & manjaro /home 分区

因为 manjaro 是后安装的,所以启动菜单使用的是 parition 3 中的 grub.cfg 配置文件, 但我们在安装内核的时候,自动更新的是 partition 2 中的 grub.cfg。
我们看看 partition 2 里面的 grub.cfg 里面的配置内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
menuentry 'Ubuntu' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-simple-697f7639-b38d-4e6c-a994-d36c5542dae5' {
recordfail
load_video
gfxmode $linux_gfx_mode
insmod gzio
if [ x$grub_platform = xxen ]; then insmod xzio; insmod lzopio; fi
insmod part_gpt
insmod ext2
if [ x$feature_platform_search_hint = xy ]; then
search --no-floppy --fs-uuid --set=root 697f7639-b38d-4e6c-a994-d36c5542dae5
else
search --no-floppy --fs-uuid --set=root 697f7639-b38d-4e6c-a994-d36c5542dae5
fi
linux /boot/vmlinuz-5.4.23-050423-generic root=UUID=697f7639-b38d-4e6c-a994-d36c5542dae5 ro quiet splash $vt_handoff
initrd /boot/initrd.img-5.4.23-050423-generic
}

我们看到最后两行配置是内核相关的,其中指定了使用哪个版本的内核来启动系统。关于 grub 的知识,是 Linux 通用的,任何发行版都是一样的。

解决方案很简单,先进入 manjaro 系统先,然后执行这个命令更新 grub 启动信息:

1
sudo update-grub

更新完之后, reboot 重启进入 ubuntu 再看看内核的版本:

1
2
3
qiushao@qiushao-pc:~$ uname -a
Linux qiushao-pc 5.4.23-050423-generic #202002281329 SMP Fri Feb 28 18:33:31 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux
qiushao@qiushao-pc:~$

嗯,升级到了 5.4。再看看耳机接口,嗯,有声音了,看来的确是新版本的内核对新硬件的支持会好一点。