早在今年上半年的 Build 2019 上,微软宣布了 wsl2,使得 wsl 不再只是进行指令的翻译,而是能够切切实实跑在一个 Linux 内核下。这样一来,wsl 将不再受内核的局限,能够运行 docker 等与 Linux kernel 密切相关的软件。

自宣布以来,wsl2 的开发很快提上日程,并在 Windows 10 20H1 版本中可用。但想要升级至此版本,目前还需进入预览体验计划,而 Windows 10 目前的 bug 数量使我对 insider fast ring 望而却步。最近在经过了很长时间的心理斗争之后,我最终还是进入了快速预览版,开始体验 wsl2,下面是途中遇到的一些坑,留存至此,以备后来者避坑。

安装

安装过程参考官方的 WSL 2 的安装说明 即可。

首先滚入 20H1 的预览版,升级系统,而后开启 hyper-v 平台,跑一个命令将原本的 wsl1 转为 wsl2 即可。更改的过程可能要花几分钟时间,等待就好。

之后就能开始使用 wsl2 啦!

各种坑

……当然,路途总不是一帆风顺的,总是伴随着艰难险阻。

虚拟机

由于 VMware 暂未支持嵌套虚拟化,所以开启了 hyper-v 之后,将无法继续使用 VMware 虚拟机。虽然 hyper-v 本身也能装个虚拟机应个急,但体验确实是远远不如 VMware 的。

terminal

另外就是终端问题了。

我在 wsl1 时期一直使用的终端 wsl-terminal 由于很久没有更新,所以并没有支持 wsl2,但见鬼的是我升级完之后 wsl1 也没办法用了……不过好在还有 windows terminal 这个官方的终端可以使用(虽然现在还不能输入中文有点难受)。

有一个方法则是可以先启动 powershell,然后通过命令行启动 wsl2。

代理

安装了 hyper-v 之后,会将一系列端口划入保留端口之中,其中就包括了 ss/ssr 的默认端口 1080。解决方法也很简单,换一个高位端口即可。(各种配置里的更改就是一项大工程了)

但真正吊诡的事则是,在我最初试用 hyper-v 时并未出现这个情况,开始使用 wsl2 后才发生……

systemd

由于 wsl2 的第一个(PID=1)进程是维持 windows 与 wsl2 通信等所需的 init,因此 systemd 无法以 PID=1 启动,直接无法使用。

但是,人民群众造轮子的热情是不可磨灭的(误,我们可以用 genie 来使用 systemd。

genie 的安装过程不再赘述,紧随官方文档或者使用 aur 即可。需要注意的是,genie 需要 dotnet 被引入环境变量,只需在你正使用的 shell 的配置文件(如 zsh 的 ~/.zshrc )中加入 export DOTNET_ROOT=/opt/dotnetsource 以应用即可。

此外,由于其实现原理,最好将宿主机上自定义的 hosts 文件清空,以防出现问题。

安装成功之后,只需执行 genie -s ,即可使 systemd 能够使用。

docker

在 systemd 这一问题解决之后,docker 的安装与使用非常简单。

yay docker 安装之后,只需通过 systemctl 启用其服务即可,换源等不再赘述。

after

其实在这一套安装下来之后,甚至感觉有点没啥用(?