[Legacy] 如何优雅地滚回 Windows

如何优雅地从 Arch Linux 滚回 Windows

前情提要：如何优雅地迁移到 Arch Linux。

数据备份

直接抄上一篇了。

使用 微 PE 和 DiskGenius 工具进行数据备份和分区克隆

由于在 PE 环境下您可能无法进行网课 / 刷题等操作，所以我们可以先使用 DiskGenius 的分区镜像功能把分区镜像保存到移动硬盘上，再回到 windows 系统使用 DeskGenius 把分区镜像还原到移动硬盘上（这是因为分区镜像是 4K / 顺序读顺序写操作，而分区还原是顺序读 4K / 顺序写操作，固态硬盘的小文件读写速度显著大于机械硬盘）

制作 wepe 环境

进入 wepe 环境，使用 DiskGenius 进行磁盘镜像操作

安装 Windows 之后恢复硬盘

安装系统

自行安装。

配置 OI 环境

CP Editor

前往 CP Editor 官方网站 下载安装包，平台选择 Windows，版本选择 v6.10.1(截至至 2022 年 8 月 18 日)，选择 对应架构-setup.exe，因为我们要手动安装编译器。

MSYS2

为了使用 Clang-Format 和 Clangd，我们需要使用 MSYS2 来安装它们。似乎选择 架构-setup-with-gcc-xxxx-llvm-xxxx.exe 就可以了，但是我没有测试过。

进入 MSYS2 网站，找到下方 Installation 的第一步 Download the installer，点击后面的按钮下载安装程序。

安装 MSYS2。

进入 MSYS2 Shell，输入 pacman -S msys2-keychain 来安装密钥链。

输入 pacman -Syu 来更新包。

输入 pacman -S mingw-w64-x86_64-toolchain mingw64/mingw-w64-x86_64-make mingw64/mingw-w64-x86_64-gdb mingw64/mingw-w64-x86_64-clang mingw64/mingw-w64-x86_64-clang-tools-extra 来安装编译器。

设置环境变量。

设置 MINGW_HOME 为你的 MSYS2 路径（默认为 C:\msys2）下的 mingw64（对于 64 位计算机）或 mingw32 （对于 32 位计算机），比如 64 位就设置为 C:\msys2\mingw64。

设置 C_INCLUDE_PATH 为 %MINGW_HOME%\include。

设置 LIBRARY_PATH 为 %MINGW_HOME%\lib。

将 %MINGW_HOME%\bin 添加到 PATH。

配置 CP Editor

打开 CP Editor，点击菜单栏上的 选项 -> 设置。

找到 语言 -> C++ -> C++ 命令，按照自己喜好配置，我的配置是 g++ -Wall -Wextra -O2 -lm --std=gnu++14 对于 CCF 的编译参数。

找到 扩展 -> 代码格式化 -> Clang Format，将 Clang Format 程序 设置为 clang-format，风格按照自己喜好设置。我的设置如下：

Copy
BasedOnStyle: Google
IndentWidth: 4

找到 扩展 -> Language Server -> C++ Server，勾选启用，延迟按照喜好设置，延迟太短可能导致无法使用。我的设置是 1000ms。

PowerShell 7 和 oh-my-posh

安装 PowerShell

进入 PowerShell 的 GitHub 页面，进入最新的 Release 内找到自己架构的安装程序，安装最新的 PowerShell。

配置 Windows Terminal

下载 MesloLGM NF 字体并安装。

为了使用带有 GUI 的设置的 Windows Terminal，你需要在 Microsoft Store 中下载 Windows Terminal Preview。

在 设置 -> 配置文件 -> 默认值 -> 其他设置 -> 外观 -> 文本 -> 字体 中把默认字体设置成 Fira Code。

安装和配置 oh-my-posh

在 Microsoft Store 中搜索 oh-my-posh 并安装。

打开 PowerShell，在 $Home\[My ]Documents 文件夹下新建 Powershell 文件夹，在其下新建 Microsoft.PowerShell_profile.ps1，输入 oh-my-posh init pwsh | Invoke-Expression。

WSL2

安装 Arch Linux

进入 控制面板 -> 程序 -> 启动或关闭 Windows 功能 勾选 适用于 Linux 的 Windows 子系统 和 虚拟机平台 并点击确定。

重启电脑。

进入网址下载并安装 WSL2 升级包。

打开 PowerShell，输入 wsl --set-default-version 2 来设置 WSL 默认使用 WSL2。

下载 LxRunOffline，解压并加入 PATH。

下载 archlinux-bootstrap-x86_64.tar.gz。

打开新的 PowerShell，输入 LxRunOffline i -n archlinux -f <bootstrap 路径> -d <存放位置> -r root.x86_64。

输入 wsl --set-version archlinux 2。请确定您开启了 虚拟机平台，如果您的系统支持 Hyper-V，请开启。

输入 wsl -d archlinux 进入 WSL。

在 PowerShell 内输入 wsl --shutdown archlinux && wsl -d archlinux 重启并连接到 WSL。

在 WSL 内输入 cd /etc && explorer.exe . 在文件资源管理器内打开 /etc。

