2. WSL2 安裝篇
此篇參考微軟 https://learn.microsoft.com/zh-tw/windows/wsl/ 相關主題所提供的信息。
WSL虛擬機在微軟商店可以有許多選擇,如Ubuntu、Debian、ArchLinux、Kali、SUSE等等,我安裝一般嵌入式開發常用的 Ubuntu,并選擇固定版本 20.04(AGL要求)。
Windows11 Home Edition 預設是不能使用WSL的,需要用 Power Shell打開 WSL 功能。我們接下來一步一步的完成。
Step0 安裝 Windows Terminal
爲了未來的使用方便,先從微軟商店下載 Windows Terminal。Windows Terminal可以多頁的開啓終端,終端可以有不同的類型,如 Power Shell、Cmd Tool、WSL 的 虛擬機、Multipass、Azure Cloud Shell等。我在【設定】選項設置使用管理員身份進入 PowerShell,這樣方便的在PowerShell中,可以操作 WSL 的各種服務任務。

Step1 打開 Home版的 WSL功能與虛擬機功能:
以管理員身份進入 powershell 或命令列,使用 dism.exe 來啓用WSL功能與虛擬機功能:
dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart
Step2 重啓 Windows,讓系統自動安裝WSL
重啟Windows,讓系統自動安裝WSL與虛擬機功能的設定。
Step3 指定選用WSL2
系統安裝WSL功能後,可以用wsl命令了。以管理員身份進入 powershell 或命令列,指定預設用WSL2:
wsl --set-default-version 2
Step4 安裝Linux子系統
2025.7.4 : ubuntu22 已經可以編譯 AGL了。但因 ubuntu24 與我的筆記本似乎有點衝突,我把 WSL與grub下的 Ubuntu 暫時停留在 ubuntu22 版.
由於目前 AGL項目不能在22.04下執行,我指定安裝用 Ubuntu 20.04版。如果在應用商店選 Ubuntu 沒定版次,將會安裝最後的LTS分佈。可以從微軟商店安裝所選的Linux發佈,也可以在 Powershell 下用以下命令安裝20.04:
Invoke-WebRequest -Uri https://aka.ms/wslubuntu2004 -OutFile Ubuntu.appx -UseBasicParsing
Step5 升級WSL以提供新的GUI服務
内容參考:https://learn.microsoft.com/zh-tw/windows/wsl/tutorials/gui-apps
現在的開發環境很多都在 VSCode 有插件, 可以直接使用 Windows 端的 VSCode 連接 WSL開發。
目前新安裝的WSL2還沒提供GUI功能,需要更新並重啓WSL:
wsl --update
wsl --shutdown
Shutdown之後,在 Windows Terminal 重新打開Ubuntu,啟動機器,就可以安裝圖形 App了。可以試試常用的 gedit:
sudo apt install gedit -y
Hints:
ubuntu有一系列的 lsXXX命令,我們可以參考系統狀況來微調系統。如 lscpu、lsmem、lsblk、lsusb、lshw 等。
Step6 遷移虛擬磁碟機到其他硬碟機上
以下示例將Ubuntu發行版移動到磁碟。D:\WSL\Ubuntu
第 1 步: 在 Microsoft Store 中安裝 Ubuntu。啟動它以初始化預設實例。根據提示創建Ubuntu中使用的使用者。
第 2 步: 匯出實例並導入到目標目錄。
D:
cd D:\
mkdir WSL
cd WSL
mkdir Ubuntu
wsl --export Ubuntu .\Ubuntu\ext4.vhdx --vhd
wsl --unregister Ubuntu
wsl --import-in-place Ubuntu .\Ubuntu\ext4.vhdx
命令說明:
wsl --export Ubuntu .\Ubuntu\ext4.vhdx --vhd:將帶有名稱的 WSL 實例的磁碟匯出到目錄中的檔中。所以你會得到檔 .Ubuntuext4.vhdx.\Ubuntu\D:\WSL\Ubuntu\ext4.vhdxwsl --unregister Ubuntu:使用名稱取消註冊 WSL 實例。Ubuntuwsl --import-in-place Ubuntu .\Ubuntu\ext4.vhdx:第一個是新創建的實例名稱。此命令將使用現有的磁碟檔註冊一個新實例。請記住,如果刪除磁碟檔,實例將崩潰,其中的所有檔將永久丟失。Ubuntu.\Ubuntu\ext4.vhdx
現在可以在商店中卸載Ubuntu 了。
第 3 步: Window Terminal 下在認設置
習慣用 Windows Terminal 了, 可以管理進入不同的WSL系統.
Step7 加大WSL內置虛擬硬碟大小
預設250G的HDD對WSL而言可能不夠。可以另外掛載 工程用 vhdx 虛擬硬碟,也可以直接擴充虛擬機内置硬碟大小。
可以用
lsblk來看系統現有的 block device的狀況。
7.1 cmdline 查看 ext4.vhdx 位置
我沒記powershell查找文件的命令。在Windows Terminal開啓【命令提示符/Cmd Line Tools】,用 dir ext4.vhdx /s 找:
dir ext4.vhdx /s
驱动器 C 中的卷是 OS
卷的序列号是 D2D8-14EC
C:\Users\cyue1\AppData\Local\Packages\CanonicalGroupLimited.Ubuntu20.04LTS_79rhkp1fndgsc\LocalState 的目录
2023/01/06 22:07 151,105,044,480 ext4.vhdx
1 个文件 151,105,044,480 字节
所列文件总数:
1 个文件 151,105,044,480 字节
0 个目录 728,238,587,904 可用字节
看到 Ubuntu 20.04的 虛擬硬碟檔案了,可以複製黏貼到 Powereshell使用。
7.2 關閉WSL并用 diskpart 增大 ext4.vhdx 分區容量
在管理員模式的 Powershell下,先停止 WSL虛擬機,再用 diskpart 命令修改虛擬機的虛擬硬碟:
wsl --shutdown
diskpart
注意: diskpart 只能增加容量,不能縮減容量。
在 diskpart的界面下,先選擇 vdisk 與要修改的虛擬硬碟檔的絕對路徑與檔案名。擴展數值單位為 MB。我們用到了4個 diskpart命令:
-
select vdisk file="絕對路徑\ext4.vhdx":選擇 vdisk的文件。 -
expand vdifk maxium=400000:擴展 vdisk 到400G(diskpart的單位為MB)。 -
detail vdisk:查看分區狀況 -
exit:結束 diskpart
Microsoft DiskPart 版本 10.0.22621.1
Copyright (C) Microsoft Corporation.
在计算机上: CYUEZENBOOK
DISKPART> select vdisk file="C:\Users\cyue1\AppData\Local\Packages\CanonicalGroupLimited.Ubuntu20.04LTS_79rhkp1fndgsc\LocalState\ext4.vhdx"
DiskPart 已成功选择虚拟磁盘文件。
DISKPART> expand vdisk maximum=400000
100 百分比已完成
DiskPart 已成功扩展虚拟磁盘文件
DISKPART> detail
设备类型 ID: 0 (未知)
供应商 ID: {00000000-0000-0000-0000-000000000000} (未知)
状态: 已添加
虚拟大小: 390 GB
物理大小: 215 GB
文件名: C:\Users\cyue1\AppData\Local\Packages\CanonicalGroupLimited.Ubuntu20.04LTS_79rhkp1fndgsc\LocalState\ext4.vhdx
为子级: 否
父文件名:
找不到关联的磁盘号。
DISKPART> exit
7.3 進入 Ubuntu 用 resize2fs 調整Disk Size
先看 ext4 的 DISK mount 在哪,再對其做對應的 diskpart的 resize數值。
sudo -s
mount -t devtmpfs none /dev
mount | grep ext4
/dev/sdc on / type ext4 (rw,relatime,discard,errors=remount-ro,data=ordered)
/dev/sdc on /mnt/wslg/distro type ext4 (ro,relatime,discard,errors=remount-ro,data=ordered)
/dev/sdc on /snap type ext4 (rw,relatime,discard,errors=remount-ro,data=ordered)
# 發現在 /dev/sdc
sudo resize2fs /dev/sdc 400000M
在上述示例中,我们将 vhd 大小更改为了 400000,因此命令将为 sudo resize2fs /dev/sdc 400000M。
resize2fs 1.45.5 (07-Jan-2020)
/dev/sdc 上的文件系统已被掛载于 /;需要进行在线调整大小
old_desc_blocks = 40, new_desc_blocks = 49
/dev/sdc 上的文件系统大小已经调整为 102400000 个块(每块 4k)。
Step8 加大 WSL 可用的 RAM大小
可以用
lsmem來看系統的 memory 狀況。可以用
top來看系統的 實時狀況。
我的PC 有 32GB的RAM,預設WSL使用一半(16GB),但發現編譯AGL時不太夠,需要改到24GB。
在 Windows的用戶主目錄下(/Users/XXX/)添加 .wslconfig 文件,内容為:
[wsl2]
memory=24GB # Limits VM memory in WSL 2 to 24 GB
Step9 打开 systemd 服务
添加 /etc/wsl.conf,在[boot] 段 设置 systemd=true,然后重启 WSL:
echo "[boot]
systemd=true" | sudo tee -a /etc/wsl.conf
sudo reboot
可以用
pstree查看進程樹。
Step10 在WSL中使用 Windows APP
WSL可以直接呼叫Host的應用處理本地文件。由於WSL會將Windows系統的PATH轉成Unix格式并添加到WSL中,在Windows命令列可以呼叫的,就能在WSL的bash呼叫。如我安裝了 Notepad++,可以在WSL中呼叫 notepad++.exe來執行。我們也可以為其設定別名,但注意特殊符號要加上倒斜綫 \。如:
alias npp='notepad\+\+.exe'
npp .bashrc
會有一些限制,命令參數中的路徑若是透過 ln 挂載,WSL翻譯路徑給Windows時很可能出錯。
若是Windows沒有path設定的GUI程式,可以用 ln -s 來鏈接到 WSL的PATH中使用。如chrome、typora 可以這樣設置:
sudo ln -s /mnt/c/Program\ Files/Google/Chrome/Application/chrome.exe /usr/local/bin/chrome
sudo ln -s /mnt/c/Program\ Files/Typora/Typora.exe typora
路徑、文件名、特殊符號透過WSL轉換可能出錯。
Step11 WSL 掛載實體硬碟機
可以用
lsblk來看系統現有的塊裝置。
11.1 連接實體硬碟機到WSL
若系統有實體硬碟機是分配給 WSL 使用的,可以把他掛載到 WSL讓WSL控制使用。
我的筆記本的讀卡器是走PCIe的,記憶卡被當成硬碟機,不是USB裝置,所以要用本小節的方式連接記憶卡。
注意,不是 USB Mass Storage分區,USB隨身碟或SSD要編譯WSL内核,讓内核支持 Mass Storage 後,再透過 usbipd 來掛載。
詳細信息參考:https://learn.microsoft.com/zh-tw/windows/wsl/wsl2-mount-disk 我們將在之後的章節看如何掛載 USB 裝置。
-
- 在管理員模式的 Powershell下,用
wmic diskdrive list brief查看現在有哪些實體硬碟機:
wmic diskdrive list brief Caption DeviceID Model Partitions Size NVMe Micron_3400_MTFDKBA1T0TFH \\.\PHYSICALDRIVE0 NVMe Micron_3400_MTFDKBA1T0TFH 4 1024203640320 NVMe Samsung SSD 970 EVO Plus 2TB \\.\PHYSICALDRIVE1 NVMe Samsung SSD 970 EVO Plus 2TB 2 2000396321280 - 在管理員模式的 Powershell下,用
-
- 在管理員模式的 Powershell下,用
wsl --mount把\\.\PHYSICALDRIVE1掛載到 WSL:
wsl --mount \\.\PHYSICALDRIVE1 --bareWSL –mount <磁碟機> 可以爲 WSL 掛載并安裝物理或虛擬磁碟機。選項:
--vhd:指定是指虚拟硬盘。
--bare:将磁盘附加到 WSL 2,但不进行安装。
--name <Name>:对安装点使用自定义名称安装磁盘。
--type <Type>:安装磁盘时要使用的文件系统,如果未指定,则默认为 ext4。
--options <Options>:其他安装选项。
--partition <Index>:要安装的分区索引,如果未指定,则默认为整个磁盘。 - 在管理員模式的 Powershell下,用
-
- 在 WSL下,用
lsblk查看連接的 block device,看到 sdd 是我們新掛載的磁碟機,其中sdd1是 Linux 的/,sdd3是Linux的/home:
lsblk内容:
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS sda 8:0 0 388.4M 1 disk sdb 8:16 0 186M 1 disk sdc 8:32 0 6G 0 disk [SWAP] sdd 8:48 0 1.8T 0 disk ├─sdd1 8:49 0 233.1G 0 part └─sdd3 8:51 0 1.6T 0 part sde 8:64 0 1T 0 disk /snap /mnt/wslg/distro / - 在 WSL下,用
11.2 與外部 dual boot 的 linux 共用 home分區
WSL 直接使用 dualboot linux 的 home 分區的好處是,不必退出 Windows, 可以接力執行在 linux 下未做完的工作。
在製作 WSL 時,我使用的ubuntu版次,以及用戶的名稱與UID,都和外部 linux同, 這樣就可以輕鬆的在 WSL 和外部 Linux 做接力工作了。
我的 ssd 在 WSL中被看成 /dev/sdd,第三分區是 home 分區。讓 WSL 接管SSD 後,可以直接在 WSL的 /etc/fstab 加上 ext4的 home 分區:
/dev/sdd3 /home ext4 defaults 0 2
執行 mount -a 後,fstab的挂載會執行,再用 lsblk 查看:
lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
sda 8:0 0 388.4M 1 disk
sdb 8:16 0 4G 0 disk [SWAP]
sdc 8:32 0 1T 0 disk /snap
/mnt/wslg/distro
/
sdd 8:48 0 1.8T 0 disk
├─sdd1 8:49 0 233.1G 0 part
└─sdd3 8:51 0 1.6T 0 part /home
執行 sudo reboot 後下次登入WSL, 可以發現 home已經是外部 Linux 的 home, 用戶的設置也一樣了。
11.3 WSL掛載實體硬碟機的現存分區(APFS爲例)
由於我掛載的是 macbook pro 2015 上曾經使用的ssd,想直接在 WSL 使用 APFS,方法如下:
-
- 安裝
libfsapfs-utils:
- 安裝
sudo apt install libfsapfs-utils
# 將apfs的第7分區掛載到 /mnt/e:
sudo fsapfsmount -f 7 /dev/sdd2 /mnt/e
- 用 fsapfsinfo 查看 /dev/sdd2 的分區
fsapfsinfo /dev/sdd2
fsapfsinfo 20190210
Apple File System (APFS) information:
Container information:
Identifier : 56840c47-411d-4dd7-978f-a8cd0fe866c4
Number of volumes : 7
Volume: 1 information:
Identifier : 92061405-f857-4ccf-a830-18a0e7c3b900
Name : macOS2T - 数据
Volume: 2 information:
Identifier : 2a12650f-d81e-4a52-92e1-c95ccd1d7368
Name : Preboot
Volume: 3 information:
Identifier : a6043ab9-e57a-441a-bc69-01cb68f4fe75
Name : Recovery
Volume: 4 information:
Identifier : cc2faad2-649d-4e1d-90ef-cd470b441aae
Name : VM
Volume: 5 information:
Identifier : 59b3bc95-c658-4087-b663-c270fe4e236c
Name : macOS2T
Volume: 6 information:
Identifier : 09d5bd2e-fc91-4977-a479-5f5404082bfb
Name : Update
Volume: 7 information:
Identifier : b4ba1c6a-cf55-488b-bab9-f879a569184d
Name : Work
分區7是我工作用的,掛載他!
- 掛載apfs分區:
sudo fsapfsmount -f 7 /dev/sdd2 /mnt/d
掛載後就可以直接使用了。。。
Step12 WSL vGPU Driver?
建议在启用了WSL的虚拟GPU(vGPU)的系统上运行WSLg,以便您可以受益于硬件加速的OpenGL渲染。您可以从下面的每个合作伙伴处找到支持WSL的预览驱动程序。
StepA Windows Terminal 卡住問題?
遇到了奇怪的問題,在按下 Tab后 ubuntu 的 terminal 會 hang住。但系統并未當機,可以另開Terminal連接。
爬文修改 /etc/inputrc ,取消了 # set bell-style none 的注釋符號。然後 reboot ubuntu 。
sudo sed -i 's/# set bell-style none/set bell-style none/g' /etc/inputrc
sudo reboot
不過似乎仍然會發生。WSL會有不穩定的時候?若發生了,可以用管理員 Powershell重啓 WSL:
wsl --shutdown
StepB Hyper-V?(WSL不需要,僅參考)
Windows11 Home 版本若要使用 Hyper-V ,要手動添加庫。執行以下 hyperv.bat:
pushd "%~dp0"
dir /b %SystemRoot%\servicing\Packages\*Hyper-V*.mum >hv.txt
for /f %%i in ('findstr /i 。hv.txt 2^>nul') do dism /online /norestart /add-package:"%SystemRoot%\servicing\Packages\%%i"
del hv.txt
Dism /online /enable-feature /featurename:Microsoft-Hyper-V -All /LimitAccess /ALL
Pause
將會添加多個 HyperV庫。或需要重啓Windows。據説 Hyper-V會與某些VM系統衝突,所以還是不要打開好了。
留言