当前位置: 首页 > news >正文

2三、buildroot

一、buildroot介绍

Buildroot是Linux平台上一个构建嵌入式Linux系统的框架。整个Buildroot是由Makefile脚本和Kconfig配

置文件构成的。你可以和编译Linux内核一样,通过buildroot配置,menuconfig修改,编译出一个完整的

可以直接烧写到机器上运行的Linux系统软件(包含boot、kernel、rootfs以及rootfs中的各种库和应用程

序)。

**在之前学习制作根文件系统时,使用的是busybox工具,这个工具仅提供了基本的根文件目录,一些第

三方库则需要自己手动移植。**buildroot工具则在busybox的基础上,整合了一些第三方库,在构建时

可以按需选择,更加方便。

**buildroot官网地址:**https://buildroot.org

这里我们选择buildroot-2023.02.tar.xz进行根文件系统制作,目录结构如下:

├── arch: 存放CPU架构相关的配置脚本,如arm/mips/x86,这些CPU相关的配置,

| 在制作工具链时,编译uboot和kernel时很关键.

├── board 板级目录,存放与板级有关的文件、脚本等

├── boot bootloader相关配置

├── CHANGES

├── Config.in

├── Config.in.legacy

├── configs: 放置开发板的一些配置参数.

├── COPYING

├── DEVELOPERS

├── dl: (download)存放下载的源代码及应用软件的压缩包.

├── docs: 存放相关的参考文档.

├── fs: 放各种文件系统的源代码.

├── linux: 存放着Linux kernel的自动构建脚本.

├── Makefile

├── Makefile.legacy

├── output: 是编译出来的输出文件夹.

│ ├── build : 存放解压后的各种软件包编译完成后的现场.

│ ├── host : 存放着制作好的编译工具链,如gcc、arm-linux-gcc等工具.

│ ├── images: 存放着编译好的uboot.bin, zImage, rootfs等镜像文件,可烧写到板子里

| | 让linux系统跑起来.

│ ├── staging

│ └── target: 用来制作rootfs文件系统,里面放着Linux系统基本的目录结构,以及编译好

| 行文件. (buildroot根据用户配置把.ko .so .bin文件安装到对应的目录下

| 配置安装指定位置)

├── package:下面放着应用软件的配置文件,每个应用软件的配置文件有Config.in和soft_na

├── README

├── support 编译需要的文件、库等存放目录

├── system 根文件系统目录创建相关配置

└── toolchain 交叉编译工具链

二、buildroot安装依赖

sudo apt install sed make binutils build-essential gcc g++

sudo apt install patch gzip bzip2 perl tar cpio unzip rsync file bc wget

sudo apt install wget python libncurses5 bzr cvs git

sudo apt install mercurial rsync subversion

三、配置及编译buildroot

1.下载及解压buildroot源码

imx6ull-iot-smart-car/buildroot$ tar -xvf buildroot-2023.02.tar.gz

2.菜单图形化配置

(1)启动菜单配置

buildroot/buildroot-2023.02$ make menuconfig

(2)选择Target options 配置平台信息

Target options --->

Target Architecture (ARM (little endian))

Target Architecture Variant (cortex-A7)

Target ABI (EABIhf)

Floating point strategy (NEON/VFPv4)

ARM instruction set (ARM)

Target Binary Format (ELF)

(3)选择Toolchain配置交叉开发工具链

Toolchain --->

Toolchain type 是工具链类型,这里有 buildroot 自带的和外部我们自己添加两种选择

我们选择 External toolchain,自己添加。

Toolchain type (External toolchain)

Toolchain 选择 Custom toolchain 自定义工具链

Toolchain (Custom toolchain)

Toolchain origin 选择 Pre-installed toolchain 预装非下载

Toolchain origin (Pre-installed toolchain)

Toolchain path设置自己安装的交叉编译器绝对路径

/home/linux/imx6ull-iot-smart-car/toolchain/gcc-linaro-4.9.4-2017.01-x86_

Toolchain prefix 编译器名前缀

($(ARCH)-linux-gnueabihf) Toolchain prefix

外部gcc编译器版本

External toolchain gcc version (4.9.x)

Linux内核版本

External toolchain gcc version(4.9.x)

C库选择glibc

External toolchain C library (glibc)

选择以下特性

[*] Toolchain has SSP support? (NEW)

[*] Toolchain has SSP strong support? (NEW)

[*] Toolchain has RPC support? (NEW)

[*] Toolchain has C++ support?

(4)选择System configuration进行系统配置

