树莓派RaspberryPi内核编译

作为一个(曾经的)内核开发者,弄到块板子怎么能不重新编译内核?系统配好跑起来后的第二件事,就是编译内核了。在树莓派上编译内核很简单,基本上就是按照官方文档跑脚本,先放GitHub上的Script传送门build/kernel.sh

系统简介

文件系统

树莓派的文件系统设计还是不错的,能比较方便地更新内核和各种固件。整个文件系统分为两个部分:Fat32分区和Ext4分区。Fat32分区是mount到/boot上的,里面放了内核和启动的核心固件;Ext4就是一般的根文件系统了,放其他的所有东西,包括firmware和各种ko等。这种设计免去了用户烧录的麻烦,只是他们的bootloader没有开放源码,对于极客来说是很不爽的事情。
所谓的系统更新,就是每次编译kernel之后,直接把生成的文件放到特定的地方,重启就行。这也是为什么系统自带的工具rpi-update可以自动更新内核、firmware等等一切东西。

硬件的选择和启动

树莓派一代和二代用的两个不同的ARM芯片,这个差别在操作系统中并没有体现出来,我是指:官方提供的系统镜像是同一个。开始我很奇怪,后来看到了它的文件系统,才明白,它是靠不同的kernel文件名来区分的。这两种板子的platform分别叫”bcm2708”和”bcm2709”,启动的时候bootloader会根据硬件情况自动区分,读取不同的kernel image,进而load不同的firmware和driver。

你看到的是非授权版本!爬虫凶猛,请尊重知识产权!

转载请注明出处:http://conanwhf.github.io/2016/01/12/rpi-kernel/

访问原文「树莓派RaspberryPi内核编译」获取最佳阅读体验并参与讨论

源码下载 & 环境准备

要说编译内核有什么好准备的,那恐怕就是要准备一个好点的网络环境和大大的耐心了。不算下载source code,我整个系统编了五六个小时吧。好在编译是一直有输出的,有点盼头,不然真是要cancel掉了……
先是源码下载:

git clone --depth=1 git://github.com/raspberrypi/linux.git linux  

然后是工具的准备,最好先apt-get -y update一下

sudo apt-get -y install gcc make bc screen ncurses-dev

正式编译(二代B为例)

源码和编译环境准备好了以后,就要开编了。kernel的config文件官方已经给出,什么都不改也是可以跑得很好的,看看有什么要改的然后就让它跑着自己睡觉去吧:

KERNEL=kernel7
make bcm2709_defconfig
make menuconfig

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 scripts/mkknlimg arch/arm/boot/zImage /boot/$KERNEL.img

完成

一觉醒来,终于跑完了!看看输出有没有什么错误,不要太鲁莽。如果没什么问题,就可以reboot了,enjoy!

万一……

万一,编译出了什么问题,系统跑不起来了……🤔我是不是应该先写这一部分?最简单的办法当然是重烧官方img,不过码农怎么会这么粗暴……你只要备份好/boot, /lib/firmware, /lib/modules这三个文件夹就行了。
最坏的情况,你之前没有备份?另外拿张卡,烧进官方系统跑起来,插入之前的卡,mount上去(系统应该会自动做了,在~/media/底下),更新那三个文件夹。
最最坏的情况,你没有第二张卡?那只好simulate一个disk出来,把上面的解决办法在主机上做一遍了……😏