用buildroot为jslinux建立最小rootfs

本文介绍如何使用Buildroot 2016.08构建i686架构下的最小根文件系统rootfs.ext2,并通过QEMU进行模拟运行。此外还介绍了如何创建更大的ext2镜像文件以及使用tcc进行交叉编译的过程。
##############################################################################
制作镜像文件
buildroot-2016.08.1.tar.gz

make O=haoning menuconfig
Target options --->
Target Architecture Variant (i686) --->
因为我的当前系统uname是i686的,为了兼容指令集
Filesystem images --->
[*] ext2/3/4 root filesystem
为了生成rootfs.ext2

Target packages --->
Development tools --->
[*] make
生成命令行的make

make O=haoning -j16

得到buildroot/haoning/images/rootfs.ext2
编译出来的最小大概2.1M


mount -o loop rootfs.ext2 root

mv root/sbin/init root/sbin/init

vim root/sbin/init

#!/bin/sh
echo "JSLinux started, initializing..."

export PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin
export HOME=/root
export TERM=vt100
mount -n -t proc /proc /proc
mount -n -t sysfs /sys /sys
mount -n -t devpts devpts /dev/pts
mount -n -t tmpfs /tmp /tmp
mount -n -t tmpfs /var /var
ifconfig lo 127.0.0.1
#/sbin/mdev -s
mkdir -p "/tmp/root"

while /bin/true; do
echo "haoning buildroot-2016.08.1 this is before sh ttyS0.........."
setsid sh -c 'exec sh </dev/ttyS0 >/dev/ttyS0 2>&1 && echo "hahah"'
echo "this is not over ...."
done
~

运行


qemu-system-i386 -kernel /opt/jslinux/kernel/linux-2.6.20/arch/i386/boot/bzImage -drive file=rootfs.ext2.onlyext2,if=ide,cache=none -append "console=ttyS0 root=/dev/hda rw init=/sbin/init notsc=1" -boot order=dc,menu=on -net nic,vlan=0,macaddr=52:54:00:12:34:22,model=e1000,addr=08 -net tap,ifname=tap1,script=./if-up,downscript=./if-down -nographic

启动之后
/sbin/mdev -s
会在/dev下建好设备
包括jsclipboard

sync,保存到磁盘,这些dev是jslinux启动的时候用的

ctl+a x 退出qemu
ctl+a c是切换到monitor

重新mount修改rootfs.ext2里面的 /sbin/init
注释
#/sbin/mdev -s

替换jslinux-network的硬盘
cp rootfs.ext2.onlyext2 /var/www/jslinux-network/root.bin



由于只有2M左右,所以修改jslinux.js


/* Preload blocks so that the boot time does not depend on the
* time to load the required disk data (optional) */
// block_list = [ 0, 7, 3, 643, 720, 256, 336, 644, 781, 387, 464, 475, 131, 589, 468, 472, 474, 776, 777, 778, 779, 465, 466, 473, 467, 469, 470, 512, 59
2, 471, 691, 697, 708, 792, 775, 769 ];
block_list = [ 0, 7, 3 ];



进入jslinux
ip link可用

如果嫌硬盘不够大,还想装点其他东西


