前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >busybox rootfs 与 ubuntu rootfs_boot.img root

busybox rootfs 与 ubuntu rootfs_boot.img root

作者头像
全栈程序员站长
发布2022-11-08 15:24:06
8500
发布2022-11-08 15:24:06
举报
文章被收录于专栏:全栈程序员必看

下载busybox的源码,解压后,设定ARCH 和 CROSS_COMPILE的两个基本环境变量,选择defconfig作为默认配置,大部分的busybox 工具都会被编译出来。 如果不指定输出目录,默认输出到根目录的_install目录下面,如果需要指定目录,配置CONFIG_PREFIX=/a/b/c/rootfs, 这样make生成的 /bin, /sbin, /usr三个默认文件夹就直接在rootfs目录下。

代码语言:javascript
复制
make ARCH=arm CROSS_COMPILE=arm-linux-gnu-eabihf-   defconfig

这样,busybox的工具文件都生成了, 默认情况下,busybox的可执行文件,不是静态链接的, 可以用readelf -d命令查看busybox依赖的库,所以需要把刚才用的交叉编译comipler的lib文件,都copy到rootfs的lib目录下。(这里要删除*.a *.la *.o等文件,只保留*.so文件)

代码语言:javascript
复制
 mkdir rootfs/lib
   cp -rf /toolchain/arm-linux-gnu-eabi/lib/libc /rootfs/lib

这里, 默认的libc库文件都比较大,包含了调试信息,符号信息等,不适合在嵌入式的有限内存空间场景,因此需要做好裁剪,使用strip命令去除debug信息。 同样的, libc/usr/lib/下面的库文件,也需要复制到rootfs下面。这里要删除*.a *.la *.o等文件,只保留*.so文件。 同时也用strip命令裁剪库文件。

代码语言:javascript
复制
mkdir -p rootfs/usr/lib
cp -rf /toolchain/arm-linux-gnu-eabi/lib/libc/usr/lib

添加其他rootfs要用的默认目录文件,dev,proc, mnt, sys, tmp, root,etc。 到这里,rootfs的骨架已经成型,接着要做的是添加kernel挂载rootfs后,要运行的init事务。 kernel挂载rootfs为根目录,替换掉系统刚刚启动时创建的临时的vfs,并开始运行第一个程序,该程序默认存放在rootfs根目录下,名字是linuxrc或者是init(如果bootargs设置了init=/linuxrc就允许linuxrc)。 linux先执行 /etc/inittab, 然后调用/etc/init.d/rcS, 最后是执行/etc/profile。 所以我们要做的修改inittab,让kernel按指定的次序,依次执行启动脚本。下面是实际的inittab的例子:

::sysinit:/etc/bspinit ::sysinit:/etc/rc.sysinit ::respawn:-/bin/sh

bspinit内容如下

代码语言:javascript
复制
#!/bin/sh
mount -n -t tmpfs tmpfs /tmp
mount -n -t proc proc /proc
mount -n -t sysfs sysfs /sys
mount -n -t tmpfs -o mode=0755 udev /dev

# telnetd need later line.
mkdir /dev/pts
mount -t devpts devpts /dev/pts

# Oprofile
if [ -e /var/lib/oprofile ]; then
        mount -t tmpfs tmpfs /root
        mount -t tmpfs tmpfs /var/lib/oprofile
fi

[ -e /proc/sys/kernel/hotplug ] && echo "" > /proc/sys/kernel/hotplug
start-stop-daemon --start --quiet --exec /sbin/udevd -- --daemon
/sbin/udevadm trigger --subsystem-nomatch=usb
/sbin/udevadm settle --timeout=10

在实际项目中,可以自己定义etc里面的内容,然后生成一个单独的emmc分区文件如etc_rw,系统启动的时候,挂载在rootfs的/etc/目录上,替换掉默认的etc内容。 这样,一个完整可用的rootfs就创建完成。由嵌入式image生成脚本,完成后续的打包,放入不同的分区文件,写入emmc之中。

参考链接: https://blog.csdn.net/u012247418/article/details/106021389

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/185225.html原文链接:https://javaforall.cn

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

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

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档