Wsl2 Config

因为想玩的几个游戏在 Linux 下面并没有,虚拟机下渲染又出现了一些奇怪的问题,最终被迫又从 Linux 套 Windows 回到了 Windows 套 Linux。安装过程中碰到了一些较为麻烦的问题,有记录的必要。

通过阅读这篇文章,你会了解到

  • 如何安装和配置 WSL2
  • 如何在子系统访问宿主系统的网络服务
  • 一个够用的 ZSH 配置
  • DNS 配置(待续)

WSL2 安装

这一部分实际上没有什么难的,跟着微软的官方教程稳扎稳打地走,一般不会出现什么奇怪的问题。

在子系统访问宿主系统的网络服务

从宿主系统访问子系统的网络服务,这种场景非常的常见,安装子系统的人一般都是想在 Linux 做开发,开发就肯定免不了开启一些端口。这个需求完全不会遇到任何阻碍,WSL2 完美支持从宿主机直接按 127.0.0.1 访问内部子系统,必要的端口映射都做好了。

但是反向操作就比较麻烦了。虽然不太常见,但是也很常见。解决方案虽然很简单,难的是定位的问题到底是在哪个环节出现。

首先,由于 WSL2 实际上使用了 Hyper-V 的虚拟化技术,其内部和宿主 Windows 形成了一个小型的局域网。为了得到 Windows 的 IP 地址,可以使用指令

1
cat /etc/resolv.conf | grep nameserver | awk '{ print $2 }'

注意,这个 IP 每次重启都会改变。从 resolv.conf 中拿到的实际上是 dns server 的配置信息,只是恰巧其解析是走的外部宿主机,所以我们就可以用这个方式拿到 IP。

但是往往得到这个 IP 后,你仍然会发现无法访问宿主机的服务。一个最重要的问题出在 Windows 的防火墙上。默认情况下,Windows 会阻断 WSL2 的虚拟网卡与外界的联系,为了放开限制,可以使用指令

1
New-NetFirewallRule -DisplayName "WSL" -Direction Inbound  -InterfaceAlias "vEthernet (WSL)"  -Action Allow

这条指令会创建一条名为 WSL 的规则,并允许所有从网卡 vEthernet (WSL) 的任何规格的入站包。

不过,这样之后仍然不能访问宿主机服务。问题仍然是防火墙,还需要放开这些服务的公共网络限制,也就是必须同时勾选家庭网络和公共网络。

到这里,排除其他问题的流程我想就不必再解释了。

  1. 检查是否还有别的防火墙阻挡了连接。
  2. 检查服务绑定的 IP 是 127.0.0.1 还是 0.0.0.0,后者才允许「外网」(虚拟机局域网)连入。
  3. ……

ZSH

换上喜闻乐见的 ZSH。

  • ZSH
  • oh-my-zsh
  • Powerlevel10k
  • zsh-autosuggestions
  • syntax-highlights

并不想折腾 ZSH,所以维持这样一个够用的状态就够了。


一点牢骚

在这段时间,我尝试了各种不同的妥协方案。我的需求

  • 开发:刚需。不行一概免谈。
    • 一般的控制台开发。必须满足。
    • 带 GUI 的开发。没有也罢。
    • 涉及到硬件、虚拟化等特殊技术的开发。没有也罢。
  • 娱乐:游戏虽然玩得不多,但总还是有。另外像网易云、QQ一类的必须有解决方案。
  • 性能:电脑是笔记本 AMD + 核显,电源管理要好,性能别白瞎了睿频以及8核16线程就好。
  • under control:足够的 flexible,且不要隐藏太多的细节。

Linux 的话,我使用了大约半个月的 Manjaro。总体来讲体验极好,Linux 的 shell,完全满足编程要求。Manjaro 的驱动也很全面,对电脑硬件的使用基本没有问题[1]。自行折腾一下能做好 btrfs,再带个 Timeshift 体验极佳。另外我也用过一段时间 Fedora,Fedora 的 Wayland 缩放率默认只有 100% 和 200% 这种整数倍选项,通过特殊手段倒是能够选中 150%、175% 这样的选项,但是效果堪忧。娱乐方面比较惨,虽然这不算是 Linux 的问题,毕竟 Steam 玩 CS:GO 都没问题……网易云可以用网页版(音质),QQ 的 Linux 版不评价了。而且我有一些游戏即使放在虚拟机下也不太行,开启3D加速之后性能够了,可 Virtual Box 的渲染效果又变得很诡异[2]。总之我不想再费时间在这上面,于是就放弃了。

Windows……稀烂的 CMD,Powershell 能用,我不想额外学。大量开源项目对 Windows 支持不佳,像 Nodejs、Ruby 等在 Windows 下性能低下,还有干脆不支持 Windows 的。个人对微软的 toolchain 也完全提不起兴趣,看到命令行里的 / 打头的 switch 就感到不适。为了获得 Linux 的体验,我尝试了这么几个方案

  • MSYS2
  • 虚拟机
  • WSL2

这件事见仁见智。MSYS2 的 Pacman 还可以。虚拟机很好,但是对宿主机的性能影响不是一点半点,完全分离的文件系统也是个问题[2],妥协使用 Server 版的后果还会有 GUI 开发受阻……最后还是用的WSL2。

不过当下 WSL2 也有很多问题。

  • 功能未稳定。这是潜在的风险。WSL2 的官方定位是一个「尝试」,可能并不是最终的解决方案。而且 WSL2 的一些特性并非稳定,可能今天有用,下个版本就失效了。这也是上文中我不太想配置 DNS 的原因。
  • 文件系统效率。虽然子系统和宿主系统间的文件系统是可以相互访问的,但是效率很低。
  • WSL2 的设置选项不够灵活。现在很多设置仍然要发掘文档和 Issue,部分问题的解决方案也没有被官方采纳录入文档。比如防火墙,比如还没有一个正式的调节 WSL2 占用磁盘大小的方法……仍有很多有待完善。

用哪个都少不了折腾。所以最终解决方案是买一台 Macbook


  1. 这个和电脑相关,参考意义不大。蓝牙驱动不稳定,大概10次开机中会有1次鼠标蓝牙连接中断。开机引导短暂花屏,系 Grub 配置问题,可以通过修改分辨率修复。高分屏支持堪忧,常用软件问题不大,但总是会有这么几个小到瞎眼。精益求精的话,需要自行研究文件系统并配置适用于 SSD 的设置。 ↩︎

  2. Virtual Box 的无缝模式在 Windows XP下对自行绘制的窗口(比如 QQ)效果很差,在 Windows 7 下看起来像是脏绘制有问题,残影严重,Windows 10 的话我又不想分太多内存给它。

    1. 对于想要尝试这种办法的人,务必考虑一下 Visual Studio Code 的 Remote SSH 插件。只要能够打通一条 SSH 的 22 端口,其他的端口映射问题都能够自动解决。不过文件的双向传递仍然需要自行解决,可以考虑一下 FileZilla。
    ↩︎


Wsl2 Config
https://blog.chenc.me/2021/01/12/wsl2-config/
作者
CC
发布于
2021年1月13日
许可协议