Ubuntu 22.04升级至24.04历程

Posted by wyj on August 30, 2024 / Edited on September 7, 2024

我选择等到官方推荐升级的场合——即Ubuntu 24.04.1推出时再进行系统升级。在此前,我已经在虚拟机里试用过Ubuntu 24.04了,感觉和22.04的区别并不大,主要区别可能就是右上角菜单的布局变了。

但是,我还是希望通过此次升级来解决一些问题的。

  • 22.04使用的chrome-gnome-shell相当陈旧,无法与extensions.gnome.org配合。因此,我就没有办法安装我想要的扩展了,比如Bluetooth Battery Meter这种相当重要的功能;
  • 去年随着某次更新,我的NVIDIA驱动忽然就无法工作了。如果使用NVIDIA驱动,我就只能进入tty,无法进入图形界面;我又不是要拿自己的电脑来当服务器用,进不了图形界面的NVIDIA驱动当然没有任何意义。

在升级之前,我的心里是没有底的,因为这几个月我看见了太多升级之后挂掉的经历了;因此,我对重要的文件进行了备份。

升级过程

为了避免任何可能的网络问题,我选择使用全局模式+TUN mode进行升级;反正我的流量还有很多。准备升级时,如果有安装后要求重启的更新,必须首先要重新启动一次,才能开始升级。

由于已经受到了官方支持,do-release-upgrade现在是不需要加-d参数的。在升级之前,它会提示你这次升级需要卸载哪些应用;事后看来,这些提示是非常准确的。在我的这次升级中,不仅是wine版本的QQ与微信,还有blender, obs, open-connect, wireshark, openjdk, vlc等等被卸载了。

2024-08-30 09-34-19.png

下载完成之后,就进入了紧张刺激的安装过程。我以前好像从来没有认真看过安装过程滚过的文字,也可能是之前的版本压根就不会进行提示;总之这次我被吓得不轻,因为它如此显示:

dpkg: libgnutls30:amd64: 有依赖问题。但是如您所愿,将继续卸载:
 systemd 依赖于 libgnutls30 (>= 3.7.2).
 ....
 apt 依赖于 libgnutls30 (>= 3.7.0).

我还以为systemd和apt会被卸载,心里觉得:这下全完了,要重装系统了!结果最后并没有卸载这些东西,上面这段文字应该是一个翻译问题,它只不过是要卸载libgnutls30而已,而新的systemd和新的apt依赖的则是别的版本。

上次的升级相同,我遇到更新配置文件一律选择跳过。最后没有任何的安装失败,并且重启后也直接进入了图形界面:登陆界面的头像变得好大啊,看上去都有些吓人了。似乎比上次要顺利很多?没想到问题才刚刚开始!

抢救

进入新系统,首先映入眼帘的就是Clash的错误信息(由于Clash是开机自启的)!这是上次升级没有遇到的。我试图检查问题所在,作为Linux用户,本能当然是按下Ctrl+Alt+T,居然终端没有弹出来!我还以为可能是快捷键改了,就在nautilus里右键选择”在终端打开”,结果终端还是没能出现。这可要命了。我初步推测,这一问题的来由可能是我之前编译安装了gnome-terminal,但是在这次的更新中只是部分被覆盖了,导致兼容问题。

为了进行抢救,我进入tty,安装了xterm作为临时终端。我多年以前曾经试用过一次xterm,对其稍有了解:这个终端的界面虽然乍一看与xclock, xeyes等等古董级应用类似(毕竟本来就是同一个年代的东西),但确实可以被配置成现代化的终端。尽管如此,打开xterm之后,我顾不得调整它的外观,就迫不及待地开始着手解决Clash的问题:

2024-08-30 11-25-14.png

似乎在Ubuntu 24.04中,chrome-sandbox需要root所有、且拥有setuid才能运行,我就照着它说的去chown,chmod了。结果又报错说它要执行”/opt/Clash“这个不存在的文件,看来路径名不能有空格。不知为何在这个系统Clash的兼容性大减,但总算是成功运行了。然而还是没法访问互联网,仔细一看,发现是之前临时用的electron-ssr占用了1080端口,杀掉就正常了。回到文明世界的感觉真好!

显然,这样丑陋的xterm是没法长期使用的。我随便找了一个教程xterm配置成了正常的样子,这样就可以继续操作了。

收尾工作

前文提到,升级时卸载了一些不那么核心的应用。但我当然还是需要它们的,因此我尝试装回来。我本来以为,既然被迫要卸载,它们应该是遇到了一些依赖问题;结果之后的安装过程出乎意料的极为顺利,没有任何的依赖问题。就是TIM和微信这两个应用我并没有装回来,因为有Linux版QQ之后,我不需要用TIM了;并且我这次想要尝试Linux版的微信,wine的微信并不好用。

