Busybox构建根文件系统

  • 介绍
  • 下载
  • 配置busybox
    • 配置交叉编译器
    • 取消静态库编译
    • 添加vi命令的支持
    • 取消简化模块
    • 支持mdev
    • 中文支持
  • 编译
  • 完善根文件系统
    • 创建必要文件夹
    • 复制库
    • 启动文件
      • etc/init.d/rcS
      • /etc/fstab
      • /etc/inittab
  • 根文件系统的打包
  • 测试
    • 网络测试
    • 程序运行测试
    • 自启动测试

介绍

BusyBox:嵌入式Linux的瑞士军刀

BusyBox将许多常见UNIX实用程序的微小版本组合成一个小的可执行文件。它为您通常在GNU fileutils、shellutils等中找到的大多数实用程序提供了替代品。BusyBox中的实用程序通常比其全功能GNU同类程序有更少的选项;然而,所包含的选项提供了预期的功能,其行为与GNU对应项非常相似。BusyBox为任何小型或嵌入式系统提供了一个相当完整的环境。

编写BusyBox时考虑了大小优化和有限的资源。它也是非常模块化的,因此您可以在编译时轻松地包含或排除命令(或功能)。这使得定制嵌入式系统变得很容易。要创建一个工作系统,只需在/dev中添加一些设备节点,在/etc中添加几个配置文件,以及一个Linux内核。

BusyBox由Denys Vlasenko维护,并根据GNU通用公共许可证版本2获得许可。

下载

下载连接:https://busybox.net/downloads/

本篇文章使用 busybox-1.35.0.tar.bz2 这个版本的包,下载完成过后上传到我们的嵌入式开发的虚拟机中并解压该文件;

tar xvf busybox-1.35.0.tar.bz2
cd busybox-1.35.0/

配置busybox

配置busybox和配置kernel和uboot是相同的方法,在busybox的目录中使用:

make menuconfig

配置交叉编译器

这里首先是要保证交叉编译器配置没有问题,我这里使用的是imx6ull,所以使用的交叉编译器是arm-linux-gnueabihf-,然后我们需要获取到交叉编译器的绝对路径,这里我们使用下面的命令就可以快速查看到;COLLECT_LTO_WRAPPER参数就有我们的交叉编译器目录,从…/这个部分分开,然后再结尾添加
交叉编译器的前缀,我这里是arm-linux-gnueabihf-

arm-linux-gnueabihf-gcc -v  # 查看交叉编译器版本
# 我最终要填入的交叉编译器路径
/usr/local/arm/gcc-linaro-7.5.0-2019.12-i686_arm-linux-gnueabihf/bin/arm-linux-gnueabihf-


我们进入busybox配置界面后依次进入setting->Cross compiler prefix回车填入上面获取的交叉编译器路径

取消静态库编译

该选项在比较新的busybox版本中默认是未选中如果遇到比较老的版本需要检查一下,选择静态编译编译出来的根文件系统也比较大;

setting->Build static binary (no shared libs)

添加vi命令的支持

我们的根文件中要操作修改文件就需要用到vi这里就必须选中
Settings -> vi-style line editing commands

取消简化模块

不选中
Linux Module Utilities-> Simplified modutils

支持mdev

选中mdev及mdev下面的所有选项
Linux System Utilities -> mdev

中文支持

setting->Support Unicode

除了选中这个选项外我们还需要修改busybox中的代码

vim libbb/printable_string.c


修改后

vim /libbb/unicode.c

直接跳转到1000行就可以看到,修改前

修改后

这两步操作主要是禁止字符大于 0X7F 的时候设置为‘?‘;

编译

make
make install CONFIG_PREFIX=../build # 将根文件系统放在上一级的build目录


然后我们可以看到bin和sbin目录中就有我们常用的一些Linux命令例如ls、cat、vi等等命令
linuxrc文件是用来挂载根文件系统的

完善根文件系统

创建必要文件夹

在我们的build目录中创建dev etc lib mnt proc sys tmp var这几个文件夹

