banner
Yuzhen

Yuzhen's Blog

🇨🇳 13 y.o. / Student & Developer & OIer / HAM & BGP Player
telegram
tg_channel
github
mastodon
email
zhihu

[Legacy] 如何優雅地滾回 Windows

如何優雅地從 Arch Linux 滾回 Windows#

前情提要:如何優雅地遷移到 Arch Linux

數據備份#

直接抄上一篇了。

使用 微 PEDiskGenius 工具進行數據備份和分區克隆

由於在 PE 環境下您可能無法進行網課 / 刷題等操作,所以我們可以先使用 DiskGenius 的分區鏡像功能把分區鏡像保存到移動硬盤上,再回到 windows 系統使用 DeskGenius 把分區鏡像還原到移動硬盤上(這是因為分區鏡像是 4K / 順序讀順序寫操作,而分區還原是順序讀 4K / 順序寫操作,固態硬盤的小文件讀寫速度顯著大於機械硬盤)

  1. 製作 wepe 環境
  2. 進入 wepe 環境,使用 DiskGenius 進行磁碟鏡像操作
  3. 安裝 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 就可以了,但是我沒有測試過。

  1. 進入 MSYS2 網站,找到下方 Installation 的第一步 Download the installer,點擊後面的按鈕下載安裝程序。
  2. 安裝 MSYS2。
  3. 進入 MSYS2 Shell,輸入 pacman -S msys2-keychain 來安裝密鑰鏈。
  4. 輸入 pacman -Syu 來更新包。
  5. 輸入 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 來安裝編譯器。
  6. 設置環境變量。
    • 設置 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#

  1. 打開 CP Editor,點擊菜單欄上的 選項 -> 設置

  2. 找到 語言 -> C++ -> C++ 命令,按照自己喜好配置,我的配置是 g++ -Wall -Wextra -O2 -lm --std=gnu++14 對於 CCF 的編譯參數。

  3. 找到 擴展 -> 代碼格式化 -> Clang Format,將 Clang Format 程序 設置為 clang-format,風格按照自己喜好設置。我的設置如下:

    BasedOnStyle: Google
    IndentWidth: 4
    
  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#

  1. 在 Microsoft Store 中搜索 oh-my-posh 並安裝。
  2. 打開 PowerShell,在 $Home\[My ]Documents 文件夾下新建 Powershell 文件夾,在其下新建 Microsoft.PowerShell_profile.ps1,輸入 oh-my-posh init pwsh | Invoke-Expression

WSL2#

安裝 Arch Linux#

  1. 進入 控制面板 -> 程序 -> 啟動或關閉 Windows 功能 勾選 適用於 Linux 的 Windows 子系統虛擬機平台 並點擊確定。

  2. 重啟電腦。

  3. 進入網址下載並安裝 WSL2 升級包。

  4. 打開 PowerShell,輸入 wsl --set-default-version 2 來設置 WSL 默認使用 WSL2。

  5. 下載 LxRunOffline,解壓並加入 PATH

  6. 下載 archlinux-bootstrap-x86_64.tar.gz

  7. 打開新的 PowerShell,輸入 LxRunOffline i -n archlinux -f <bootstrap 路徑> -d <存放位置> -r root.x86_64

  8. 輸入 wsl --set-version archlinux 2。請確定您開啟了 虛擬機平台,如果您的系統支持 Hyper-V,請開啟。

  9. 輸入 wsl -d archlinux 進入 WSL。

  10. 在 PowerShell 內輸入 wsl --shutdown archlinux && wsl -d archlinux 重啟並連接到 WSL。

  11. 在 WSL 內輸入 cd /etc && explorer.exe . 在文件資源管理器內打開 /etc

  12. 打開 pacman.conf,取消註釋 multilib 源並加入 archlinuxcn 源:

    [archlinuxcn]
    Server = https://mirrors.tuna.tsinghua.edu.cn/archlinuxcn/$arch
    
  13. 打開 pacman.d/mirrorlist,取消註釋國內鏡像源。

  14. 在 WSL 內輸入下列命令。

    pacman -Syy
    pacman-key --init
    pacman-key --populate
    pacman -S archlinuxcn-keyring
    pacman -S base base-devel nano git wget
    
  15. 在 WSL 內輸入 passwd 設置 root 密碼。

  16. 新建普通用戶並設置密碼。

    useradd -m -G wheel -s /bin/bash <用戶>
    passwd <用戶>
    
  17. 輸入 EDITOR=nano visudo,取消註釋 %wheel ALL=(ALL:ALL) NOPASSWD: ALL,按 Ctrl+O Enter 保存, Ctrl+X 退出。

  18. 輸入 id -u <用戶名> 查詢新建用戶的 ID,第一個賬戶應為 1000

  19. 輸入 exit 退出 WSL。

  20. 在 PowerShell 中輸入 LxRunOffline su -n archlinux -v <賬戶 id>

  21. 以管理員權限打開 PowerShell,輸入 net stop LxssManager && net start LxssManager 重啟 WSL 服務。

  22. 打開 Microsoft® Update Catalog,下載最新的 Windows Subsystem for Linux Update5.10.102.2 截至到 2022 年 8 月 18 日)。

  23. 安裝更新,以管理員權限打開 PowerShell,輸入 wsl --shutdown && wsl -d archlinux 重啟 WSL 並進入 WSL,輸入 uname -a 查看內核版本。

