【PetaLinux】领航者ZYNQ使用SD卡根文件系统内核启动失败的错误

报错打印:

VFS: Cannot open root device "(null)" or unknown-block(0,0): error -6
Please append a correct "root=" boot option; here are the available partitions:
0100           16384 ram0
 (driver?)
0101           16384 ram1
 (driver?)
0102           16384 ram2
 (driver?)
0103           16384 ram3
 (driver?)
0104           16384 ram4
 (driver?)
0105           16384 ram5
 (driver?)
0106           16384 ram6
 (driver?)
0107           16384 ram7
 (driver?)
0108           16384 ram8
 (driver?)
0109           16384 ram9
 (driver?)
010a           16384 ram10
 (driver?)
010b           16384 ram11
 (driver?)
010c           16384 ram12
 (driver?)
010d           16384 ram13
 (driver?)
010e           16384 ram14
 (driver?)
010f           16384 ram15
 (driver?)
1f00            1024 mtdblock0
 (driver?)
1f01             128 mtdblock1
 (driver?)
1f02            4096 mtdblock2
 (driver?)
1f03             128 mtdblock3
 (driver?)
1f04            5120 mtdblock4
 (driver?)
1f05           22272 mtdblock5
 (driver?)
b300        15138816 mmcblk0
 driver: mmcblk
  b301          512000 mmcblk0p1 f7632111-01

  b302        14625792 mmcblk0p2 f7632111-02

b308         7634944 mmcblk1
 driver: mmcblk
  b309         7634936 mmcblk1p1 9269d97b-01

Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(0,0)
CPU0: stopping
CPU: 0 PID: 0 Comm: swapper/0 Not tainted 5.4.0-xilinx-v2020.2 #1
Hardware name: Xilinx Zynq Platform
[<c010e37c>] (unwind_backtrace) from [<c010a128>] (show_stack+0x10/0x14)
[<c010a128>] (show_stack) from [<c0752204>] (dump_stack+0xb4/0xd0)
[<c0752204>] (dump_stack) from [<c010c964>] (ipi_cpu_stop+0x3c/0x98)
[<c010c964>] (ipi_cpu_stop) from [<c010d1b0>] (handle_IPI+0x64/0x80)
[<c010d1b0>] (handle_IPI) from [<c0364fa4>] (gic_handle_irq+0x84/0x90)
[<c0364fa4>] (gic_handle_irq) from [<c0101a8c>] (__irq_svc+0x6c/0xa8)
Exception stack(0xc0c01ee0 to 0xc0c01f28)
1ee0: 00000000 00000000 2ec8c000 ef7d0180 c0c2b9e4 00000000 ef7cf578 00000000
1f00: 69a89591 69fce0e3 00000000 00000000 fffffff5 c0c01f30 c0561c54 c0561c78
1f20: 60000013 ffffffff
[<c0101a8c>] (__irq_svc) from [<c0561c78>] (cpuidle_enter_state+0xec/0x288)
[<c0561c78>] (cpuidle_enter_state) from [<c0561e50>] (cpuidle_enter+0x28/0x38)
[<c0561e50>] (cpuidle_enter) from [<c013ecac>] (do_idle+0x230/0x258)
[<c013ecac>] (do_idle) from [<c013ee38>] (cpu_startup_entry+0x18/0x1c)
[<c013ee38>] (cpu_startup_entry) from [<c0b00ca0>] (start_kernel+0x388/0x424)
[<c0b00ca0>] (start_kernel) from [<00000000>] (0x0)
---[ end Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(0,0) ]---