打开 pacman.conf，取消注释 multilib 源并加入 archlinuxcn 源：

Copy
[archlinuxcn]
Server = https://mirrors.tuna.tsinghua.edu.cn/archlinuxcn/$arch

打开 pacman.d/mirrorlist，取消注释国内镜像源。

在 WSL 内输入下列命令。

Copy
pacman -Syy
pacman-key --init
pacman-key --populate
pacman -S archlinuxcn-keyring
pacman -S base base-devel nano git wget

在 WSL 内输入 passwd 设置 root 密码。

新建普通用户并设置密码。

Copy
useradd -m -G wheel -s /bin/bash <用户名>
passwd <用户名>

输入 EDITOR=nano visudo，取消注释 %wheel ALL=(ALL:ALL) NOPASSWD: ALL，按 Ctrl+O Enter 保存， Ctrl+X 退出。

输入 id -u <用户名> 查询新建用户的 ID，第一个账户应为 1000。

输入 exit 退出 WSL。

在 PowerShell 中输入 LxRunOffline su -n archlinux -v <账户 id>。

以管理员权限打开 PowerShell，输入 net stop LxssManager && net start LxssManager 重启 WSL 服务。

打开 Microsoft® Update Catalog，下载最新的 Windows Subsystem for Linux Update（5.10.102.2 截至到 2022 年 8 月 18 日）。

安装更新，以管理员权限打开 PowerShell，输入 wsl --shutdown && wsl -d archlinux 重启 WSL 并进入 WSL，输入 uname -a 查看内核版本。

安装和配置 zsh 和 oh-my-zsh

进入 WSL。

输入 pacman -S zsh 安装 zsh。

输入 chsh，输入密码，把 shell 切换为 /bin/zsh。

输入 sh -c "$(curl -fsSL https://gitee.com/mirrors/oh-my-zsh/raw/master/tools/install.sh)" 安装 oh-my-zsh。

输入 git clone --depth=1 https://gitee.com/romkatv/powerlevel10k.git ${ZSH_CUSTOM:-$HOME/.oh-my-zsh/custom}/themes/powerlevel10k 安装 powerlevel10k 主题。

输入 git clone https://ghproxy.com/https://github.com/zsh-users/zsh-autosuggestions ${ZSH_CUSTOM:-~/ .oh-my-zsh/custom}/plugins/zsh-autosuggestions && git clone https://ghproxy.com/https://github.com/zsh-users/zsh-syntax -highlighting.git ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-syntax-highlighting 安装插件。

nano ~/.zshrc，设置 ZSH_THEME="powerlevel10k/powerlevel10k"，plugins=(git zsh-autosuggestions zsh-syntax highlighting)。

退出并重启 WSL。

KDE Plasma

基本安装

Copy
sudo pacman -Syu plasma

基本使用

推荐使用 GWSL 来连接到 Plasma。在 Microsoft Store 内搜索 GWSL 即可。国区的 GWSL 是收费的，但是试用版和付费版没有任何区别，没有时间限制也不会让你付费，但是还是建议支持一下作者。

下载后打开 GWSL，点击任务栏上的图标会出现 Dashboard。点击 GWSL Distro Tools，然后启用 Display/Audio Auto-Exporting。GWSL 支持将 Linux 程序窗口放置在 Windows 桌面上，但是我更喜欢使用一个单独的虚拟桌面来放置整个 Plasma。

为了做到这点，你需要进行如下操作：

新建一个虚拟桌面。

在新建的虚拟桌面上打开 GWSL。

右击任务栏上的 GWSL 图标选择顶部的 XServer Profiles，选择 Fullscreen Mode。

在虚拟桌面上会出现一个全屏的黑色窗口，不需要操作，切换到另一个虚拟桌面上。

左键单击任务栏上的 GWSL 图标，选择 Shortcut Creator。

在弹出的窗口中，Shortcut Label 填写 KDE Plasma，Shortcut Command 填写 dbus-launch startplasma-x11。如果有多个 WSL 容器，请将 Run In 选择为 archlinux（即你的容器名称）。

使用搜索工具搜索 KDE Plasma on archlinux，打开文件夹，将快捷方式复制到桌面上用来启动 Plasma。

双击快捷方式。

回到开启了全屏 GWSL 的虚拟桌面上，会发现 Plasma 已经启动。

Some Tricks

在这样配置之后，会有一个问题：

切换虚拟桌面会导致 GWSL 窗口被最小化。

首先需要安装好 Python 3.x 环境，并使用 python -m pip install pywin32 pyvda 来安装 Win32 API 和操作虚拟桌面的模块。

One More Problem

这时，我们会发现，切换虚拟桌面时，GWSL 窗口还是会最小化，得益于 Windows 11 的新功能，我们可以在多个虚拟桌面上设置不同的壁纸。但是桌面上的图标不能分离。我的办法是不在桌面上放文件。

解决方案

我们仍然可以编写一个脚本将 GWSL 窗口设为非最小化状态，通过 Python 的 Win32 API 和强大的 pyvda 库即可完成。

