linux内核配置——树莓派3B+

树莓派内核文件的获取

如果想要树莓派的内核文件,可以到

Raspberry Pi · GitHub

中选择linux(在连接树莓派的终端中利用指令uname -r来知道自己的树莓派版本)

选择对应的版本,在code里选择download.zip下载压缩包,放到windows中自己之前弄过的共享文件夹中,方便在Ubuntu中文件的传递

我们把下载好的压缩包放在一个创建好的文件夹中(SYSTEM),解压,目的是为了后续配置文件做好准备

驱动代码的编写

驱动代码的编译需要一个提前编译好的内核

        编译内核就需要配置

                配置的最终目标会生成.config文件,该文件指导Makefile去把有用的东西组织成内核

第一种方式:

厂家配linux内核源码,比如买树莓派,树莓派的linux内核源码商家会一并给你

查找各种内核源码的指令是:find -name *_defconfig

配置对应的内核源码:

cp 厂家.config .config

第二种方式:

make menuconfig 一项项配置,通常是基于厂家的config来配置

第三种方式:

完全自己来

我们把这个为什么配置以及方式有哪几种说清楚后,开始我们的配置工作

如何配置树莓派的linux内核

参考博文

树莓派-内核开发-说明 下载代码 编译 替换内核_树莓派-内核开发-说明 下载代码 编译 替换内核 nicekwell-CSDN博客

1、配置交叉编译(之前有记笔记,或者点击上述链接进入后进行配置)

2、配置config

Linux源码中有很多工程:

树莓派1的工程是bcmrpi_defconfig

树莓派2,3的工程是bcm2709_defconfig

我们选择使用源码里自带的config(内核配置)

ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- KERNEL=

指定ARM架构      指定编译器            树莓派         

kernel7 make bcm2709_defconfig

主要核心指令

注:上面这个指令不是分段进行

完整指令如下:

ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- KERNEL=kernel7 make bcm2709_defconfig

(当然我的建议是先把下面提到的树莓派linux内核编译提到的必要的库安装完成之后在执行这个指令)

这个指令在/home/wbw/SYSTEM/linux-rpi-4.14.y这个目录下进行

注:在你自己解压好的内核源码目录下也就是(linux-rpi-4.14.y)我之所以是4.14是因为我的树莓派版本是4.14,前面有提到。

此命令功能是获取bcm2709_defconfig的配置到.config里

树莓派linux内核编译

安装必要的库:

sudo apt-get install bc

sudo apt-get install libcurses5-dev libncursesw5-dev(或者sudo apt-get install libncurses5-dev)

如果你在安装ncurses5出现了Unable to locate package libcurses5-dev问题

问题样式:

                                Reading package lists... Done

                                Building dependency tree       

                                Reading state information... Done

                                E: Unable to locate package libcurses5-dev

解决方法如下:

可以考虑是apt源的问题,修改apt源

(1)备份下apt源

sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak

(2)修改/etc/apt/sources.list文件内容

1.首先我们在修改文件内容之前先确认我们自己的Ubuntu版本和code name

可以在终端输入如下指令:

lsb_release -a

linux内核配置——树莓派3B+_第1张图片

2./etc/apt# vi sources.list(在/rtc/apt目录下)(这里建议加sudo,这样可以修改里面的内容)

