WSL2 Ubuntu 22.04 安装踩坑记录

最近 Ubuntu 22.04 正式发布了,我使用的 Ubuntu 还是 WSL2 中的 20.04 版本,故前来升级。不过坑确实比想象中的多,遂来尝试总结一下,希望能帮助到有需要的同学。不过这篇文章确实是我快折腾结束时,临时起意,故有些场景的截图可能会有所纰漏,还望包涵。

目录

  • 安装全新的 Ubuntu 22.04 WSL2
    • 隐去 APT 报错
    • 启用 snap
  • 升级已有 Ubuntu 20.04 WSL2
    • 方案一:保证升级前的系统 APT 源为国内源
    • 方案二:修改升级脚本替换源为国内源
  • 附录
    • 安装 WSL2
    • 查看系统发行版本
    • 替换 APT 国内源
    • snap 国内速度慢
    • Hyper-V 虚拟机改分辨率
    • WSL2 上你会需要的一些工具
      • wslu
    • 最后,来点魔法

安装全新的 Ubuntu 22.04 WSL2

首先要注意的是,升级到 Ubuntu 22.04 后,需要按照附录所写,把 apt 软件源换成国内的,因为此新版本的官方源有些包无法正常下载。

隐去 APT 报错

如果你在使用 APT 安装软件包的结尾,出现这样的报错:

Failed to retrieve available kernel versions.
Failed to check for processor microcode upgrades.

那么可以通过修改 needrestart 的配置去消去这类报错1

sudo -e /etc/needrestart/needrestart.conf

在配置文件中找到 kernelhints 和 ucodehints 这两行,取消注释并将值改成 0:

$nrconf{kernelhints} = 0;
$nrconf{ucodehints} = 0;

这样再使用 APT 时就不会有之前的报错了。

不过这个报错留着也不会有什么影响,所以不改也可以,另外直接卸载此软件包也可以:

sudo apt-get purge needrestart

此外,22.04 的 APT 包安装结尾现在多了一些检查项,所以日志多了几条:
WSL2 Ubuntu 22.04 安装踩坑记录_第1张图片
但并无大碍,无需关注。

启用 snap

现在 Ubuntu 的战略似乎都转向用 snapcraft 打包应用,很多软件在 apt 官方源内的版本都不是最新,甚至有的都不再提供 apt 安装方式2

但是,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 即可3

sudo vim /etc/wsl.conf

在这份配置文件中加上下面的配置:

[boot]
command="/usr/libexec/wsl-systemd"

最后重启 WSL2,即可正常使用 snap:

WSL2 Ubuntu 22.04 安装踩坑记录_第2张图片

但到这里其实还只是能使用 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 版本官方源在国内有一定的问题(报错见下,因为忘了截图,就根据网上的一些问题还原了一个报错4),所以也要保证升级时使用的 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 源为国内源

理论上只要你和附录一样,改用国内源5,那么升级应该也会是顺利使用国内源升级6

方案二:修改升级脚本替换源为国内源

这个方案比较暴力,也比较有意思,思路就是手动修改升级系统的脚本7,使之按照自己的意愿升级,可操作性和灵活性都比较大,如果上面方案一试了不可以,就可以试试这种备选的万能方案。

每次运行 do-release-upgrade 时,都会在 /tmp 目录下缓存一个升级包的解压目录,里面即为升级程序的脚本源码,大多是 Python 程序。

注意,直接使用 sudo 是没法接 cd 之类的 shell 内建命令(不是可执行程序)的,需要先升级权限为 root:

sudo -i

然后进入一个 do-release-upgrade 缓存目录,比如我这里是 /tmp/ubuntu-release-upgrader-49tqpuq1,你的可能不一样,但里面的文件都是差不多的,

WSL2 Ubuntu 22.04 安装踩坑记录_第3张图片
我们可以看到修改源的地方是在 apt_clone.py 这个文件:
WSL2 Ubuntu 22.04 安装踩坑记录_第4张图片
于是可以找到 _rewrite_sources_list 这个方法是重写当前系统的 sources.list 文件到新的发行版的 source.list,然后依照这个来升级系统和包……那么这里我们自然也可以自行在这代码里改成我们想要的国内源来升级……这里具体如何修改 Python 代码就不细说了,其实说到这里,我已经明白方案一就可以了,不用大费周折来改到这里,因为这里代码赫然写着只替换发行版的名字,不替换 URL。
WSL2 Ubuntu 22.04 安装踩坑记录_第5张图片