在每次升级时,第三方源都会被禁用,需要手动启用;我轻车熟路地sudo vim /etc/apt/sources.list准备取消注释,出乎意料的是,里面什么都没有!原来是新版本的软件源被搬到了/etc/apt/sources.list.d目录下,修改这里面的就可以了$\dots$还是不行!现在的软件源条目多出了Signed-By一项,需要找到这个源对应的gpg文件(推荐使用locate命令,很方便),写进去。参见这里

作为我使用频率最高的应用之一,gedit的高亮配色居然变了,变成了Ubuntu的Yaru配色方案,这实在是影响太大。我试图找回之前自己做的配色方案,但是在默认给出的选项里面找不到!看来似乎是由于gtksourceview从4升级到了5,加载默认方案的路径变了。万幸的是,我手动导入自制的配色方案成功了。曾经,修改配色方案是我参加OI比赛时必做的准备工作之一;从那以后,已经许多年没有碰过这个了。

gedit的左上角“打开”按钮又一次让我失望了。Ubuntu 18.04和22.04的“打开”按钮下拉后可以输入文件名来快速查找、打开最近用过的文件;而Ubuntu 20.04就没有,只是列出了最近用过的文件。24.04居然回到了20.04的行为,这就变得非常难用了,需要使用系统的搜索功能(按Win之后输入以搜索)来代偿;但是这个搜索功能不能使用fcitx输入法,仅能用于英文标题的文件。

24.04的优点

蓝牙电量显示

我早已向往的蓝牙电量显示,居然如此简单!只需在Bluetooth Battery Meter的网页上点一下,居然就装好了,蓝牙耳机的电量就显示出来了,这在桌面Linux的世界里简直是不可理喻:我本来以为可能先要折腾半天Chrome的扩展,再折腾半天chrome-gnome-shell,最后再在扩展的设置里折腾半天。

NVIDIA

在Ubuntu 24.04的软件源中,我找到了nvidia-driver-550这个新版的驱动。新版的驱动配合新的内核,完全可能让NVIDIA复活!我安装该版本之后sudo prime-select nvidia,然后重启,成功进入了图形界面:这说明NVIDIA驱动安装成功了。然而,上次我提到过的、扣下再打开笔记本后黑屏的问题仍然存在。然而我这次没法再用升级驱动版本来尝试解决了,我尝试按照这个回答中的option 1来做,至少黑屏的问题是解决了。

2024-08-30 13-08-55.png

经过一个晚上的观察,我发现休眠时也不会有过多耗电的问题,早上看还有93%的电。然而,就算我选择“节电”模式,续航也只有两三个小时,比之前要少;这可能是使用了NVIDIA驱动导致的问题。

微信

之前wine的微信字体存在问题,上传文件的对话框中不仅有许多的tofu,文件在屏幕上显示的坐标与实际需点击的坐标也不同。这次,反正老的微信已经被卸载了,我就尝试安装了早有耳闻的Linux版微信。

我找到了教程,可是它给出的openkylin的软件源里明明是有2.1.9版本的,为什么这个教程非要去安装什么beta-1.0.0呢?我不信邪,直接下载了2.1.9版本的deb来安装。

我听说,Ubuntu 24.04移除了图形界面打开deb文件安装的功能,而是跳转到应用商店;于是我故意尝试双击打开deb,发现仍然可以直接安装啊?仔细一看,原来Ubuntu只是在新安装的24.04里不包含旧版的软件商店,因此无法直接安装;而从低版本升级来的自然还保留着这些。

安装之后如我所料,一运行就报错。但是我一看报错信息:这也太眼熟了,和Clash的一模一样!于是我再次把chrome-sandbox改成root所有、setuid权限。于是微信就能成功运行了,比wine版的好用多了。虽然成功运行了,和Clash不同,我对此还是有点担心的:作为一个不可信任的软件,被赋予了setuid这么高的权限(以root身份执行),实在是相当可怕。而且我一运行,它就往我的主目录里拉了叫做.sys1og.conf的一坨屎,真是熟悉的墙国软件作风啊。我确实在网上看到了不少禁止微信访问私人文件的方法,但我寻思这些方法在suid面前都没用啊;这是需要虚拟机这种级别的隔离才能阻止的。

复杂的问题

gnome-terminal

我又一次查看了vte的issue,失望地发现这个问题还是没能得到解决;不仅如此,这问题反而扩散开来,现在连gedit里中文与英文都有着不一样的行高了。一旦输入汉字,行高就会突然增加;所以在汉英夹杂的文档里编辑,段落就会忽高忽低地移动。但毕竟代码编辑一般只需要等宽字体而非等高字体,这并非不可接受。

但在绝望之中,我发现Tadashi Saito先生提供了一条新的解决方案:在~/.config/fontconfig/fonts.conf文件里写入如下内容:

<match>
  <test name="prgname" compare="eq">
    <string>gnome-terminal-server</string>
  </test>
  <edit name="matrix" mode="assign">
    <matrix>
      <double>0.5</double><double>0</double>
      <double>0</double><double>0.5</double>
    </matrix>
    <matrix>
      <double>2</double><double>0</double>
      <double>0</double><double>2</double>
    </matrix> 
  </edit>
</match>

