前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >使用Busybox制作根文件系统

使用Busybox制作根文件系统

作者头像
手撕代码八百里
发布于 2021-09-26 02:54:12
发布于 2021-09-26 02:54:12
3K00
代码可运行
举报
文章被收录于专栏:猿计划猿计划
运行总次数:0
代码可运行

使用Busybox手工制作

Busybox本身包含了很了Linux命令,但是要编译其他程序的话需要手工下载、编译,如果它需要某些依赖库,你还需要手工下载、编译这些依赖库。 如果想做一个极简的文件系统,可以使用Busybox手工制作。

制作步骤

一、下载

busybox官方:https://busybox.net/

下载地址: https://busybox.net/downloads/

可以下载一个最新的版本,下载好之后,放到Linux中

二、配置环境&生成命令

解压出来

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
zh@zh-lpc:~/soft$ cd software/
zh@zh-lpc:~/soft/software$ ls
busybox-1.34.0.tar.bz2  
zh@zh-lpc:~/soft/software$
zh@zh-lpc:~/soft/software$ tar xvf busybox-1.34.0.tar.bz2

解压之后进入到解压后的目录中:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
zh@zh-lpc:~/soft/software$
zh@zh-lpc:~/soft/software$ cd busybox-1.34.0/
zh@zh-lpc:~/soft/software/busybox-1.34.0$ pwd
/home/zh/soft/software/busybox-1.34.0
zh@zh-lpc:~/soft/software/busybox-1.34.0$

修改Makefile

先留一手,修改之前,先备份一下

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
cp -p Makefile Makefile_bak

找到ARCH变量,修改如下:

代码语言:javascript
代码运行次数:0
运行
复制

修改后的:

修改CROSS_COMPILE变量

可以看到我的交叉编译工具的前缀是arm-linux-gnueabi-

修改如下:

配置busybox

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
make defconfig

在配置busybox-1.34.0版本的时候,出现:

我的交叉编译工具是4.9的,所以是没有这一条命令的,

此时你可以下载更高版本的交叉编译工具,或者更低版本的busybox,据我所知,这个版本是的交叉编译工具的命令是没有变化的。

下载一个更高版本的交叉编译工具

配置一下环境变量

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
export ARCH=arm
export CROSS_COMPILE=arm-linux-gnueabihf-
export PATH=$PATH:/home/zh/soft/linux_tools/gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf/bin

快速生效

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
source ~/.bashrc

重新执行make defconfig即可。

也可以使用图形化配置make menuconfig

报错了

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
zh@zh-lpc:~/soft/software/busybox-1.34.0$ make menuconfig
  HOSTCC  scripts/kconfig/lxdialog/checklist.o
<command-line>: fatal error: curses.h: 没有那个文件或目录
compilation terminated.
make[2]: *** [scripts/Makefile.host:120:scripts/kconfig/lxdialog/checklist.o] 错误 1
make[1]: *** [/home/zh/soft/software/busybox-1.34.0/scripts/kconfig/Makefile:14:menuconfig] 错误 2
make: *** [Makefile:448:menuconfig] 错误 2
zh@zh-lpc:~/soft/software/busybox-1.34.0$
zh@zh-lpc:~/soft/software/busybox-1.34.0$

解决办法: 这时因为系统中缺少一个套件 ncurses devel ,把此套件安装下即可

Ubuntu中使用如下命令安装即可,其他系统可以参考。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
sudo apt-get install ncurses-dev -y

安装之后再次执行即可看到图形化的配置界面

1、Settings

按回车即可进入

2、选择Build Options选择编译成静态库

3、然后按esc即可退出,退出时提示保存,确定即可

4、编译

如果觉得自己电脑线程数够用的话,可以适当调大或减小

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
make -j12

编译完成:

5、安装

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
make install

可以看到都放到了_install目录下

