使用Virtual Box編譯及建構適用於RPi 4B的kernel
使用Virtual Box編譯及建構適用於RPi 4B的kernel
前幾天的文章是使用WSL來做Cross compilation,但到最後安裝kernel步驟會遇到檔案系統的問題,詳細的原因請參考小弟另一篇文章。而結論就是現階段要做RPi的kernel cross compilation,建議使用Virtual Box來完成,因此整理這篇Virtual Box步驟範例給大家參考。
版本環境
- Windows 11
- Virtual Box 7.1.2
- Ubuntu Desktop 24.04 LTS
- Raspberry Pi 4B 8GB
建立Virtual Box環境
安裝Virtual Box
請依你的系統版本(Win/Mac)下載,並照指示安裝。
下載Ubuntu Desktop映像檔
目前最新穩定版為 24.04.1 LTS。 *如果不需要GUI可安裝Server版。
在Virtual Box中建立新虛擬機
設定虛擬機名稱及映像檔(.iso)
名稱可隨意設定,映像檔請指定剛剛下載的Ubuntu Desktop ISO,並勾選Skip Unattended Installation。
設定虛擬機Hardware
切換到Hardware欄位,並設定RAM及CPU核心數。RAM建議4GB以上,CPU 2核心以上,否則cross compile時間會更久。
設定硬碟大小
切換到Hard Disk欄位,設定虛擬機的硬碟大小。基本上預設的設定即可(本文全部步驟完成約占用15GB)。
啟動虛擬機
按下Start啟用虛擬機,並依指示完成Ubuntu系統安裝。
Cross Compilation on Virtual Box
提示
請使用Virtual Box中Ubuntu提供的Terminal
環境準備
更新套件
sudo apt update
安裝必要套件
sudo apt install git bc bison flex libssl-dev make libc6-dev libncurses5-dev
安裝Linux kernel compile套件
sudo apt install build-essential dkms linux-headers-$(uname -r)
安裝ARM cross compile toolchain(64bit)
sudo apt install crossbuild-essential-arm64
Linux Kernel Compilation & Build
下載Linux Kernel Source
# cd ~ git clone --depth=1 https://github.com/raspberrypi/linux
指定版本
請使用branch名稱指定版本(目前最新為rpi-6.6.y)
git clone --depth=1 --brach [branch_name] https://github.com/raspberrypi/linux
清除並建立乾淨環境
make distclean
到clone下來的路徑(~/linux)底下,以make指令設定config檔
cd linux/
make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- bcm2711_defconfig
指令說明
- Raspberry Pi 4B採用bcm2711 SoC,所以可直接指定預先設定好的bcm2711_defconfig。
- ARCH為指定的架構。
- CROSS_COMPILE為指定的cross compile toolchain。
開始compile & build kernel
make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- LOCALVERSION="-[custom_name]-raspi" Image modules dtbs
指令說明
- Image modules dtbs為指定要build出的檔案類型,此設定會輸出kernel image及各種modules.dtb檔案。如果需要包成安裝包(deb),請設為bindeb-pkg。
- LOCALVERSION可指定kernel名稱。請注意需要-raspi結尾,並建議前面要有"-"開頭(不然會跟版本號連在一起)。
執行時間參考
- Intel i5-13450H
- 虛擬機切分6GB RAM/4核心CPU
- 約45分鐘
安裝新kernel & modules到樹梅派SD Card
插入樹梅派的SD Card,並在Virtual Box的USB選項中,選定你的電腦的SD Card Reader
筆者範例為Generic USB2.0-CRW。
直接在SD Card上的rootfs分區安裝新modules
sudo env PATH=$PATH make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- INSTALL_MOD_PATH=/media/[username]/rootfs modules_install
指令說明
INSTALL_MOD_PATH為SD Card的rootfs路徑。
Virtual Box會將SD Card自動掛載在 /media/[username] 目錄底下。複製新kernel image到SD Card上的bootfs分區
sudo cp arch/arm64/boot/Image /media/[username]/bootfs/kernel-[custom_name].img
指令說明
預設的樹梅派kernel映像檔為kernel8.img,可直接用相同名稱覆蓋。
如使用[custom_name]自定名稱,需修改boot config,指定使用新kernel執行,如下:
sudo nano /media/[username]/bootfs/config.txt
在最後一行添加以下內容
kernel=kernel-[custom_name].img
複製新kernel dtb到SD Card上的bootfs分區
sudo cp arch/arm64/boot/dts/broadcom/*.dtb /media/[username]/bootfs/ sudo cp arch/arm64/boot/dts/overlays/*.dtb* /media/[username]/bootfs/overlays
在樹梅派上檢查kernel是否已安裝
將SD Card插回樹梅派並開機
以uname檢查目前kernel版本與日期
user@rpi:~$ uname -a Linux rpi 6.6.54-v8-[custom_name]-raspi #1 SMP PREEMPT Sun Oct 6 14:26:45 CST 2024 aarch64 GNU/Linux
注意
[custom_name]應為你剛剛設定的名稱,而後方的日期為build的時間。
參考
- 0
- 0
- 0
- 0
- 0
- 0
Preview: