我目前正在为从 RAM 运行的嵌入式 yocto 构建进行测试构建。
使用 yocto 我生成一个包含 initramfs 的 fitimage,它在启动时从 RAM 运行。在过去,这按预期工作,但是,随着时间的推移,由于 initramfs 中需要的更多功能不断增长,我现在已经达到了空间限制。在过去,我遇到过空间限制,可以通过调整 yocto 变量(例如 INITRAMFS_MAXSIZE 和 IMAGE_OVERHEAD_FACTOR)来纠正,但这些不再产生任何效果,因为我似乎已经达到了其他限制。
设备有 2GB 物理内存,当启动到 initramfs 并查看磁盘使用情况时,我们可以看到 rootfs 处于 100% 使用状态,即 557MB,而还有 1+GB 的空 tmpfs 存储。
此外,如果我们将另一个包添加到 initramfs 中,我们可以毫无错误地编译,因为我们没有达到 INITRAMFS_MAXSIZE,但我们无法再启动,因为我们遇到以下内核恐慌:
[ 10.918626] Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(0,0)
[ 10.926889] CPU: 2 PID: 1 Comm: swapper/0 Not tainted 5.15.52 #1
[ 10.934110] Hardware name: i.MX8MPlus
[ 10.940026] Call trace:
[ 10.942470] dump_backtrace+0x0/0x1a0
[ 10.946138] show_stack+0x18/0x70
[ 10.949452] dump_stack_lvl+0x68/0x84
[ 10.953116] dump_stack+0x18/0x34
[ 10.956431] panic+0x160/0x30c
[ 10.959485] mount_block_root+0x180/0x234
[ 10.963496] mount_root+0x178/0x198
[ 10.966984] prepare_namespace+0x130/0x170
[ 10.971081] kernel_init_freeable+0x24c/0x290
[ 10.975437] kernel_init+0x28/0x12c
[ 10.978927] ret_from_fork+0x10/0x20
[ 10.982503] SMP: stopping secondary CPUs
[ 10.986709] Kernel Offset: 0x80000 from 0xffff800008000000
[ 10.992192] PHYS_OFFSET: 0x40000000
[ 10.995677] CPU features: 0x00002401,20000842
[ 11.000031] Memory Limit: none
[ 11.003086] ---[ end Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(0,0) ]---
如何重新分配未使用的 tmpfs 空间,以便它可以被 initramfs 使用?
标记为已回答,因为我们已经修复了一段时间并且看起来效果很好。
我最终看到了以下博客文章https://www.lightofdawn.org/blog/?viewDetailed=00128(Sawdust在评论中链接了同一篇文章,谢谢Sawdust)
按照博客文章中的建议,我添加了一个额外的 u-boot bootarg“rootfstype=ramfs”,它允许我使用完整的空间。尽管此解决方案可能不适合生产系统,但它对于这个特定的测试版本来说效果非常好。