可以看到里面的bin目录下生成了一些常见的linux shell命令。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
zh@zh-lpc:~/soft/software/busybox-1.34.0$ cd _install/
zh@zh-lpc:~/soft/software/busybox-1.34.0/_install$ ls
bin  linuxrc  sbin  usr
zh@zh-lpc:~/soft/software/busybox-1.34.0/_install$
zh@zh-lpc:~/soft/software/busybox-1.34.0/_install$ ls bin/
arch     chmod     df             fatattr  hostname  linux32   mkdir       mv             ps         run-parts     stat    uname
ash      chown     dmesg          fdflush  hush      linux64   mknod       netstat        pwd        scriptreplay  stty    usleep
base32   conspy    dnsdomainname  fgrep    ionice    ln        mktemp      nice           reformime  sed           su      vi
base64   cp        dumpkmap       fsync    iostat    login     more        pidof          resume     setarch       sync    watch
busybox  cpio      echo           getopt   ipcalc    ls        mount       ping           rev        setpriv       tar     zcat
cat      cttyhack  ed             grep     kbd_mode  lsattr    mountpoint  ping6          rm         setserial     touch
chattr   date      egrep          gunzip   kill      lzop      mpstat      pipe_progress  rmdir      sh            true
chgrp    dd        false          gzip     link      makemime  mt          printenv       rpm        sleep         umount
zh@zh-lpc:~/soft/software/busybox-1.34.0/_install$
zh@zh-lpc:~/soft/software/busybox-1.34.0/_install$

现在命令已经生成了

三、拷贝必要的库文件

1、首先在自己习惯的位置,创建一个rootfs目录

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
zh@zh-lpc:~$ cd soft/linux_tools/
zh@zh-lpc:~/soft/linux_tools$
zh@zh-lpc:~/soft/linux_tools$ mkdir rootfs

