如何优雅地从 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,风格按照自己喜好设置。我的设置如下: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。 -
打开新的 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源:[archlinuxcn] Server = https://mirrors.tuna.tsinghua.edu.cn/archlinuxcn/$arch -
打开
pacman.d/mirrorlist,取消注释国内镜像源。 -
在 WSL 内输入下列命令。
pacman -Syy pacman-key --init pacman-key --populate pacman -S archlinuxcn-keyring pacman -S base base-devel nano git wget -
在 WSL 内输入
passwd设置 root 密码。 -
新建普通用户并设置密码。
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#
基本安装#
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 库即可完成。
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 源:
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 方案。 -
然后终端上会显示你的方案,等待完成就行了。
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,登录账号,安装微软桌面。