它整合了许多Linux上常用的工具和命令(utilities), 如rm, ls, gzip, tftp等。对于这些工具和命令,busybox中的实现可能不是最全的,但却是最常用的,因此它的特点就是短小精悍,特别适合对尺寸很敏感的嵌入式系统。

官网:https://busybox.net/

参考: http://www.tldp.org/HOWTO/Bootdisk-HOWTO/buildroot.html

busybox有两个作用:

  • 基于busybox构建rootfs

  • 编译生成Linux上常用的工具和命令

toolchain:gcc-linaro-5.4.1-2017.01-x86_64_aarch64-linux-gnu

1. 下载busybox

进官网,选择 BusyBox 1.31.1下载

解压:tar -vxjf busybox-1.31.1.tar.bz2

2. 配置

2.1 使用默认配置

make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- defconfig

  • defconfig,缺省配置,也就是默认配置选项。

  • allyesconfig,全选配置,也就是选中 busybox 的所有功能。

  • allnoconfig,最小配置。

2.2 定制

执行:make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- menuconfig

默认配置即可

3. build

3.1 创建一个文件夹用来存放roofs

cd ~/tools

mkdir rootfs

3.2 make

make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- install CONFIG_PREFIX=/home/wangbaoli/tools/rootfs

CONFIG_PREFIX=/home/wangbaoli/tools/rootfs用来指定安装文件夹

编译完成后,工具和命令被安装到~/tools/rootfs

4. 添加lib库

4.1 lib

lib文件夹中包含*.so *.a库,理论上我们应该copy gcc-toolchain下的lib库,并且根据需要做一定的删减,否者的话rootfs体积会太大。

gcc-toolchain下的lib库:/usr/local/gcc-linaro-5.4.1-2017.01-x86_64_aarch64-linux-gnu/aarch64-linux-gnu/libc/lib/

但是,这里为了节省做裁剪的时间,我直接复制已有rootfs的lib库。

1)mkdir lib

