树莓派4b编译内核问题

CPU/显卡/打印机/USB设备等硬件问题
回复
maple412
帖子: 45
注册时间: 2017-11-25 22:36

树莓派4b编译内核问题

#1

帖子 maple412 » 2021-12-23 14:09

想把树莓派4b编译到4.19这个内核版本。按照官网的指导书编译过程如下
git clone --branch rpi-4.19.y https://github.com/raspberrypi/linux
KERNEL=kernel8
make bcm2711_defconfig
make -j4 Image modules dtbs
sudo make modules_install
sudo cp arch/arm64/boot/dts/broadcom/*.dtb /boot/
sudo cp arch/arm64/boot/dts/overlays/*.dtb* /boot/overlays/
sudo cp arch/arm64/boot/dts/overlays/README /boot/overlays/
sudo cp arch/arm64/boot/Image /boot/$KERNEL.img

以上都正常执行了。执行reboot后uname -r还是原来的5.4.0-1042-raspi
boot目录下看到貌似还是链接的以前的内核
drwxr-xr-x 5 root root 4096 Dec 23 06:08 ./
drwxr-xr-x 20 root root 4096 Dec 23 05:31 ../
-rw------- 1 root root 4167480 Jul 29 16:30 System.map-5.4.0-1042-raspi
-rw------- 1 root root 4169434 Nov 24 07:55 System.map-5.4.0-1047-raspi
-rw-r--r-- 1 root root 25483 Dec 23 05:31 bcm2710-rpi-2-b.dtb
-rw-r--r-- 1 root root 27143 Dec 23 05:31 bcm2710-rpi-3-b-plus.dtb
-rw-r--r-- 1 root root 26524 Dec 23 05:31 bcm2710-rpi-3-b.dtb
-rw-r--r-- 1 root root 25338 Dec 23 05:31 bcm2710-rpi-cm3.dtb
-rw-r--r-- 1 root root 41185 Dec 23 05:31 bcm2711-rpi-4-b.dtb
-rw-r--r-- 1 root root 21027 Dec 23 05:31 bcm2837-rpi-3-b-plus.dtb
-rw-r--r-- 1 root root 20238 Dec 23 05:31 bcm2837-rpi-3-b.dtb
-rw-r--r-- 1 root root 219341 Jul 29 16:30 config-5.4.0-1042-raspi
-rw-r--r-- 1 root root 219373 Nov 24 07:55 config-5.4.0-1047-raspi
lrwxrwxrwx 1 root root 43 Dec 23 06:07 dtb -> dtbs/5.4.0-1047-raspi/./bcm2711-rpi-4-b.dtb
lrwxrwxrwx 1 root root 43 Dec 23 06:07 dtb-5.4.0-1047-raspi -> dtbs/5.4.0-1047-raspi/./bcm2711-rpi-4-b.dtb
drwxr-xr-x 3 root root 4096 Dec 23 06:04 dtbs/
drwxr-xr-x 3 root root 7168 Jan 1 1970 firmware/
lrwxrwxrwx 1 root root 27 Dec 23 06:03 initrd.img -> initrd.img-5.4.0-1047-raspi
-rw-r--r-- 1 root root 29950584 Aug 19 10:38 initrd.img-5.4.0-1042-raspi
-rw-r--r-- 1 root root 30359059 Dec 23 06:07 initrd.img-5.4.0-1047-raspi
lrwxrwxrwx 1 root root 27 Aug 19 10:37 initrd.img.old -> initrd.img-5.4.0-1042-raspi
-rwxr-xr-x 1 root root 14010880 Dec 23 05:27 kernel8.img*
drwxr-xr-x 2 root root 12288 Dec 23 05:27 overlays/
lrwxrwxrwx 1 root root 24 Dec 23 06:03 vmlinuz -> vmlinuz-5.4.0-1047-raspi
-rw------- 1 root root 8400065 Jul 29 16:30 vmlinuz-5.4.0-1042-raspi
-rw------- 1 root root 8409086 Nov 24 07:55 vmlinuz-5.4.0-1047-raspi
lrwxrwxrwx 1 root root 24 Aug 19 10:37 vmlinuz.old -> vmlinuz-5.4.0-1042-raspi

请各位专家指导还需要做什么配置
头像
astolia
论坛版主
帖子: 6542
注册时间: 2008-09-18 13:11

Re: 树莓派4b编译内核问题

#2

帖子 astolia » 2021-12-23 21:57

首先,ubuntu做的树莓派系统的启动分区是挂载到/boot/firmware下面的,其次/boot/firmware/config.txt作为树莓派的启动配置文件,里面应该有指明内核文件的kernel=vmlinuz和指明initramfs的initramfs initrd.img followkernel这么两句。

所以你需要把相关的文件复制到/boot/firmware下面,并且把kernel8.img改名或修改config.txt里的内核文件名称。另外你还需要用update-initramfs或mkinitramfs来创建和你内核版本对应的initrd.img文件,同样复制到/boot/firmware下面
maple412
帖子: 45
注册时间: 2017-11-25 22:36

Re: 树莓派4b编译内核问题

#3

帖子 maple412 » 2021-12-24 10:41

astolia 写了: 2021-12-23 21:57 首先,ubuntu做的树莓派系统的启动分区是挂载到/boot/firmware下面的,其次/boot/firmware/config.txt作为树莓派的启动配置文件,里面应该有指明内核文件的kernel=vmlinuz和指明initramfs的initramfs initrd.img followkernel这么两句。

所以你需要把相关的文件复制到/boot/firmware下面,并且把kernel8.img改名或修改config.txt里的内核文件名称。另外你还需要用update-initramfs或mkinitramfs来创建和你内核版本对应的initrd.img文件,同样复制到/boot/firmware下面
问题一:哪些文件需要copy 到/boot/firmware下面
问题二:config.txt下面只有配置kernel的,没有initramfs initrd.img这些配置
# Please DO NOT modify this file; if you need to modify the boot config, the
# "usercfg.txt" file is the place to include user changes. Please refer to
# the README file for a description of the various configuration files on
# the boot partition.

# The unusual ordering below is deliberate; older firmwares (in particular the
# version initially shipped with bionic) don't understand the conditional
# [sections] below and simply ignore them. The Pi4 doesn't boot at all with
# firmwares this old so it's safe to place at the top. Of the Pi2 and Pi3, the
# Pi3 uboot happens to work happily on the Pi2, so it needs to go at the bottom
# to support old firmwares.

[pi4]
kernel=uboot_rpi_4.bin
max_framebuffers=2

[pi2]
kernel=uboot_rpi_2.bin

[pi3]
kernel=uboot_rpi_3.bin

[all]
arm_64bit=1
device_tree_address=0x03000000

# The following settings are "defaults" expected to be overridden by the
# included configuration. The only reason they are included is, again, to
# support old firmwares which don't understand the "include" command.

enable_uart=1
cmdline=cmdline.txt

include syscfg.txt
include usercfg.txt

问题三:update-initramfs 这个没用过,需要怎么使用
头像
astolia
论坛版主
帖子: 6542
注册时间: 2008-09-18 13:11

Re: 树莓派4b编译内核问题

#4

帖子 astolia » 2021-12-26 9:33

maple412 写了: 2021-12-24 10:41 问题一:哪些文件需要copy 到/boot/firmware下面
看不懂我上面说的意思?那我再说清楚点:树莓派官方出的raspbian之类的系统,启动分区是挂载到/boot下,而ubuntu做的树莓派系统,启动分区是挂载到/boot/firmware下,所以你在官方教程中看到cp xxx /boot/yyy这样的操作,在ubuntu上就要执行cp xxx /boot/firmware/yyy
maple412 写了: 2021-12-24 10:41 问题二:config.txt下面只有配置kernel的,没有initramfs initrd.img这些配置
喔你这是旧版的启动文件配置。我记得uboot_rpi_4.bin好像是直接加载启动分区里的vmlinuz和initrd.img。直接指定kernel为内核文件也可以的,initramfs没有也可以自己加上
maple412 写了: 2021-12-24 10:41 问题三:update-initramfs 这个没用过,需要怎么使用
小知识:对于一个不知道怎么用的命令xxx,可以用xxx --help来看各个参数的意义,还可以用man xxx来看详细的说明手册
maple412
帖子: 45
注册时间: 2017-11-25 22:36

Re: 树莓派4b编译内核问题

#5

帖子 maple412 » 2021-12-28 10:33

astolia 写了: 2021-12-26 9:33
maple412 写了: 2021-12-24 10:41 问题一:哪些文件需要copy 到/boot/firmware下面
看不懂我上面说的意思?那我再说清楚点:树莓派官方出的raspbian之类的系统,启动分区是挂载到/boot下,而ubuntu做的树莓派系统,启动分区是挂载到/boot/firmware下,所以你在官方教程中看到cp xxx /boot/yyy这样的操作,在ubuntu上就要执行cp xxx /boot/firmware/yyy
maple412 写了: 2021-12-24 10:41 问题二:config.txt下面只有配置kernel的,没有initramfs initrd.img这些配置
喔你这是旧版的启动文件配置。我记得uboot_rpi_4.bin好像是直接加载启动分区里的vmlinuz和initrd.img。直接指定kernel为内核文件也可以的,initramfs没有也可以自己加上
maple412 写了: 2021-12-24 10:41 问题三:update-initramfs 这个没用过,需要怎么使用
小知识:对于一个不知道怎么用的命令xxx,可以用xxx --help来看各个参数的意义,还可以用man xxx来看详细的说明手册
那我是否可以在config.txt中改成如下就可以了
kernel=KERNEL8.img
vmlinuz和initrd.img还需要单独指定么
头像
astolia
论坛版主
帖子: 6542
注册时间: 2008-09-18 13:11

Re: 树莓派4b编译内核问题

#6

帖子 astolia » 2021-12-28 11:12

maple412 写了: 2021-12-28 10:33 那我是否可以在config.txt中改成如下就可以了
kernel=KERNEL8.img
vmlinuz和initrd.img还需要单独指定么
看得出来你对linux内核编译每一步的作用和系统启动流程都不太清楚。如果你以前都没怎么接触过这些相对底层的东西,那最好去用树梅派官方出的系统而不是ubuntu。对新手来说资料更丰富,也不需要考虑系统间的差异。

你用make Image编译出来的内核文件是未压缩的,vmlinuz是压缩后的。就只有一个执行前要不要先解压缩,执行起来两者都是等价的
initrd.img的具体作用你可以自己去搜索一下,如果你不构建针对你内核的initrd文件,那么用的是原来针对5.4内核的initrd,很有可能会出问题。

另外有什么想法就大胆去尝试。反正系统都在sd卡上,改动文件前注意备份,改出了问题就还原。树梅派没那么容易弄坏的。
搞不清楚的东西多去查官方文档,对要执行的各种命令要修改的各种配置的用处都心里有个数,别稀里糊涂的糊弄过去。
maple412
帖子: 45
注册时间: 2017-11-25 22:36

Re: 树莓派4b编译内核问题

#7

帖子 maple412 » 2021-12-28 22:41

astolia 写了: 2021-12-28 11:12
maple412 写了: 2021-12-28 10:33 那我是否可以在config.txt中改成如下就可以了
kernel=KERNEL8.img
vmlinuz和initrd.img还需要单独指定么
看得出来你对linux内核编译每一步的作用和系统启动流程都不太清楚。如果你以前都没怎么接触过这些相对底层的东西,那最好去用树梅派官方出的系统而不是ubuntu。对新手来说资料更丰富,也不需要考虑系统间的差异。

你用make Image编译出来的内核文件是未压缩的,vmlinuz是压缩后的。就只有一个执行前要不要先解压缩,执行起来两者都是等价的
initrd.img的具体作用你可以自己去搜索一下,如果你不构建针对你内核的initrd文件,那么用的是原来针对5.4内核的initrd,很有可能会出问题。

另外有什么想法就大胆去尝试。反正系统都在sd卡上,改动文件前注意备份,改出了问题就还原。树梅派没那么容易弄坏的。
搞不清楚的东西多去查官方文档,对要执行的各种命令要修改的各种配置的用处都心里有个数,别稀里糊涂的糊弄过去。
我理解initrd.img需要替换成我内核编译后新成的。否则启动起来还是老的内核。执行 mkinitramfs -o /boot/initrd.img kernel-v8 kernel-v8在/lib/modules下编译的时候生成的。mkinitramfs会把/lib/modules/${kernel_version}/ 目录下的一些启动会用到的模块添加到initramfs中.但是执行完命令后,/boot下的initrd.img看上去没有更新。执行update-initramfs -u 显示还是更新的之前的内核image
头像
astolia
论坛版主
帖子: 6542
注册时间: 2008-09-18 13:11

Re: 树莓派4b编译内核问题

#8

帖子 astolia » 2021-12-31 10:27

maple412 写了: 2021-12-28 22:41 我理解initrd.img需要替换成我内核编译后新成的。否则启动起来还是老的内核。
我上面说过了,自己去查一下initrd.img的具体作用。initrd.img并不决定要用的内核版本。
maple412 写了: 2021-12-28 22:41 执行 mkinitramfs -o /boot/initrd.img kernel-v8 kernel-v8在/lib/modules下编译的时候生成的。
我上面说了两遍/boot和/boot/firmware的关系,你都没听?
maple412 写了: 2021-12-28 22:41 执行update-initramfs -u 显示还是更新的之前的内核image
你用man update-initramfs仔细看一下它的运行逻辑好吗?
回复