WSL2 踩坑日记
618 搞了个 NUC10 做上网机用, 想了一下还是装 Windows 好了. 然后就装了 2004, 直接在 WSL2 中运行一些东西.
安装 WSL2
安装 Linux Kernel
你需要下载 Linux Kernel 并安装, 可以从 微软官方的 WSL2 Kernel 地址 下载到. 然后我们就得到了
wsl_update_x64.msi
设定 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
This tells Windows not to load LSP DLLs into wsl.exe process.HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\WinSock2\Parameters\AppId_Catalog
同时 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 了
或者我们可以通过
arch
配置
DNS Server 有问题
WSL 默认的 DNS 服务器是宿主机, 并且每次运行会覆盖
/etc/resolv.conf
在
/etc/wsl.conf
cat > /etc/wsl.conf <<EOF
[network]
generateResolvConf = false
EOF
然后打开一个新的 Powershell 窗口执行
wsl --shutdown
然后在
/etc/resolv.conf
在 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