本以为是小菜一碟,但还是遇到了WslRegisterDistribution failed和参考的对象类型不支持尝试的操作的坑,故记录一下。

为什么要升级到WSL2

WSL2主要是增加了完整的Linux内核和完全的系统调用兼容性,此外不再需要VM Ware和VirtualBox,而是将VM集成在后台管理和运行亦有助于提升性能节省资源。关于WSL2和1的详细比较见此处

强制升级Win10

WSL2要求Win10为目前最新的2020五月版(Build 19041),部分设备已经推送了系统更新,到控制面板的Windows更新处可以自动更新。而没有推送的设备官方建议是加入Windows Insider,但副作用是更新推送频繁,成了测试版的小白鼠。也有人建议下载ISO镜像来升级。
个人建议直接下载易升,比镜像快,亦无需接受Insider的推送。

安装WSL2

安装WSL

以管理员身份运行PowerShell。

1
dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart

开启虚拟机平台组件

1
dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart

设定WSL2为默认版本

1
wsl --set-default-version 2

安装Ubuntu20.04

Microsoft Store直接获取即可。

Debug

WslRegisterDistribution failed with error: 0x800706ba

下载后第一次运行Ubuntu报错:

1
2
3
4
5
Installing, this may take a few minutes...
WslRegisterDistribution failed with error: 0x800706ba
Error: 0x800706ba The RPC server is unavailable.

Press any key to continue...

产生这个错误有两个可能的原因:

LxssManager未正常运行。

以管理员身份运行cmd。重启该服务。

1
2
sc stop LxssManager
sc start LxssManager

之后可以通过sc query LxssManager检查服务运行状况。

DNS Client未运行。

运行service.msc查看该服务状态,若没有运行则开启服务。
但有可能碰到服务状态下的按钮为灰色不可更改的情况。此时需要修改注册表。
运行regedit,转到HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\Dnscache目录下。将Start的值由4(禁用)改为2(自动)。
重启系统。

参考的对象类型不支持尝试的操作

第一次启动Ubuntu后无法创建新用户,显示参考的对象类型不支持尝试的操作(The attempted operation is not supported for the type of object referenced.)。
以管理员身份运行cmd

1
netsh winsock reset

原因是WSL的通信和Proxifier通过Winsock LSP抓取TCP连接产生冲突。
如果重置winsock则wsl正常但Proxifer无法工作。Proxifier的开发者提供的解决办法如下:
下载http://www.proxifier.com/tmp/Test20200228/NoLsp.exe
以管理员身份运行cmd

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

使得wsl绕开Proxifer修改过的LSP。

附加信息

HOME文件夹位置

之前WSL1时数据是存在%LOCALAPPDATA%\Packages处,但官方并不建议在Win下修改子系统文件,主要是Win和Linux处理文件的元数据(权限,时间戳等)方式不一样,会造成Linux无法正确识别该文件,严重时会导致子系统崩溃甚至无法正常卸载。
现在五月更新后,直接在子系统终端执行explorer.exe .即可将子系统映射到Win中并用资源管理器打开,此时可以放心地用Win的工具修改文件而不用担心损坏文件了,方便了不少,详情见此处

参考资料

Windows Subsystem for Linux Installation Guide for Windows 10