安裝和配置 zsh 和 oh-my-zsh#

  1. 進入 WSL。
  2. 輸入 pacman -S zsh 安裝 zsh。
  3. 輸入 chsh,輸入密碼,把 shell 切換為 /bin/zsh
  4. 輸入 sh -c "$(curl -fsSL https://gitee.com/mirrors/oh-my-zsh/raw/master/tools/install.sh)" 安裝 oh-my-zsh。
  5. 輸入 git clone --depth=1 https://gitee.com/romkatv/powerlevel10k.git ${ZSH_CUSTOM:-$HOME/.oh-my-zsh/custom}/themes/powerlevel10k 安裝 powerlevel10k 主題。
  6. 輸入 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 安裝插件。
  7. nano ~/.zshrc,設置 ZSH_THEME="powerlevel10k/powerlevel10k"plugins=(git zsh-autosuggestions zsh-syntax highlighting)
  8. 退出並重啟 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。

為了做到這點,你需要進行如下操作:

  1. 新建一個虛擬桌面。
  2. 在新建的虛擬桌面上打開 GWSL。
  3. 右擊任務欄上的 GWSL 圖標選擇頂部的 XServer Profiles,選擇 Fullscreen Mode
  4. 在虛擬桌面上會出現一個全屏的黑色窗口,不需要操作,切換到另一個虛擬桌面上。
  5. 左鍵單擊任務欄上的 GWSL 圖標,選擇 Shortcut Creator
  6. 在彈出的窗口中,Shortcut Label 填寫 KDE PlasmaShortcut Command 填寫 dbus-launch startplasma-x11。如果有多個 WSL 容器,請將 Run In 選擇為 archlinux(即你的容器名稱)。
  7. 使用搜索工具搜索 KDE Plasma on archlinux,打開文件夾,將快捷方式複製到桌面上用來啟動 Plasma。
  8. 雙擊快捷方式。
  9. 回到開啟了全屏 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,建議手動編譯。

具體操作步驟如下:

  1. Fork LSPosed/MagiskOnWSALocal

  2. .github 文件夾下新建 workflows 文件夾。

  3. workflows 文件夾下新建一個任意名字的 .yml 文件,粘貼 Workflow。Workflow 已經放在洛谷雲剪貼板上。

  4. 點擊網頁上的 Actions 一欄,開通 Actions。

  5. 參照下面的第 8~14 條選擇你需要的配置,然後運行 Workflow。

    img

手動編譯(不推薦)#

這種方法需要 **“較好的網絡環境”**。

具體操作步驟如下:

  1. 使用 wsl --install -d Ubuntu 新建一個 Ubuntu 容器。

  2. 在新窗口中設置用戶名和密碼。

  3. 輸入下面的腳本來更換 Tuna 源:

    wget https://gitee.com/weizy1983/CNSolutions/raw/master/ubuntu/tunasource/UbuntuTunaSource.sh
    sudo chmod 777 UbuntuTunaSource.sh
    sudo ./UbuntuTunaSource.sh ubuntu20.04
    
  4. 輸入 sudo apt-get install python3-pip winetricks -y 來安裝依賴。

  5. 在 WSL 中打開一個目錄,比如 $Home\Documents

  6. Clone Git 倉庫,輸入 git clone https://ghproxy.com/https://github.com/LSPosed/MagiskOnWSALocal

  7. 進入倉庫目錄並運行 scripts/run.sh,輸入 bash scripts/run.sh

  8. 出現 Build arch 選擇頁面,默認設置即可,回車確認。

  9. 出現 WSA release type,自行選擇即可,我選擇的是 insider slow/Beta Channel,上下鍵移動,空格選擇,回車確認。

  10. 然後是 Magisk version,自行選擇,我選擇的是 Beta Channel

  11. 然後詢問 Do you want to install gapps? 選擇 Yes,回車確認。

  12. 然後是 Variants of gapps,由於 OpenGApps 還沒有官方支持安卓 12,只能選擇 Pico。

  13. 然後選擇 Do you want to keep amazon appStore?,選擇 No,不保留亞馬遜應用商店。

  14. Root solution 選擇 Magisk 作為 root 方案。

  15. 然後終端上會顯示你的方案,等待完成就行了。

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

安裝#

  1. 設置 -> 隱私和安全性 -> 開發者選項 -> 啟用開發者選項
  2. 打開你的 MagiskOnWSALocal 目錄,如果你使用的是 GitHub Actions,下載 Artifact 並解壓到一個文件夾。
  3. 右鍵 Install.ps1,使用 PowerShell 打開,等待完成即可。
  4. 在 Microsoft Store 裡搜索安裝 WSATools。
  5. 安裝 Android SDK Platform Tools。
  6. 安裝一個你喜歡的代理軟件(如果你沒有“良好的網絡環境”),我使用的是 Clash for Android,然後配置。
  7. 進入 Google Play Store,登錄賬號,安裝微軟桌面。
載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。