RTThreadIoTOS · 2021年07月06日

如何把Linux工具里的“军刀”BusyBox移植到RT-Thread Smart?

RT-Thread Smart 系列连载

image.png

BusyBox 是一个集成了数百个常用Linux/Unix命令和工具的软件。BusyBox 包含了一些简单的工具,例如ls、cat和echo等等,还包含了一些更大、更复杂的工具,例grep、find、mount以及telnet。有些人将 BusyBox 称为 Linux 工具里的瑞士军刀。简单的说BusyBox就好像是个大工具箱,它集成压缩了 Linux 的许多工具和命令,也包含了 Android 系统的自带的shell。

这篇文章将介绍把BusyBox移植到RT-Thread Smart下。

准备工作

busybox-1.32.0为例,下载源码包:

1$ mkdir -p userapps/gnu-apps/busybox
2$ wget https://busybox.net/downloads/busybox-1.32.0.tar.bz2

移植脚本

与上篇文章有些许不同的是,busybox自带Makefile,所以需要给Makefile里面的一些变量替换成交叉编译环境变量,下面会通过一个patch文件实现。

首先还是创建一份简单的build.sh脚本:

 1#!/bin/sh
 2
 3APP_NAME="busybox"
 4VERSION="1.32.0"
 5APP_DIR=${APP_NAME}-${VERSION}
 6
 7# userapps is ROOTDIR
 8ROOTDIR=${PWD}/../..
 9
10# set env
11export RTT_EXEC_PATH=${ROOTDIR}/../tools/gnu_gcc/arm-linux-musleabi_for_x86_64-pc-linux-gnu/bin
12export PATH=$PATH:$RTT_EXEC_PATH:$RTT_EXEC_PATH/../arm-linux-musleabi/bin
13
14# get src
15tar xjf ${APP_DIR}.tar.bz2
16cd ${APP_DIR}
17
18# patch Makefile
19patch -Np1 -i ../makefile.patch
20
21# get default config
22cp ../def_config .config
23
24make V=1

makefile.patch文件如下:

1--- busybox-1.32.0/Makefile.orig        2020-12-24 12:51:40.752730739 +0800
 2+++ busybox-1.32.0/Makefile     2020-12-24 12:55:44.162093866 +0800
 3@@ -4,6 +4,21 @@
 4 EXTRAVERSION =
 5 NAME = Unnamed
 6
 7+
 8+CROSS_COMPILE= arm-linux-musleabi-
 9+
10+PWD := $(shell pwd)
11+# userapp dir
12+ROOTDIR := $(PWD)/../../..
13+RT_DIR=$(ROOTDIR)/sdk/rt-thread
14+INC_DIR=${ROOTDIR}/sdk/include
15+LIB_DIR=${ROOTDIR}/sdk/lib
16+
17+CFLAGS = -march=armv7-a -marm -msoft-float -D__RTTHREAD__ -Wall -O2 -n --static -I. -I$(RT_DIR)/include -I$(RT_DIR)/components/dfs -I$(RT_DIR)/components/drivers -I$(RT_DIR)/components/finsh -I$(RT_DIR)/components/net -I${INC_DIR}
18+
19+LDFLAGS = -L. -L${LIB_DIR} -T $(ROOTDIR)/linker_scripts/arm/cortex-a/link.lds -march=armv7-a -marm -msoft-float -L$(RT_DIR)/lib -Wl,--whole-archive -lrtthread -Wl,--no-whole-archive -n --static -Wl,--start-group -lrtthread -Wl,--end-group
20+
21+
22 # *DOCUMENTATION*
23 # To see a list of typical targets execute "make help"
24 # More info can be located in ./README    

Busybox在编译之前最好通过"make menuconfig"配置一下需要编译的指令,这里为了方便提供一个配置好的def\_config文件,在上面的build.sh脚本里面会用到。

文件比较长,请将以下链接复制至外部浏览器打开,打开后可直接下载文件:

https://gitee.com/rtthread/rt...

编译:

1userapps/gnu-apps/busybox$ ls
2build.sh  busybox-1.32.0.tar.bz2  def_config  makefile.patch
3userapps/gnu-apps/busybox$ sh build.sh

使用BusyBox

在Linux上使用BusyBox,一般的方式会是建立一个个的符号链接,例如把ls通过符号链接的方式链接到busybox,这样在调用ls时,实际上会被调用到busybox。只是对于main(int argc, char** argv)来说,这个argv[0]'ls'

当然busybox也支持直接调用busybox,并把命令附加在后面的方式,例如:

1msh /> busybox.elf ls -l

因为RT-Thread及RT-Thread Smart并不支持符号链接,所以还只能采用后面的形式。

BusyBox包含有很多个指令,可以通过执行“make menuconfig”来配置需要编译的指令。

image.png

查看busybox当前可使用的命令可以使用\`help' 选项:

image.png

查看具体某个指令的使用帮助,如 ls 的:

image.png

更多指令

为确保一些特定的指令正常运行,需要在kernel配置里面打开null、random、zero等设备;并确保/etc/resolv.com和/etc/hosts文件存在。

1msh /> busybox.elf cat /etc/resolv.conf
2nameserver 114.114.114.114
3
4msh /> busybox.elf cat /etc/hosts
5127.0.0.1    localhost

busybox是一套很精简的工具集,已经在rt-smart上验证过的命令包括(但不限于):

  • 归档类工具,例如 tar/unzip/bzip2/bunzip2/bzcat/gzip/gunzip/zcat/xz/unxz/xzcat 等;
  • 核心类工具,例如 cat/cp/dd/echo/head/ls/mv/mkdir/pwd/rm/tail/uname/wc 等;
  • 编辑类工具,例如 vi/diff/cmp/awk/sed 等;
  • 网络类工具,例如ftpd/tcpsvd/ftpgt/ftpput/tftp/nslookup/telnet/httpd/wget 等

推荐阅读
【RT-Thread开源作品秀】基于STM32F407与RT-Thread的智能水培系统
【AI简报20210521期】 2nm 芯片性能提升了多少、清华「计图」现在支持国产芯片了!
【RW007系列综合实战1】STM32+RW007实现BLE透传功能

原文链接:如何把Linux工具里的“军刀”BusyBox移植到RT-Thread Smart?
作者: RT-Thread
推荐阅读
关注数
8071
内容数
181
小而美的物联网操作系统,经过14年的累积发展,RT-Thread 已经拥有一个国内最大的嵌入式开源社区,同时被广泛应用于能源、车载、医疗、消费电子等多个行业,累积装机量超过4亿台,成为国人自主开发、国内最成熟稳定和装机量最大的开源 RTOS。
目录
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
安谋科技学堂公众号
关注安谋科技学堂
实时获取安谋科技及 Arm 教学资源
安谋科技招聘公众号
关注安谋科技招聘
实时获取安谋科技中国职位信息