Copy
from pyvda import VirtualDesktop
import win32gui, win32con
import asyncio

hwnd_title = {}
WINDOW_NAME = 'VcXsrv Server - Display 秦玉振的笔记本:0.0' # 请把这里修改成你的窗口名
GWSL_VD_NUM = 2 # 请把这里修改成你的虚拟桌面编号
DEBUG = False # 显示调试信息

def get_all_hwnd(hwnd, mouse) -> dict:
global hwnd_title
hwnd_title = {}
if win32gui.IsWindow(hwnd) and win32gui.IsWindowEnabled(hwnd) and win32gui.IsWindowVisible(hwnd):
hwnd_title.update({hwnd: win32gui.GetWindowText(hwnd)})

async def main():
while True:
if VirtualDesktop.current().number != GWSL_VD_NUM:
await asyncio.sleep(0.1)
continue
win32gui.EnumWindows(get_all_hwnd, 0)
hwnd = win32gui.FindWindow(None, WINDOW_NAME)
win32gui.ShowWindow(hwnd, win32con.SW_SHOWNORMAL)
if DEBUG:
print('Unminimized', hwnd)
await asyncio.sleep(0.1)

if __name__ == '__main__':
asyncio.run(main())

这段代码使用 AsyncIO 进行窗口的非最小化，每次之间间隔 0.1s。

参考资料：Python 控制窗口置顶，作者：DG 息。

为了在切换窗口时显示不那么突兀，我们可以把桌面背景换成和 Plasma 一样的。

WSA

如果你已经安装了 Windows Subsystem for Android，请先卸载掉。

MagiskOnWSA with GApps

顾名思义，这允许你在 Windows Subsystem for Android 上运行 Magisk（root 权限）和 GApps（谷歌服务框架和 Google Play 等）。

很不幸的是，在本文编写之前，LSPosed/MagiskOnWSA 就已经被封禁了。但是我们可以使用 LSPosed/MagiskOnWSALocal 提供的脚本在 Linux 下编译。

使用 GitHub Actions（推荐）

如果你有 GitHub 账号，懂一点 GitHub 操作，建议使用这种方法，虽然严格来说这违反了 GitHub Actions 的条款，滥用了开源仓库构建免费的权利。如果你的 WSL 容器里可以访问 GitHub，建议手动编译。

具体操作步骤如下：

Fork LSPosed/MagiskOnWSALocal。

在 .github 文件夹下新建 workflows 文件夹。

在 workflows 文件夹下新建一个任意名字的 .yml 文件，粘贴 Workflow。Workflow 已经放在洛谷云剪贴板上。

点击网页上的 Actions 一栏，开通 Actions。

参照下面的第 8~14 条选择你需要的配置，然后运行 Workflow。

手动编译（不推荐）

这种方法需要 **“较好的网络环境”**。

具体操作步骤如下：

使用 wsl --install -d Ubuntu 新建一个 Ubuntu 容器。

在新窗口中设置用户名和密码。

输入下面的脚本来更换 Tuna 源：

Copy
wget https://gitee.com/weizy1983/CNSolutions/raw/master/ubuntu/tunasource/UbuntuTunaSource.sh
sudo chmod 777 UbuntuTunaSource.sh
sudo ./UbuntuTunaSource.sh ubuntu20.04

输入 sudo apt-get install python3-pip winetricks -y 来安装依赖。

在 WSL 中打开一个目录，比如 $Home\Documents。

Clone Git 仓库，输入 git clone https://ghproxy.com/https://github.com/LSPosed/MagiskOnWSALocal。

进入仓库目录并运行 scripts/run.sh，输入 bash scripts/run.sh。

出现 Build arch 选择页面，默认设置即可，回车确认。

出现 WSA release type，自行选择即可，我选择的是 insider slow/Beta Channel，上下键移动，空格选择，回车确认。

然后是 Magisk version，自行选择，我选择的是 Beta Channel。

然后询问 Do you want to install gapps? 选择 Yes，回车确认。

然后是 Variants of gapps，由于 OpenGApps 还没有官方支持安卓 12，只能选择 Pico。

然后选择 Do you want to keep amazon appStore?，选择 No，不保留亚马逊应用商店。

Root solution 选择 Magisk 作为 root 方案。

然后终端上会显示你的方案，等待完成就行了。

Copy
ARCH=x64
RELEASE_TYPE=insider slow
MAGISK_VER=beta
GAPPS_VARIANT=pico
REMOVE_AMAZON=remove
ROOT_SOL=magisk

安装

设置 -> 隐私和安全性 -> 开发者选项 -> 启用开发者选项。

打开你的 MagiskOnWSALocal 目录，如果你使用的是 GitHub Actions，下载 Artifact 并解压到一个文件夹。

右键 Install.ps1，使用 PowerShell 打开，等待完成即可。

在 Microsoft Store 里搜索安装 WSATools。

安装 Android SDK Platform Tools。

安装一个你喜欢的代理软件（如果你没有“良好的网络环境”），我使用的是 Clash for Android，然后配置。

进入 Google Play Store，登录账号，安装微软桌面。