问题描述

给嵌入式设备更新完内核后无法启动。

u-boot 中打印的错误信息

...
...
Verifying Checksum .. Bad Data CRC

...
...
Ramdisk image is corrupt or invalid
似乎是 ramdisk 镜像受损了,导致 CRC 验证失败。

问题的解决步骤

  1. chroot 进入原系统
  2. 调用 bash 进入终端
  3. 调用 update-initramfs 更新 initramfs 文件
  4. 调用 mkimage 传入更新的 initramfs 文件以生成新的内核 uInitrd 镜像文件
  5. 将新生成的文件放置到正确位置
  6. 重启

具体步骤代码及说明

这里假设你的原系统分区位于 /dev/sda1 ,启动分区位于 /dev/sda12
#挂载原系统环境,准备进入chroot
mount -t ext4 /dev/sda1 /mnt
mount -t proc proc /mnt/proc
mount -t sysfs sys /mnt/sys
mount -o bind /dev /mnt/dev
chroot /mnt /bin/bash
mount -t ext4 /dev/sda2 /mnt/boot 
#由于chroot环境下的内核不为原系统内核,你需要先确定原内核版本
#通常可以确定于 /lib/modules 中,这里假设原内核版本为 5.4.0-81-generic
update-initramfs -c -t -k 5.4.0-81-generic
#通常会在 boot 分区中生成新的文件,使用下列命令使用该文件生成新的镜像,替换受损的镜像即可,请自行替换相关参数信息
mkimage -A arm64 -O linux -T ramdisk -C none -a 0 -e 0 -n uInitrd -d /boot/initrd.img-5.4.0-81-generic /boot/initrd.img
#卸载文件系统并重启
umount /mnt/boot
exit
umount /mnt/{proc,sys,dev}
umount /mnt
rebootCode language: PHP (php)

完成

你的设备应可以正常启动了!

温馨提示

在更新内核时确保内核安装完全,并在重启前将缓冲写入文件系统。

Refer


0 条评论

发表回复

Avatar placeholder

您的电子邮箱地址不会被公开。 必填项已用 * 标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据