如何在Buildroot中重建rootfs

11
我将设置构建环境,为AT91SAM9X25板制作我自己的嵌入式Linux系统。 我正在使用buildroot来完成这项工作。 make命令构建所有目标,首先构建工具链,然后是软件包,然后是rootfs和rootfs映像(tar,cpio ...)。 要重新构建rootfs,我通常使用make clean然后进行构建。 make clean命令删除所有内容,包括工具链在内。
因此,我的第一个问题是:有没有一些方法可以重置rootfs而不构建工具链? 这需要很长时间。
同时,我正在buildroot中构建Linux内核。 我已经在buildroot中启用了BR2_LINUX_KERNEL [= y]。 Linux配置为使用初始RAM文件系统,因此构建内核需要rootfs映像(应由buildroot创建)。 当我在buildroot根目录下运行make时,构建失败并显示错误信息“Cannot open 'buildroot-2013.05/output/images/rootfs.cpio'”,因为(如果我理解正确),构建顺序是工具链 - 软件包 - rootfs - Linux内核 - rootfs映像。 当它尝试构建Linux内核时,rootfs.cpio映像未被创建。
因此,我的第二个问题是:如何在buildroot中构建Linux,如果我想使用初始RAM文件系统?
也许还有比buildroot更有效的替代方案吗?
提前致谢。
3个回答

13

make命令构建所有目标

在配置Buildroot之前,您不希望这样做。
您需要首先通过指定目标板来配置Buildroot。
根据手册,您可以从头开始,也可以为AT91SAM9X25开发板创建一个基于类似板的Buildroot配置文件,例如configs/at91sam9g20dfc_defconfig

除了Buildroot配置文件外,您还需要一个Linux内核配置文件(除非您想尝试从头开始配置内核)。
Atmel使用的带有AT91SAM9x5的评估板的内核配置文件是at91sam9x5ek_defconfig

您还应阅读第3.4.2节:创建自己的板支持

那么我的第一个问题是:是否有一种方法可以重新制作rootfs而无需构建工具链?这需要很长时间。

答案取决于您如何定义“重新制作rootfs”。 如果删除目录output/images/,则rootfs文件将被重写。
如果删除output/build/中的目录,则会从源代码重新编译这些软件包或子系统。

如果您配置Buildroot使用自己的或外部工具链,则make clean不会将其删除。如果您配置了Buildroot以在其目录之外安装它构建的工具链,则可能在make clean期间不会对其进行更改操作。

当然,Buildroot make足够聪明,以知道自上次构建以来发生了什么变化以及必须重新编译什么。
应该很少需要删除output/build/中的目录来强制重新编译。

那么第二个问题是:如果我想使用初始RAM文件系统,如何在buildroot内构建linux?

您需要正确配置Buildroot和Linux内核。

make menuconfig
    Filesystem images --->
make linux-menuconfig
    General setup --->
make

使用Buildroot构建AT91SAM9x5的更简洁信息,请参考这个Linx4SAM页面

可能有比buildroot更有效的替代方案吗?

还有其他工具,例如Open Embedded,但将它们描述为“更有效”是主观的。


补充说明

如何在buildroot中重新构建rootfs

要强制重建rootfs(在本例中是initramfs),请删除output/build/linux-x.xx.xx目录下的三个隐藏文件。

    .stamp_images_installed
    .stamp_initramfs_rebuilt
    .stamp_target_installed

让我重新阐述一下关于在buildroot中构建Linux内核的问题(可能我解释得不够清楚)。Buildroot的构建顺序是:1.工具链 -> 2.软件包 -> 3.Linux内核 -> 4.rootfs镜像。但是,在第三步(Linux内核)中需要rootfs镜像,因为Linux被配置为使用初始RAM文件系统,而我们只在第四步才会得到它。这就是问题所在 - 我在第三步看到错误消息:没有rootfs.cpio文件。 - Yuri
1
“Linux配置为使用初始RAM文件系统”--Buildroot是否也配置了initramfs?步骤#3中的错误意味着您没有正确配置Buildroot。有关Buildroot如何处理似乎是鸡生蛋问题的问题,在“添加对initramfs的支持”的提交说明中得到了解决(http://git.uclibc.org/buildroot/commit/?id=f507921d391bb2578261a9e45c003e72302dc67a)。基本上,Buildroot使用一个*空的* initramfs文件执行步骤#3,然后执行额外的步骤#5以生成具有实际initramfs的内核。 - sawdust
你的回答(即删除 .stamp_xxx 文件)对于强制重建 rootfs 非常有用。但是,我使用了一个覆盖层向 rootfs 中添加了额外的内容。当我切换到没有 rootfs 覆盖层的(稍微)不同的配置时,旧覆盖层中的文件不会从“target/”下的结构或最终镜像中删除。我尝试删除“target”的内容,但这导致了构建错误(它不是简单的构建输出)。有没有一种方法可以清理已从 rootfs 中删除的东西,而不必进行完整的 distclean / 重建? - Jeremy
@Jeremy -- 我想没有其他选择,只能进行完全的distclean然后重新构建。如果我没记错的话,手册中有提到。 - sawdust
@sawdust 有趣的是,从手册的这一页上:https://buildroot.org/downloads/manual/manual.html#full-rebuild - Buildroot 无法确定所有可能的依赖项,因此如果删除一个“PACKAGE”,则需要进行清除。但是,“但是,当对根文件系统叠加、后构建脚本或后镜像脚本进行更改时,不需要进行完全重建:简单的 make 命令将考虑到更改”,因此更改 rootfs 叠加不应该需要重建... 尽管我发现它确实需要。 - Jeremy

2

在buildroot中重新构建rootfs

  1. 查看依赖项:
    make show-targets
    
    示例输出:
    rootfs-cpio rootfs-tar rootfs-ubi rootfs-ubifs
    
  2. 重新构建目标。例如:
    # 告诉 Buildroot 重新构建 `rootfs-ubi`
    make rootfs-ubi rebuild 
    

-2
如果您只想重新生成rootfs分区,请执行以下操作:
rm -r output/target && make

如果您删除了根文件系统覆盖中的文件,这将有所帮助。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接