wsl2更新后,报错0x8007273d解决方案

wsl2更新后,报错0x8007273d解决方案

在wsl2更新后,可能会出现Error code: Wsl/Service/0x8007273d时,可能是电脑中存在的代理软件(比如proxifier)与wsl发生冲突导致的。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eRwTtHIL-1686657341742)(WSL2冲突问题/images/image-20230613190305294.png)]

临时解决方案

管理员身份启动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\添加相应的注册表项,注册表项可以使用软件也可以使用脚本,这里都演示一下:

使用软件则需要proxifierNoLsp.exe

NoLsp.exe下载地址:http://www.proxifier.com/tmp/Test20200228/NoLsp.exe

  • 管理员打开powershell,执行如下命令,获取应用商店版wsl安装目录

    cd "C:\Program Files\WindowsApps"
    ls
    

    例如,MicrosoftCorporationII.WindowsSubsystemForLinux_1.2.5.0_x64__8wekyb3d8bbwe

  • 管理员打开powershell,执行以下命令,下面的命令就相当于添加注册表:

    NoLsp.exe C:\Users\<username>\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执行下列脚本,输出四个success,重启即可,如果您不想重新启动,请使用taskkill -IM "wslservice.exe" /Fkill 所有 wsl相关东西。

#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);
'@

$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");

foreach ($Exe in $Executables) {
    $ExePath = "${WslLocation}\${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!";
    }
}

参考链接

https://github.com/microsoft/WSL/issues/4177

猜你喜欢

转载自blog.csdn.net/weixin_44411509/article/details/131195308