最后如果改完,可以运行升级程序即可继续正常升级:

# 此时还是 root 权限,且在缓存文件夹中
./dist-upgrade.py --frontend=DistUpgradeViewText

其实这个过程还有很多地方可以随心所欲地修改,比如按照这个 Issue7 注释掉 snapd 的一些逻辑使得安装过程更顺畅等等……还是很有趣的。

附录

安装 WSL2

这个过程官方文档已经写得很详尽了,就不赘述了8

查看系统发行版本

lsb_release -a

替换 APT 国内源

# 养成备份好习惯
sudo cp /etc/apt/sources.list /etc/apt/sources.list.backup

# 编辑 APT 源列表
sudo vim /etc/apt/sources.list

将里面默认的 archive.ubuntu.com/ubuntu/security.ubuntu.com/ubuntu/ 都替换成你选择的国内源地址。

比如都替换成 mirrors.tuna.tsinghua.edu.cn/ubuntu/

WSL2 Ubuntu 22.04 安装踩坑记录_第6张图片
WSL2 Ubuntu 22.04 安装踩坑记录_第7张图片
最后刷新一下包列表,完成更换:

sudo apt update

sudo apt dist-upgrade

snap 国内速度慢

如果想国内使用 snap 可以参考这篇博文9的两个方案,我因为使用了科学上网的方式,就没有继续使用这里的方案了。

Hyper-V 虚拟机改分辨率

附赠一下用 Hyper-V 虚拟机时如果需要改掉默认的分辨率需要的一个 PowerShell 下的命令10,这个跟本篇并无太大关系,但如果你最后转去使用 Hyper-V 安装 Ubuntu 的话,还是需要这个的:

# template
set-vmvideo $vm_name -horizontalresolution:$width -verticalresolution:$height -resolutiontype single

# example
set-vmvideo Ubuntu -horizontalresolution:1920 -verticalresolution:1080 -resolutiontype single

只需这一行命令设置一下,下次启动名为 $vm_name 的虚拟机时,显示的分辨率就会如你设置这般。

WSL2 上你会需要的一些工具

wslu

wslu 是一个 WSL2 下和 Windows 系统交互的命令行工具集合11

sudo apt install wslu

我目前在用的:

  • wslview:可以通过此命令调用 Windows 的默认浏览器打开 WSL2 内的超链接。使用时你可以直接把 WSL2 下的默认浏览器(即环境变量 BROWSER 设置为 wslview12),这样你就可以不用再在 WSL2 里安装浏览器,通过 wslg13 来使用浏览器了。而是可以直接打开终端上的超链接,很方便。

最后,来点魔法

WSL2 内不能直接使用 Windows 下配置的魔法,需要设置到 Windows 魔法端口的代理,这里14已经描述的很详细了,也可以直接复制我的配置15,祝君体验愉快。


  1. windows subsystem for linux - Ubuntu 22.04 LTS on WSL: “Failed to retrieve available kernel versions”/“Failed to check for processor microcode upgrades” when installing packages - Ask Ubuntu ↩︎

  2. Ubuntu Makes Firefox Snap Default in 21.10 - OMG! Ubuntu! ↩︎

  3. WSL2- Ubuntu 20.04 Snap store doesn’t work due to systemd dependency · Issue #5126 · microsoft/WSL ↩︎

  4. Bug #1969597 “can not install xrdp on ubuntu 22.04” : Bugs : xrdp package : Ubuntu ↩︎

  5. apt get - Ubuntu apt-get unable to fetch packages - Stack Overflow ↩︎

  6. Exit 1 when upgrading to Ubuntu 21.04 · Issue #6942 · microsoft/WSL ↩︎

  7. Exit 1 when upgrading to Ubuntu 21.04 · Issue #6942 · microsoft/WSL ↩︎ ↩︎

  8. Install WSL | Microsoft Docs ↩︎

  9. snap install too slow ↩︎

  10. virtual machine - Change screen resolution of Ubuntu VM in Hyper-V - Super User ↩︎

  11. wslutilities/wslu: A collection of utilities for Windows 10 Linux Subsystems ↩︎

  12. icyzeroice/linux-vor ↩︎

  13. microsoft/wslg: Enabling the Windows Subsystem for Linux to include support for Wayland and X server related scenarios ↩︎

  14. 记一次在 WSL2 下使用魔法 ↩︎

  15. icyzeroice/linux-vor ↩︎

你可能感兴趣的:(ubuntu,linux,windows)