最近 Ubuntu 22.04 正式发布了,我使用的 Ubuntu 还是 WSL2 中的 20.04 版本,故前来升级。不过坑确实比想象中的多,遂来尝试总结一下,希望能帮助到有需要的同学。不过这篇文章确实是我快折腾结束时,临时起意,故有些场景的截图可能会有所纰漏,还望包涵。
目录
安装全新的 Ubuntu 22.04 WSL2
首先要注意的是,升级到 Ubuntu 22.04 后,需要按照附录所写,把 apt 软件源换成国内的,因为此新版本的官方源有些包无法正常下载。
隐去 APT 报错
如果你在使用 APT 安装软件包的结尾,出现这样的报错:
Failed to retrieve available kernel versions.
Failed to check for processor microcode upgrades.
那么可以通过修改
needrestart
的配置去消去这类报错:
sudo-e /etc/needrestart/needrestart.conf
在配置文件中找到 kernelhints 和 ucodehints 这两行,取消注释并将值改成 0:
$nrconf{kernelhints} = 0;
$nrconf{ucodehints} = 0;
这样再使用 APT 时就不会有之前的报错了。
不过这个报错留着也不会有什么影响,所以不改也可以,另外直接卸载此软件包也可以:
sudoapt-get purge needrestart
此外,22.04 的 APT 包安装结尾现在多了一些检查项,所以日志多了几条:
但并无大碍,无需关注。
启用 snap
现在 Ubuntu 的战略似乎都转向用 snapcraft 打包应用,很多软件在 apt 官方源内的版本都不是最新,甚至有的都不再提供 apt 安装方式。
但是,snap 的使用需要依赖 systemd,而这个在 WSL2 上没有正常开启,导致我们在使用 snap 时会报错:
error: cannot communicate with server: Post http://localhost/v2/snaps/xxx: dial unix /run/snapd.socket: connect: no such file or directory
目前需要我们手动配置开启 systemd,即在 WSL 启动时执行 wsl-systemd 即可:
sudovim /etc/wsl.conf
在这份配置文件中加上下面的配置:
# /etc/wsl.conf[boot]command="/usr/libexec/wsl-systemd"
2023/01/27 更新:
如果上面的配置最终无法成功工作,可以尝试下面另一种配置方法# /etc/wsl.conf[boot]systemd=true
最后重启 WSL2,即可正常使用 snap:
但到这里其实还只是能使用 snap 的命令,并不能正常使用 snap 安装的软件包,还需要把 snap 安装的软件二进制可执行文件的文件夹放到环境变量中,然后重启终端:
# 注意使用单引号不是双引号,或者直接用编辑器修改对应 bash 或 zsh 的配置文件也可以echo'export PATH=$PATH:/snap/bin\n'>> ~/.zshrc
echo'export PATH=$PATH:/snap/bin\n'>> ~/.bashrc
至此,snap 安装的应用也可以正常使用了。
升级已有 Ubuntu 20.04 WSL2
如果已经安装使用了 Ubuntu 20.04,是可以直接不卸载此子系统,直接滚动升级到 22.04 版本的:
sudo do-release-upgrade -d
升级后大概还是会遇到上面 22.04 小节的问题,然后解决一遍即可。
但是可能,你无法直接进行升级,因为 22.04 版本官方源在国内有一定的问题(报错见下,因为忘了截图,就根据网上的一些问题还原了一个报错),所以也要保证升级时使用的 22.04 版本源为国内源,成功率会高很多。
Err:1 http://cn.archive.ubuntu.com/ubuntu jammy/universe amd64 libfuse2 amd64 2.9.9-5ubuntu3 Connection failed [IP: 91.189.91.38 80]
E: Failed to fetch http://archive.ubuntu.com/ubuntu/pool/universe/f/fuse/libfuse2_2.9.9-5ubuntu3_amd64.deb Connection failed [IP: 91.189.91.38 80]
E: Unable to fetch some archives, maybe run apt-get update or try with --fix-missing?
Aborting
Reading package lists... Done
Building dependency tree
Reading state information... Done
=== Command terminated with exit status 1 (Mon May 02 15:30:00 2022) ===
至于如何保证国内源,这里提供两种方案和思路供尝试,这些方案是我在搜索一些问题的解决方案时得到的启发,但因为我安装了新的 22.04 版本,没有继续折腾滚动升级的方式,故留下一些记录,如果有同学遇到类似的问题,可供参考。
方案一:保证升级前的系统 APT 源为国内源
理论上只要你和附录一样,改用国内源,那么升级应该也会是顺利使用国内源升级。
方案二:修改升级脚本替换源为国内源
这个方案比较暴力,也比较有意思,思路就是手动修改升级系统的脚本,使之按照自己的意愿升级,可操作性和灵活性都比较大,如果上面方案一试了不可以,就可以试试这种备选的万能方案。
每次运行
do-release-upgrade
时,都会在
/tmp
目录下缓存一个升级包的解压目录,里面即为升级程序的脚本源码,大多是 Python 程序。
注意,直接使用
sudo
是没法接
cd
之类的 shell 内建命令(不是可执行程序)的,需要先升级权限为 root:
sudo-i
然后进入一个
do-release-upgrade
缓存目录,比如我这里是
/tmp/ubuntu-release-upgrader-49tqpuq1
,你的可能不一样,但里面的文件都是差不多的,
我们可以看到修改源的地方是在
apt_clone.py
这个文件:
于是可以找到
_rewrite_sources_list
这个方法是重写当前系统的 sources.list 文件到新的发行版的 source.list,然后依照这个来升级系统和包……那么这里我们自然也可以自行在这代码里改成我们想要的国内源来升级……这里具体如何修改 Python 代码就不细说了,其实说到这里,我已经明白方案一就可以了,不用大费周折来改到这里,因为这里代码赫然写着只替换发行版的名字,不替换 URL。
最后如果改完,可以运行升级程序即可继续正常升级:
# 此时还是 root 权限,且在缓存文件夹中
./dist-upgrade.py --frontend=DistUpgradeViewText
其实这个过程还有很多地方可以随心所欲地修改,比如按照这个 Issue 注释掉 snapd 的一些逻辑使得安装过程更顺畅等等……还是很有趣的。
附录
安装 WSL2
这个过程官方文档已经写得很详尽了,就不赘述了
查看系统发行版本
lsb_release -a
替换 APT 国内源
# 养成备份好习惯sudocp /etc/apt/sources.list /etc/apt/sources.list.backup
# 编辑 APT 源列表sudovim /etc/apt/sources.list
将里面默认的
archive.ubuntu.com/ubuntu/
和
security.ubuntu.com/ubuntu/
都替换成你选择的国内源地址。
比如都替换成
mirrors.tuna.tsinghua.edu.cn/ubuntu/
:
最后刷新一下包列表,完成更换:
sudoapt update
sudoapt dist-upgrade
snap 国内速度慢
如果想国内使用 snap 可以参考这篇博文的两个方案,我因为使用了科学上网的方式,就没有继续使用这里的方案了。
Hyper-V 虚拟机改分辨率
附赠一下用 Hyper-V 虚拟机时如果需要改掉默认的分辨率需要的一个 PowerShell 下的命令,这个跟本篇并无太大关系,但如果你最后转去使用 Hyper-V 安装 Ubuntu 的话,还是需要这个的:
# templateset-vmvideo$vm_name-horizontalresolution:$width-verticalresolution:$height-resolutiontype single
# exampleset-vmvideo Ubuntu -horizontalresolution:1920 -verticalresolution:1080 -resolutiontype single
只需这一行命令设置一下,下次启动名为
$vm_name
的虚拟机时,显示的分辨率就会如你设置这般。
WSL2 上你会需要的一些工具
wslu
wslu 是一个 WSL2 下和 Windows 系统交互的命令行工具集合
sudoaptinstall wslu
我目前在用的:
wslview
:可以通过此命令调用 Windows 的默认浏览器打开 WSL2 内的超链接。使用时你可以直接把 WSL2 下的默认浏览器(即环境变量BROWSER
设置为wslview
),这样你就可以不用再在 WSL2 里安装浏览器,通过 wslg 来使用浏览器了。而是可以直接打开终端上的超链接,很方便。
最后,来点魔法
WSL2 内不能直接使用 Windows 下配置的魔法,需要设置到 Windows 魔法端口的代理,这里已经描述的很详细了,也可以直接复制我的配置,祝君体验愉快。
版权归原作者 零度冰华 所有, 如有侵权,请联系我们删除。