如何優雅地從 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,登錄賬號,安裝微軟桌面。