System configuration --->

主机名设置

(SmartCar) System hostname

欢迎语设置

(Welcome to SmartCar Linux) System banner

初始化程序使用busybox提供

Init system (BusyBox)

设备文件管理

/dev management (Dynamic using devtmpfs + mdev)

使能root用户登录

[*] Enable root login with password (NEW)

密码设置

(1) Root password

(5)选择Filesystem images配置文件系统镜像

Filesystem images --->

[*] tar the root filesystem (NEW)

Compression method (bzip2)

(6)禁止编译 Linux 内核和 uboot

Kernel --->

[ ] Linux Kernel (NEW)

Bootloaders --->

[ ] U-Boot (NEW)

(7)保存配置

退出的时候,选择save保存配置,默认配置会保存到当前目录下的.config文件

configuration written to /home/linux/imx6ull-iot-smart-car/buildroot/

buildroot-2023.02/.config

*** End of the configuration.

*** Execute 'make' to start the bu

3.编译源码

编译期间buildroot会自行下载一些软件源码,请保证网络可用!

imx6ull-iot-smart-car/buildroot/buildroot-2023.02$ make -j12

编译的时候会有如下错误:

原因是配置buildroot工具链的linux内核版本与工具链本身自带的内核版本标识不一致导致的,我们只要

修改下工具链自带的内核版本表示即可。

打开**./arm-linux-gnueabihf/libc/usr/include/linux/version.h文件,**里面有个宏定义就是内核版本标识,

修改为262415(4.1.15版本内核)

默认内容如下:

版本计算公式主要是十进制转换为16进制:

262144 = 040000(h) 对应4.0.0版本内核

262415 = 04010F(h) 对应4.1.15版本内核

修改完以后再次编译:

这个错误是因为busybox版本过高,而编译器版本过低导致的要么降低busybox版本,要么升级编译

。这里选择降低busybox版本。

buildroot下载的源码包都存放在dl目录下,我们进入这个目录可以看到下载的busybox版本。

修改buildroot-2023.02/package/busybox/busybox.mk文件,将版本1.36.0版本修改成1.35.0版本。

修改完成以后接着编译:

这个错误是因为buildroot-2023.02/package/busybox/busybox.hash记录的是busybox-1.36.0.tar.bz2的

hash值,我们需要把它修改成busybox-1.35.0.tar.bz2的hash值。

得到busybox-1.35.0.tar.bz2值以后,打开buildroot-2023.02/package/busybox/busybox.hash将busybox-

1.36.0.tar.bz2的hash值修改成busybox-1.35.0.tar.bz2的hash值

修改完成以后接着编译:

linux@ubuntu:~/imx6ull-iot-smart-car/buildroot/buildroot-2023.02$ make -j12

4.测试文件系统

给rootfs-buildroot目录创建一个软链接rootfs

imx6ull-iot-smart-car/fs$ ln -s rootfs-buildroot rootfs

通过NFS的方式挂载文件系统测试如下:

解决报错

建目录

继续报错

建目录

继续报错

建文件

修改文件

修改前

修改后

继续报错

解决修改

四、buildroot构建根文件系统流程

需要归纳的几点如下:

