WSL2 踩坑日记

618 搞了个 NUC10 做上网机用, 想了一下还是装 Windows 好了. 然后就装了 2004, 直接在 WSL2 中运行一些东西.

安装 WSL2

安装 Linux Kernel

你需要下载 Linux Kernel 并安装, 可以从 微软官方的 WSL2 Kernel 地址 下载到. 然后我们就得到了

wsl_update_x64.msi
~~这一步真的是非常的 Windows~~

设定 WSL 为 NoLSP

我 Windows 中使用了 Proxifier 把流量引导到 Clash 进行全局策略代理, 但是 WSL 这玩意在用 Proxifier 的情况下会有问题, 在运行 WSL 的时候会提示

The attempted operation is not supported for the type of object referenced.

参考 microsoft/WSL#4177 (comment)

The easiest solution is to use WSCSetApplicationCategory WinAPI call for wsl.exe to prevent this. Under the hood the call creates an entry for wsl.exe at

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\WinSock2\Parameters\AppId_Catalog
This tells Windows not to load LSP DLLs into wsl.exe process.

同时 Proxifier 释出了一个 工具, 可以帮助设定 NoLSP 的设定

创建一个新的管理员 Powershell, 进入 NoLSP 所在的位置

./NoLsp.exe c:\windows\system32\wsl.exe

然后再次运行 WSL 就可以正常运行了

安装 ArchWSL

作为一个 Arch 粉, WSL 当然要用 ~~Ubuntu~~ Arch 啦, 最新的 ArchWSL 已经支持了 WSL2, 所以我们只需要进入 ArchWSL Release 下载最新的

ArchWSL.appx
进行安装就好了

在安装前我们需要安装 cer 文件, 选择安装到 Local Machine 的

Trusted Root Certification Authorities
中, 在安装完成之后就可以去删除掉这个证书.

安装证书

然后在 Windows Terminal 中就可以看到 Arch 的 Profile 了

查看 Profile

或者我们可以通过

arch
命令进入 arch 的 shell 中去

成果

配置

DNS Server 有问题

WSL 默认的 DNS 服务器是宿主机, 并且每次运行会覆盖

/etc/resolv.conf
, 这个在某些情况下会有些问题.

/etc/wsl.conf
中取消 ResolvConf 的生成

cat > /etc/wsl.conf <<EOF
[network]
generateResolvConf = false
EOF

然后打开一个新的 Powershell 窗口执行

wsl --shutdown

然后在

/etc/resolv.conf
中添加需要的 nameserver 就好了

在 Arch 内的 Docker 不正常

如果直接通过 pacman 安装 docker 并且通过

dockerd
运行, 在运行容器的时候会提示

docker: Error response from daemon: cgroups: cannot find cgroup mount destination: unknown.

这个问题出现的原因是因为因为 WSL 的实现原因, 整个系统并不是以 systemd 作为 init 的, 所以 docker 在运行的时候找不到 cgroup 相关文件系统.

可以在 shell 中运行 cgroup 的 workaround 来创建 cgroup 分区

mkdir /sys/fs/cgroup/systemd
mount -t cgroup -o none,name=systemd cgroup /sys/fs/cgroup/systemd

标题:WSL2 踩坑日记

许可协议:知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议

作者: Indexyz