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 所在的位置

1./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 窗口执行

1wsl --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 分区

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