前段时间重新安装了 Ubuntu 22.04 LTS,安装后没有显示 GRUB 引导页面(默认自动跳过),直接使用默认内核启动,而我需要变更一下默认的内核版本,特此记录一下修改过程。
安装其他版本内核
Ubuntu 中安装其他版本的内核非常简单,内核其实就是相当于一个软件(DEB 包),安装方式与其他软件并没有啥区别。首先,使用命令 uname -sr
就可以查看当前运行的内核版本。
注意,这里说的是安装一个其他版本的内核,与更新当前 Ubuntu 的内核不同。如果是更新当前 Ubuntu 的内核,则是直接使用命令 sudo apt-cache search linux-image-
可以搜到针对当前 Ubuntu 版本的官方发布的不同版本的内核,然后使用 sudo apt-get install xxx
即可。
默认情况下,Ubuntu 系统使用 Ubuntu 存储库提供的 Ubuntu 修改过的内核。出于测试、验证等原因,Ubuntu 也提供了各个版本的构建好的 Mainline 内核。而这里我们主要是讲从 https://kernel.ubuntu.com/~kernel-ppa/mainline/ 安装其他版本的 Mainline 内核。
Ubuntu 内核与主线并不完全相同,https://people.canonical.com/~kernel/info/kernel-version-map.html 给出了对应关系
https://kernel.ubuntu.com/~kernel-ppa/mainline/ 上提供的内核是由未经修改的上游内核(upstream kernel)源代码制成,但使用了 Ubuntu 内核配置文件。 然后,将这些文件打包成 .deb
文件,以方便大家使用。
- 这些内核不受支持,不提供任何安全更新
- 如果使用了选定的专有或树外模块(例如 bcmwl、fglrx、NVIDIA 专有图形驱动程序、VirtualBox等),需要先卸载,否则可能导致安装失败
- 官方说明 MainlineBuilds
手动安装
要安装新的 Ubuntu 的内核,首先打开 http://kernel.ubuntu.com/~kernel-ppa/mainline/,然后从列表中选择需要的版本。打开页面就会发现 Ubuntu 官方对该内核针对不同架构平台的构建(xxx/build
)和测试(xxx/self-tests
)情况,所以,务必注意不要选择错了架构(例如我这里是 amd64)。
如上所示,内核并不是只有一个包,通常会有 linux-headers-*-generic_*
、 linux-headers-*_all
、 linux-image-unsigned-*-generic_*
、 linux-modules-*-generic_*
四个软件包(我们通常需要的就是名字中带有 generic
字样的包),我们可以使用 dpkg -x xx.deb ./xxx
将这些包解压看到里面的内容。
-
linux-headers-*
:这个包里主要就是我们在应用编程时使用的各种 C 头文件,因为在大版本升级时,这些头文件可能会变化,因此需要替换。linux-headers-*
有时会有两个,这主要是因为 Ubuntu 提供了不用用途的内核,带有_all
的那个包含了实际的各种文件,带有generic_
的那个里面通常是一些指向带有_all
的那个里面的符号 -
linux-image-*
: 这个包里主要就是编译出来的内核镜像文件vmlinuz
-
linux-modules-*
:这个包里主要就是那些.ko
驱动
如下所示,某些内核下面可能还会有一些与 generic
对应的 lowlatency
的包。lowlatency
是用于工业嵌入式系统的低延迟 Linux 内核。官方介绍:https://ubuntu.com/blog/industrial-embedded-systems-iii。
安装步骤:
- 下载各个包
wget https://kernel.ubuntu.com/~kernel-ppa/mainline/v5.19.17/amd64/linux-headers-5.19.17-051917-generic_5.19.17-051917.202210240939_amd64.deb wget https://kernel.ubuntu.com/~kernel-ppa/mainline/v5.19.17/amd64/linux-headers-5.19.17-051917_5.19.17-051917.202210240939_all.deb wget https://kernel.ubuntu.com/~kernel-ppa/mainline/v5.19.17/amd64/linux-image-unsigned-5.19.17-051917-generic_5.19.17-051917.202210240939_amd64.deb wget https://kernel.ubuntu.com/~kernel-ppa/mainline/v5.19.17/amd64/linux-modules-5.19.17-051917-generic_5.19.17-051917.202210240939_amd64.deb
- 直接使用命令
sudo dpkg -i *.deb
安装下载的所有包即可
Mainline Kernel Installer
相比手动安装,Ubuntu 下还有个第三方的带 GUI 的内核安装器:Mainline Kernel Installer,我们只需要点点鼠标,其会自动从 http://kernel.ubuntu.com/~kernel-ppa/mainline/ 下载内核的各个包,然后安装。
- 添加安装源
sudo add-apt-repository ppa:cappelikan/ppa -y
- 安装
sudo apt install mainline
- 从开始界面打开 Mainline Kernel Installer 选择要安装的内核即可
Mainline Kernel Installer 会自动过滤掉不支持当前架构平台的内核
修改默认版本内核
在实际工作中,有时候我们需要在 Ubuntu 中添加多个不同版本的内核。所有已安装的可用内核可以在 /boot/grub/grub.cfg
这个文件中查看到。/boot/grub/grub.cfg
这里面就对应于 GRUB 引导页面中的各条目内核的启动参数。
命令行方式
-
首先打开
sudo nano /boot/grub/grub.cfg
,从中选择要配置的内核参数。这个文件就是 GRUB 启动项的菜单描述文件!GRUB 在启动中会读取该文件,然后显示出来就是我们看到的 GRUB 引导界面。
我这里没有安装其他内核,默认的是有Linux 5.15.0-53-generic
和Linux 5.15.0-56-generic
这两个(以及这两个对应的 recovery mode 模式)。其中,我添加的蓝色和红色标号代表不同层级的菜单项的标号。不要试图直接编辑
/boot/grub/grub.cfg
,这个文件会根据默认配置自动更新 -
编辑默认的 GRUB 配置文件:
sudo nano /etc/default/grub
,其中,默认的GRUB_DEFAULT=0
就表示使用上面的第 0 个菜单项(也就是默认选中 Ubuntu 这条菜单),这里我以修改为Linux 5.15.0-53-generic
为例。
我们只需要将需要的内核对应的菜单添加到GRUB_DEFAULT=0
这一项上即可。注意,修改的格式是需要包含菜单层级:Advanced options for Ubuntu>Ubuntu, with Linux 5.15.0-53-generic
或者直接简写1>2
由于内容中包含了空格,因此必须使用双引号
-
保存后退出。然后执行
sudo update-grub
,最后sudo reboot
重启应该就可以会自动选择我们指定的内核了。
grub-customizer
Ubuntu 中有一个名为 grub-customizer
的带 GUI 的 GRUB 编辑器,不喜欢使用命令行的可以直接安装这个工具。使用也比较简单直接,简单说一下如何安装,就不过多介绍使用方法了。
- Ubuntu 20.04 版本可以直接使用命令
sudo apt install grub-customizer
来安装 - Ubuntu 22.04 中由于一个 BUG,官方没有提供该工具,因此需要从第三方安装源进行安装:
sudo add-apt-repository ppa:danielrichter2007/grub-customizer sudo apt update sudo apt install grub-customizer
开启 GRUB 引导页面
在默认情况下,如果系统只有一个版本的 Ubuntu(或者说只有一个操作系统),GRUB 引导页面是不会显示的。如果需要打开 GRUB 引导页面就需要编辑 Ubuntu 中的 GRUB 配置文件(不喜欢命令行的也可以直接使用上面说的 grub-customizer
)。
- 编辑默认的 GRUB 配置文件:
sudo nano /etc/default/grub
- 将
GRUB_TIMEOUT_STYLE=hidden
这一行前加个#
注释掉或者改为GRUB_TIMEOUT_STYLE=menu
- 修改
GRUB_TIMEOUT=0
,添加一个合适的启动超时时间,单位是秒。超时时间内如果无操作,则自动启动。
- 将
- 保存后退出。然后执行
sudo update-grub
,最后sudo reboot
重启应该就可以看到 GRUB 引导界面了。
如果只有一个内核,开启 GRUB 引导页面貌似也没啥意义,还额外增加了启动时间。通常,我们在安装了不同内核时才需要开启。当然,在某些情况下,安装内核后,相关工具可能自动就给我开启了!
远程桌面
Ubuntu 22.04 自带了微软搞的 RDP(Remote Desktop Protocol),并且是默认的远程桌面,因此,我们可以直接使用 Windows 的远程桌面进行连接。同时也带了 VNC 远程桌面,再也不用手动安装各种 VNC 服务端了。
Ubuntu 22.04 中的这套远程桌面其实就来自于最新的 GNOME 中的 gnome-remote-desktop
。gnome-remote-desktop
还有个配套的命令行工具 grdctl
,通过 grdctl
可以直接在 SSH 中来修改上面 GUI 中的配置。
处理锁屏断开问题
上面这些都不是重点,重点是默认的远程桌面在自动息屏(屏幕变黑)或者手动执行 Lock 锁屏之后就会断开连接,然而,如果把 Ubuntu 22.04 的息屏直接关闭,屏幕就会一直亮着(容易被领导窥屏),再也不会锁屏了(手动锁屏还是会断开远程桌面)。
Ubuntu 使用的是 GNOME 桌面,GNOME 提供了很多插件,最终,我在 GNOME 插件中发现了 Allow Locked Remote Desktop
这个插件,完美解决了上面的问题。在 Ubuntu 下,GNOME 插件有个带 GUI 的管理程序,通过管理程序可以方便安装卸载各种插件:sudo apt install gnome-shell-extension-manager gnome-shell-extensions
。
处理重启无法连接问题
还有一种情况,当我们重启电脑后,远程桌面是无法链接的,因为默认用户没有启用自动登录,导致没有可用的账户来进行远程链接。然而,并不是开了自动登录就可以用的,因为权限问题,自动登录后不允许远程操作,这和常用的 Windows 还是有很大差别的。
解决方法就是将修改 Ubuntu 中的秘钥链:Ubuntu 提供了 Passwords and Keys 这个 GUI 程序,打开后修改 Login 的密码为空(直接在 Login 上鼠标右键,输入原密码,新密码留空,确定即可)。以后即使重启电脑,也会自动登录并可以进行远程桌面链接了(与 Windows 体验一模一样)。
包后缀
在 Ubuntu 下使用 apt
命令安装软件包时,经常会遇到这些包都有各种各样的后缀。apt
命令安装软件包其实就是安装了一些其他软件的依赖(运行时 .so
及 .a
文件)。注意,包全名的格式通常是 包名-版本-patch-后缀
,例如:libusb-1.0-0
。此外,包的版本号与包中运行时(全名格式通常与包差不多)的版本号可能不一致!
-
无后缀
:不带任何后缀的包就是一个包含软件运行时(.so
文件)包,以供其他软件运行时调用。当我们运行某个软件时就需要安装其依赖的这种不带后缀的包! 无后缀的包中的运行时是经过版本化的(运行时文件有版本后缀),如下所示: -
-dev
:带-dev
后缀的包是开发专用的,其中不仅包含运行时(.so
及.a
文件),还包含了该软件包对外提供的开发使用的各种头文件。当我们要编译某些软件源码时,就需要安装其依赖的带-dev
后缀的包!-dev
后缀的包中的运行时通常是没有版本化的(运行时文件没有版本后缀),如下所示- debian、ubuntu 常用
-dev
后缀;red hat、centos、fedora 常用-devel
后缀
- debian、ubuntu 常用
-
-utils
:带-utils
后缀的包里面包含了一些该软件额外的命令行工具。 -
-dbg
:带-dbg
后缀的包里面包含调试符号,通常仅供开发人员使用该软件或调试软件的人员使用 -
-doc
:带-dbg
后缀的包里是本软件包的文档
The following packages have been kept back
当我们使用 sudo apt upgrade
时,经常会遇到 The following packages have been kept back
,被保留的软件包不会被升级。出现这个文件的很大原因是 Ubuntu 的阶段性更新策略导致的,从 21.04 开始,apt
命令实现了阶段性更新策略(以前只有更新管理器支持阶段性更新)。
在分批更新策略之下,更新包会优先推送给部分用户,以供测试及反馈,只有没问题后才会逐步大面积推送。我们可以在 https://ubuntu-archive-team.ubuntu.com/phased-updates.html 这个页面上看到更新的推送情况。
阶段性更新是由 python3-update-manager 提供的,具体文件是在 /usr/lib/python3/dist-packages/UpdateManager/Core/UpdateList.py
中实现的。apt
设置与更新管理器设置略有不同:文章来源:https://www.toymoban.com/news/detail-469104.html
Update-Manager::Always-Include-Phased-Updates;
APT::Get::Always-Include-Phased-Updates True;
Update-Manager::Never-Include-Phased-Updates;
APT::Get::Never-Include-Phased-Updates True;
可以通过告诉 apt
忽略阶段性更新来尽早获得更新:sudo apt -o APT::Get::Always-Include-Phased-Updates=true upgrade
文章来源地址https://www.toymoban.com/news/detail-469104.html
参考
- https://linuxhint.com/install-linux-kernel-ubuntu/
- https://linuxhint.com/install-upgrade-latest-kernel-ubuntu-22-04/
- https://codechacha.com/ja/ubuntu-update-kerenl/
- https://askubuntu.com/questions/1246962
到了这里,关于Linux 之十八 Ubuntu 22.04 配置内核版本、GRUB 引导、远程桌面、包后缀(-dev、-dbg等)、Ubuntu 阶段更新的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!