2、把生成的所有文件都拷贝到创建好的rootfs目录下

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
zh@zh-lpc:~/soft/linux_tools/rootfs$
zh@zh-lpc:~/soft/linux_tools/rootfs$ cp -arf ~/soft/software/busybox-1.34.0/_install/* ./
zh@zh-lpc:~/soft/linux_tools/rootfs$
zh@zh-lpc:~/soft/linux_tools/rootfs$ pwd
/home/zh/soft/linux_tools/rootfs
zh@zh-lpc:~/soft/linux_tools/rootfs$ ls
bin  linuxrc  sbin  usr
zh@zh-lpc:~/soft/linux_tools/rootfs$
zh@zh-lpc:~/soft/linux_tools/rootfs$

3、把Linux中用到的一些库文件拷贝到rootfs/lib目录下

3-1:创建lib目录

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
zh@zh-lpc:~/soft/linux_tools/rootfs$ ls
bin  linuxrc  sbin  usr
zh@zh-lpc:~/soft/linux_tools/rootfs$
zh@zh-lpc:~/soft/linux_tools/rootfs$ mkdir lib
zh@zh-lpc:~/soft/linux_tools/rootfs$
zh@zh-lpc:~/soft/linux_tools/rootfs$ ls
bin  lib  linuxrc  sbin  usr
zh@zh-lpc:~/soft/linux_tools/rootfs$

可以先看一下自己库所在位置

可以看到有很多常用的库文件

3-2:拷贝过来

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
zh@zh-lpc:~/soft/linux_tools/rootfs$ cp -arf /home/zh/soft/linux_tools/gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf/arm-linux-gnueabihf/lib/* ./lib/

四、创建字符设备

底层与用户交互的文件

先创建一个dev目录,用来存放各种节点

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
zh@zh-lpc:~/soft/linux_tools/rootfs$ mkdir dev
zh@zh-lpc:~/soft/linux_tools/rootfs$
zh@zh-lpc:~/soft/linux_tools/rootfs$ ls
bin  dev  lib  linuxrc  sbin  usr
zh@zh-lpc:~/soft/linux_tools/rootfs$
zh@zh-lpc:~/soft/linux_tools/rootfs$ cd dev/
zh@zh-lpc:~/soft/linux_tools/rootfs/dev$
zh@zh-lpc:~/soft/linux_tools/rootfs/dev$ sudo mknod -m 666 tty1 c 4 1
[sudo] zh 的密码:
zh@zh-lpc:~/soft/linux_tools/rootfs/dev$
zh@zh-lpc:~/soft/linux_tools/rootfs/dev$
zh@zh-lpc:~/soft/linux_tools/rootfs/dev$ sudo mknod -m 666 tty2 c 4 2
zh@zh-lpc:~/soft/linux_tools/rootfs/dev$
zh@zh-lpc:~/soft/linux_tools/rootfs/dev$ sudo mknod -m 666 tty3 c 4 3
zh@zh-lpc:~/soft/linux_tools/rootfs/dev$
zh@zh-lpc:~/soft/linux_tools/rootfs/dev$ sudo mknod -m 666 tty4 c 4 4
zh@zh-lpc:~/soft/linux_tools/rootfs/dev$
zh@zh-lpc:~/soft/linux_tools/rootfs/dev$
zh@zh-lpc:~/soft/linux_tools/rootfs/dev$ sudo mknod -m 666 console c 5 1
zh@zh-lpc:~/soft/linux_tools/rootfs/dev$
zh@zh-lpc:~/soft/linux_tools/rootfs/dev$ sudo mknod -m 666 null c 1 3
zh@zh-lpc:~/soft/linux_tools/rootfs/dev$
zh@zh-lpc:~/soft/linux_tools/rootfs/dev$ ls
console  null  tty1  tty2  tty3  tty4
zh@zh-lpc:~/soft/linux_tools/rootfs/dev$

五、启动测试

在开发板上指定rootfs的目录,即可启动成功,有一些错误不必担心

can’t run ‘/etc/init.d/rcS’: No such file or directory

这个错误可以直接创建一个即可

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
zh@zh-lpc:~/soft/linux_tools/rootfs$ mkdir init.d
zh@zh-lpc:~/soft/linux_tools/rootfs$ cd init.d/
zh@zh-lpc:~/soft/linux_tools/rootfs/init.d$
zh@zh-lpc:~/soft/linux_tools/rootfs/init.d$ touch rcS
zh@zh-lpc:~/soft/linux_tools/rootfs/init.d$
zh@zh-lpc:~/soft/linux_tools/rootfs/init.d$ chmod 777 rcS
zh@zh-lpc:~/soft/linux_tools/rootfs/init.d$
zh@zh-lpc:~/soft/linux_tools/rootfs/init.d$ vim rcS
zh@zh-lpc:~/soft/linux_tools/rootfs/init.d$
zh@zh-lpc:~/soft/linux_tools/rootfs/init.d$ cat rcS
echo "Hello zheng hui"
zh@zh-lpc:~/soft/linux_tools/rootfs/init.d$
zh@zh-lpc:~/soft/linux_tools/rootfs/init.d$ ls -l
总用量 4
-rwxrwxrwx 1 zh zh 23 925 20:16 rcS
zh@zh-lpc:~/soft/linux_tools/rootfs/init.d$
zh@zh-lpc:~/soft/linux_tools/rootfs/init.d$ cd ..
zh@zh-lpc:~/soft/linux_tools/rootfs$ ls
bin  dev  init.d  lib  linuxrc  sbin  usr
zh@zh-lpc:~/soft/linux_tools/rootfs$
zh@zh-lpc:~/soft/linux_tools/rootfs$ mkdir etc
zh@zh-lpc:~/soft/linux_tools/rootfs$
zh@zh-lpc:~/soft/linux_tools/rootfs$ mv init.d etc/
zh@zh-lpc:~/soft/linux_tools/rootfs$
zh@zh-lpc:~/soft/linux_tools/rootfs$ ls etc/
init.d
zh@zh-lpc:~/soft/linux_tools/rootfs$

再次启动后可以看到:

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021/09/25 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
【ijkplayer】编译 Android 版本的 ijkplayer ⑥ ( 进入 ijkplayer-android/android 目录 | 执行 compile-ijk.sh 脚本完成编译 )
参考 https://github.com/bilibili/ijkplayer 项目的编译过程 ;
韩曙亮
2023/03/30
6810
【ijkplayer】编译 Android 版本的 ijkplayer ⑥ ( 进入 ijkplayer-android/android 目录 | 执行 compile-ijk.sh 脚本完成编译 )
c/c++基础零散补充
s1mba
2018/01/03
7260
c/c++基础零散补充
c++ 之布尔类型和引用的学习总结!
在c语言里面我们知道是没有布尔数据类型的,而在C++中添加了布尔数据类型(bool),它的取值是:true或者false(也就是1或者0),在内存大小上它占用一个字节大小:
用户6280468
2022/03/21
4570
你所不知道的printf函数
printf是接受变长参数的函数,传入printf中的参数个数可以不定。而我们在变长参数探究中说到: 调用者会对每个参数执行“默认实际参数提升",提升规则如下: ——float将提升到double ——char、short和相应的signed、unsigned类型将提升到int
用户4645519
2020/09/08
4900
你所不知道的printf函数
C++之友元的学习总结
注意:func() 全局函数是 Test 类的友元,func() 可以访问Test 类的所有成员,但是 func() 不是 Test 的成员函数。
用户6280468
2022/03/21
2480
C++之友元的学习总结
你可能不知道的printf
printf可能是我们在学习C语言的过程中最早接触的库函数了。其基本使用想必我们都已经非常清楚了。但是下面的这些情况你是否已经清楚地知道了呢?
编程珠玑
2019/07/12
4490
Postgresql中的C/C++混编(JIT)
GCC编译的三个.o文件llvmjit、llvmjit_deform、llvmjit_expr
mingjie
2023/10/13
2640
Postgresql中的C/C++混编(JIT)
【IOS 开发】Objective - C 入门 之 数据类型详解
转载请注明出处 : http://blog.csdn.net/shulianghan/article/details/38544659
韩曙亮
2023/03/27
1.2K0
3 C++ Boost 字符,文本
3 C++ Boost 字符,文本 目录: 字符与数值转换 Boost format函数 简单实用 Boost format 输出人员信息 小案例 Boost format 数字处理 Boost format 高级特性 Boost String 处理,大小写转换 Boost String  字符串查找  Boost String 字符串判断式 Boost String 字符串替换: Boost String  字符串分割 Boost String trim剔除两边字符 Boost String  regex
py3study
2020/01/14
1.6K0
c++之重载函数学习总结
从上面报错的结果里面有一个单词ambiguous(意思是梦棱两可的),也就是说默认参数这种使用时不允许的。
用户6280468
2022/03/21
4100
C++之拷贝构造函数的浅copy和深copy
当类中没有定义构造函数时,编译器默认提供一个无参构造函数,并且其函数体为空;换句话来说,就是我们在类中,不用我们程序猿自己写,编译就自动提供了无参构造函数(只是我们肉眼看不到!)
用户6280468
2022/03/21
4080
C++之拷贝构造函数的浅copy和深copy
C++之Lambda研究
本文代码测试环境为“GCC-9.1.0”,有关编译器的安装请参考《安装GCC-8.3.0及其依赖》,适用于“GCC-9.1.0”。
一见
2019/06/04
8410
C++之初始化列表学习总结
1、在介绍列表之前,我们先来看看使用const关键字来修饰类中的成员会有什么事情发生,下面是一段简单代码:
用户6280468
2022/03/21
2450
C语言之宏定义用法
在上篇文章里面,我们分析了预处理的一个完整过程,这能够让我们理解一个写好的程序,在生成一个可执行文件,到底发生了什么,对我们在大型工程项目里面有助于对程序的理解;今天我们继续接着上篇文章的基础上,来分享有关c语言里面关于宏定义的用法!
用户6280468
2022/03/21
2.9K0
每日一水之strcmp用法
strcmp函数 C/C++函数,比较两个字符串 设这两个字符串为str1,str2, 若str1==str2,则返回零; 若str1<str2,则返回负数; 若str1>str2,则返回正数。 规则 当s1<s2时,返回为负数; 当s1==s2时,返回值= 0; 当s1>s2时,返回正数。 即:两个字符串自左向右逐个字符相比(按ASCII值大小相比较),直到出现不同的字符或遇'\0'为止。如: "A"<"B" "a">"A" "computer">"compare" 特别注意:strcmp(const c
Angel_Kitty
2018/04/08
1K0
C语言边角料:结构体中指针类型的成员变量,它的类型重要吗?
昨天在编译代码的时候,之前一直OK的一个地方,却突然出现了好几个 Warning!
IOT物联网小镇
2021/05/13
5560
如何写出优雅的C++代码
工欲善其事必先利其器,优雅的代码离不开静态代码检查工具,大家可能平时使用较多的是cppcheck,但今天我想跟大家分享另一个静态代码检查工具clang-tidy。
DeROy
2021/01/20
1.1K0
cuda8+cuDNN Faster R-CNN安装塈运行demo
该文介绍了如何使用Faster R-CNN在CPU上进行目标检测,并总结了在实践过程中需要注意的一些关键点。包括使用预训练模型、修改训练脚本、设置合适的训练参数和优化模型等方面。同时,文章还提供了在CPU上运行Faster R-CNN的示例代码和具体操作流程。
10km
2018/01/03
1.5K0
再论C++中的const和引用
今天给大家分享一下这段时间学习c++的总结学习:c++里面的const关键字和引用。
用户6280468
2022/03/21
4300
C语言的main函数解析
main函数的返回值用于说明程序的退出状态。如果返回0,则代表程序正常退出。返回其它数字的含义则由系统决定。通常,返回非零代表程序异常退出。
小林C语言
2020/12/25
2.6K0
C语言的main函数解析
相关推荐
【ijkplayer】编译 Android 版本的 ijkplayer ⑥ ( 进入 ijkplayer-android/android 目录 | 执行 compile-ijk.sh 脚本完成编译 )
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文