orangelop

在 Windows 10 上成功安装并正常使用 WSA

2023-01-24
WSA  WSL  Linux
   

本文基于github.com/cinit/WSAPatchgithub.com/LSPosed/MagiskOnWSALocal工具实现,本文部分参考此处

前置要求及注意事项

  • 本人使用Windows 10版本:Build 21390.co_release.210521-1658(人称最后一个Dev频道的Win10),成功运行

  • 目前内存低于8GB的机器能够安装但无法成功运行WSA,等待修改

  • Windows 10版本要求:≥Windows 10 22H2 10.0.19045.2311(可以通过 winver 命令查看您当前的 Windows 版本)

  • 一个Linux操作系统,x86_64与arm64均可,虚拟机实机WSL均可,依赖要求:setools lzip wine patchelf e2fsprogs aria2 python3 attr,其中python版本≥3.7

  • WSA只能安装在NTFS分区 (请勿安装在exFAT分区)

利用Linux打包WSA AppX with Magisk

(可选,换成清华源,下载速度更快)pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple

pip install requests

git clone https://github.com/LSPosed/MagiskOnWSALocal.git

./run.sh ## 跟着向导走就好,推荐压缩下输出

项目目录\output把你的WSA AppX包复制出来,解压到你希望安装 WSA 的地方

在符合要求的Windows 10上调试并安装

获取WsaPatch.dll和icu.dll

WsaPatch.dll:用 MSVC 工具链编译github.com/cinit/WSAPatch仓库的代码,
如果你不想自己编译,你可以去github.com/cinit/WSAPatch/releases里下.

icu.dll: 想办法从Windows 11 22H2System32里复制一个icu.dll过来,找一个PE32+编辑工具给它的导入表加一个WsaPatch.dll,如果你不想自己搞,你可以用github.com/cinit/WSAPatch/releases里已经修改过的icu.dll.

把编译好的WsaPatch.dll和修改过的icu.dll复制到WSA的WsaClient文件夹.

获取winhttp.dll

WsaClient.exe 会用GetProcAddress从winhttp.dll动态获取一些符号.
有些符号是只有在Windows 11的winhttp.dll里才有,Windows 10的winhttp.dll缺少这些符号.

如果你找一个Windows 11 22H2的winhttp.dll放到WsaClient文件夹里(或者 WSA 安装目录),WsaClient.exe就能找到这些符号了.
但是不管WsaClient.exe能否找得到这些符号,它都能用.

修改AppxManifest.xml

AppxManifest.xml找到<TargetDeviceFamily>节点

<TargetDeviceFamily Name="Windows.Desktop" MinVersion="10.0.22000.120" MaxVersionTested="10.0.22000.120"/>

MinVersion10.0.22000.120改成10.0.19045.2311.

AppxManifest.xml删除customInstall相关节点,一共有两个. 找到以下内容,然后删掉.

<rescap:Capability Name="customInstallActions"/>
<desktop6:Extension Category="windows.customInstall">
    <desktop6:CustomInstall Folder="CustomInstall" desktop8:RunAsUser="true">
        <desktop6:RepairActions>
            <desktop6:RepairAction File="WsaSetup.exe" Name="Repair" Arguments="repair"/>
        </desktop6:RepairActions>
        <desktop6:UninstallActions>
            <desktop6:UninstallAction File="WsaSetup.exe" Name="Uninstall" Arguments="uninstall"/>
        </desktop6:UninstallActions>
    </desktop6:CustomInstall>
</desktop6:Extension>

注册appx

运行Run.bat(需要管理员权限).

在完成WSA的安装后,你原先解压WSA的文件夹不可以删除。因为Run.bat的作用是注册appx应用包,它只登记注册,不会复制文件,参考MS Powershell Add-AppxPackage

排错

在解压WSA后第一次启动之前,你需要注册WSA appx包。
对于MagiskOnWSALocal用户,你只需要运行解压目录下的Run.bat即可。 如果报错失败, 你可以进行以下操作进行错误诊断(需要管理员权限).
以管理员身份打开PowerShell,切换工作目录到WSA的解压目录。
在PowerShell中运行Add-AppxPackage -ForceApplicationShutdown -ForceUpdateFromAnyVersion -Register .\AppxManifest.xml. 该命令应该会失败并提供一个这次错误的 ActivityID (是个 UUID)。
在PowerShell中运行Get-AppPackageLog -ActivityID <UUID>获取刚才的错误的日志,根据日志的内容进行修复。

可能遇到的问题

  • 如果老版本的WSA 2209.40000.26.0开了开发者模式也连不上ADB(端口没有进程监听), 更新到WSA 2210.40000.7.0就可以了。
  • 移动WSA的设置窗口可以通过按住窗口最小化按钮左边的一小块空白区域然后拖动, 也可以通过按快捷键Alt+Space然后点弹出菜单里的”移动”。
  • 如果你的WSA在启动时闪退且没有任何提示,请将Windows 10更新到22H2 10.0.19045.2311或更高版本。 (有人反应过WSA在22H2 19045.2251闪退, 但更新到22H2 19045.2311就能用了)。


Content
Return Click here...