嵌入式Linux驱动笔记(二十三)------使用buidroot构建文件系统

你好!这里是风筝的博客,

欢迎和我一起交流。

所有的buidroot使用问题都可以看这个在线使用文档:https://buildroot.org/downloads/manual/manual.html#_about_buildroot

  Buildroot是一种使用交叉编译简化和自动化为嵌入式系统构建完整Linux系统的过程的工具。
  为了实现这一点,Buildroot能够为您的目标生成交叉编译工具链,根文件系统,Linux内核映像和引导加载程序。Buildroot可以独立地用于这些选项的任意组合(例如,您可以使用现有的交叉编译工具链,并仅使用Buildroot构建根文件系统)。

  如上所述,Buildroot基本上是一组Makefiles,可以使用正确的选项下载,配置和编译软件。它还包括各种软件包补丁-主要参与的交叉编译工具链的那些(gcc,binutils和 uClibc)。

  toolchain/目录包含Makefile文件和相关文件的有关交叉编译工具链的所有软件:binutils,gcc,gdb, kernel-headers和uClibc。
  arch/目录包含Buildroot支持的所有处理器体系结构的定义。
  package/目录包含所有用户空间工具和库的Makefile和相关文件,Buildroot可以编译并添加到目标根文件系统。每个包有一个子目录。
  linux/目录包含Linux内核的Makefile和相关文件。
  boot/目录包含Buildroot支持的引导加载程序的Makefile和关联文件。
  system/目录包含对系统集成的支持,例如目标文件系统框架和init系统的选择。(存放着文件系统目录的和设备节点的模板,这些模板会被拷贝到output/目录下,用于制作根文件系统rootfs)
  fs/目录包含与生成目标根文件系统映像相关的软件的Makefile和相关文件。
  configs/目录放置开发板的一些配置文件。
  dl/目录存在从官网上下载的开源软件包,第一次下载后,下次就不会再去从官网下载了,而是从dl/目录下拿开源包,以节约时间。

每个package目录至少包含2个文件:
  something.mk是下载,配置,编译和安装包的Makefile something。
  Config.in是配置工具描述文件的一部分。它描述了与包相关的选项

重要提示:您可以而且应该以普通用户身份构建所有内容。无需root用户即可配置和使用Buildroot。通过以常规用户身份运行所有命令,可以保护系统免受在编译和安装期间表现不佳的程序包的影响。

  使用Buildroot的第一步是创建配置。Buildroot有一个很好的配置工具,类似于Linux内核或 BusyBox中的配置工具。
从buildroot目录中运行

make ARCH=arm menuconfig

因为我们只是构建根文件系统,就直接修改默认配置了,否则可以选择对应的板子,如:make mini2440_defconfig
当然,也可以使用:make list-defconfigs 命令查看支持的板子。

toolchain设置
进入Toolchain选项:
Toolchain —>
  Toolchain type (External toolchain) —> (设定采用自己定义的交叉编译工具)
  Toolchain (Custom toolchain) —>
  Toolchain origin (Pre-installed toolchain) —>(预先安装了交叉编译工具)
  (/opt/FriendlyARM/toolchain/4.9.3/) Toolchain path (设定自定义交叉编译工具的路径)
   ($(ARCH)-linux) Toolchain prefix (设置toolchain的前缀)
   External toolchain gcc version (4.9.x) —>(设置toolchain的版本)
  External toolchain kernel headers series (3.10.x) —> (最好选用与平台所用的linux版本一致的headers,具体还要看交叉编译工具是否支持)
  External toolchain C library (glibc/eglibc) —> (选择自定义交叉编译工具所用的C库)
  [* ] Toolchain has SSP support? (根据报错选上的)
  [* ] Toolchain has RPC support? (根据报错选上的)
  [*] Toolchain has C++ support? (支持C++)

我的toolchain版本是4.9.3,Linux header可以自行查看:就在version.h里,199261是十进制,换成十六进制即可发现是3.10版本
嵌入式Linux驱动笔记(二十三)------使用buidroot构建文件系统_第1张图片
嵌入式Linux驱动笔记(二十三)------使用buidroot构建文件系统_第2张图片
Target options设置
Target options —>
  Target Architecture (ARM (little endian)) —>(小端模式)
  Target Binary Format (ELF) —>(二进制格式是ELF)
  Target Architecture Variant (cortex-A7) —>(我的板子CPU是a7)
  Target ABI (EABIhf) —> (支持EABIhf)
  Floating point strategy (VFPv4-D16) —> (浮点处理采用VFP-v4)
  ARM instruction set (Thumb2) —> (采用精简指令集Thumb2)