1. 新版buildroot已经把rootfs的**/etc/init.d/的rcS等启动脚本移到了package/initscripts/**目录下。

2. **系统默认的rcS脚本不会直接做系统用户态启动初始化操作,而是会调用/etc/init.d/目录下的SXX开

头的脚本执行系统用户态启动的流程,其中XX是数字,数字越小的脚本优先于数字大的脚本被调

用。**用于实际的系统用户态启动脚本应该以SXX这这种格式命名,install到output/target/etc/init.d/

目录下。

3. **fakeroot是一个主机上使用的软件包,它会被buildroot下载编译,用于为构建rootfs提供一个虚拟的

root权限环境,只有在root权限下,才能把output/target/中的目录和文件变成root用户,并创建dev节

点。**有了fakeroot环境,系统构建者无需获取主机的root权限,也能在fakeroot下把文件改为root用

户,并制作root方式。

fakeroot: fakeroot是一个用于模拟root用户权限的工具,可以模拟一个用户对文件系统的操作行

为,而不需要实际的root用户权限。

1. 用户特定格式的rootfs制作脚本,最后都会被写到一个脚本中,该脚本会在fakeroot环境中执行。

五、buildroot配置busybox

1.介绍

buildroot 在构建根文件系统的时候也是需要用到 busybox 的,buildroot 会自动下载 busybox 压缩包,

buildroot 下载的源码压缩包都存放在源码目录下的dl目录下,在dl目录下就有一个叫做"busybox"的文件

夹,此目录下保存着 busybox 压缩包,如下图所示:

buildroot 将 所 有 解 压 缩 后 的 软 件 保 存 在 源 码 目 录 下 的 output/build 目 录 中 , 我 们 可 以 在 找 到

output/build/busybox-1.35.0 这个文件夹,此文件夹就是解压后的 busybox 源码,如下图所示:

2.配置busybox

buildroot/buildroot-2023.02$ make busybox-menuconfig

3.支持中文

从 busybox1.17.0 以上之后,对 ls 命令不做修改是无法显示中文的。就算是内核设置了支持中文的话,

在 shell 下用 ls 命令也是无法显示中文的,这是因为 busybox1.17.0 以后版本对中文的支持进行了限制。

要想让 busybox1.17.0 以上支持中文,需要修改libbb/printable_string.clibbb/unicode.c文件。

4、编译

5.shell终端提示符显示路径

目前我们用busybox编译出来的文件系统终端提示符一直是"#",这样不利于我们查看自己当前所处的路

径。最好能像 Ubuntu 一样,可以提示当前登录的用户名,主机名以及所处的目录。如果想达到此效果,

我们需要先了解一个环境变量PS1,格式如下:

PS1 = '命令列表'

命令列表可以有如下参数:

\! 显示该命令的历史记录编号。

\# 显示当前命令的命令编号。

\$ 显示$符作为提示符,如果用户是 root 的话,则显示#号。

\\ 显示反斜杠。

\d 显示当前日期。

\h 显示主机名。

\n 打印新行。

\nnn 显示 nnn 的八进制值。

\s 显示当前运行的 shell 的名字。

\t 显示当前时间。

\u 显示当前用户的用户名。

\W 显示当前工作目录的名字。

\w 显示当前工作目录的路径

我们打开buildroot制作出来的根文件系统目录下的/etc/profile文件可以看到如下内容:

export PATH="/bin:/sbin:/usr/bin:/usr/sbin"

if [ "$PS1" ]; then

if [ "`id -u`" -eq 0 ]; then

export PS1='# '

else

export PS1='$ '

fi

fi

export EDITOR='/bin/vi'

# Source configuration files from /etc/profile.d

for i in /etc/profile.d/*.sh ; do

if [ -r "$i" ]; then

. $i

fi

done

unset i

我们将/etc/profile文件内容修改成如下:

http://www.dtcms.com/a/494634.html

相关文章:

  • 开源 C++ QT QML 开发(二十二)多媒体--ffmpeg编码和录像
  • 详细分析平衡树--红黑树(万字长文/图文详解)
  • 国产开源代码管理工具 GitPuk 安装+入门全流程解析
  • wordpress本地视频教程免费网站seo优化
  • 前端布局入门:flex、grid 及其他常用布局
  • Excel中将毫秒时间戳转换为标准时间格式
  • 传奇网站模板免费下载建立网站需要多少钱费用
  • 第2讲:Go内存管理机制深度解析
  • 【解决】mayfly-go 容器启动失败 —— failed to connect to mysql!
  • 基于STM32低功耗授时系统的硬件电路设计-上
  • 嵌入式软件架构--多窗口显示1(后台软件实现)
  • 牛商网网站建设企业网站开发建设
  • 软件供应链安全的革命:深度解析链图·SBOM管理服务平台的技术突破
  • QChart控件:图例QLegend
  • 【活动预告】2025斗拱开发者大会,共探支付与AI未来
  • 开源Filestash 搭建“多合一”文件管理器
  • Web3.0的底层引擎
  • 建设一个手机网站怎么制作网站生成图片
  • QEMU:如何组织与 I2C 设备的透明交互
  • 精密电子东莞网站建设技术支持视频网站建设类图
  • AI+大数据时代:从架构重构看时序数据库的价值释放——关键概念、核心技巧与代码实践
  • CoRL-2025 | VLM赋能高阶推理导航!ReasonNav:在人类世界中实现与人类一致的导航
  • ARM开发板基础与文件传输
  • 【读书笔记】《一念之差》
  • ssh端口探测 端口测试
  • 计算机操作系统:避免死锁
  • YOLOv3 详解:核心改进、网络架构与目标检测实践
  • Redis过期键的删除策略有哪些?
  • 云南网站建设设计公司百度网站怎么做的
  • HTTP请求走私漏洞介绍