獲取內核源碼及工具
源碼鏈接:
https://github.com/raspberrypi/linux
工具鏈接:
https://github.com/raspberrypi/tools
patch鏈接:
https://www.kernel.org/pub/linux/kernel/projects/rt/
源碼在git上的master的版本是4.9,可直接複製git的鏈接
git clone https://github.com/raspberrypi/linux.git
如果想下載其他版本的內核,比如想下載5.1.y版本內核,則使用如下方式
git clone -b rpi-5.1.y https://github.com/raspberrypi/linux.git
tools工具則是一些交叉編譯所使用的編譯器
git clone https://github.com/raspberrypi/tools.git
下載patch,要下載和你將要編譯的內核版本一致的patch。
以上是使用git下載,在國內的下載速度是比較慢的。如果想高速下載,可以使用迅雷。方法是複製瀏覽器頂部鏈接,複製到迅雷進行搜索
然後下載壓縮版本,我在迅雷裏的下載速度達到了3m,速度還可以。
下載完成後全部解壓。
打patch
我們對Linux內核添加補丁,這個過程就是打patch。將上面下載的patch壓縮版解壓到對應的內核文件夾下,並執行
cat *.patch | patch p1
配置交叉編譯環境
這個要用到我們下載的tools。使用git方式下載的文件夾名爲tools;下載壓縮包版本直接解壓的文件夾名爲tool-master。我們以tools爲命名來講解。
ubuntu系統位數查看
$ getconf LONG_BIT
64
如果你的ubuntu系統位數爲32位,執行
echo PATH=\$PATH:~/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian/bin >> ~/.bashrc
source ~/.bashrc
如果是64位,執行
echo PATH=\$PATH:~/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin >> ~/.bashrc
source ~/.bashrc
並且64位系統也要安裝32位的編譯器的支持
sudo apt-get install lib32stdc++6
sudo apt-get install libc6:i386
sudo apt-get install lib32z1
進入Linux源碼目錄,進行交叉編譯的配置
KERNEL=kernel7
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- bcm2709_defconfig
編譯
進入Linux源碼目錄,執行
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- zImage modules dtbs
或者你的處理器有多個線程,可以使用-jn來加速編譯
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- zImage modules dtbs -j4
這個過程應該要持續幾十分鐘,取決於電腦運行速度。喝杯茶等一下吧~
部署到SD卡
首先將插入裝有系統的內存卡讀卡器,並在虛擬機內掛載。
查看分區在/dev下的名稱
lsblk
sdc1是boot分區,sdc2是rootfs分區。
接下來進行掛載。首先在/mnt下創建兩個文件夾
sudo mkdir /mnt/fat32
sudo mkdir /mnt/ext4
然後將sdc1和sdc2分別掛載在fat32和ext4
sudo mount /dev/sdc1 /mnt/fat32
sudo mount /dev/sdc2 /mnt/ext4
首先安裝內核模塊到/mnt/ext4,定位到內核源碼文件夾下,執行
sudo make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- INSTALL_MOD_PATH=/mnt/ext4 modules_install
接下來的操作都是對boot分區進行,也就是/mnt/fat32
備份原本的內核,本次調試發現,kernel7.img是樹莓派所使用的內核,所以我們對樹莓派的kernel7.img進行備份
mv kernel7.img kernel7-pre.img
將內核源碼中的zImage重命名爲kernel7.img(所在位置:linux-rpi-4.9.y/arch/arm/boot)
mv zImage kernel7.img
或者使用tools下的工具進行類型轉換
cd tools/mkimage
./imagetool-uncompressed.py ~/linux-rpi-4.9.y/arch/arm/boot/zImage
這樣生成的名稱爲kernel.img,將他重命名爲kernel7.img
mv kernel.img kernel7.img
**********************************************
如果出現python編譯的錯
/usr/bin/env python\r no such file or directory
則是由於windows下編寫的python代碼不符合Linux下的規範,使用以下方式進行轉碼
sudo apt-get install dos2unix
dos2unix <filename>
**********************************************
將生成的kernel複製到/mnt/fat32下
sudo cp ~/linux-rpi-4.9.y/arch/arm/boot/kernel7.img /mnt/fat32
或者
sudo cp ~/tools/mkimage/kernel7.img /mnt/fat32
複製.dts文件和README文件
sudo cp ~/linux-rpi-4.9.y/arch/arm/boot/dts/*.dtb /mnt/fat32
sudo cp ~/linux-rpi-4.9.yarch/arm/boot/dts/overlays/README /mnt/fat32/overlays
至此樹莓派內核更新完成,插入到樹莓派中試一試