initramfs体积增大后在populate_rootfs阶段触发内核panic问题求助
问题根因
内核populate_rootfs阶段触发写错误panic,直接原因是内置initramfs解压所需空间超过了内核init段预留的最大容量:
- 崩溃日志显示内核init段仅分配了14780K空间
- 你的
rootfs.cpio解压后大小为25330176字节(约24.15M),远超预留空间,写入时越界触发panic
你之前调整的参数无效的原因:
CONFIG_BLK_DEV_RAM_SIZE、ramdisk_size仅作用于外置ramdisk,你使用内置initramfs时这两个参数不生效- bootargs中的
noinitrd参数本身就禁用了外置ramdisk加载逻辑
解决步骤
方案1:调整内核内置initramfs配置(无需修改UBoot)
进入内核配置界面修改以下参数:
- 修改
CONFIG_INITRAMFS_MAXSIZE为至少33554432(即32M,预留足够冗余) - 确认
CONFIG_INITRAMFS_COMPRESSION_LZMA=y保持开启,确保压缩逻辑正常 - 重新编译内核后验证启动
方案2:改用外置initramfs加载(更灵活,无内核段大小限制,推荐)
- Buildroot配置调整:关闭
BR2_TARGET_ROOTFS_INITRAMFS,单独生成rootfs.cpio.lzma镜像 - UBoot环境变量修改:
# 新增加载rootfs的命令,将rootfs加载到内存未占用的0x4000000地址 loadrootfs=sf read 0x4000000 0x2000000 0x600000 # 修改bootargs,去掉noinitrd,增加initrd参数 bootargs=ramdisk_size=30720 console=ttyS0,115200n8 oops=panic panic=10 rdinit=/sbin/init mem=64M ubi.mtd=2 mtdparts=nand0:0x200000@0x0(u-boot),0x1E00000@0x200000(kernel),-(user) ignore_loglevel initrd=0x4000000,0x600000 # 修改bootcmd,增加加载rootfs逻辑 bootcmd=run setspi;run loadkernel;run loadrootfs;bootm 0x7fc0 - 调整NAND分区布局,给rootfs单独分配至少8M空间存放
rootfs.cpio.lzma
补充优化建议
- 开启Buildroot的二进制裁剪功能:配置
BR2_STRIP_strip=y,去掉所有执行文件的调试符号,可减少至少30%的rootfs体积 - 可将压缩算法更换为XZ,配置
BR2_TARGET_ROOTFS_CPIO_XZ=y,比LZMA压缩率高15%~20%,进一步减小镜像体积
内容的提问来源于stack exchange,提问作者varta
相关产品推荐
相关产品推荐

