WSL 2 体验

我很久前就开始使用 WSL 2,遗憾好几次被 pre_release 通道各种鬼畜的 bug 劝退。而这次不同——还算能用的慢速预览通道总算迎来了 2004 更新,这个版本的更新包含 WSL 2。

安装

如果之前已装 WSL

  1. 在控制面板 - 程序和功能 - 启用或关闭 Windows 功能里开启“虚拟机平台”并重启。

  2. 到这个页面下载并安装 WSL 2 Linux Kernel:Updating the WSL 2 Linux kernel | Microsoft Docs

  3. 将原来安装的发行版转为 WSL 2:

    1
    wsl --set-version Ubuntu 2

上述命令的 Ubuntu 换成自己发行版的名字,不确定的话可以通过 wsl -l -v 命令查看。

如果以前没装过 WSL

  1. 控制面板 - 程序和功能 - 启用或关闭 Windows 功能 里启用"适用于 Linux 的 Windows 子系统"和“虚拟机平台”并重启。

    启用或关闭 Windows 功能

    或者以管理员权限打开 PowerShell 执行以下命令后重启:

    1
    2
    dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
    dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart
  2. 到这个页面安装 WSL 2 Linux Kernel:Updating the WSL 2 Linux kernel | Microsoft Docs

  3. 设置默认 wsl 版本:

    1
    wsl --set-default-version 2
  4. 在 Microsoft Store 中找到想要的发行版进行安装,安装完后点击发行版图标打开,后续安装会自动进行,途中会提示新建一个 Linux 用户。

使用

换源

备份原来的配置文件:

1
sudo mv /etc/apt/sources.list /etc/apt/sources.list.bak

新建配置文件:

1
sudo vim /etc/apt/sources.list

我用的是清华镜像:

1
2
3
4
5
6
7
8
9
10
11
12
13
# 默认注释了源码镜像以提高 apt update 速度,如有需要可自行取消注释
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-updates main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-updates main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-backports main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-backports main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-security main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-security main restricted universe multiverse

# 预发布软件源,不建议启用
# deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-proposed main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-proposed main restricted universe multiverse

保存后更新:

1
sudo apt update; sudo apt upgrade

常用程序

WSL 1 时代有个对常用程序在 WSL 运行效果打分的项目:ethanhs/WSL-Programs,许多时候还得战战兢兢去这个页面看自己用的程序和 WSL 相性如何。

而 WSL 2 拥有完整的 Linux 内核,常见的程序应该都能运行,以下是一些我常用的程序的测试。

holo (Java + H2 数据库) 功能正常:

Halo

Jupyter 正常:

Jupyter + VSCode WSL Extension

Python + MySQL 正常:NSFW 警告

Python + MySQL

:由于 Systemctl 不可用,请使用 sudo service start mysql 来启动 MySQL。

Terminal

推荐唯一指定 Terminal——Windows Terminal,目前还处于测试,但已经足够好用。Win + Shift + 4 就可以直接打开终端了,可以在这里找到许多主题: iTerm2-Color-Schemes

VSCode WSL 插件

现在 VSCode 插件已经兼容 WSL 2,直接在 VSCode 新建 WSL 窗口就能访问 WSL 的文件,用来写 Python 还是挺舒服的。

Shell

bash 和 ZSH 都正常运行,oh-my-zsh 也正常。

服务的互相访问

  • WSL 下可以输入 cat /etc/resolv.conf 命令查看 Windows 端 IP:

    1
    2
    3
    4
    5
    ➜  ~ cat /etc/resolv.conf
    # This file was automatically generated by WSL. To stop automatic generation of this file, add the following entry to /etc/wsl.conf:
    # [network]
    # generateResolvConf = false
    nameserver 172.29.32.1

    通过上面命令可知可以使用 172.29.32.1 这个 IP 访问 Windows 服务。
    比如我可以在 WSL 访问 Windows 的 IP:v2ray 端口 来进行代理,详见终端代理

  • Windows 端直接使用 localhost 访问 WSL 启动的服务:
    WindowsAccessWSLServers

文件的互相访问

  • Windows 的所有磁盘被挂载在 WSL 的 /mnt 目录下。
    WinFiles
  • WSL 的文件在 \\wsl$ 这个地址中找到,可通过 explorer 进行访问。
    WSLFiles

Proxy

我这里直接使用了 Windows 端的 v2ray,v2rayN 记得打开“允许来自局域网的连接”选项。zsh 配置如下(记得把 V2RAY 的值设置成自己 Windows 的 IP 和端口,或直接在 WSL 跑一个 v2ray 也是可以的):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#proxy
V2RAY='172.29.32.1:10809'
defp=$V2RAY

# No Proxy
function noproxy
{
unset http_proxy HTTP_PROXY https_proxy HTTPS_PROXY all_proxy ALL_PROXY ftp_proxy FTP_PROXY dns_proxy DNS_PROXY JAVA_OPTS GRADLE_OPTS MAVEN_OPTS
echo "clear proxy done"
}

