介绍
在本系列文章中,我想了解一下 buildroot 发行版构建系统并分享我定制它的经验。 将获得创建具有图形界面和最少功能的小型操作系统的实践经验。
首先,您不应该混淆构建系统和发行版。 Buildroot 可以从提供给它的一组软件包构建一个系统。 Buildroot 基于 makefile 构建,因此具有巨大的定制功能。 用另一个版本替换一个包,添加自己的包,更改构建包的规则,安装所有包后自定义文件系统? buildroot 可以做到这一切。
在俄罗斯,使用的是buildroot,但在我看来,对于初学者来说,俄语信息很少。
这项工作的目标是组装一个具有实时下载、icewm 界面和浏览器的分发包。 目标平台是virtualbox。
为什么要构建自己的发行版? 通常,资源有限,需要的功能也有限。 在自动化中,您更经常需要创建固件。 通过清除不必要的软件包并将其转换为固件来调整通用发行版比构建新发行版更加耗费人力。 使用 Gentoo 也有其局限性。
Buildroot系统非常强大,但它不会为你做任何事。 它只能启用并自动化组装过程。
不考虑或比较替代构建系统(yocto、开放构建系统等)。
从哪里获取以及如何开始
项目网站—— 。 您可以在这里下载当前版本并阅读手册。 您可以在那里联系社区,那里有错误跟踪器、邮件列表和 irc 频道。
Buildroot 为构建的目标板运行 defconfigs。 Defconfig是一个配置文件,仅存储没有默认值的选项。 他决定收集什么以及如何收集。 在这种情况下,您可以单独配置 busybox、linux-kernel、uglibc、u-boot 和 barebox bootloader 的配置,但它们都将绑定到目标板。
解压下载的存档或从 git 克隆后,我们得到一个现成的 buildroot。 您可以在手册中阅读有关目录结构的更多信息;我将告诉您最重要的内容:
板 — 包含特定于每个板的文件的目录。 这些可以是用于形成系统映像(iso、sdcart、cpio 等)、覆盖目录、内核配置等的脚本。
CONFIGS — 主板的实际 defconfig。 Defconfig 是不完整的板配置。 它仅存储与默认设置不同的参数
dl — 包含下载的源代码/汇编文件的目录
输出/目标 — 生成的操作系统的组装文件系统。 随后,从中创建图像以供下载/安装
输出/主机 - 用于组装的主机实用程序
输出/构建 - 组装包
该程序集是通过 KConfig 配置的。 相同的系统用于构建 Linux 内核。 最常用命令列表(在buildroot目录中执行):
- make menuconfig - 调用构建配置。 您还可以使用图形界面(make nconfig、make xconfig、make gconfig)
- make linux-menuconfig - 调用内核配置。
- make clean - 清理构建结果(存储在输出中的所有内容)
- make——建立一个系统。 这不会重新组装已经组装的流程。
- make defconfig_name - 将配置切换到特定的 defconfig
- make list-defconfigs - 显示 defconfig 列表
- make source - 只需下载安装文件,无需构建。
- make help - 列出可能的命令
重要说明和有用的提示
Buildroot 不会重建已经构建的包! 因此,可能会出现需要完全重新组装的情况。
您可以使用以下命令重建单独的包 使包名重建。 例如,您可以重建 Linux 内核:
make linux-rebuildBuildroot 通过在 output/build/$packagename 目录中创建 .stamp 文件来存储任何包的状态:

因此,您可以重建 root-fs 和镜像,而无需重建软件包:
rm output/build/host-gcc-final-*/.stamp_host_installed;rm -rf output/target;find output/ -name ".stamp_target_installed" |xargs rm -rf ; make有用的变量
buildroot 有一组变量,方便配置
- $TOPDIR - buildroot 目录
- $BASEDIR - 输出目录
- $HOST_DIR、$STAGING_DIR、$TARGET_DIR — 主机文件系统、暂存文件系统、目标文件系统构建目录。
- $BUILD_DIR - 包含解压和构建包的目录
可视化
buildroot具有可视化功能,您可以在最终系统中构建依赖关系图、构建时间图和包大小图。 结果以 pdf 文件的形式(可以从 svn、png 中选择)保存在 output/graph 目录中。
可视化命令示例:
make graph-depends构建依赖树make <pkg>-graph-depends为特定包构建依赖树BR2_GRAPH_OUT=png make graph-build使用 PNG 输出绘制构建时间make graph-size绘图包大小
有用的脚本
buildroot目录下有一个子目录 utils的 与有用的脚本。 例如,有一个脚本可以检查包描述的正确性。 添加您自己的包时这可能很有用(我稍后会这样做)。 文件 utils/readme.txt 包含这些脚本的描述。
让我们建立一个股票分布
重要的是要记住,所有操作都是代表普通用户而不是 root 执行的。
所有命令都在 buildroot 中执行。 buildroot 包已经包含了一组用于许多常见板和虚拟化的配置。
我们来看看配置列表:

切换到 qemu_x86_64_defconfig 配置
make qemu_x86_64_defconfig我们开始组装
make构建成功完成,查看结果:
![]()
Buildroot 已编译映像,您可以在 Qemu 中运行这些映像并验证它们是否有效。
qemu-system-x86_64 -kernel output/images/bzImage -hda output/images/rootfs.ext2 -append "root=/dev/sda rw" -s -S结果是在 qemu 中运行的系统:

创建您自己的板配置
添加板文件
我们来看看配置列表:

在列表中我们看到 pc_x86_64_efi_defconfig。 我们将通过从配置中复制它来创建我们自己的板:
cp configs/pc_x86_64_bios_defconfig configs/my_x86_board_defconfig让我们立即创建一个 board 目录来存储我们的脚本、rootfs-overlay 和其他必要的文件:
mkdir board/my_x86_board切换到这个defconfig:
make my_x86_board_defconfig因此,现在构建配置(存储在 buildroot 目录的根目录中的 .config 中)对应于 x86-64 Legacy(BIOS) 引导目标计算机。
让我们复制 linux-kernel 配置(稍后有用):
cp board/pc/linux.config board/my_x86_board/通过 KConfig 设置构建参数
让我们开始设置:
make menuconfig KConfig 窗口将打开。 可以使用图形界面进行配置(make nconfig、make xconfig、make gconfig):

我们进入第一部分目标选项。 您可以在此处选择要执行构建的目标架构。

构建选项 - 这里有各种构建设置。 您可以指定包含源代码的目录、构建线程的数量、下载源代码的镜像和其他设置。 让我们保留默认设置。
工具链——构建工具本身在此处配置。 了解更多关于他的信息。

工具链类型 – 使用的工具链类型。 这可以是 buildroot 中内置的工具链,也可以是外部工具链(您可以指定已构建的目录或下载的 url)。 对于不同的架构还有其他选项。 例如,对于arm,您只需选择外部工具链的Linaro 版本即可。
C库——C库的选择,整个系统的运行依赖于此。 通常使用 glibc,它支持所有可能的功能。 但对于嵌入式系统来说可能太大了,所以经常选择uglibc或musl。 我们将选择 glibc(稍后使用 systemd 时需要这样做)。
内核头文件和自定义内核头文件系列 – 必须与组装系统中的内核版本相匹配。 对于内核标头,您还可以指定 tarball 或 git 存储库的路径。
GCC 编译器版本 – 选择用于构建的编译器版本
启用 C++ 支持 – 选择在系统中构建对 C++ 库的支持。 这对我们将来很有用。
其他 gcc 选项 – 您可以设置其他编译器选项。 我们暂时不需要它。
系统配置允许您设置所创建系统的未来参数:

大多数要点从标题中就可以清楚地看出。 我们要注意以下几点:
用户表的路径 - 包含要创建的用户的表().
示例文件。 将创建用户用户,密码为admin,自动为gid/uid,/bin/sh shell,默认组用户,组成员root,注释为Foo用户
[alexey@alexey-pc buildroot ]$ cat board/my_x86_board/users.txt
user -1 user -1 =admin /home/user /bin/sh root Foo user根文件系统覆盖目录 - 覆盖在组装的 target-fs 之上的目录。 添加新文件并替换现有文件。
创建文件系统映像之前运行的自定义脚本 - 在将文件系统折叠到映像之前立即执行的脚本。 我们暂时将脚本留空。
让我们进入内核部分

内核设置在这里设置。 内核本身是通过 make linux-menuconfig 配置的。
您可以通过不同的方式设置内核版本:从提供的版本中进行选择、手动输入版本、指定存储库或现成的 tarball。
内核配置——内核配置文件的路径。您可以选择所选架构的默认配置,或从 `defocconfig` 中选择默认配置。 Linux在源代码中 Linux 针对不同的目标系统,有一系列默认配置(defconfig)。您可以找到所需的配置。 。 例如,对于小猎犬骨黑板,您可以 .
目标包部分允许您选择将在正在构建的系统上安装哪些包。 我们暂时保持不变。 稍后我们会将我们的包添加到此列表中。
文件系统映像 - 将收集的文件系统映像的列表。 添加 iso 映像

引导加载程序 - 选择要收集的引导加载程序。 我们选择isolinix

配置Systemd
Systemd 正在与内核和 glibc 一起成为 Linux 的支柱之一。 因此,我将其设置移至单独的项目。
通过 make menuconfig 配置,然后目标包 → 系统工具 → systemd。 在这里您可以指定系统启动时将安装和启动哪些systemd服务。

保存系统配置
我们通过 KConfig 保存此配置。
然后保存我们的defconfig:
make savedefconfig配置内核 Linux
使用以下命令调用 Linux 内核配置:
make linux-menuconfig让我们添加对 Virtualbox 显卡的支持

让我们添加 Virtualbox Guest 集成支持

保存并退出。 重要的:配置将保存在output/build/linux-$version/config中,但不会保存在board/my_x86_board/linux.config中

因此,您需要手动将配置复制到存储位置:
cp output/build/linux-4.19.25/.config board/my_x86_board/linux.config之后我们将对整个系统进行完整的重新组装。 buildroot 不会重建已经构建的内容,您必须手动指定用于重建的包。 为了不浪费时间和精力,完全重建一个小系统会更容易):
make clean;make构建完成后,从 CD 启动 VirtualBox(在版本 5.2 和 6.0 上测试)。系统参数:

从组装的 iso 运行:

使用材料清单
- 构建根目录手册
来源: habr.com