这个解决方案不需要编译安装任何东西,要简单得多;我决心尝试一下。但是我目前的gnome-terminal还不能使用;研究之后,我发现这是由于它已经被更新成了新版,但调用的vte的库仍然是我之前编译安装的,因此找不到符号而报错。为了解决这个问题,我删除了之前编译安装的/usr/local/lib/x86_64-linux-gnu/libvte-2.91.so.0和同目录下的libvte-2.91.so.0.6900.0,此时再ldd找到的就是官方软件源里来的新版vte了。

此时gnome-terminal总算可以成功运行了,应该是变成了正常的Ubuntu 24.04安装中该有的行为;然后我按照Tadashi Saito先生的解决方案执行,果然就成功了!虽然看上去终端还是比20.04的要大一号,似乎行列间距都稍有扩大,但已经不影响正常使用了。

按照惯例,放个截图,显示升级的效果:

2024-08-30 15-24-04.png

python 3.12

我本以为升级已经完成了;结果之后试图做科研时,发现我之前装的python包居然全都没有了!这似乎是由于python从3.10升级到了3.12。伴随着系统升级的python升级我之前当然也经历过,可我完全没有印象哪次升级之后包变得不可用了;当然,这也可能是由于22.04之前我本身用python就不多。

没关系,用pip3装回来不就行了吗?可是$\dots$ 2024-08-30 16-11-54.png

我并没有用过它说的这个venv。并且,如果按照它的说法来装包(以cvxpy为例),那此后有cvxpy的python就不再是系统的那个python,而相当于是另起炉灶。然而,我已经有了大量的用到cvxpy的Python脚本,它们写的都是

#!/usr/bin/env python3
...

因此,这些脚本自然也就无法工作了。什么,你说可以改变运行方法?首先,别的运行方法肯定比./1.py这样的敲起来麻烦;其次,我还有一些shell脚本来执行这些python脚本,这样的话也都要改了。总之,如果要按照它的说法来做,需要改动的东西太多。经过这些考虑,我选择忽视它的这些警告,使用--break-system-packages选项来坚持安装。毕竟,我都用了这么多年,装了这么多包,也从来没有经历过什么“breaking your Python installation or OS”,纯属杞人忧天。我觉得对于一个单人使用的操作系统,这套脱裤子放屁的操作大可不必。

尽管使用了--break-system-packages,还是有一些包无法被安装。比如bpy,它居然显示只支持python 3.7!我之前用3.10安装的时候明明非常顺利的啊,怎么就只支持3.7了?我必须保留python 3.10,因为这是我唯一可用的bpy了。可apt autoremove反复向我建议把它卸载掉,于是我将其设置为手动安装来避免遭到卸载。

2024-09-07更新:更多问题

使用了一周之后,我发现24.04暴露出来了更多的问题,显得品质明显不如之前我用过的几个LTS。我最近在r/ubuntu上就看见了很多升级失败的经历,整个系统可能在升级的过程中崩溃,重启后会失去图形界面和联网能力。由于这些严重的问题,Ubuntu官方又重新关闭了22.04的升级通道。所幸我自己没有经历这些,只是卸载了几个无关紧要的包。

NVIDIA下一些窗口无法显示

我是在玩aisleriot的时候发现的这个问题:GNOME的帮助(Yelp)无法正常运行,打开后会是空白的窗口,因此都没法查看纸牌游戏的规则了。在终端下执行yelp命令,显示错误信息AcceleratedSurfaceDMABuf was unable to construct a complete framebuffer

经过搜索,我发现这个问题远不止aisleriot一个程序,而是在NVIDIA下广泛存在的。解决方案是往/etc/environment里加入一行WEBKIT_DISABLE_DMABUF_RENDERER=1,然后注销即可。

GTK4应用无法使用输入法

Ubuntu 24.04引入了不少新版本的GNOME应用,这些应用是使用GTK4/LibAdwaita开发的,以文件管理器nautilus为代表。经过一段时间的使用,我震惊地发现在nautilus里尝试重命名文件时,竟然无法输入中文。我最开始还以为是太过老旧从不更新的搜狗输入法的锅,毕竟它能在24.04上运行已经是一种奇迹了;结果发现日文输入法mozc居然也不能输入。上网搜索后,我发现这个问题是广泛存在的:虽然我使用的是X11和fcitx,但是我看到Wayland用户和ibus用户也都有同样的问题。我的问题还要更严重一点,因为我在地址栏里也不能输入中文了,而部分用户似乎只有重命名有问题。我在其余的GTK4应用里也观察到了类似的问题,如gnome-control-center;带有参数--gtk-version=4运行Chrome的话也会无法输入中文。

这是真没办法,毕竟这些搞桌面Linux的向来对CJK的支持漠不关心,我也不是第一天知道。网上有一个修复方法,但是需要编译安装,而且只对某个特定版本的Fedora有用。截至目前,我还没有找到有效的解决方案。所幸的是,我使用频率最高的gedit和gnome-terminal都是GNOME已经放弃维护的老版本应用,因此没有问题。