如何在 buildroot 中重建 rootfs

Posted

技术标签:

【中文标题】如何在 buildroot 中重建 rootfs【英文标题】:how to rebuild rootfs in buildroot 【发布时间】:2013-07-26 23:10:08 【问题描述】:

我将设置构建环境来为 AT91SAM9X25 Board 制作我自己的 linux 嵌入式系统。我正在使用 buildroot 来执行此操作。 make 命令构建所有目标,首先构建工具链,然后打包,然后是 rootfs 和 rootfs 的映像(tar、cpio ...)。 要重建 rootfs,我通常使用 make clean 然后 make。 make clean 命令删除所有工具链,包括工具链。

所以我的第一个问题是:有没有什么方法可以在不构建工具链的情况下重新制作 rootfs?这需要很多时间。

我也在 buildroot 中构建 linux 内核。我在 buildroot 中打开了 BR2_LINUX_KERNEL [=y]。 linux 配置为使用初始 RAM 文件系统,因此要构建内核,它需要 rootfs 的映像(应该由 buildroot 创建)。当我在 buildroot 的根目录下运行 make 时,构建失败并出现错误无法打开“buildroot-2013.05/output/images/rootfs.cpio”。因为(如果我理解正确的话)构建顺序是工具链-软件包-rootfs-linux内核-rootfs的图像。当它尝试构建 linux 内核时,不会创建 rootfs.cpio 映像。

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

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

提前致谢。

【问题讨论】:

【参考方案1】:

make 命令构建所有目标

您不想这样做(在配置 Buildroot 之前)。 您首先需要通过指定目标板来配置 Buildroot。 根据manual,您可以从头开始,或者为您的 AT91SAM9X25 板创建一个 Buildroot 配置文件,该文件源自类似的板,例如configs/at91sam9g20dfc_defconfig

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

您还应该阅读第 3.4.2 节。 创建您自己的董事会支持

所以我的第一个问题是:有没有办法在不构建工具链的情况下重新制作 rootfs?这需要很多时间。

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

如果您将 Buildroot 配置为使用您自己的或外部的工具链,那么 make clean 不会删除它们。如果您将 Buildroot 配置为在其目录之外安装它构建的工具链,那么它可能会在 make clean 期间不理会它。

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

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

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

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

有关使用 Buildroot 用于 AT91SAM9x5 的更简明信息是 this Linx4SAM page

可能有比 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.Toolchain -> 2.packages -> 3.Linux 内核 -> 4.rootfs 映像。但是,在第 3 步(Linux 内核)中需要 rootfs 映像,因为 linux 配置为使用初始 RAM 文件系统,但我们仅在第 4 步得到它。问题 - 我在第 3 步看到错误消息:没有 rootfs.cpio "linux 配置为使用初始 RAM 文件系统" -- 是否也为 initramfs 配置了 Buildroot?步骤 #3 中的错误意味着您没有正确配置 Buildroot。 the commit description for "add support for initramfs" 解决了您对 Buildroot 如何处理看似鸡与蛋问题的担忧。本质上,Buildroot 使用 empty initramfs 文件执行第 3 步,然后执行额外的第 5 步以使用实际的 initramfs 生成内核。 您的回答(即删除 .stamp_xxx 文件)对于强制重建 rootfs 非常有用。但是,我已经通过覆盖向 rootfs 添加了额外的东西。当我更改为没有 rootfs 覆盖的(稍微)不同的配置时,旧覆盖中的文件不会从“target/”下的结构或最终图像中删除。我尝试删除“目标”的内容,但这导致了构建错误(这不是简单的构建输出)。有没有一种方法可以清理从 rootfs 中删除的东西,而无需进行完整的 distclean / 重建? @Jeremy -- 我认为除了完整的 distclean 然后重建之外别无选择。 IIRC 它在手册中提到。 @sawdust 有趣,来自手册的这一页:buildroot.org/downloads/manual/manual.html#full-rebuild - Buildroot 无法找出所有可能的依赖关系,因此如果删除了 PACKAGE,则需要进行清理。但是,“但是,当对根文件系统覆盖、构建后脚本或镜像后脚本进行更改时,不需要完全重建:简单的 make 调用将考虑更改”,因此更改rootfs 覆盖不需要重建......虽然我发现它确实需要。【参考方案2】:

在 buildroot 中重建 rootfs

    查看依赖项:
    make show-targets
    
    示例输出:
    rootfs-cpio rootfs-tar rootfs-ubi rootfs-ubifs
    
    重建目标。例子:
    # Tell buildroot to rebuild `rootfs-ubi`
    make rootfs-ubi rebuild 
    

【讨论】:

以上是关于如何在 buildroot 中重建 rootfs的主要内容,如果未能解决你的问题,请参考以下文章

Buildroot包管理

buildroot - 如何更改内核版本字符串

BR2_JLEVEL=2 在 Buildroot 中有啥作用?

Buildroot运行make menuconfig时报错:Unable to find the ncurses libraries(如何打开 Buildroot 配置界面?)

根文件系统构建(Buildroot 方式)

瑞芯微RV1126 BuildRoot开发学习笔记