wsl2更新后,报错0x8007273d解决方案
产生原因
在wsl2更新后,可能会出现Error code: Wsl/Service/0x8007273d
时,可能是电脑中存在的代理软件(比如proxifier)与wsl发生冲突导致的。
Proxifer开发人员解释如下:
如果Winsock LSP DLL被加载到其进程中,则wsl.exe将显示此错误。最简单的解决方案是对wsl.exe使用WSCSetApplicationCategory WinAPI调用来防止这种情况。在后台,该调用在HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\WinSock2\Parameters\AppId_Catalog中为wsl.exe创建一个条目。
临时解决方案
管理员身份启动cmd/powershell , 运行。
netsh winsock reset
该方案需要每次启动wsl时重新执行,非常不方便。
永久解决方案
这里我找到了两种不同的解决方案,一种是卸载wsl2更新,降级之后就不会发生冲突了,但是不能使用wsl2的新功能;第二种是则需要添加注册表,但不需要降级安装,但是每次wsl更新都需要重新执行,因为版本化路径不断变化,也很难判断该应用程序何时更新。
方案一 wsl降级
- 在添加或删除程序中:先卸载
Windows Subsystem for Linux Update
,然后卸载Windows Subsystem for Linux
- 重新启动
wsl
,会跳转至https://aka.ms/wsl2kernel - 重新下载
wsl_update_x64.msi
安装即可。 - 最重要的一点,千万不要更新
wsl
。
方案二 添加注册表信息
主要原理是在\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\WinSock2\Parameters\AppId_Catalog\
添加相应的注册表项,添加注册表项可以使用软件NoLsp.exe
添加也可以使用powershell脚本一键添加,这里都演示一下:
使用软件添加注册表项
我们所使用软件是proxifier
的NoLsp.exe
。
NoLsp.exe
下载地址:http://www.proxifier.com/tmp/Test20200228/NoLsp.exe
使用步骤
-
管理员打开
powershell
,执行如下命令,获取应用商店版wsl
安装目录cd "C:\Program Files\WindowsApps" ls
找到包含
WindowsSubsystemForLinux
字段就是,例如我电脑上是MicrosoftCorporationII.WindowsSubsystemForLinux_1.2.5.0_x64__8wekyb3d8bbwe
-
管理员打开
cmd
,执行以下命令,下面的命令就相当于添加注册表(记得将MicrosoftCorporationII.WindowsSubsystemForLinux_1.2.5.0_x64__8wekyb3d8bbwe
修改为上一步所找到的字段):NoLsp.exe %USERPROFILE%\AppData\Local\Microsoft\WindowsApps\wsl.exe NoLsp.exe "C:\Program Files\WindowsApps\MicrosoftCorporationII.WindowsSubsystemForLinux_1.2.5.0_x64__8wekyb3d8bbwe\wsl.exe" NoLsp.exe "C:\Program Files\WindowsApps\MicrosoftCorporationII.WindowsSubsystemForLinux_1.2.5.0_x64__8wekyb3d8bbwe\wslservice.exe" NoLsp.exe "C:\Program Files\WindowsApps\MicrosoftCorporationII.WindowsSubsystemForLinux_1.2.5.0_x64__8wekyb3d8bbwe\wslg.exe" NoLsp.exe "C:\Program Files\WindowsApps\MicrosoftCorporationII.WindowsSubsystemForLinux_1.2.5.0_x64__8wekyb3d8bbwe\wslhost.exe"
使用powershell脚本添加注册表项
不想使用软件的话,也可以使用管理员身份运行powershell
执行下列脚本,输出success即可。
#Requires -RunAsAdministrator
# Fix for https://github.com/microsoft/WSL/issues/4177
$MethodDefinition = @'
[DllImport("ws2_32.dll", CharSet = CharSet.Unicode)]
public static extern int WSCSetApplicationCategory([MarshalAs(UnmanagedType.LPWStr)] string Path, uint PathLength, [MarshalAs(UnmanagedType.LPWStr)] string Extra, uint ExtraLength, uint PermittedLspCategories, out uint pPrevPermLspCat, out int lpErrno);
'@
$UserProfilePath = $env:USERPROFILE
$Ws2Spi = Add-Type -MemberDefinition $MethodDefinition -Name 'Ws2Spi' -PassThru
$WslLocation = Get-AppxPackage MicrosoftCorporationII.WindowsSubsystemForLinux | Select-Object -expand InstallLocation
$Executables = ("wsl.exe", "wslservice.exe","wslg.exe","wslhost.exe");
$Location = ($WslLocation,"C:\Program Files\WSL","C:\Windows\System32","${UserProfilePath}\AppData\Local\Microsoft\WindowsApps");
foreach ($Location in $Location){
foreach ($Exe in $Executables) {
$ExePath = "${Location}\${Exe}";
$ExePathLength = $ExePath.Length;
$PrevCat = $null;
$ErrNo = $null;
if ($Ws2Spi::WSCSetApplicationCategory($ExePath, $ExePathLength, $null, 0, [uint32]"0x80000000", [ref] $PrevCat, [ref] $ErrNo) -eq 0) {
Write-Output "Added $ExePath!";
}
}
}
Write-Output "success";
修复完成之后需要进行系统重启,如果您不想重新启动,可以使用taskkill -IM "wslservice.exe" /F
杀死wsl相关东西并重新启动WSL也可以。文章来源:https://www.toymoban.com/news/detail-619735.html
参考链接
https://github.com/microsoft/WSL/issues/4177文章来源地址https://www.toymoban.com/news/detail-619735.html
到了这里,关于wsl2更新后,报错0x8007273d解决方案的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!