一、前言
樹莓派使用的鏡像比較舊了,可以通過三種方式進行升級。一種是本地下載編譯升級,即Local build,還有一種采用交叉編譯,第三種最簡單,輸入一條命令就可以升級。
下面主要講第一種方式。
二、升級過程
- 1、目前的內核版本,使用
uname -a
查看
- 2、使用
sudo apt-get install git bc
安裝必備軟件 - 3、使用
git clone --depth=1 https://github.com/raspberrypi/linux
下載最新內核 - 4、使用如下命令進行編譯前配置
cd linux
KERNEL=kernel7
make bcm2709_defconfig
- 5、make,共有三個東西需要make,這個過程會花費很少時間,同時為了避免出錯,可以分別make.
make -j4 zImage
make -j4 modules
make -j4 dtbs
- 6、執行 sudo make modules_install
進行安裝
- 7、依次使用如下命令拷貝
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
- 8、執行完上述步驟,不出錯的話,重啟后,內核應該就升級成功了。
三、升級情況
make的過程非常舊,如果不加參數 -j4
的話,編譯需要好幾個小時,加上參數使用 4核同時編譯,編譯速度明顯加快。時間如下:
make -j4 zImage 34min
make -j4 modules 66min
make -j4 dtbs <1min
除去兩個編譯過程特別耗時外,其他的指令都很快完成。
四、錯誤及解決方法
可能出現的錯誤
如上執行完了所有步驟,並沒有那一步出現錯誤。執行完步驟后查看版本號是沒有變化的,重啟后就無法網卡燈不閃爍,路由器看不到樹莓派連接,SSH自然登陸不上。沒有顯示器,因此看不出系統是否啟動,感覺應該是沒有。
目前不知道是什么原因導致的。升級完成后,/boot目錄下多了幾個.dts文件,刪除后試了不行。最新版的樹莓派官方系統默認不開啟SSH,需要在/boot目錄下手動添加一個名為ssh
的空白文件,添加了也不行。
拷貝升級前的/boot文件夾內容進行替換后,可以連上樹莓派,查看版本號並沒有更新。
解決方法
出現上面這個情況的原因是樹莓派無法boot,bootbin和升級后的內核並不兼容,也就是說原有的舊的bootbin不能boot新的內核。
可以使用新版本的固件文件替換。代碼在樹莓派github倉庫的firmware項目下。具體的替換有三個,如下:
bootcode.bin
fixup.dat
start.elf
將新版本的這三個文件拷貝到/boot目錄下替換掉原有的文件,便可以啟動了。
五、第二種方式
第二種方式是使用的交叉編譯,宿主機是搭建在VM虛擬機里的一個ubuntu。具體的步驟可以看官網的文檔,交叉編譯的工具在樹莓派github倉庫tools項目中。
編譯的原理都差不多,也可以使用menuconfig來自定義編譯的內核。由於虛擬機的ubuntu也僅僅只分配了一個CPU核,實際的編譯效果和樹莓派四核編譯時間雖有減少,但也不是很多。
編譯完成之后見內存卡插入電腦,掛載進ubuntu里,拷貝新編譯好的內核和模塊進去,便可。若出現不開機的情況,和上面提到的錯誤類型是一致的。也就是固件和內核不兼容,比如說我這里使用內核4.1,升級到最新的內核4.9之后就出現這個問題,同時升級固件就不會。
六、第三種方式
使用命令升級,最簡單也不會出錯。
sudo apt-get install --reinstall raspberrypi-bootloader raspberrypi-kernel