cd /opt/jslinux/buildroot/buildroot-2016.08.1/haoning/images
qemu-img create -f raw image.raw 20M
mkfs.ext2 image.raw
mkdir image
mount -o loop image.raw image
mount -o loop rootfs.ext2 root
cp -r root/* image/

把rootfs.ext2 里的文件cp到image.raw里面,jslinux和qemu可用

得到一个比较大有空间的image镜像image.raw给qemu用
如果使用gcc需要注意内核的版本
FATAL kernel too old
[url]http://blog.youkuaiyun.com/yimiyangguang1314/article/details/6095740[/url]

[color=red]★★★★★★★★★★★★★[/color]
交叉编译tcc
buildroot的i686-linux-gcc 在buildroot-2016.08.1/haoning/host
host目录下有完整的交叉编译用的gcc等,但是比较大,我们用tcc编译


export PATH=/opt/jslinux/buildroot/buildroot-2016.08.1/haoning/host/usr/bin
这下面有i686-linux-gcc
测试:
[code="java"]
# i686-linux-gcc --version
i686-linux-gcc.br_real (Buildroot 2016.08.1) 4.9.4
Copyright (C) 2015 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
[/code]

export CC=i686-linux-gcc

cd tcc-0.9.25
注意这里CC要放在前面

CC=i686-linux-gcc ./configure --prefix=/opt/jslinux/buildroot/buildroot-2016.08.1/haoning/images/image/usr --cc=i686-linux-gcc


make
make install

image.raw 挂载在image下,把tcc写入了这个镜像
cp -r /opt/jslinux/buildroot/buildroot-2016.08.1/haoning/host/usr/i686-buildroot-linux-uclibc/sysroot/* /opt/jslinux/buildroot/buildroot-2016.08.1/haoning/images/image/


qemu执行


qemu-system-i386 -kernel /opt/jslinux/kernel/linux-2.6.20/arch/i386/boot/bzImage -drive file=image.raw,if=ide,cache=none -append "console=ttyS0 root=/dev/hda rw init=/sbin/init notsc=1" -boot order=dc,menu=on -net nic,vlan=0,macaddr=52:54:00:12:34:22,model=e1000,addr=08 -net tap,ifname=tap1,script=./if-up,downscript=./if-down -nographic



进入系统tcc

之后保存系统
sync
sync

vi /sbin/init
注释掉
#/sbin/mdev -s
替换/var/www/jslinux-network/root.bin
测试jslinux


最后报错:
/var # tcc sniffer.c -o sniffer
In file included from sniffer.c:3:
In file included from /usr/include/netinet/in.h:24:
In file included from /usr/include/sys/socket.h:27:
In file included from /usr/include/sys/uio.h:23:
/usr/include/sys/types.h:146: include file 'stddef.h' not found


可能是没选c++
编译一次下周一再看
<think>好的,我现在需要解决用户在编译Buildroot时生成rootfs.tar阶段出现的错误。根据用户提供的引用,特别是引用[1]中提到的问题是关于找不到zImage导致生成sdcard.img失败,这可能与rootfs生成有关联吗?或者可能类似的依赖问题? 首先,我应该分析可能的错误原因。用户提到在生成rootfs.tar时出错,可能的问题包括文件系统镜像生成工具的缺失、权限问题、依赖包未正确安装或配置错误。另外,可能还有文件系统大小超出限制,或者某些文件在打包过程中被占用无法访问。 接下来,我需要参考用户提供的引用。引用[1]中的错误是因为缺少zImage,这说明Buildroot在生成镜像时依赖于其他组件,如果这些组件未正确编译或配置,后续步骤会失败。因此,用户需要检查在生成rootfs.tar之前是否所有依赖的组件(如内核、uboot)已经正确编译,并且相关路径配置正确。 引用[2]提到了Buildroot的基本使用方法,包括下载和切换分支。用户可能需要确认自己使用的Buildroot版本是否稳定,是否存在已知的bug。可能需要切换到稳定分支,如2013.08.x,或者更新到最新版本以修复问题。 引用[3]看起来是一个IPKG源的配置,可能与软件包安装有关。如果在生成rootfs时某些软件包下载失败或安装出错,可能导致打包失败。用户需要检查网络连接,确保所有需要的软件包都能正确下载,并且源配置正确。 解决方案步骤可能包括: 1. 检查编译日志,确定具体错误信息。通常在输出中会有更详细的提示,比如缺少某个文件或权限被拒绝。 2. 确认所有依赖组件已正确编译,如内核镜像是否生成,路径是否正确配置。 3. 检查Buildroot配置,确保文件系统类型(如tar)和相关选项正确。 4. 检查软件包下载是否成功,可能需要更换源或手动下载。 5. 清理并重新编译,有时候部分编译残留会导致问题。 6. 如果使用旧版本Buildroot,尝试切换到更新的稳定版本,或者应用已知的补丁。 可能还需要建议用户查看Buildroot的文档或社区支持,是否有类似问题的解决方案。另外,权限问题也可能是原因之一,比如在生成tar包时是否有写入权限,或者磁盘空间不足等。 需要确保用户按照正确步骤配置和编译Buildroot,尤其是生成rootfs.tar所需的工具是否已安装,比如tar工具链是否正常。此外,可能某些软件包在安装过程中出现错误,导致rootfs内容不完整,进而打包失败。 最后,生成相关问题,帮助用户进一步排查其他潜在问题,比如依赖项检查、日志分析、版本问题等。</think>### Buildroot编译错误"Generating root filesystem image rootfs.tar"解决方案 #### 错误原因分析 1. **依赖组件缺失**:类似引用[1]中因缺少zImage导致镜像生成失败,rootfs.tar可能依赖其他组件(如内核模块)未正确编译[^1] 2. **软件包下载失败**:引用[3]显示的源配置若不可达,会导致软件包安装失败中断打包过程[^3] 3. **文件系统配置错误**:文件系统类型选择或权限设置不当 4. **工具链不完整**:缺少tar打包工具或相关依赖库 5. **磁盘空间不足**:生成文件系统时超过存储容量 #### 分步解决方案 **步骤1:检查编译日志** ```bash cat output/build/build-time.log | grep "Error occurred at" ``` 查看具体报错位置,常见错误格式: ``` >>> Generating root filesystem image rootfs.tar ERROR: failed to generate rootfs.tar ``` **步骤2:验证基础配置** 1. 确认使用的Buildroot版本: ```bash git branch -v # 确认是否为引用[2]建议的稳定分支[^2] ``` 2. 检查文件系统格式配置: ``` Filesystem images --> tar the root filesystem ``` **步骤3:处理软件包依赖** 1. 清除缓存强制重新下载: ```bash make clean && make dirclean ``` 2. 检查package目录下的.mk文件是否包含: ``` ROOTFS_TAR_DEPENDENCIES += host-tar ``` **步骤4:处理文件权限问题** ```bash # 临时解除权限限制(危险操作需谨慎) chmod -R 755 output/target/ ``` #### 高级排查方法 **方法1:手动生成tar验证** ```bash cd output/target tar -cvf test.tar ./* # 若手动打包失败,显示具体文件错误 ``` **方法2:检查overlay文件** ```diff - overlay/ # 检查该目录下的文件是否包含特殊字符文件名 + rename "特殊字符文件" ``` #### 预防措施 1. 使用官方推荐配置: ```bash make savedefconfig # 生成标准配置文件 ``` 2. 定期更新工具链: ```bash make sdk # 生成独立工具链 ``` 相关问题
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值