關於WSL2你應該知道的

邵玄發表於2024-08-12
  • 關於WSL2你應該知道的
    • linux-headers

關於WSL2你應該知道的

一個預設的前提是你已經打算去使用WSL2,因此關於虛擬機器(一般意義上)和WSL2優劣的討論會被避免。

這篇文章主要記錄筆者使用WSL2進行開發過程中遇到的問題以及相應的解決方法。

linux-headers

在linux下進行驅動開發需要相應的核心標頭檔案,在使用虛擬機器的情況下可以透過linux-headers-$(uname -r)進行下載,但是在WSL2下該功能並不被支援,因為WSL2使用的linux核心時microsoft特別定製過的,以筆者的電腦為例,如果你執行uname -r,得到的輸出如下:

5.15.153.1-microsoft-standard-WSL2

按照文件安裝的WSL2並不會自帶原始碼,因此需要去GitHub下載相應的原始碼 WSL2-Linux-Kernel

原始碼下載完成後需要安裝相應的依賴:

sudo apt install libelf-dev build-essential pkg-config
sudo apt install bison build-essential flex libssl-dev libelf-dev bc

之後開始編譯原始碼:

tar -zvxf WSL2-Linux-Kernel-linux-msft-wsl-5.15.153.1.tar.gz
cd WSL2-Linux-Kernel-linux-msft-wsl-5.15.153.1
zcat /proc/config.gz > .config
make -j $(nproc) 
sudo make -j $(nproc) modules_install

編譯過程中可能遇到一些錯誤,一些可能的參考如下:

sudo apt install bison flex # flex&bison相關報錯
sudo apt-get install libssl-dev # <openssl/bio.h>相關報錯
sudo apt-get install dwarves # BTF相關報錯

最後為了方便程式設計做一個軟連結:

sudo ln -s /path/to/WSL2-Linux-Kernel-linux-msft-wsl-5.15.153.1 /usr/src/linux-headers-5.15.153.1-microsoft-standard-WSL2

如果你做完了上述的內容,在模組開發上面就應該比較順利了,但是當你在試圖載入模組的時候,大機率還是會遇到問題。筆者在開發過程中分別遇到過Invalid module formatInvalid parameter兩種報錯,而且兩次報錯中我的程式碼時相同的,唯一不同的時Ubuntu的版本,我在Ubuntu20.04上遇到的時Invalid module format,而在Ubuntu22.04和Ubuntu24.04上遇到的則是後者。關於前者的具體報錯和日誌資訊可以參考筆者在Stackoverflow的提問 Meeting Invalid module format when insmod mymodule.ko。後者的日誌輸出如下:

[14962.221382] BPF:[133427] Invalid name_offset:2397115
[14962.222417] failed to validate module [mychardev] BTF: -22

單看日誌的話似乎時BPF版本的問題,但是實際上這個問題來自於WSL2核心本身。發行的WSL2核心本身就禁止了模組的載入,一個解決方法是編譯並使用自己的WSL2核心。

在之前的編譯步驟結束之後,在/path/to/WSL2-Linux-Kernel-linux-msft-wsl-5.15.153.1/arch/x86/boot/bzimage可以找到bzimage檔案,把它複製到Windows下的%userprofile%下。關於環境變數%userprofile%,你可以透過下面的方式檢視:

# cmd
echo %userprofile%

# powershell
echo $env:userprofile

複製結束後建立並編輯%userprofile%\.wslconfig檔案,內容如下:

[wsl2]
kernel=C:\\Users\\WIN10_USER\\bzimage

多的一個\作為跳脫字元是必須存在的,而WIN10_USER作為佔位符在使用時換成自己的Windows使用者名稱。此外結尾不要加上空格以避免潛在的bug。

最後,執行wsl --shutdown並重啟WSL2,此時你應該可以成功載入模組了。

以上方法來自 Hannah J

相關文章