跳转至

WSL (Windows 10)

頭圖

本章主要介紹了在 Windows 系統下使用 Windows Subsystem for Linux 運行 Linux 環境的方法。


引言1

現在大部分學校的競賽練習環境都是構建在 Windows 系操作系統上,但是在 NOI 系列賽中,已經用上了 NOI Linux 這個 Ubuntu 操作系統的修改版。

NOI 競賽(自 2021 年 9 月 1 日)的環境要求如下。2

類別 軟件或模塊 版本 備註説明
系統 Linux 內核 5.4.0-42-generic 64 位 x86 (AMD64)
語言環境 GCC(gccg++ 9.3.0 C 和 C++ 編譯器
FPC 3.0.4 Pascal 編譯器(注:自 2022 年起,NOI 系列競賽不再支持 Pascal 語言)
Python 2 2.7 非競賽語言
Python 3 3.8 非競賽語言
調試工具 GDB 9.1
DDD 3.3.12 GDB 的 GUI 前端
集成開發環境(IDE) Code::Blocks 20.03 C/C++ IDE
Lazarus 2.0.6 Pascal IDE
Geany 1.36 C/C++/Pascal(輕量級)IDE
文本編輯工具 Visual Studio Code 1.54.3
GNU Emacs 26.3
gedit 3.36.2
Vim 8.1
Joe 4.6
nano 4.8
Sublime Text 3.2.2
其它軟件 Firefox 79.0 瀏覽器
Midnight Commander (mc) 4.8.24 文件管理器
xterm (uxterm) 3.5.3 終端
Arbiter-local 1.02 程序評測工具單機版

考場環境與一般環境會有一系列差異:

  • 命令行上的操作和圖形界面上的操作會有差異。
  • Linux 和 Windows 的差異,如對於大小寫的敏感性差異。
  • 不同編譯器的行為(MSVC 和 GCC)和不同版本的編譯器(Windows 上和 Linux 上的 GCC,32 位和 64 位的 Linux GCC,GCC 7 和 GCC 8 等)的行為,如對變量初始化和對數組下標越界的處理會有差異。
  • 不同評測系統(洛谷和 Arbiter)的超時檢查和內存限制檢查會有差異。

這有可能導致一系列的尷尬情況:

  • 想用Ctrl+C複製,結果退出了程序。
  • 平時 AC 的程序模板到了 Linux 上就 WA。

為了防止考場上出現此類尷尬情況,我們必須要提前熟悉 Linux 系統的操作方法。

雖然 NOI 的官網已經放出了 NOI Linux 的 ISO 鏡像,虛擬機的配置較為麻煩。且由於 NOI Linux 默認自帶圖形界面,無法保證在低配系統上流暢運行。

Windows 10 在一週年更新時推出了 Linux 子系統(WSL),在 2020 年 5 月更新中升級到了 WSL 2。截至 2020 年 6 月 1 日,WSL 已支持安裝 Ubuntu、openSUSE Leap、Kali、Debian 等主流 Linux 分發版。但 WSL 並不支持 NOI 評測用的 Arbiter。

什麼是 Linux 子系統(WSL)

適用於 Linux 的 Windows 子系統(英語:Windows Subsystem for Linux,簡稱 WSL)是一個為在 Windows 10、Windows 11 與 Windows Server 2019 上能夠原生運行 Linux 二進制可執行文件(ELF 格式)的兼容層。

WSL 可讓開發人員按原樣運行 GNU/Linux 環境 - 包括大多數命令行工具、實用工具和應用程序 - 且不會產生虛擬機開銷。

WSL 僅在 64 位 Windows 10 版本 1607 及以上、Windows 11 和 Windows Server 2019/2022 中可用。


啓用 WSL3

自動安裝

Warning

本部分適用於 Windows 10 版本 2004 及更高版本(內部版本 19041 及更高版本)或 Windows 11。

如果你正在使用 2004 以下版本或你的電腦不支持虛擬化,請閲讀下面的手動安裝一節。

如果你正在使用 1607 以下版本的 Windows 10,你的系統不支持 WSL。

  1. 以管理員身份打開 Windows PowerShell(右擊「開始」按鈕,選擇 Windows PowerShell(管理員)或 Windows 終端(管理員))

  2. 輸入 wsl --install,並等待所有組件自動安裝完成。期間你可能需要重啓你的計算機來啓用必要的 Windows 功能。

  3. 安裝完成後,你可以在「開始」菜單或 Windows 終端的標籤頁中找到你安裝的發行版。

  4. 接下來,請轉到下面「配置分發版」一節完成其他設置。

手動安裝4

Warning

下面介紹手動安裝 WSL 的步驟。如果你已經完成了自動安裝,請跳過此部分。

啓用適用於 Linux 的 Windows 子系統

在安裝適用於 WSL 的任何 Linux 分發版之前,必須在下述兩種方法中選擇一種,以確保啓用「適用於 Linux 的 Windows 子系統」可選功能:

使用命令行:

  1. 以管理員身份打開 PowerShell 並運行:

    1
    2
    3
    Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux
    # 如果你只想要使用 WSL 1 請跳過此步驟
    Enable-WindowsOptionalFeature -Online -FeatureName VirtualMachinePlatform
    
  2. 出現提示時,重啓計算機。

使用圖形界面:

Windows 功能

  1. 打開「控制面板」

  2. 訪問「程序和功能」子菜單「打開或關閉 Windows 功能」

  3. 選擇「適用於 Linux 的 Windows 子系統」與「虛擬機平台」

  4. 點擊確定

  5. 重啓

安裝內核更新包

如果你想要使用 WSL 1, 請跳過此步驟。

下載 適用於 x64 計算機的 WSL2 Linux 內核更新包 並安裝。

設置 WSL 默認版本

絕大部分情況下,建議使用 WSL 2。 WSL 1 與 WSL 2 的區別,請見 比較 WSL 2 和 WSL 1

關於 systemd

WSL 1 完全不支持 systemd(這意味着一些需要 systemd 的功能無法實現或需要其他替代方案)。WSL 2 已經內建對 systemd 的支持。如果需要使用 systemd,而當前運行的發行版沒有配置為啓用 systemd,可參考 WSL 中的高級設置配置

1
2
# 將 WSL 默認版本設置為 WSL 2
wsl --set-default-version 2

安裝 WSL 分發版

搜索頁

進入 Microsoft Store,搜索「Ubuntu」,然後選擇「Ubuntu」,點擊「安裝」進行安裝。也可打開 Ubuntu 的商店頁面

Warning

Microsoft Store 的 Ubuntu 隨着 Ubuntu 的更新而更新,因此內容可能會有所改變。如果想獲取穩定的 Ubuntu 長期支持版,可以在 Microsoft Store 安裝 Ubuntu 的 LTS 版本。

配置分發版5

本章以 Windows 自動安裝的 Ubuntu 為例。

運行 Ubuntu

打開「開始」菜單找到 Ubuntu 並啓動,或使用 wsl 命令從 Windows 命令行啓動。

可以為 Ubuntu 創建應用程序磁貼或固定至任務欄,以在下次方便地打開。

初始化

第一次運行 Ubuntu,需要完成初始化。

1
Installing, this may take a few minutes...

等待一兩分鐘時間,系統會提示創建新的用户帳户。

1
2
3
Please create a default UNIX user account. The username does not need to match your Windows username.
For more information visit: https://aka.ms/wslusers
Enter new UNIX username: chtholly

輸入完用户名以後會提示輸入密碼。在 Linux 中,輸入密碼時屏幕上不顯示文字屬於正常現象。

1
Enter new UNIX password:

設置好帳户名和密碼後,WSL 就安裝完成了。

1
2
3
4
5
Installation successful!
To run a command as administrator (user "root"), use "sudo <command>".
See "man sudo_root" for details.

chtholly@SENIORIOUS:~$

基礎配置

初次安裝好的系統不附帶任何 C/C++ 編譯器,需要手動配置環境。

1
2
3
4
5
6
$ gcc
The program 'gcc' is currently not installed. You can install it by typing:
sudo apt install gcc
$ g++
The program 'g++' is currently not installed. You can install it by typing:
sudo apt install g++

更換為國內軟件源

Ubuntu 默認的軟件源在國外。可以換成國內的軟件源以加快速度,如 清華 TUNA 的軟件源

使用與自己系統版本匹配的軟件源

請在頁面中尋找與自己系統版本相配的源(可使用 sudo lsb_release -a 查看 Ubuntu 版本)。

除非你知道你在做什麼,否則不要使用與自己的系統版本不匹配的源!

使用以下命令更新軟件和軟件源:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
$ sudo su # 執行這行指令後,終端提示符會從 $ 變成 #,執行下文的命令前注意關注提示符
[sudo] xxx 的密碼:
# cp /etc/apt/sources.list /etc/apt/sources.list.bak
# vim /etc/apt/sources.list
...(按 i 之後將上文的源右鍵粘貼進去,編輯完後按 Esc,再輸入 :wq 和回車)
# apt update
# apt upgrade -y
# exit
exit
$ 

安裝中文環境

1
2
3
4
# apt install language-pack-zh-hans -y
# apt install fontconfig -y
# apt install fonts-noto-cjk fonts-wqy-microhei fonts-wqy-zenhei -y # 中文字體
# dpkg-reconfigure locales

此時會進入一個設置菜單,不用管,直接回車。

下一個菜單中選擇 zh_CN.UTF-8 回車。

1
2
3
4
5
6
7
8
Default locale for the system environment:

             None
             C.UTF-8
             en_US.UTF-8
            [zh_CN.UTF-8]

        <Ok>            <Cancel>

之後關閉 WSL 並重啓,系統就會變成中文。

再依次輸入下列命令,把 man 幫助頁替換為中文。6

1
2
# apt install manpages-zh
# sed -i 's|/usr/share/man|/usr/share/man/zh_CN|g' /etc/manpath.config

可以用 man help 測試。

安裝編譯環境7

1
# apt install -y build-essential vim ddd gdb fpc emacs gedit anjuta lazarus

GUIDE 的安裝請參考 Debian 或 Ubuntu 下 GUIDE 的安裝

這裏安裝的是基礎 + NOI 官方要求的環境,如有需要可以用 sudo apt install <程序名> 來安裝其它軟件包。 若想安裝其他版本可以參考 Debian 官方的 包管理手冊

以下為一個示例程序:

1
2
3
4
5
$ vim cpuid.cpp
...
$ g++ -Wall cpuid.cpp -o cpuid
$ ./cpuid
AMD Ryzen 5 1400 Quad-Core Processor
Note

Linux 環境下可執行文件可不帶擴展名,運行方式參見上方命令。

進階操作

使用 WSLg 運行 GUI 程序

如果你使用 Windows 10 19044 及以上版本或 Windows 11,則可以使用 WSL 2 提供的集成的桌面體驗。該功能允許你直接安裝並啓動 Linux 桌面程序而無須其他配置。

參見 在適用於 Linux 的 Windows 子系統上運行 Linux GUI 應用

安裝圖形環境,並使用遠程桌面連接

如果你使用的版本尚不支持 WSLg, 可以嘗試使用以下指南開啓圖形界面功能。

以下以 Xfce 為例。

如果只想安裝 Xfce,可以執行以下命令:

1
$ sudo apt install xfce4 tightvncserver -y

如果除 Xfce 外想要更多的軟件,可以執行以下命令:

1
$ sudo apt install xubuntu-desktop -y

圖形環境文件較大,下載解包需要一定時間。

配置 xrdp:

1
2
3
$ sudo apt install xrdp -y
$ echo "xfce4-session" >~/.xsession
$ sudo service xrdp restart

為了防止和計算機原有的遠程桌面衝突,需要更換默認端口。

不換端口的結果

運行命令 sudo sed 's/port=[0-9]{1,5}/port=otherport/' /etc/xrdp/xrdp.ini,其中 otherport 為其他端口(如 3390)。

1
2
3
[globals]
...
port=3390

運行 sudo service xrdp restart,然後去開始菜單,用 localhost:otherport 來訪問。

使用 Xming 連接

進入 Ubuntu 環境,安裝 xterm:

1
# apt install xterm -y

退出 Ubuntu。

Xming X Server 下載地址 下載最新的 Xming Server,然後安裝:

如果安裝完後忘記勾選 Launch Xming,需在開始菜單裏打開 Xming:

別忘了!

之後再回到 Ubuntu,鍵入如下指令:

1
$ DISPLAY=:0 xterm

如果使用了 xfce4,可以在彈出的窗口中使用如下命令激活 xfce4:

1
$ xfce4-session

運行結果如圖。(在 Xming 中使用Ctrl+C就可以退出該界面。)

WSL 與 Windows 文件的互訪問

Windows 下的硬盤被自動掛載至 Linux 環境下的 /mnt 文件夾下。 如 C 盤在 WSL 下的路徑為 /mnt/c

1
2
3
4
5
6
7
8
9
PS C:\Users\chtholly> bash
/mnt/c/Users/chtholly$ echo "Hello world!" > hello
/mnt/c/Users/chtholly$ exit
PS C:\Users\chtholly> cat hello
Hello world!
PS C:\Users\chtholly> echo "Welcome!" > welcome
PS C:\Users\chtholly> bash
/mnt/c/Users/chtholly$ cat welcome
Welcome!

另外,也可以從文件管理器訪問 WSL 目錄。在安裝 WSL 後,可以在資源管理器的側邊欄中發現 Linux 項,在其中可以訪問所有安裝的發行版中的文件。

同樣,也可以在資源管理器的路徑或運行(Win+R)中直接輸入 \\wsl$ 來轉到 WSL 的目錄。

也可以直接使用諸如 \\wsl$\Ubuntu\home\ 的路徑訪問其子文件夾。

配合 Visual Sudio Code 進行編輯

如果習慣在 Windows 環境下使用 Visual Studio Code 進行代碼編輯,可以安裝 VS Code 中的 Remote - WSL 插件,更方便地對 WSL 系統中的文件進行編輯。

通過 Remote - WSL,可以在 Windows 下的 VS Code 界面中直接對 WSL 子系統進行操作,更加方便地編輯子系統目錄下的文件、更方便地使用終端進行調試。

通過在 WSL 中直接鍵入 code .,可以在該目錄下直接喚出 Visual Studio Code,對於該目錄下的文件進行編輯。

同時,可以通過類似 code filename 的命令,對於指定文件進行編輯。

在插件 Remote - WSL 的 Getting Started 頁面,包含對於編輯操作的詳細簡介。

同時,也可以參考 Visual Studio Code 的官方文檔中關於 WSL 的內容(Remote development in WSL),這篇文章包含從 WSL 安裝到配合插件使用的全流程的更詳細的介紹。

WSL1 升級為 WSL2

Warning

請確認已經完成前面 WSL1 的安裝步驟。

執行命令 wsl -l -v 可以看到 WSL 版本號是 1,需要執行升級,才能到 2。

  1. 啓用「虛擬機平台」功能

    使用 PowerShell 以管理員身份運行:

    1
    dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart
    

    然後 重啓電腦

  2. 下載 Linux 內核更新包

  3. 設置分發版版本

    執行命令:wsl --set-version <分發版名稱> <版本號>

    如:將 Ubuntu 18.04 設置為 WSL 2 的命令為 wsl --set-version Ubuntu-18.04 2

    這一步比較耗時,執行完成後通過命令 wsl -l -v 來檢查升級是否成功。

FAQ

參見:常見問題WSL 2 常見問題解答

  • 如何在子系統下進行 xxx?

    可以用自帶命令行,或者使用圖形界面。 比如説 vim,在命令行中鍵入 man vim,會給出一份詳盡的使用方法。 亦可使用 vim --help

    關於命令行,可閲讀 命令行

  • 對系統資源的佔用量?

    這個系統和 Windows 10 共用 Host,所以理論上是比虛擬機佔用小的。

外部鏈接

參考資料與註釋