基于busybox构建rootfs
它整合了许多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相关推荐
- 基于Yocto构建嵌入式Linux系统U-boot、kernel内核、rootfs文件系统
前言 Yocto 是一个很强大的构建工具,其功能不仅仅是用来获取BSP源码和简单地编译源码,开发者还可以使用Yocto对其 开发板添加各种第三方开发库,而不需要每次重新从零开始编译源码,解决第三方依赖 ...
- 2.3【Linux系统移植之三】:使用BusyBox构建根文件系统(rootfs)
文章目录 一.搭建NFS服务器 二.使用BusyBox构建跟文件系统 2.1 修改顶层Makefile 2.2 busybox中文支持 2.3 配置busybox 2.4 编译busybox 2.5 ...
- 详解基于busybox、dropbear、ngnix制作完整的嵌入式Linux系统
说明: <一>:查看此博文,建议查看笔者上一篇博文(Linux启动过程),因为只有在完全了解Linux系统启动流程及一些配置文件的相关性,在阅读此博文才能有思路,理解起来更 ...
- 基于busybox的Linux小系统制作 (initrd)
我们有时候有需要在busybox基础上,制作linux,可是却不知道具体怎么做,这里将对基于busybox的linux小系统制作做出详细的步骤说明. 准备环境: 1.一个Redhat完整系统的虚拟机, ...
- 移植busybox构建最小根文件系统
Busybox:瑞士军刀,里面装有很多小命令. STEP 1:构建目录结构 创建根文件系统目录,主要包括以下目录 /dev /etc /lib /usr /var /proc /tmp /ho ...
- Docker学习之六:基于Dockerfile构建镜像
镜像制作 一般镜像的制作,通常需要修改镜像的配置文件,比如nginx的配置文件,可以通过以下的方式: 将配置文件做成存储卷,从宿主机编辑好之后,启动容器时应用程序加载配置文件的路径并和宿主机的目录建立 ...
- 基于scratch构建轻量快速镜像
设计背景: 由于项目所限定的运行平台生态所限,没有良好的容器镜像支持无父镜像可以依赖(不像X86.ARM平台),且项目对容器镜像的启动时间和镜像大小的要求,所以需要从零开始构建镜像. docker的镜 ...
- 基于Buildroot的rootfs制作
基于Buildroot的rootfs制作 本文当记录使用buildroot制作rockchip-rk3288平台的rootfs过程. 1.准备工作 首先,需要到Buildroot的官网下载最新版本的源 ...
- 为omap3530使用BusyBox构建linux文件系统及添加telnet服务
一.设备清单: 1.天漠出产的mini8100核心板,用的是omap3530芯片: 2.linux-2.6.37内核: 3. 1.21.1版本的Busybox: 4.10.04.3版本的ubuntu操 ...
最新文章
- Sublime Text保存文件时自动去掉行末空格
- 数学狂想曲(五)——概率分布(2), 自相关互相关卷积
- HTML邮件制作规范
- 【sdut 1751】 区间覆盖问题
- 信息学奥赛一本通 2070:【例2.13】数字对调
- tcpdump命令--详解
- js打印线程id_Node.js多线程完全指南[每日前端夜话0x43]
- web和python前景_我想了解一下pythonweb和javaweb比较详细的学习成本和应用前景,谢谢!?...
- 少儿编程scratch系统介绍(附网站源码)
- R语言plot函数参数合集
- 算算职场薪水账 到手3000元税前工资约3760元
- 中国自然地理分区数据集 (含农业区划、森林工程、生态保护区、九大流域等)
- 针对Object和Array深拷贝处理
- Java中grabImage_JavaCV实现将视频以帧方式抽取
- 数据挖掘 | 判别分析 +朴素贝叶斯分类算法
- 一步教你超简单设置Android Studio背景图片
- MathType怎么编辑半开半闭区间
- 书法练字帖纸——井字格为什么受到学生青睐
- tf.dynamic_stitch
- 在Teams团队中快速添加SharePoint Online站点
热门文章
- Python 开发者在迁移到 Go(lang) 时需要知道哪些事?
- 如何生成.p12文件
- php与nginx整合
- 2013/01/04作业raid+lvm+quota
- php无法写入word文档,PHP生成WORD文档的问题
- python内存的回收机制_简单介绍python的垃圾回收机制
- HTML设置允许冒泡,html css hover也会冒泡
- java普通类方法的区别是什么_java – 普通接口类和只有抽象方法的抽象类之间有什么区别吗?...
- 79. 单词搜索(dfs)
- Codeforces Round #572 (Div. 2)(ABCD1D2E)