Buildroot-第1部分。一般信息,构建一个最小系统,通过菜单进行设置

引言


在本系列文章中,我将考虑buildroot分发系统并分享对其进行定制的经验。 这是创建具有图形界面和最小功能的小型OS的实践经验。


首先,您不应混淆构建系统和发行版。 Buildroot可以从提供的软件包集中构建系统。 Buildroot基于makefile构建,因此具有强大的自定义功能。 将软件包替换为另一个版本,添加软件包,更改构建软件包的规则,在安装所有软件包后自定义文件系统? Buildroot可以完成所有这一切。


在俄罗斯,使用了buildroot,但我认为对于初学者来说,俄语信息很少。


这项工作的目的是构建一个具有实时下载,icewm界面和浏览器的分发工具包。 目标平台是virtualbox。


为什么要建立您的发行版? 通常,您需要功能有限且资源有限。 在自动化中,您通常需要创建固件。 通过清除多余的软件包并将其转换为固件来适应通用发行版,比构建新发行版要花费更多的时间。 使用Gentoo也有其局限性。


Buildroot系统功能强大,但对您没有任何帮助。 它只能提供机会并使组装过程自动化。


不考虑或比较其他构建系统(yocto,开放构建系统等)。


从哪里获得以及如何开始


项目站点是buildroot.org 。 您可以在此处下载当前版本并阅读手册。 您还可以联系那里的社区,那里有一个错误跟踪器,邮件列表和一个irc频道。


Buildroot与defconfig一起用于组装目标板。 Defconfig是一个配置文件,仅存储没有默认值的选项。 由他决定收集什么以及如何收集。 在这种情况下,您可以分别配置configs busybox,linux-kernel,uClibc,bootloader,u-boot和areabox,但它们都将绑定到目标板上。
解压缩下载的归档文件或从git克隆后,我们就可以开始使用buildroot了。 关于目录结构的详细信息可以在手册中找到,我将讨论最重要的:


board-包含每个委员会专用文件的目录。 这些可以是用于形成系统映像(iso,sdcart,cpio等),覆盖目录,内核配置等的脚本。
configs-实际上是defconfig板。 Defconfig是主板的不完整配置。 仅默认设置以外的参数存储在其中。
dl-包含下载源代码/汇编文件的目录
输出/目标 -生成的OS的组合文件系统。 随后,从中创建用于下载/安装的映像。
输出/主机 -用于构建的主机实用程序
输出/构建 -编译包


构建配置通过KConfig完成。 相同的系统用于构建linux内核。 最常用的命令列表(在buildroot目录中运行):


  • make menuconfig-调用构建配置。 您还可以使用图形界面(make nconfig,make xconfig,make gconfig)
  • make linux-menuconfig-调用内核配置。
  • 清理-清除装配结果(存储在输出中的所有内容)
  • 制作-构建系统。 它不会重建已经收集的流程
  • make defconfig_name-将配置切换到特定的defconfig
  • make list-defconfigs-显示defconfig列表
  • make source-仅下载安装文件,而无需汇编。
  • 提供帮助-列出可能的命令

重要说明和提示


Buildroot不会重建已经打包的软件包! 因此,当需要完全重新组装时,可能会出现这种情况。


您可以使用make packagename-rebuild命令来重建单个软件包 例如,您可以重建linux内核:


make linux-rebuild 

Buildroot通过在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-程序集目录托管fs,暂存fs,目标fs。
  • $ BUILD_DIR-包含解包和组装包的目录

可视化


buildroot中具有可视化功能,可以在最终系统中构建依赖关系图,构建时间线和数据包大小图。 结果以output / graph目录中的pdf文件(您可以从svn,png中选择)的形式显示。


可视化命令示例:


  • 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_bios_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旧版(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,支持所有可能的功能。 但是对于嵌入式系统而言,它可能太大了,因此经常选择uClibc或musl。 我们将选择glibc(将来将需要使用systemd)。


内核头文件和定制内核头文件系列-必须与将在构建系统上的内核版本匹配。 对于内核头文件,您还可以指定tarball或git存储库的路径。


GCC编译器版本-选择将用于汇编的编译器版本
启用C ++支持-选择支持系统中c ++库的程序集。 将来,这将派上用场。


其他gcc选项-您可以设置其他编译器选项。 到目前为止,我们不需要。


系统配置使您可以为创建的系统设置将来的参数:



从名称中可以清楚地看出大部分要点。 请注意以下几点:
用户表的路径-具有创建的用户的表( https://buildroot.org/downloads/manual/manual.html#makeuser-syntax )。


文件示例。 将使用密码admin,自动gid / uid,/ bin / sh shell创建用户用户,默认组为user,根组成员,comment 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。


内核配置-内核配置的路径。 您可以为所选架构选择默认配置,也可以从Linux中选择默认配置。 Linux源代码为不同的目标系统提供了一组defconfig。 您可以通过直接在此处查看源代码来找到合适的代码 。 例如,对于beagle骨黑色面板,可以选择config


“目标软件包”部分允许您选择要在构建系统上安装的软件包。 暂时保持不变。 稍后,我们会将软件包添加到此列表中。
文件系统映像-要编译的文件系统映像的列表。 添加ISO图像



自举程序-组装自举程序的选择。 选择isolinix



系统配置


Systemd与内核和glibc一起成为Linux支柱之一。 因此,我在单独的段落中进行了配置。


它是通过make menuconfig进行配置的,然后通过目标软件包→系统工具→systemd进行配置。 在这里,您可以指定将在系统启动时安装和启动哪些systemd服务。



保存系统配置


通过KConfig保存此配置。


然后保存我们的defconfig:


 make savedefconfig 

Linux内核配置


使用以下命令调用linux内核配置:


 make linux-menuconfig 

添加对Virtualbox图形卡的支持



添加Virtualbox Guest集成支持



保存并退出。 重要说明 :配置将保存在输出/构建/ linux- $版本/配置中,但不保存在board / my_x86_board / linux.config中



因此,您需要手动将配置复制到存储位置:


 cp output/build/linux-4.19.25/.config board/my_x86_board/linux.config 

使用此命令,我复制了FULL内核配置,但并非总是如此。 一种更正确的方法是保留内核defconfig:


 make linux-update-defconfig 

之后,我们将对整个系统进行完整的重组。 由于buildroot不会重新组装已组装的软件包,因此必须手动指定要重新组装的软件包。 为了不浪费时间和神经,更容易重建整个小型系统):


 make clean;make 

构建完成后,从CD驱动器启动运行VirtualBox(在5.2和6.0版上测试)。



从组装的iso开始:



使用的材料清单


  1. Buildroot手册

Source: https://habr.com/ru/post/zh-CN448638/


All Articles