- 關於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 format
和Invalid 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。