我有一个基于ARM的嵌入式板。目前rootfs是squashfs。我还处在发展阶段。
我当前的工作流程是:
在开发机器中进行更改。
创建新的根fs映像。
将图像刻录到板中的闪存盘。
重新启动并测试更改。
如您所见,上面的工作流效率不高。创建fs的完整映像会浪费很多时间,而只需要对我的应用程序或fs中的某些脚本进行一些小的更改,就可以烧掉映像并重新启动。
我知道我可以创建初始ram磁盘来保存rootfs,我在buildroot中选择了这个选项,构建就完成了。
现在我有点困惑我该在黑板上烧什么?这是否足以避免开发过程中的整个重建、刻录和重新启动周期。
我知道我需要在最后烧掉图像才能在板上持久,但我只想在确定更改有效后烧掉最后一个图像。
最佳答案
这不允许你烧更小的零件。您仍然需要将完整图像复制到设备的内存中。
有一个解决方法:在U-boot中使用网络设施,即tftpboot,在内存中下载映像并在板上运行。
下面是一个PowerPC板的示例:
nb_load=dhcp;run nb_load_dtb;run nb_load_vmlinuz;run nb_load_initrd
nb_load_initrd=tftpboot 0x1900000 /mybooklive/initrd
nb_load_vmlinuz=tftpboot 0x1000000 /mybooklive/vmlinuz
nb_load_dtb=tftpboot 0x1800000 /mybooklive/apollo3g.dtb
nb_boot=setenv bootargs ${nb_bootargs}; run nb_load; bootm 0x1000000 0x1900000 0x1800000
nb_bootargs=console=ttyS0,115200n8 ignore_loglevel
要启动,请在u-boot命令行中运行
run nb_boot
。基本上,您需要内核映像、初始ram磁盘和设备树blob(以防您选择不在内核中编译它)。
下面是Intel Edison Board从EMMC引导的U-Boot选项的另一个示例:
setenv boot_edsboot 'zboot 0x100000 0 0x3000000 0x1000000'
setenv bootargs_edsboot 'console=tty1 console=ttyS2,115200n8 rootfstype=ramfs rw'
setenv bootcmd_edsboot 'setenv bootargs ${bootargs_edsboot}; run load_edsboot; run boot_edsboot'
setenv load_edsboot 'load mmc 0:9 0x100000 vmlinuz.efi; load mmc 0:9 0x3000000 initrd'
要启动,请在u-boot命令行中运行
run bootcmd_edsboot
。全文here。
很明显,你需要根据你拥有的线路板获得正确的文件(DTB)和地址。