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
- 选择"Image Packaging Confguraton → Root flesystem type”
选择SD card、或者Ext4,不同版本显示不同。
返回查看"Device node"的分区是不是对的,如果SD的分区1是rootfs,则该项应该为/dev/mmcblk0p1
博主的SD分区2是rootfs,因此该项为/dev/mmcblk0p2 - 选择"DTG Setting → Kernel bootargs"
检查bootargs是否设置正确
使能autoconfig bootargs
使能earlyprintk
bootargs中,root的设置与Device node一致
3.2 SD卡问题
主要是SD卡的分区和文件的问题,按照博主的分区应为
- 50M 空闲区域
- 1.5G FAT32分区
- 剩余 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
- 进入petalinux工程目录
- 运行以下命令
cp ./project-spec/meta-user/recipes-bsp/u-boot-zynq-scr/boot.cmd.default ./images/linux/
cd ./images/linux
- 修改文件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
- 编译脚本,运行如下命令,如果找不到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。
希望本博对各位看官有用,多多点赞