这部分是按自己的板子来设置的:
嵌入式Linux驱动笔记(二十三)------使用buidroot构建文件系统_第3张图片
嵌入式Linux驱动笔记(二十三)------使用buidroot构建文件系统_第4张图片

System configuration设置
System configuration —>
  (buildroot) System hostname (设置主机名)
  (Welcome to Buildroot) System banner (输入欢迎语)
  Init system (BusyBox) —>
  /dev management (Dynamic using devtmpfs + mdev) —>(使用mdev动态加载设备节点的方式,devtmpfs是Linux内核中的一个虚拟文件系统,需要启用内核配置选项: CONFIG_DEVTMPFS和CONFIG_DEVTMPFS_MOUNT)
  () Root password(进入linux控制台终端后的密码)
  [*] remount root filesystem read-write during boot(可以进行动态的挂载)
  Run a getty (login prompt) after boot —>
    (console) TTY port(设置成串口登陆的设备节点)
    Baudrate (115200) —> (设置波特率)
嵌入式Linux驱动笔记(二十三)------使用buidroot构建文件系统_第5张图片

Filesystem images设置
Filesystem images —>
  [*] ext2/3/4 root filesystem
    ext2/3/4 variant (ext4) —>

  [*] tar the root filesystem
    Compression method (no compression) —>
嵌入式Linux驱动笔记(二十三)------使用buidroot构建文件系统_第6张图片
不编译kernel
Kernel—>
  [] Linux Kernel 不选

不编译U-BOOT
Bootloaders —>
  [] U-Boot 不选

Target packages设置
Target packages —> : 按自己需求增加或裁剪Target packages,里面包含了一大堆第三方的开源工具和库,包括常用的busybox的选用、音频、网络等。一切都是按自己需求来配置。
在许多程序中,BusyBox具有基本init程序的实现,这对于大多数嵌入式系统来说已经足够了。启用BR2_INIT_BUSYBOX将确保BusyBox将构建和安装其init程序。这是Buildroot中的默认解决方案。BusyBox init程序将/etc/inittab在启动时读取文件以了解如何操作。

配置完所有内容后,配置工具将生成.config包含整个配置的 文件。该文件将由顶级Makefile读取。
要开始构建过程,只需运行:

make

编译过程中要联网,因为可能需要下载一些packages。

编译后生成的文件夹格式的rootfs在buildroot/output/images/rootfs.tar。先创建一个文件夹作为根文件目录,我们将rootfs.tar解压到这个文件内,得到的就是一个完整的可以工作的文件夹形式的rootfs了

你永远不应该使用make -jN与Buildroot里面:目前不支持顶级并行make。相反,使用该BR2_JLEVEL选项告诉Buildroot运行每个包的编译make -jN。

Buildroot输出存储在一个目录中output/。该目录包含几个子目录:
images/其中存储了所有images(内核 image,引导加载程序和根文件系统 image)。这些是您需要放在目标系统上的文件。
ibuild//构建所有组件的位置(包括主机上Buildroot所需的工具和为目标编译的包)。该目录包含每个组件的一个子目录。
staging/其中包含类似于根文件系统层次结构的层次结构。此目录包含交叉编译工具链的标头和库以及为目标选择的所有用户空间包。但是,此目录不是目标的根文件系统:它包含许多开发文件,未被剥离的二进制文件和库,这使得它对于嵌入式系统来说太大了。这些开发文件用于编译依赖于其他库的目标库和应用程序。
target/它几乎包含了目标的完整根文件系统:除了/ dev /中的设备文件外,所有需要的东西都存在(Buildroot无法创建它们,因为Buildroot不以root身份运行,也不想以root身份运行)。此外,它没有正确的权限(例如busybox二进制文件的setuid)。因此,不应在目标上使用此目录 。相反,您应该使用images/目录中内置的一个图像。如果需要提取的根文件系统映像以通过NFS引导,则使用生成的tarball映像images/并以root身份提取它。相比staging/,target/ 仅包含运行所选目标应用程序所需的文件和库:开发文件(标题等)不存在,二进制文件被剥离。
host/ 包含为正确执行Buildroot所需的为主机编译的工具的安装,包括交叉编译工具链。

其中每次开机都要登录,太麻烦了,我们修改根文件系统:
vi etc/inittab

console::respawn:/sbin/getty -L  console 115200 vt100 # GENERIC_SERIAL

这一行注释掉,替换成:

console::respawn:-/bin/sh

保存重启即可。

你可能感兴趣的:(Linux驱动)