function setproxy
{
if [ $# -eq 0 ]
then
inArg=$defp
else
inArg=$1
fi
HOST=$(echo $inArg |cut -d: -f1)
PORT=$(echo $inArg |cut -d: -f2)
http_proxy=http://$HOST:$PORT
HTTP_PROXY=$http_proxy
all_proxy=$http_proxy
ALL_PROXY=$http_proxy
ftp_proxy=$http_proxy
FTP_PROXY=$http_proxy
dns_proxy=$http_proxy
DNS_PROXY=$http_proxy
https_proxy=$http_proxy
HTTPS_PROXY=$https_proxy
JAVA_OPTS="-Dhttp.proxyHost=$HOST -Dhttp.proxyPort=$PORT -Dhttps.proxyHost=$HOST -Dhttps.proxyPort=$PORT"
GRADLE_OPTS="-Dgradle.user.home=$HOME/.gradle"
MAVEN_OPTS=$JAVA_OPTS
no_proxy="localhost,127.0.0.1,localaddress,.localdomain.com,.huaweicloud.com,.coding.net,.ruby-china.org"
echo "current proxy is ${http_proxy}"
export no_proxy http_proxy HTTP_PROXY https_proxy HTTPS_PROXY all_proxy ALL_PROXY ftp_proxy FTP_PROXY dns_proxy DNS_PROXY JAVA_OPTS GRADLE_OPTS MAVEN_OPTS
}

在需要使用代理时,终端输入 setproxy 即可。在想要取消时输入 noproxy。比如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
➜  ~ setproxy # 设置代理
current proxy is http://172.29.32.1:10809
➜ ~ curl ipinfo.io # 从 ipinfo.io 确认代理是否生效
{
"ip": "xxx",
"hostname": "",
"city": "Hong Kong",
"region": "Central and Western",
"country": "HK",
"loc": "",
"org": "",
"timezone": "Asia/Hong_Kong",
"readme": "https://ipinfo.io/missingauth"
}%
➜ ~ noproxy # 取消代理
clear proxy done

参考:在Mac终端下配置Proxy

Docker

运行正常,我试着跑了个容器化的 TinyTinyRSS,没什么问题,爽到。

DockerTest

Docker Windows 版还出了一个以 WSL 2 为后端的新特性,我对以前的 Docker for Windows 有阴影,所以不尝试使用了,蹲篇对两者进行比较的文章。

GPU

无法使用 GPU,想用 WSL 跑机器学习啥的没戏,不过 MS 也说他们正慢慢迭代 WSL,敬请期待。

Systemd

无法使用,启动/停止服务要用 service

缺陷

内存占用

内存使用显著增加,就开了个 MySQL 占用高达 3G:MemoryUsage.png

本人 16G 内存勉强能用,如果内存被 WSL 撑爆了可以尝试用 wsl --shutdown 结束所有相关服务。

预览版带来的问题

5E 对战平台不支持在预览版系统运行。

解决:老老实实等正式版推送 | 用另一台电脑打 5E

Hyper-V 带来的问题

  1. 腾讯家的网游和部分使用 ByttlEye 反作弊系统的游戏无法运行。
  2. 其他模拟器会出问题,比如 Android Studio 自带的模拟器、我玩少前用的雷电模拟器、VirtualBox等…

解决:要玩这些游戏/要用其他模拟器时临时关闭“虚拟机平台”功能(要重启,有点麻烦) | 用另一台电脑打游戏/用模拟器

对了,贴一个开启 Hyper-V 后使用 Android 模拟器的办法:使用 Hyper-V 加速 Android 模拟器 | Kara

我宣布微软就是使用 AMD CPU 的 Android 开发者的救星。哦,Genymotion 也行啊?那没事了。但 Genymotion 和 WSL 2 只能二选一啊。

似乎 VMware Workstation 已经推出和 Hpyer-V 共存的版本,我没 license key 就不倒腾了。

总结

  • WSL 2 的 I/O 表现比以往好太多,Miniconda 安装和 apt upgrade 速度可能比以前快了一倍不止,我有启用 WD,不知道把 WD 换成其他防护软件 IO 表现会不会更好
  • 完整的 Linux 内核很爽,Docker 终于好用了
  • Systemd 还是不能用,如果要管理服务可以用 service 命令

2004 更新之后新添的 WSL2 搭配 Scoop 和 Windows Terminal 还算好用,有点 macOS + iTerm2 + brew 那味,不过这也会带来娱乐性的损失——好些游戏都无法运行。

这几年巨硬的努力有目共睹:

  1. 对开发者:Azure, VSCode, WSL, Windows Terminal
  2. 服务和应用:TO-DO、Outlook Mobile、能看 4K Netflix 的 Chromium Edge、Office 365
  3. 游戏:非独占策略,自家工作室游戏在 Xbox 和 win10 同步发售;良心的 XGP,我已经从 Origin 高级会员叛逃到 XGP for PC 了 ww

总之谢谢微软,下个世代的 Xbox 我必买。

参考

Author: Boli Tao
Link: https://www.bolitao.xyz/archives/ea6de4.html
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.