Xilinx ZCU106 SD卡启动,找不到rootfs

8 篇文章 0 订阅
2 篇文章 0 订阅

1.引言

最近在Xilinx的ZCU106板子上移植linux系统,想把rootfs放在sd卡的单独分区上,方便开发。但是按照官方文档和官方bsp生成的BOOT.bin、image.ub、boot.scr等文件,boot并不能找到sd卡的另一个分区挂载rootfs。找遍了全网的解决方法,基本没有解决。最终经过自己修改boot文件,解决的了问题。特纪录在此。如有相同问题,希望能有参考。

2.问题描述

采用的bsp:xilinx-vcu-zcu106-v2020.1-final.bsp
采用的petalinux:petalinux2021
SD卡分区:

分区1:BOOT     1.5G FAT32
分区2:rootfs   14G Ext4

boot的问题:

[    8.869566] VFS: Cannot open root device "(null)" or unknown-block(0,0): error -6
[    8.876932] Please append a correct "root=" boot option; here are the available partitions:
.
.
.
[    9.026230] Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(0,0)

简单来说就是boot找不到rootfs了,所以围绕这个去解决就可以。

3.分析问题

3.1 petaliinux工程配置问题

在使用SD卡作为rootfs的引导分区时,需要在petalinux工程中更改部分设置。进入到petalinux工程目录下,运行petalinux-config

  1. 选择"Image Packaging Confguraton → Root flesystem type”
    选择SD card、或者Ext4,不同版本显示不同。
    返回查看"Device node"的分区是不是对的,如果SD的分区1是rootfs,则该项应该为/dev/mmcblk0p1
    博主的SD分区2是rootfs,因此该项为/dev/mmcblk0p2
  2. 选择"DTG Setting → Kernel bootargs"
    检查bootargs是否设置正确
    使能autoconfig bootargs
    使能earlyprintk
    bootargs中,root的设置与Device node一致

3.2 SD卡问题

主要是SD卡的分区和文件的问题,按照博主的分区应为

  1. 50M 空闲区域
  2. 1.5G FAT32分区
  3. 剩余 Ext4分区

分区没有问题,检查是否可读写,如果SD写保护或读保护也会存在问题
然后检查文件是否正确,FAT32分区存放BOOT.bin、image.ub、boot.scr,Ext4分区存放rootfs的所有文件,注意有的rootfs解压后不是rootfs的跟目录,需要将rootfs根目录直接拷贝至Ext4分区。即Ext4分区下为bin、etc、home、root、…文件夹。

3.3 boot启动变量问题

要检查是不是该问题,只需要在进入boot时暂停,然后添加以下变量

senenv bootargs 'console=ttyPS0,115200 root=/dev/mmcblk0p2 rw rootwait earlyprintk'
boot

注意root的分区须与自己的对应,如果可以进入根文件系统,则是bootargs变量的问题后续只需添加该变量即可。

4.解决方法

对于3.1和3.2问题,对相应配置进行修改即可,3.3的问题是由于petalinux中设置bootargs变量无效导致的,具体原因不详。修改方法很简单:

4.1 方法1

  1. 进入petalinux工程目录
  2. 运行以下命令
cp ./project-spec/meta-user/recipes-bsp/u-boot-zynq-scr/boot.cmd.default  ./images/linux/
cd ./images/linux
  1. 修改文件boot.cmd.default,添加bootargs变量设置脚本
for boot_target in ${boot_targets};
do
	if test "${boot_target}" = "jtag" ; then
		booti ${kernel_addr} - ${fdt_addr};
		exit;
	fi
	if test "${boot_target}" = "mmc0" || test "${boot_target}" = "mmc1" ; then
		if test -e ${devtype} ${devnum}:${distro_bootpart} /image.ub; then
			fatload ${devtype} ${devnum}:${distro_bootpart} ${imageub_addr} image.ub;
			setenv bootargs 'console=ttyPS0,115200 root=/dev/mmcblk0p2 rw earlyprintk'
			bootm ${imageub_addr};
			exit;
		fi
		if test -e ${devtype} ${devnum}:${distro_bootpart} /Image; then
			fatload ${devtype} ${devnum}:${distro_bootpart} ${kernel_addr} Image;
			setenv bootargs 'console=ttyPS0,115200 root=/dev/mmcblk0p2 rw earlyprintk'
			booti ${kernel_addr} - ${fdt_addr};
			exit;
		fi
		setenv bootargs 'console=ttyPS0,115200 root=/dev/mmcblk0p2 rw earlyprintk'
		booti ${kernel_addr} - ${fdt_addr};
		exit;
	fi
	if test "${boot_target}" = "xspi0"; then
		sf probe 0 0 0;
		if test "${kernel_type}" = "image.ub"; then
			sf read ${imageub_addr} ${kernel_offset} ${kernel_size};
			setenv bootargs 'console=ttyPS0,115200 root=/dev/mmcblk0p2 rw earlyprintk'
			bootm ${imageub_addr};
			exit;
		fi
		if test "${kernel_type}" = "Image"; then
			sf read ${kernel_addr} ${kernel_offset} ${kernel_size};
			setenv bootargs 'console=ttyPS0,115200 root=/dev/mmcblk0p2 rw earlyprintk'
			booti ${kernel_addr} - ${fdt_addr};
			exit;
		fi
		exit;
	fi
done
  1. 编译脚本,运行如下命令,如果找不到mkimage,可根据提示安装
mkimage -c none -A arm -T script -d boot.cmd.default  boot.scr

将生成的boot.src脚本替换到SD卡中,注意boot.scr不能直接修改,否则启动时会报Bad src

4.2 方法2

将petalinux中bootargs改为手动配置,进入petalinux工程目录,输入petalinux-config
选择"DTG Setting → Kernel bootargs"
取消autoconfig bootargs的*号
在下面的输入

console=ttyPS0,115200 root=/dev/mmcblk0p2 rw earlyprintk

bootargs中,root的设置与Device node一致
重新编译,重新打包,输出BOOT.bin、image.ub、boot.scr文件。

5.总结

依据官方手册的流程走下来,boot依然出问题,不知道是不是petalinux工程的问题,有时间的读者可以重新创建工程试试。博主这里提供两个方法:一个是自己修改boot.cmd.default启动脚本,添加bootargs变量,并重新生成boot.scr;一个是petalinux中改为手动配置bootargs,两种方法都成功挂载了rootfs。
希望本博对各位看官有用,多多点赞

  • 3
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值