內容目錄

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 的各種服務任務。

image-20230215212246167

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 遷移虛擬磁碟機到其他硬碟機上

ref: Move WSL to Another Drive (iany.me)

以下示例將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.vhdx
  • wsl --unregister Ubuntu:使用名稱取消註冊 WSL 實例。Ubuntu
  • wsl --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 裝置。

    1. 在管理員模式的 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
    1. 在管理員模式的 Powershell下,用 wsl --mount\\.\PHYSICALDRIVE1 掛載到 WSL:
    wsl --mount \\.\PHYSICALDRIVE1 --bare

    WSL –mount <磁碟機> 可以爲 WSL 掛載并安裝物理或虛擬磁碟機。選項:
    --vhd:指定 是指虚拟硬盘。
    --bare:将磁盘附加到 WSL 2,但不进行安装
    --name <Name>:对安装点使用自定义名称安装磁盘。
    --type <Type>:安装磁盘时要使用的文件系统,如果未指定,则默认为 ext4。
    --options <Options>:其他安装选项。
    --partition <Index>:要安装的分区索引,如果未指定,则默认为整个磁盘。

    1. 在 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
                                 /    

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,方法如下:

    1. 安裝 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系統衝突,所以還是不要打開好了。

最後修改日期: 2025 年 7 月 4 日

作者

留言

撰寫回覆或留言

發佈留言必須填寫的電子郵件地址不會公開。