樹莓派內(nèi)核源代碼保存在GitHub上github.com/raspberrypi/linux,可以看做是Linux主線內(nèi)核代碼的一個(gè)分支。樹莓派內(nèi)核源代碼是從Linux主線的長期維護(hù)的穩(wěn)定版本加上樹莓派特有的改動形成的。樹莓派的內(nèi)核更新可以通過apt命令自動更新到最新的穩(wěn)定版本。但是如果你需要使用到最新的非穩(wěn)定版本或者指定版本或者要對內(nèi)核進(jìn)行裁剪或者修改內(nèi)核代碼。那么你就會需要對內(nèi)核進(jìn)行編譯。
1、下載內(nèi)核代碼
通過訪問github找到樹莓派內(nèi)核源代碼項(xiàng)目(方法見下載linux內(nèi)核代碼),通過https或者git下載你想要的版本的源代碼到本地主機(jī)。
2、編譯樹莓派內(nèi)核
編譯過成可以分成在本機(jī)上本地編譯和交叉編譯,本地編譯指的是在目標(biāo)主機(jī)上直接編譯,編譯完成后就在目標(biāo)主機(jī)上直接運(yùn)行,交叉編譯是指在其它主機(jī)上編譯,編譯完成后再把編譯出來的程序安裝到目標(biāo)主機(jī)上執(zhí)行。在樹莓派這里,我們可以采用本地編譯與可以采用交叉編譯,因?yàn)闃漭蛇\(yùn)行速度較慢,所以交叉編譯在這里可以顯著的提高編譯速度。
3、本地編譯
3.1、安裝編譯環(huán)境
啟動樹莓派后,輸入如下命令安裝編譯環(huán)境
sudo apt install git bc bison flex libssl-dev make
3.2、下載樹莓派內(nèi)核代碼
然后通過https下載Linux內(nèi)核代碼后解決壓或者通過git下載代碼到/usr/src目錄下,如下所示:
xxx@raspberrypi:/usr/src $ ls -l
total 16
drwxr-xr-x 27 root root 4096 Jun 5 13:56 linux-rpi-6.1.y
xxx@raspberrypi:/usr/src $ cd ./linux-rpi-6.1.y/
xxx@raspberrypi:/usr/src/linux-rpi-6.1.y $ ls -l
total 1012
drwxr-xr-x 24 root root 4096 Jun 4 19:39 arch
drwxr-xr-x 3 root root 12288 Jun 5 14:01 block
drwxr-xr-x 2 root root 4096 Jun 5 10:28 certs
-rw-r--r-- 1 root root 496 Jun 4 19:39 COPYING
-rw-r--r-- 1 root root 101639 Jun 4 19:39 CREDITS
drwxr-xr-x 4 root root 20480 Jun 5 13:25 crypto
drwxr-xr-x 86 root root 4096 Jun 4 19:39 Documentation
3.3、配置內(nèi)核
開始編譯之前我們需要先對內(nèi)核進(jìn)行配置,讓編譯工程知道我們要編譯的內(nèi)核的目標(biāo)主機(jī)架構(gòu)等信息,編譯工程才知道自己應(yīng)該怎么編譯。
- 使用默認(rèn)配置
- 如果你的設(shè)備是Raspberry Pi 1, Zero 或者 Zero W 或者 Raspberry Pi Compute Module 1 ,那么它們只支持32-bit的Linux內(nèi)核,可以使用如下內(nèi)核配置命令配置成默認(rèn)配置。
xxx@raspberrypi:/usr/src $ cd ./linux-rpi-6.1.y/
xxx@raspberrypi:/usr/src $ KERNEL=kernel
xxx@raspberrypi:/usr/src $ sudo make bcmrpi_defconfig
- 如果你的設(shè)備是Raspberry Pi 2, 3, 3+ 或者 Zero 2 W 或者 Raspberry Pi Compute Modules 3, 3+,且使用32-bit的內(nèi)核,可以使用如下內(nèi)核配置命令配置成默認(rèn)配置。
xxx@raspberrypi:/usr/src $ cd ./linux-rpi-6.1.y/
xxx@raspberrypi:/usr/src $ KERNEL=kernel7
xxx@raspberrypi:/usr/src $ sudo make bcm2709_defconfig
- 如果你的設(shè)備是Raspberry Pi 4 或者 400, 或者 Raspberry Pi Compute Module 4 ,且使用32-bit的內(nèi)核,可以使用如下內(nèi)核配置命令配置成默認(rèn)配置。
xxx@raspberrypi:/usr/src $ cd ./linux-rpi-6.1.y/
xxx@raspberrypi:/usr/src $ KERNEL=kernel7l
xxx@raspberrypi:/usr/src $ sudo make bcm2711_defconfig
- 如果你的設(shè)備是Raspberry Pi 3, 3+, 4, 400 或者 Zero 2 W, 或者 Raspberry Pi Compute Modules 3, 3+ 或者 4,那么它們還支持64-bit的內(nèi)核,可以使用如下內(nèi)核配置命令配置成默認(rèn)配置。
xxx@raspberrypi:/usr/src $ cd ./linux-rpi-6.1.y/
xxx@raspberrypi:/usr/src $ KERNEL=kernel8
xxx@raspberrypi:/usr/src $ sudo make bcm2711_defconfig
本文使用的是樹莓派zero w,只支持32位內(nèi)核,所以使用的是第一種配置。
-
自定義內(nèi)核配置
待更新 -
加入內(nèi)核補(bǔ)丁
待更新
3.4、定制內(nèi)核版本號
修改當(dāng)前目錄下的.config文件里的
CONFIG_LOCALVERSION=“my_first_kernel”
xxx@raspberrypi:/usr/src/linux-rpi-6.1.y $ ls -a | grep config
.cocciconfig
.config----------------------------修改這個(gè)文件里的LOCAL配置項(xiàng)成你想要的任何字符串
Kconfig
這個(gè)可以在你后續(xù)運(yùn)行中通過uname命令查詢到你自己編譯的Linux內(nèi)核的版本號,也會讓新的內(nèi)核在/lib/modules目錄下產(chǎn)生新的目錄文件去放置新內(nèi)核的模塊,而不是直接覆蓋。
3.5、編譯并安裝內(nèi)核
這一步,我們將編譯,安裝內(nèi)核,模塊和設(shè)備樹,因?yàn)闃漭尚阅鼙容^差,所以這一步會花費(fèi)非常長的時(shí)間,尤其是如果你使用的是樹莓派的早期硬件版本的話,就更慢了。
32bit內(nèi)核
make -j4 zImage modules dtbs
sudo make modules_install
sudo cp arch/arm/boot/dts/*.dtb /boot/
sudo cp arch/arm/boot/dts/overlays/*.dtb* /boot/overlays/
sudo cp arch/arm/boot/dts/overlays/README /boot/overlays/
sudo cp arch/arm/boot/zImage /boot/$KERNEL.img
64bit內(nèi)核
make -j4 Image.gz modules dtbs
sudo make modules_install
sudo cp arch/arm64/boot/dts/broadcom/*.dtb /boot/
sudo cp arch/arm64/boot/dts/overlays/*.dtb* /boot/overlays/
sudo cp arch/arm64/boot/dts/overlays/README /boot/overlays/
sudo cp arch/arm64/boot/Image.gz /boot/$KERNEL.img
編譯安裝完成后,重啟則已經(jīng)用新編譯的內(nèi)核了。
4、交叉編譯
這里以ubuntu為例,介紹如何對樹莓派內(nèi)核進(jìn)行交叉編譯
4.1、安裝編譯環(huán)境
啟動樹莓派后,輸入如下命令安裝編譯環(huán)境
sudo apt install git bc bison flex libssl-dev make libc6-dev libncurses5-dev
根據(jù)你編譯的目標(biāo)是32bit內(nèi)核還是64bit內(nèi)核選擇安裝不同的toolchain
- 32bit
sudo apt install crossbuild-essential-armhf
- 64bit
sudo apt install crossbuild-essential-arm64
4.2、下載樹莓派內(nèi)核代碼
然后通過https下載Linux內(nèi)核代碼后解決壓或者通過git下載代碼到/usr/src目錄下,如下所示:
xxx@ubuntu:/usr/src $ ls -l
total 16
drwxr-xr-x 27 root root 4096 Jun 5 13:56 linux-rpi-6.1.y
xxx@ubuntu:/usr/src $ cd ./linux-rpi-6.1.y/
xxx@ubuntu:/usr/src/linux-rpi-6.1.y $ ls -l
total 1012
drwxr-xr-x 24 root root 4096 Jun 4 19:39 arch
drwxr-xr-x 3 root root 12288 Jun 5 14:01 block
drwxr-xr-x 2 root root 4096 Jun 5 10:28 certs
-rw-r--r-- 1 root root 496 Jun 4 19:39 COPYING
-rw-r--r-- 1 root root 101639 Jun 4 19:39 CREDITS
drwxr-xr-x 4 root root 20480 Jun 5 13:25 crypto
drwxr-xr-x 86 root root 4096 Jun 4 19:39 Documentation
4.3、配置內(nèi)核
開始編譯之前我們需要先對內(nèi)核進(jìn)行配置,讓編譯工程知道我們要編譯的內(nèi)核的目標(biāo)主機(jī)架構(gòu)等信息,編譯工程才知道自己應(yīng)該怎么編譯。
- 32-bit
如果你的設(shè)備是Raspberry Pi 1, Zero 或者 Zero W 或者 Raspberry Pi Compute Module 1:
cd linux-rpi-6.1.y
KERNEL=kernel
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- bcmrpi_defconfig
如果你的設(shè)備是Raspberry Pi 2, 3, 3+ 或者 Zero 2 W 或者 Raspberry Pi Compute Modules 3, 3+:
cd linux-rpi-6.1.y
KERNEL=kernel7
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- bcm2709_defconfig
如果你的設(shè)備是Raspberry Pi 4 或者 400, 或者 Raspberry Pi Compute Module 4 :
cd linux-rpi-6.1.y
KERNEL=kernel7l
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- bcm2711_defconfig
- 64-bit
如果你的設(shè)備是Raspberry Pi 3, 3+, 4, 400 或者 Zero 2 W, 或者 Raspberry Pi Compute Modules 3, 3+ 或者 4:
cd linux-rpi-6.1.y
KERNEL=kernel8
make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- bcm2711_defconfig
本文使用的是樹莓派zero w,只支持32位內(nèi)核,所以使用的是第一種配置。
4.4、定制內(nèi)核版本號
修改當(dāng)前目錄下的.config文件里的
CONFIG_LOCALVERSION=“-v7-MY_FIRST_KERNEL”
xxx@raspberrypi:/usr/src/linux-rpi-6.1.y $ ls -a | grep config
.cocciconfig
.config----------------------------修改這個(gè)文件里的LOCAL配置項(xiàng)成你想要的任何字符串
Kconfig
這個(gè)可以在你后續(xù)運(yùn)行中通過uname命令查詢到你自己編譯的Linux內(nèi)核的版本號,也會讓新的內(nèi)核在/lib/modules目錄下產(chǎn)生新的目錄文件去放置新內(nèi)核的模塊,而不是直接覆蓋。
4.5、編譯內(nèi)核
這一步,我們將編譯,安裝內(nèi)核,模塊和設(shè)備樹,因?yàn)槭墙徊婢幾g,交叉編譯用的主要性能相對于樹莓派而言都是非常非常高的了,所以這一步會花費(fèi)的時(shí)間會比較短,8核 i7用-j12選項(xiàng)一般來說25分鐘就可以編完了。
32bit內(nèi)核
make -j4 ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- zImage modules dtbs
64bit內(nèi)核
make -j4 ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- Image modules dtbs
4.6、安裝內(nèi)核
完成交叉編譯后,需要將編譯出來的內(nèi)核拷貝到樹梅莓里并安裝內(nèi)核模塊。通過將SD讀卡器插入編譯主機(jī)的方式進(jìn)行的操作會比較簡單。下面就以這個(gè)為例進(jìn)行說明。
將帶有SD卡的SD卡讀卡器插入主機(jī),輸入以下命令(注意,如果你的主機(jī)本來就有多個(gè)硬盤那么插入的SD卡可能顯示的是sdc之類的,注意鑒別一下):
xxx@xx-PC:~$ lsblk -f | grep sdb
sdb
├─sdb1 vfat FAT32 bootfs CEE7-0DF0
└─sdb2 ext4 1.0 rootfs ebadab55-bd70-46a9-8f18-995c136fb5b2
- 掛載這二個(gè)分區(qū):
sudo mkdir mnt
sudo mkdir mnt/fat32
sudo mkdir mnt/ext4
sudo mount /dev/sdb1 mnt/fat32
sudo mount /dev/sdb2 mnt/ext4
- 安裝內(nèi)核模塊到sd卡
- 32bit系統(tǒng)
sudo env PATH=$PATH make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- INSTALL_MOD_PATH=mnt/ext4 modules_install
- 64bit系統(tǒng)
sudo env PATH=$PATH make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- INSTALL_MOD_PATH=mnt/ext4 modules_install
- 安裝內(nèi)核與設(shè)備樹(安裝前可以先備份原先的內(nèi)核):
- 32bit系統(tǒng)
sudo cp mnt/fat32/$KERNEL.img mnt/fat32/$KERNEL-backup.img
sudo cp arch/arm/boot/zImage mnt/fat32/$KERNEL.img
sudo cp arch/arm/boot/dts/*.dtb mnt/fat32/
sudo cp arch/arm/boot/dts/overlays/*.dtb* mnt/fat32/overlays/
sudo cp arch/arm/boot/dts/overlays/README mnt/fat32/overlays/
sudo umount mnt/fat32
sudo umount mnt/ext4
- 64bit系統(tǒng)
sudo cp mnt/fat32/$KERNEL.img mnt/fat32/$KERNEL-backup.img
sudo cp arch/arm64/boot/Image mnt/fat32/$KERNEL.img
sudo cp arch/arm64/boot/dts/broadcom/*.dtb mnt/fat32/
sudo cp arch/arm64/boot/dts/overlays/*.dtb* mnt/fat32/overlays/
sudo cp arch/arm64/boot/dts/overlays/README mnt/fat32/overlays/
sudo umount mnt/fat32
sudo umount mnt/ext4
退出SD卡,將SD卡插回樹莓派,重啟則可。文章來源:http://www.zghlxwxcb.cn/news/detail-472810.html
5、內(nèi)核更新結(jié)果
我們可以看到內(nèi)核版本已經(jīng)變成6.1.31my_first_kernel,也已經(jīng) 更新了內(nèi)核編譯的時(shí)間。文章來源地址http://www.zghlxwxcb.cn/news/detail-472810.html
xxx@raspberrypi:~ $ uname -a
Linux raspberrypi 6.1.31my_first_kernel #1 Mon Jun 5 20:48:53 CST 2023 armv6l GNU/Linux
到了這里,關(guān)于樹莓派Linux內(nèi)核編譯的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!