2)cp ~/repo/rootfs/buildroot-2019.02.5/output/target/lib/* ./lib

注:~/repo/rootfs/buildroot-2019.02.5/output/target 是buildroot默认的rootfs存放路径

3)创建lib64到lib的软连接

ln -s lib lib64

4.2 usr/lib

usr/lib文件夹中包含*.so *.a库,理论上我们应该copy gcc-toolchain下的usr/lib库,并且根据需要做一定的删减,否者的话rootfs体积会太大。

gcc-toolchain下的usr/lib库:/usr/local/gcc-linaro-5.4.1-2017.01-x86_64_aarch64-linux-gnu/aarch64-linux-gnu/libc/usr/lib

但是,这里为了节省做裁剪的时间,我直接复制已有rootfs的usr/lib库。

1)cd usr && mkdir lib

2)cp ~/repo/rootfs/buildroot-2019.02.5/output/target/usr/lib/* ./lib

3)ln -s lib lib64

5. 添加init和其他文件夹

5.1 执行:mkdir dev proc mnt sys tmp root

5.2 添加init

如果通过bootloader传入命令行参数init=xxx(通常是init=linuxrc),那么系统挂载文件系统后运行linuxrc。

如果存在文件/init,那么系统挂载文件系统后运行/init,即内核启动时会将/init作为第一个用户进程启动。

在rootfs下,新建init,添加:

#!/bin/sh

# devtmpfs does not get automounted for initramfs

/bin/mount -t devtmpfs devtmpfs /dev

exec 0</dev/console

exec 1>/dev/console

exec 2>/dev/console

exec /sbin/init "$@"

然后执行:chmod +x init

6. 完善

首先:mkdir etc && mkdir etc/init.d

在kernel挂载根文件系统后,运行的第一个程序是根目录下的linuxrc或init( 如果bootargs 设置 init=/linuxrc则运行linuxrc),实际是一个指向/bin/busybox的链接, 也就是说系统起来后运行的第一个程序是busybox本身。

linux先执行 /etc/inittab, 然后调用/etc/init.d/rcS, 最后是执行/etc/profile。

6.1 创建 /etc/init.d/rcS

开机启动脚本

#!/bin/sh

PATH=/sbin:/bin:/usr/sbin:/usr/bin

LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/lib:/usr/lib

export PATH LD_LIBRARY_PATH runlevel

/bin/hostname megvii

mount -a

mkdir /dev/pts

mount -t devpts devpts /dev/pts

echo /sbin/mdev > /proc/sys/kernel/hotplug

mdev -s

然后:chmod +x etc/init.d/rcS

6.2 创建 /etc/fstab

proc    /proc   proc    defaults 0 0

tmpfs   /tmp    tmpfs   defaults 0 0

sysfs   /sys    sysfs   defaults 0 0

tmpfs   /dev    tmpfs   defaults 0 0

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

6.3 创建 /etc/inittab

#etc/inittab

::sysinit:/etc/init.d/rcS

console::askfirst:-/bin/sh

::restart:/sbin/init

::ctrlaltdel:/sbin/reboot

::shutdown:/bin/umount -a -r

::shutdown:/sbin/swapoff -a

6.4 创建/etc/profile

USER="`id -un`"

LOGNAME=$USER

HOSTNAME=`/bin/hostname`

HOME=/root

PS1="[$USER@$HOSTNAME \W]\# "

PATH=$PATH

export USER LOGNAME HOSTNAME HOME PS1 PATH PATH LD_LIBRARY_PATH

此文件涉及系统的环境,即环境变量相关。这里修改会对所有用户起作用。

用户登录或切换(即Login shell 启动)时都有一个专用的运行环境,但首先执行 /etc/profile 。

在 /etc/profile 文件中设置的变量是全局变量。而 .bashrc文件(在用户的家目录下)则只对当前用户有用。

6.5最终目录

7. 打包

可以将rootfs打包压缩成各种格式,我打包成rootfs.cpio.gz

1) cd rootfs

2) 打包压缩成rootfs.cpio.gz

  • find ./* | cpio -H newc -o > rootfs.cpio

  • gzip rootfs.cpio

8. 测试

测试该rootfs.cpio.gz

boot kernel,出现如下错误,我们逐个来解决:

8.1 VFS: Cannot open root device "(null)" or unknown-block(0,0): error -6

[    2.086084] VFS: Cannot open root device "(null)" or unknown-block(0,0): error -6

[    2.086155] Please append a correct "root=" boot option; here are the available partitions:

[    2.086250] Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(0,0)

完成上述步骤5.2,添加init

8.2 can't run '/etc/init.d/rcS': No such file or directory

解决:完成上述步骤6

8.3 成功时的界面:

8.4 优化

1)去掉:Please press Enter to activate this console.

在/etc/inittab,将::askfirst:-/bin/sh改为::respawn:-/bin/sh

2)设置hostname

在/etc/init.d/rcS加入/bin/hostname yourname

3)设置user

在/etc/profile 设置USER=root

注:

1) 解压rootfs.cpio.gz

gunzip rootfs.cpio.gz

cpio -idmv <rootfs.cpio

基于busybox构建rootfs相关推荐

  1. 基于Yocto构建嵌入式Linux系统U-boot、kernel内核、rootfs文件系统

    前言 Yocto 是一个很强大的构建工具,其功能不仅仅是用来获取BSP源码和简单地编译源码,开发者还可以使用Yocto对其 开发板添加各种第三方开发库,而不需要每次重新从零开始编译源码,解决第三方依赖 ...

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

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

  3. 详解基于busybox、dropbear、ngnix制作完整的嵌入式Linux系统

    说明:         <一>:查看此博文,建议查看笔者上一篇博文(Linux启动过程),因为只有在完全了解Linux系统启动流程及一些配置文件的相关性,在阅读此博文才能有思路,理解起来更 ...

  4. 基于busybox的Linux小系统制作 (initrd)

    我们有时候有需要在busybox基础上,制作linux,可是却不知道具体怎么做,这里将对基于busybox的linux小系统制作做出详细的步骤说明. 准备环境: 1.一个Redhat完整系统的虚拟机, ...

  5. 移植busybox构建最小根文件系统

    Busybox:瑞士军刀,里面装有很多小命令. STEP 1:构建目录结构  创建根文件系统目录,主要包括以下目录 /dev  /etc /lib  /usr  /var /proc /tmp /ho ...

  6. Docker学习之六:基于Dockerfile构建镜像

    镜像制作 一般镜像的制作,通常需要修改镜像的配置文件,比如nginx的配置文件,可以通过以下的方式: 将配置文件做成存储卷,从宿主机编辑好之后,启动容器时应用程序加载配置文件的路径并和宿主机的目录建立 ...

  7. 基于scratch构建轻量快速镜像

    设计背景: 由于项目所限定的运行平台生态所限,没有良好的容器镜像支持无父镜像可以依赖(不像X86.ARM平台),且项目对容器镜像的启动时间和镜像大小的要求,所以需要从零开始构建镜像. docker的镜 ...

  8. 基于Buildroot的rootfs制作

    基于Buildroot的rootfs制作 本文当记录使用buildroot制作rockchip-rk3288平台的rootfs过程. 1.准备工作 首先,需要到Buildroot的官网下载最新版本的源 ...

  9. 为omap3530使用BusyBox构建linux文件系统及添加telnet服务

    一.设备清单: 1.天漠出产的mini8100核心板,用的是omap3530芯片: 2.linux-2.6.37内核: 3. 1.21.1版本的Busybox: 4.10.04.3版本的ubuntu操 ...

最新文章

  1. Sublime Text保存文件时自动去掉行末空格
  2. 数学狂想曲(五)——概率分布(2), 自相关互相关卷积
  3. HTML邮件制作规范
  4. 【sdut 1751】 区间覆盖问题
  5. 信息学奥赛一本通 2070:【例2.13】数字对调
  6. tcpdump命令--详解
  7. js打印线程id_Node.js多线程完全指南[每日前端夜话0x43]
  8. web和python前景_我想了解一下pythonweb和javaweb比较详细的学习成本和应用前景,谢谢!?...
  9. 少儿编程scratch系统介绍(附网站源码)
  10. R语言plot函数参数合集
  11. 算算职场薪水账 到手3000元税前工资约3760元
  12. 中国自然地理分区数据集 (含农业区划、森林工程、生态保护区、九大流域等)
  13. 针对Object和Array深拷贝处理
  14. Java中grabImage_JavaCV实现将视频以帧方式抽取
  15. 数据挖掘 | 判别分析 +朴素贝叶斯分类算法
  16. 一步教你超简单设置Android Studio背景图片
  17. MathType怎么编辑半开半闭区间
  18. 书法练字帖纸——井字格为什么受到学生青睐
  19. tf.dynamic_stitch
  20. 在Teams团队中快速添加SharePoint Online站点

热门文章

  1. Python 开发者在迁移到 Go(lang) 时需要知道哪些事?
  2. 如何生成.p12文件
  3. php与nginx整合
  4. 2013/01/04作业raid+lvm+quota
  5. php无法写入word文档,PHP生成WORD文档的问题
  6. python内存的回收机制_简单介绍python的垃圾回收机制
  7. HTML设置允许冒泡,html css hover也会冒泡
  8. java普通类方法的区别是什么_java – 普通接口类和只有抽象方法的抽象类之间有什么区别吗?...
  9. 79. 单词搜索(dfs)
  10. Codeforces Round #572 (Div. 2)(ABCD1D2E)