编译自定义的树莓派内核

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_21078557/article/details/83044057

写在最前面,以前一直想自己做一个系统来玩玩儿,可是苦于找不到资料,外加遇到很多的问题都不知道如何下手,所以。。。才有本博客,避免其他道友和我一样,浪费自己的时间不去撩小姐姐

博客实现的功能:通过自己的电脑 -->交叉编译<-- 树莓派的内核,即定制内核,剪裁系统等等说法,如有不对,欢迎大神指导批评。如果不是你想查阅的内容,请点击右上角X,关闭此页面。


要实现树莓派的内核定制实际上和做Linux的内核剪裁原理是一样一样的,下面,我主要分为以下几个步骤进行,亲测是100%成功了的,网上很多人都说的半前不后的,命令也写错,真的是,害的我走了超级多的弯路,当然,还是得感谢各位的指导,才有了本博客的以下内容。


步骤如下:
1、准备需要编译系统的Linux系统

2、配置编译raspberry内核需要的各种环境

3、下载raspberry Linux内核源代码

4、配置新内核功能(即配置需要将什么内容编译进内核,将什么内容编译成为模块,什么内容删除)

5、构建新内核

6、将新内核安装到镜像文件系统中

7、烧写xxx.img镜像文件到SD卡中


以下是详细的配置步骤和命令:

1、准备需要编译系统的Linu系统

[1] 本博客的环境为 **Ubuntu18.04**,如果你的电脑不是,我建议你装一个虚拟机,这样会省去你遇到错误问题的概率,因为很多库或者包没有。

2、配置编译raspberry内核需要的各种环境

[1] 更新系统源:sudo apt-get update

[2] 安装一些必要的工具库:sudo apt-get install -y bc build-essential gcc-aarch64-linux-gnu git unzip

[3] 安装配置系统内核包:sudo apt-get install kernel-package 

[4] 安装配置内核menuconfig的辅助工具:sudo apt-get install libncurses5-dev

OK,到这里,编译树莓派需要用到的包都已经安装好了,接下来就可以进入正题了。


3、下载raspberry Linux内核源代码

[1] 获取源代码:git clone --depth=1 -b rpi-4.8.y https://github.com/raspberrypi/linux.git

备注:在这个git上面有很多的工具,有需要自己去寻找吧。


4、配置新内核功能

所谓的配置新内核,实际上就是把需要的内容编译进内核,将一些不常用的内容编译成为模块,将不用的内容删除,这样做的一个好处就是,可以减轻整个内核的大小,移除一些开机自启的模块设备,提升开机速度,使得整个系统的流畅性更加棒棒哒~~~,反正就是好处多,等待自己以后慢慢领悟了。

划重点了,在这里,推荐一个网站,里面介绍了如何配置Linux系统的内核,以及相关Linux内核剪裁的方法,我没有实际去验证是否可靠,但是能知道大概的步骤应该是他所描述的。网站链接

备注:将下载的源代码放在桌面(个人推荐),便于等会儿使用。

[1] 将下载的源代码解压并移动到桌面;

如果不想自己去配置内核,执行这一句代码,即可跳过本小节余下内容:

 执行命令:make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- bcmrpi3_defconfig
 实际上就是生成这个.config内核配置文件。
 bcmrpi3_defconfig 这个文件在我的电脑的这个位置:
 /home/kingderzhang/桌面/linux-rpi-4.14.y/arch/arm64/configs

里面还有一个defconfig文件,如果不用下面介绍的方法去配置,也可以直接修改这里的配置文件,在修改之前建议你备份一份。好处你懂的 ^… _…^ ~ ~ ~.

在这里,插播一条广告,偶然间看到这篇博客,写的非常不错,是介绍Linux的源码结构的,写的算是全网比较详细的了,推荐瞅瞅


[2] 如果需要自己配置内核,则需要使用 menuconfig 配置新内核的功能,进入桌面的 linux-rpi-4.14.y 这个文件夹,
ls 一下,你会看到很多的文件,里面是按照树型结构来存放代码的,内容太多,不做解释,
有兴趣自己去找相关的博客吧。

在rpi-4.14.y 这个文件夹内打开终端并输入: make  menuconfig 

注意:这一步骤是对你的新内核进行功能模块的选择,新手请谨慎操作,不会的,进去看看就好了。
在输入make menuconfig 命令后,会显示这个界面,但是,我建议在看下面内容之前,先去补习一下基础知识,飞机在这里
menuconfig

这里不做内核的配置说明,需要的请看上面给出的内核编译网站进行相应的配置即可,在这里,我自己取消了树莓派的开机提示打印信息,具体的做法如下:
1、在linux内核顶层目录下执行:make menuconfig
2、修改选项:
Device Drivers —>
Character Devices —>
[*] Support for console on virtual terminal
去掉选项 [ ]中的 *,按空格,打印信息就不会在显示屏或LCD上显示,修改后这一项的显示应该如下所示:[ ] Support for console on virtual terminal
注意:之前我写的是–>然后就是两次Esc,保存即可,这样保存实际上是错误的,如果这样保存了,系统会覆盖之前的配置,导致你进行编译的时候,系统会询问你很多的配置项,请不要这样去做,实力挖坑。
ok,那问题来了,那该如何去做,才能使自己现在修改的保存到原来配置的基础之上,请看上面的那张界面图,底部实际上有 5 个选项的,使用 Tab 键移动到 Save 这个地方,然后回车,就保存到默认配置基础之上了,哇,最开始没有发现,坑自己啊。

