Win10安装WSL2及Ubuntu20.04子系统
本以为是小菜一碟,但还是遇到了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 | Installing, this may take a few minutes... |
产生这个错误有两个可能的原因:
LxssManager未正常运行
以管理员身份运行cmd
。重启该服务。
1 | sc stop 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