如何优雅地从 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,登录账号,安装微软桌面。