3.然后可以到阿里云官网(https://developer.aliyun.com/mirror/)找到Ubuntu的下载地址

linux内核配置——树莓派3B+_第2张图片

4.点击进去,下滑,找到对应的源,复制

5.回到linux终端进入/etc/apt# sudo vi sources.list将里面的源替换掉,退出文件

如下是18.04(bionic)的源

deb https://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse

deb-src https://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse

deb https://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse

deb-src https://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse

deb https://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse

deb-src https://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse

# deb https://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse

# deb-src https://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse

deb https://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse

deb-src https://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse

(3)更新源

sudo apt-get update(也是在/etc/apt目录下进行)

(4)再执行一次sudo apt-get install libcurses5-dev libncursesw5-dev(或sudo apt-get install libncurses5-dev)

(继续上面安装必要的库说)

sudo apt-get install zlib1g:i386

sudo apt-get install libc6-i386 lib32stdc++6 lib32gcc1 lib32ncurses5

1、执行menuconfig

ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- KERNEL=kernel7 make menuconfig

会进入这样一个界面

linux内核配置——树莓派3B+_第3张图片

对图片中的一些东西进行解释:

General setup —>(通用选项)

[ * ] Enable loadable module support —> 内核模块选项

[ * ]Enable the block layer —> 块设备逻辑层选项(大文件支持、分区、I/O调度)

System Type —>(平台选项)

Bus support —> 总线选项

Kernel Features —>内核特征

Boot options —> 引导选项

CPU Power Management —> CPU电源管理选项

Floating point emulation —> 浮点运算

Userspace binary formats —> 用户程序格式

Power management options —> 电源管理选项

[*] Networking support —> 网络协议选项

Device Drivers —> 设备驱动

Firmware Drivers ---- 驱动固件选项

File systems —> 文件系统选项

Kernel hacking —> 内核调试选项

Security options —> 安全模块选项

[*]:编译进内核(*代表Y,编译进内核,zImage包含了驱动)

[M]:编译成模块(以模块的方式生成驱动文件xxx.ko,系统启动后,

                通过命令inmosd xxx.ko来加载驱动,也可以减小一些内核大小)

[ ]:表示不需要的部分

空格可切换修改。

修改完毕后,保存退出

如果没有改的就不用执行这一步。

2、编译

ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- KERNEL=kernel7 make -j4 zImage modules dtbs

-j4:指定用多少电脑资源进行编译

zImage:生成内核镜像

modules:要生成驱动模块

dtbs:生成配置文件

编译成功后,看到源码树目录多了vmlinux,失败则无此文件

成功后,目标zImage镜像在arch/arm/boot底下

我们要打包zImage成树莓派可用的xxx.img

3、打包zlmage文件

直接用linux源码包里的工具:

./scripts/mkknlimg arch/arm/boot/zImage ./kernel_new.img(在linux-rpi-4.14.y目录下使用)

可能会出现以下报错:

bash: ./scripts/mkknlimg:No such file or directory

这是因为这个版本的linux源码包将mkknlimg工具给淘汰了,可以从一些旧版本的源码包中复制过来,也可以使用,同样位于/scripts目录。

在本目录生成一个kernel_new.img文件,这个文件就是要放到sd卡中的文件。

注:网上很多地方说的用 tools/mkimage/imagetool-uncompressd.py 的方法不行!!

4、将树莓派SD卡的U盘映射到虚拟机上

将树莓派SD卡插到读卡器,再与电脑连接,然后映射到虚拟机,过程中虚拟机可能会识别不到。

我的原因是会被windows系统抢占,这个时候需要在虚拟机——>可移动设备——>打开Super Top Mass Storage Device

指令dmesg可以看到内核信息

linux内核配置——树莓派3B+_第4张图片

出现 sdb1 和 sdb2 说明成功映射到虚拟机上了。

把树莓派的sd卡插入Ubuntu系统电脑,树莓派的sd卡有两个分区

一个是fat分区(sdb1),是boot相关的内容,kernel的img文件就放在这个分区里;

一个是ext4分区(sdb2),也就是系统的根目录分区

一般插入ubuntu会自动挂载,fat分区不需要root权限,ext4需要root权限操作

5、数据拷贝

创建两个文件夹为挂载做准备

mkdir data1

mkdir data2

sudo mount /dev/sdb1 data1  

    //挂载U盘的sdb1文件分区到当前路径下的data1文件夹,   

    //该分区为fat分区,是boot相关的内容,kernel的img.

sudo mount /dev/sdb2 data2  

    //挂载U盘的sdb2文件分区到当前路径下的data2文件夹,

    //该分区为ext4分区,也就是系统的根目录分区.

这个地方需要注意一些问题:关于树莓派3B+内核配置遇到的一个问题——nl80211-CSDN博客

(一定要点进去看看,很重要!!!)

6、安装modules(内核的驱动文件)

运行指令安装,因为内核配置时,有一部分是编译成模块的形式配置进来的,安装后hdmi接口、usb、wifi、io口等等的设备才能使用,所以需要这么一步。

如下指令:

sudo ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- KERNEL=kernel7 make INSTALL_MOD_PATH=[ext4] modules_install

[ext4]为第二分区(sdb2)虚拟机上挂载的地址(data2的位置),需要根据自己的地址更改

eg:sudo ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- KERNEL=kernel7 make INSTALL_MOD_PATH=home/wbw/data2 modules_install

这个指令一定要在解压的源码文件夹(/linux-rpi-4.14.y)里运行。 

7、更新内核文件

有两种方式更新内核文件,

第一种:

运行以下指令,将生成的kernel_new.img文件拷贝到boot分区(也就是data1文件夹)。

cp ./kernel_new.img ~/data1

还要修改boot分区的config.text文件。

vi ~/data1/config.text

 //在最后一行加入kernel=kernel_new.img

第二种:

先备份

cd /home/wbw/data1(在用户目录运行)

sudo cp kernel7.img kernel7OLD.img

再把编译新生成的拷贝到data1,起名kernel7.img

sudo cp kernel_new.img /home/wbw/data1/kernel7.img(在linux-rpi-4.14.y目录运行)

检查:

du kernel_new.img -h

可以查看文件的大小

每个文件都有一个独一无二的特殊编码号(md5),检查拷贝文件是否损坏可以通过查看两个文件的md5是否相同来确认

指令为:

md5sum kernel_new.img

md5sum /home/wbw/data1/kernel7.img

8、拷贝配置相关文件

sudo cp arch/arm/boot/dts/.*dtb* [fat]/

sudo cp arch/arm/boot/dts/overlays/.*dtb* [fat]/overlays/

sudo cp arch/arm/boot/dts/overlays/README [fat]/overlays/

[fat]为第一分区(sdb1)虚拟机上挂载的地址(data1的位置),需要根据自己的地址更改。

这样就完成了,然后断开与虚拟机的连接,windows连接,在出现的U盘里把cmdline.txt更改成以下内容。

dwc_otg.lpm_enable=0 console=tty1 console=serial0,115200 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait

最后,将SD卡插回树莓派,用串口查看是否刷机成功。

今天的分享就到这里啦!!!

你可能感兴趣的:(树莓派,linux)