mkdir dev etc lib mnt proc sys tmp var

复制库

将交叉编译器路径下的libc文件夹里面的库文件拷贝到我们的根文件系统中的lib文件夹中

如果用的是imx6ull路径如下

/usr/local/arm/gcc-linaro-7.5.0-2019.12-i686_arm-linux-gnueabihf/arm-linux-gnueabihf/libc/lib/

如果是用的rk3568路径如下

/usr/local/arm64/gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu/aarch64-linux-gnu/libc/lib/

拷贝使用下面这个指令

cp /usr/local/arm64/gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu/aarch64-linux-gnu/libc/lib/* ./lib -rfd

其中有一个文件是以软连接的方式存在的,所以这里我们需要单独操作一下,在rk3568中该文件为ld-linux-aarch64.so.1在imx6ull中该文件为ld-linux-armhf.so.3

rm ld-linux-armhf.so.3
cp /usr/local/arm/gcc-linaro-7.5.0-2019.12-i686_arm-linux-gnueabihf/arm-linux-gnueabihf/libc/lib/ld-linux-armhf.so.3 ./lib/
rm ./lib/debug/ -rf

启动文件

该篇幅取之于原子哥的教程

etc/init.d/rcS

mkdir ./etc/init.d
vim ./etc/init.d/rcS

填入下面的内容

#!/bin/sh  # 表示这是一个 shell 脚本。# PATH 环境变量保存着可执行文件可能存在的目录,这样我们在执行一些命令或者可执行文件的时候就不会提示找不到文件这样的错误。
PATH=/sbin:/bin:/usr/sbin:/usr/bin:$PATH# LD_LIBRARY_PATH 环境变量保存着库文件所在的目录,使用 export 来导出上面这些环境变量,相当于声明一些“全局变量”。
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/lib:/usr/lib
export PATH LD_LIBRARY_PATH # 使用 mount 命令来挂载所有的文件系统,这些文件系统由文件/etc/fstab 来指定
mount -a
# 创建目录/dev/pts,然后将 devpts 挂载到/dev/pts 目录中
mkdir /dev/pts
mount -t devpts devpts /dev/pts# 使用 mdev 来管理热插拔设备,通过这两行,Linux 内核就可以在/dev 目录下自动创建设备节点。关于 mdev 的详细内容可以参考 busybox 中的 docs/mdev.txt 文档
echo /sbin/mdev > /proc/sys/kernel/hotplug
mdev -s

创建完成后需要赋予该文件执行权限

chmod 777 ./etc/init.d/rcS

/etc/fstab

vim ./etc/fstab

fstab 在 Linux 开机以后自动配置哪些需要自动挂载的分区;

【file system】:要挂载的特殊的设备,也可以是块设备,比如/dev/sda 等等。
【mount point】:挂载点。
【type】:文件系统类型,比如 ext2、ext3、proc、romfs、tmpfs 等等。
【options】:挂载选项,在Ubuntu 中输入“man mount”命令可以查看具体的选项。一般使 用 defaults,也就是默认选项,defaults 包含了rw、suid、 dev、 exec、 auto、 nouser 和 async。
【dump】:为 1 的话表示允许备份,为 0不备份,一般不备份,因此设置为 0。
【pass】:磁盘检查设置,为 0 表示不检查。根目录‘/’设置为 1,其他的都不能设置为 1, 其他的分区从 2 开始。一般不在 fstab 中挂载根目录,因此这里一般设置为 0。

#<file system> <mount point> <type> <options> <dump> <pass>
proc            /proc       proc    defaults    0   0
tmpfs           /tmp        tmpfs   defaults    0   0
sysfs           /sys        sysfs   defaults    0   0

/etc/inittab

inittab 的详细内容可以参考 busybox 下的文件 examples/inittab。init 程序会读取/etc/inittab
这个文件,inittab 由若干条指令组成。每条指令的结构都是一样的,由以“:”分隔的 4 个段组
成,格式如下:
【id】:【runlevels】:【action】:【process】
【id】:每个指令的标识符,不能重复。但是对于 busybox 的 init 来说,有着特殊意义。
对于 busybox 而言用来指定启动进程的控制 tty,一般我们将串口或者 LCD 屏幕设置为控
制 tty。
【runlevels】:对 busybox 来说此项完全没用,所以空着。
【action】:动作,用于指定【process】可能用到的动作。busybox 支持的动作如下图;
【process】:具体的动作,比如程序、脚本或命令等

#etc/inittab
::sysinit:/etc/init.d/rcS # 系统启动以后运行/etc/init.d/rcS 这个脚本文件
console::askfirst:-/bin/sh  # 将 console 作为控制台终端,也就是 ttymxc0
::restart:/sbin/init # 重启的话运行/sbin/init
::ctrlaltdel:/sbin/reboot # 按下 ctrl+alt+del 组合键的话就运行/sbin/reboot重启系统
::shutdown:/bin/umount -a -r # 关机的时候执行/bin/umount,也就是卸载各个文件系统
::shutdown:/sbin/swapoff -a # 关机的时候执行/sbin/swapoff,也就是关闭交换分区

根文件系统的打包

每个芯片烧录需要的根文件系统镜像文件格式都不相同,这个需要先了解原厂提供的rootfs的格式才能完成打包(这里需要注意编译用的交叉编译器只能对应该交叉编译器支持的芯片使用这里的文件系统)

imx6ull打包格式

tar -vcjf rootfs.tar.bz2 ./build/*

nuc970,nuc980

mkyaffs2 --inband-tags -p 2048 build rootfs_yaffs2.img

rk3568

mkdir rk3568_rootfs
dd if=/dev/zero of=rk3568.img bs=1M count=300 ## 生成rk3568.img容器,容器大小300m,具体需要的大小可以通过du build -h查看我们根文件系统大小调整
mkfs.ext4 rk3568.img
sudo mount rk3568.img rk3568_rootfs # 将容器挂载到我们开始创建的文件夹,现在我们将文件复制到这个文件夹就完成了
sudo cp ./build/* ./rk3568_rootfs/ -rfpd
sudo umount rk3568_rootfs # 使用df命令可以查看是否已经取消挂载
du rk3568.img -h # 查看系统大小

测试

网络测试

静态分配

ifconfig eth0 192.168.1.166 netmask 255.255.255.0 up # 需要符合开发板所在网段的ip,这里配置的是网卡1,如果有多个网卡可以使用ifconfig -a
route add default gw 192.168.1.x # 开发板的默认网关地址是 192.168.1.1,如果接入的网络网关不是这个地址,可以用以下参数更改网关192.168.0.x 。

动态分配

ifconfig eth0 up
udhcpc -i eth0

测试

ping baidu.com

程序运行测试

#include <stdio.h>int main(void)
{while(1) {printf("hello world!\r\n");sleep(1);}return 0;
}

./imx6ull_main

自启动测试

在根目录创建一个app文件夹,将上面测试用的文件拷贝到app文件夹,然后我们通过vi工具修改/etc/init.d/rcS文件,在最后添加下面这段;

/app/imx6ull_main &

然后重启板子就可以看到程序的执行了,停止该程序可以使用ps -e查看到程序的pid号然后使用kill指令,也可以使用pkill指定名字来停止该程序

pkill /app/imx6ull_main

我们也可以将上面的网络配置指令放在这个文件中;

【ARM】使用Busybox构建根文件系统相关推荐

  1. 2.3【Linux系统移植之三】:使用BusyBox构建根文件系统(rootfs)

    文章目录 一.搭建NFS服务器 二.使用BusyBox构建跟文件系统 2.1 修改顶层Makefile 2.2 busybox中文支持 2.3 配置busybox 2.4 编译busybox 2.5 ...

  2. JZ2440:busybox构建根文件系统

    busybox版本是:1.24.2 此文章的链接:http://blog.csdn.net/qqliyunpeng/article/details/52163265 我的nfs的目录是 /source ...

  3. linux busybox路径,BusyBox构建根文件系统

    BusyBox是一个复合了大量简易版Linux工具的程序,嵌入式系统中使用它可以快速建立一个相对简易的根文件系统. 1.下载busybox 官网 www.busybox.net 目前(2015.8.8 ...

  4. 笔记:使用buildroot构建根文件系统

    文章目录 简介 构建过程 buildroot包下载 配置 Target options配置项 Build options配置项 Toolchain配置项 System configuration配置项 ...

  5. 嵌入式Linux利用busybox制作根文件系统

    本文介绍如何利用busybox制作一个最小根文件系统,系统包含ls.cd.ifconfig等基本指令,文件系统采用动态加载的方式. 1.去busybox官网下载源码   官网地址:busybox官网 ...

  6. 【ARM】使用Ubuntu-base构建根文件系统

    使用Buildroot构建根文件系统 介绍 资源下载 配置根文件系统 设置软件源 安装必要软件 添加新用户 设置主机名称和本机IP 设置终端串口 网络DHCP FTP服务器搭建 串口无法登录 开机启动 ...

  7. 教你用 buildroot 构建根文件系统

    如果想要构建完整的根文件系统,大家一般都是使用buildroot,它不仅包含了 busybox 的功能,而且里面还集成了各种软件,需要什么软件就选择什么软件,不需要我们去移植. 嵌入式系统三大部分:b ...

  8. 使用BusyBox制作根文件系统的操作步骤

    参考博客http://www.cnblogs.com/Charles-Zhang-Blog/p/3419301.html 一.构建根文件系统该有的目录 即在/rootfs/目录下创建该有的空目录: 一 ...

  9. 构建根文件系统(一)

    接着前边内核移植的文章,记录根文件系统的构建. 这里要用到强大的busybox,我选择的版本是busybox-1.18.5.tar.bz2 ,1.17的也可以:之所以选择这个版本是因为基于现在的交叉编 ...

最新文章

  1. 如何写一篇好的技术博客
  2. R语言dim函数返回NULL
  3. NCB|心咽发育多样化的单细胞转录轨迹分析
  4. 一次通过Blender2Ogre将FBK转为Mesh的失败尝试
  5. multiprocess模块使用进程池调用apply_async()提交的函数及回调函数不执行问题
  6. 算法导论2.1-2.3 部分答案
  7. SpaceX公布四月份宇宙飞船爆炸原因:由阀门泄露引发
  8. Android https通信问题
  9. yii ajax验证失败返回提示,Yii ajax显示错误提示,messagebox
  10. java 正则表达式 table_JavaEdge/Java/Java中正则表达式.md at master · VegTableBird/JavaEdge · GitHub...
  11. ajax请求成功后返回值如何赋值给js变量
  12. azure web应用部署_Java Web应用程序中的Azure AD SSO,ADFS SSO配置
  13. BGP增强特性(华为设备)
  14. 万嘉MOV格式转换器v1.00.102官方免费版
  15. code换取微信openid_快速实现微信公众号支付功能
  16. socket函数返回Too many open files
  17. Java基础知识笔记-11_2-Swing用户界面组件
  18. 2021Matlab项目课题推荐
  19. 复制淘宝店需要设置那些?
  20. 读《Evolving Algebraic Constructions for Designing Bent Boolean Functions》

热门文章

  1. 前端js入门——JavaScript 转义字符串
  2. javascript里的转义字符
  3. JavaCore-深入理解注解-Annotation
  4. Android 序列化(Serializable和Parcelable),kotlin开发windows程序
  5. Python join() 函数 连接字符串
  6. 虚拟机无线网卡与有线网卡互相ping通(不是转载,绝对有效)
  7. ftp服务器需要ssl证书吗,启用SSL加密功能确保FTP服务器安全性
  8. 【云原生 • DevOps】一文掌握持续集成工具 Jenkins
  9. 集成显卡常见故障大全
  10. Filter、FilterChain、FilterConfig 介绍