备注:如果对内核配置错误,或者想重新配置,需要执行这句指令进行内核配置文件清理:sudo make distclean


5、构建新内核

在上面所有的准备工作做好了之后,就可以开始进行内核编译了,这是一个漫长的过程,耐心等待。
需要在linux-rpi-4.14.y 文件夹的主目录下执行如下代码,就是指定编译器进行内核编译:

 make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu-  -j  20

备注:后面的 -j 20 代表用多少核去编译,因为我电脑是20核的,所以,肆意妄为的使用我的CPU。按照官方给的参数,应该是1.5的整数倍。

貌似我的电脑有点牛逼,编译整个系统的内核只用了七分钟左右,扎实让我有点尴尬,他们的电脑一般都是半个小时起。


6、将新内核安装到镜像文件系统中

此过程大概需要两步,第一步,挂在官方提供的img镜像文件到Ubuntu系统中,第二步,替换原来的系统内核,第三步,安装内核以及模块并配置boot启动为新编译的内核。
6.1 挂载img镜像文件
都说了要挂载镜像文件,那就是需要镜像文件了,我这里使用的是 raspberry lite 版本,没有使用desktop,主要是方便,不需要界面,后面在编译Qt5到上面,就可以做成嵌入式应用了。下载地址

建议你也把这个下载好的镜像解压后放在桌面位置方便操作。

在桌面打开终端,查看当前树莓派系统的详细信息,便于后面我们挂载到 /mnt 上

在img镜像文件的同位置下输入如下命令: sudo fdisk -l 2018-10-09-raspbian-stretch-lite.img 

这个命令的意思就是查看当前这个镜像文件的img区块位置,里面的起点末尾扇区的值需要留心观察,等会儿我们会用于计算挂载的地址偏移量。如果你下载的img和我的一样,可以直接输入我的命令即可,不一样的,以你们实际看到的为准。
在这里插入图片描述

挂载系统到/mnt:sudo mount -o loop,offset=50331648 2018-10-09-raspbian-stretch-lite.img /mnt
offset = 50331648 = 98304 * 512

挂载启动分区到/mnt/boot:sudo mount -o loop,offset=4194304,sizelimit=45920768 2018-10-09-raspbian-stretch-lite.img /mnt/boot
offset = 4194304 = 512 * 8192
sizelimit = 45920768 =512 * 89689

注意:上面的数值计算请对照我给的图片,只要返回错误,就证明你计算的值错误,请好好对比检查。到此,系统原生自带的img镜像就全部挂载到了我们的Ubuntu系统中的/mnt目录下了。

6.2 替换原来的内核
注意,做这一步的前提是需要你编译好内核。
刚刚忘记说了,我们编译好的内核,在这个地方:/home/kingderzhang/桌面/linux-rpi-4.14.y/arch/arm64/boot,里面有一个文件叫做Image,就是我们已经编译好的新内核,可以使用 ls -l 就能看到内核文的生成时间。然后就是把这个内核文件Image拷贝到/mnt/boot/下,并且给他去个名字,叫做kernel8.img好了。因为里面已经有一个kernel7.img了

sudo cp Image /mnt/boot/kernel8.img
备注:目前我的位置在 /home/kingderzhang/桌面/linux-rpi-4.14.y/arch/arm64/boot下

然后在拷贝系统启动的dtb文件,dtb文件位于:/home/kingderzhang/桌面/linux-rpi-4.14.y/arch/arm64/boot/dts/broadcom
进入这个目录,然后拷贝dtb文件。

命令如下:sudo cp bcm2710-rpi-3-b.dtb /mnt/boot/
备注,里面有很多的dtb文件,是针对不同树莓派型号的,根据你自己的实际板子来。

注意:上述两步的拷贝均是切换到了文件所在位置执行的。

6.3 安装内核模块并配置内核
上面的步骤均操作无误后,执行安装命令,这一句安装命令需要在内核源代码的最顶层目录进行执行,我的执行路径如下:/home/kingderzhang/桌面/linux-rpi-4.14.y

执行命令:sudo make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- INSTALL_MOD_PATH=/mnt modules_install

OK,到这里,基本上就完成了,最后一点的收尾工作,配置新的img镜像。

执行下面命令:sudo echo kernel=kernel8.img >> /mnt/boot/config.txt

注意:这个kernel8.img就是你拷贝的时候取的新内核名字。如果提示权限不够,则手动加入。

OK,大功告成,取消挂载的分区,如果提示你系统忙,关闭所有的终端后再重新执行即可。

sudo umount /mnt/boot 
sudo  umount /mnt

7、烧写xxx.img镜像文件到SD卡中

最后的收尾工作,就是将img烧写到SD卡中,然后,上电,启动。enjoy yourself。


附:
参考网址:
http://shumeipai.nxez.com/2017/11/07/build-ubuntu-64-bit-system-on-raspberry-pi-by-yourself.html
https://www.raspberrypi.org/documentation/linux/kernel/building.md

猜你喜欢

转载自blog.csdn.net/qq_21078557/article/details/83044057