报错分析:
不知道哪里去引导rootfs,但是扫描出了SD卡的各个区域。
在解决问题的过程中发现的一些问题:
问题:
(1)PetaLinux生成的rootfs文件的压缩包解压出现错误
报错信息:
Windows下使用Bandzip解压会报错,要么是什么以管理员模式链接,要么就是有重复文件,这里无法解决,建议直接在Ubantu下弄。
如果你是远程的Ubantu系统编译,那就先加权限,复制到Windows分享文件夹,然后再从远程端复制到本地Windows,再从本地Windows复制到本地Ubantu。
在Ubantu下解压出现一大堆Permission denied以及操作无效的报错,主要还是因为这个根文件系统的解压需要一定的权限。这里研究了很久,发现在远端Ubantu可以正常解压,但是如果将tar文件复制到本地Ubantu解压,就会报一大堆错。研究发现,还是在远端设置一下权限,然后在本地Ubantu利用root权限进行解压,解压命令如底下所示,不能有错噢。如果你直接解压到本地的目录而不是SD卡,可能你在复制到SD卡的时候仍然还会出现权限问题,所以直接使用虚拟机访问SD卡,复制到SD卡上去就行。
解决方法:
先将其复制到项目外的目录,对其进行加一些权限,然后一定要在Ubantu下解压到SD卡中,解压之后需要输入sync进行同步,最后umount。
最好按照正点原子的流程把你的SD卡进行一系列的分区与初始化,详情在领航者ZYNQLinux开发手册中的6.2.10。
流程如下:

cp rootfs.tar.gz /home/dante
cd /home/dante/
chmod 777 rootfs.tar.gz
sudo tar -xzf rootfs.tar.gz -C /media/dante/rootfs
sync
umount /dev/sdb2

这里 /media/dante/rootfs 是你挂载SD卡第二分区的目录,按照ZYNQ手册中进行SD卡制作的话其名字就会是rootfs。
如果你始终怀疑根文件系统有问题,那么我推荐你一个简单的办法,直接将它解压至本地Ubantu的NFS文件夹,然后参考ZYNQ手册11.6在boot阶段指定网络挂载根文件系统,然后看起步起得来,如果起得来就说明根文件系统的生成和解压没有毛病。那可能就是问题(2),或者是SD卡的设置有问题了。
(2)内核启动失败,找不到根文件系统。
如果按照以上的步骤做了,SD第一分区有:BOOT.BIN,system.dtb,system.bit,boot.src,zImage这五个文件的话,先注意这几个文件的生成有没有问题。
需要检查的点:
1.在PetaLiunx的配置,输入petalinux-config进入Image Packaging Configuration菜单,找到Root filesystem type,将它设置成EXT4,如果是默认的INITRD的话就不会在SD卡加载根文件系统,每次开机都会是默认的文件系统(这就是为什么每次开机你的文件就莫得了)
2.检查设备树,设备树文件:system_user.dtsi,实际上如果你按照正点原子的流程做到6.2.7时,会直接替换设备树文件(4_Source_Code\3_Embedded_Linux\zynq_petalinux\zynq7020\1_customize_linux\device-tree的文件),但是那个目录的设备树文件实际上是针对于无Rootfs文件的情况的。这个设备树文件中并不含有以下内容:

chosen {
    
     
bootargs = "console=ttyPS0,115200 cma=50M earlycon root=/dev/mmcblk0p2 rw rootwait"; 
stdout-path = "serial0:115200n8";
 };

真正含有这一部分的设备树文件在正点原子给的内核源码中:atk-zynq-linux-xlnx/arch/arm/boot/dts 下的system_user.dtsi。
少了这一部分,Petalinux在build时自然就不知道从哪里加载内核以及挂载Rootfs了。将其替换至petalinux的设备树目录后重新进行编译,按照道理来说应该只需要重新复制zImage和system.dtb(最需要换的)。
实际上,如果楼主完全按照正点原子的流程去做,是不会出现这个问题的。
楼主偷了个懒,寻思着反正已经在Petalinux中指定了源码的目录,是不是就可以直接不管它本身设备树的目录了,而且,这个细小的区别是我在重新查看不挂载Rootfs系统时候发现正点原子将它注释了才发现的。
如果按照正点原子的流程去做,那就是:
(1)使用PetaLinux下生成的BOOT.BIN、boot.scr(mkimage一下)、system.bit;
(2)使用PetaLinux生成的根文件系统。
(2)使用源码编译生成大内核zImage以及设备树文件system.dtb。
所以按照道理来说,其实换一换zImage和system.dtb就行了,但是鉴于BOOT.BIN的打包可能涉及其他的文件,所以最好还是都换一下比较好。
目前楼主已经解决这个问题,成功使用SD卡挂载ROOTFS系统了。

猜你喜欢

转载自blog.csdn.net/qq_32006213/article/details/131896503