开发环境 unbuntu 12.04
目标版:友善之臂tiny6410
工具:busybox,zlib,yaff2制作工具
前提条件:搭建好交叉编译的环境,下载好curess.h这个库,开发板烧好了u-boot和内核
今天马上进入正题,如何制作根文件系统。
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
一,编译/安装Busybox,生成 /bin,/usr,/sbin,文件
1、从http://www.busybox.net/ 下载busybox-1.7.0.tar.bz21,
2,解压
tar xjvf busybox-1.7.0.tar.bz23,配置Busybox
make menuconfig
选项的有关配置我就不用图来解释,用简单的文字来描述吧
第一部分是Busybox Settings,主要编译和安装busybox的一些选项。这里主要需要配置:
1)、Build Options -- Build BusyBox as a static binary (no shared libs),表示编译busybox时,是否静态链接C库。我们选择动态链接C库,所以把它置空。
2)、Installation Options -- Applets links (as soft-links) -- (X) as soft-links,表示安装busybox时,将各个命令安装为指向busybox的软链接还是硬链接。我们选择软链接。
3)、Installation Options -- (/home/lbw/busy) BusyBox installation prefix,表示busybox的安装位置。我们选择/home/lbw/busy
4)Busybox Library Tuning。保留Command line editing以支持命令行编辑;保留History size以支持记忆历史命令;选中Tab completion和Username completion以支持命令自动补全
5)进 入 Cross Compiler prefix 选 项 , 修 改 本 地 交 叉 工 具 链 的 路 径 , 如“/opt/FriendlyARM/toolschain/4.5.1/bin/arm-linux-”
6) 返回 Busybox Settings 菜单,选择并进入 Busybox Library Turing--->选项,这里我用图说明一下
7)选择 vi-style line editing commands(NEW)选项,
8)选上 Fancy shell prompts(NEW)选上
9)一直按 直到这个界面出现,点击yes,图形界面
4,编译busybox
make
5,安装busybox
make install
等上述步骤完成后就可以在刚刚制定的目录下产生
二,创建一个目录文件,存放其它目录,具体步骤如下
#mkdir /root/rootfs
#cd /root/rootfs
#mkdir dev home proc tmp var etc lib mnt sys usr etc/rc.d将busybox产生的四个文件拷贝到/root/rootfs下
好吧,写到这大家应该知道我用的是root用户了,为了避免权限的麻烦,我一开始就用了root,以下对目录的操作是我们制作的哦,不是宿主机的。且用且珍惜,小心别改到宿主机的目录上去哦
三,配置etc文件。
1)etc/inittab 文件
说明:inittab 文件是 init 进程的配置文件,系统启动后所访问的第一个脚本文件,后续启动的文件都由它指定。
#cd /root/ rootfs
#vi etc/inittab内容如下
其中第三行的前面本该有参数的,就是指定它的设备节点口,tiny6410的前面要添加,s3c2410_serial0,为了避开错误提示,我就先把那句话删除掉
2)etc/rc.d/rc.sysinit 文件
这是一个脚本文件,可以在里面添加想自动执行的命令。以下命令配置环境变量、
主机名、dev 目录环境、挂接/etc/fstab 指定的文件系统、建立设备节点与设置 IP。
#vi etc/rc.d/rc.sysinit
这一部分非常有意思,你可以在里面添加你喜欢的自动执行的命令和脚本,非常好用,这里只列出比较简单的一些功能,想要实现更加强大的功能,可以自行添加
3)etc/fstab 文件
执行 mount –a 时挂接/etc/fstab 指定的文件系统
#vi etc/fstab
4)etc/profile 文件
说明:inittab 中执行了这样一个语句“::respawn:-/bin/sh”。启动/bin/sh 程序时会启动 ash 的配置信息,而它就是/etc/profile,
会把 profile 的所有配置全sh部都运行一遍,因此用户可以把自己的启动程序放在这里
vi etc/profile
5)修改系统配置文件权限
#chmod 755 etc/*
#chmod 755 etc/rc.d/rc.sysinit
四,利用交叉编译工具链,拷贝其库文件
在上述我们选择的是动态库编译,所以拷贝的时候我们要注意把链接的文件也一起拷过去,避免错误
通常用到的库是以下几个。
ld.so.1, ld-2.3.6.so, libcrypt.so.1, libc.so.6, libdl.so.2, libgcc_s.so.1, libm.so.6, libpthread.so.0,libstdc++.so.6
我存放的路径比较长如下
/opt/FriendlyARM/toolschain/4.5.1/arm-none-linux-gnueabi/sys-root/usr/lib如果你找不到上诉路径可以用强大的find命令,具体如下
find /* -name "lib*.so.*" -print
这样的搜索就可以把路径查找出来
接下来我们就把它拷贝下来,注意它的链接文件哦,但是小编为了避免错误,决心把整个lib/下的库拷贝过去
cp -rdf /opt/FriendlyARM/toolschain/4.5.1/arm-none-linux-gnueabi/sys-root/usr/lib /root/rootfs/lib
五,创建/dev的设备文件
在小编亲试的过程中,在上述配置完之后就急忙制成根文件系统镜像,结果导致错误出现
/init: line 103: can't open /r/dev/console: no such file
[ 3.185580] Kernel panic - not syncing: Attempted to kill init!结果一看,原来是没有这个控制台,但控制台是设备文件,于是我查了一下我本机上的/dev/console
找出它的节点是5,1
于是我在dev/就创建了个
#mknod console c 5 1这一步很关键哦,如果提示出现没有这个null,那同样的方法
#mknod null c 1 3
六,制作根文件系统(yaffs)
根文件系统已经制作完毕,最后一个步骤是将其打包为yaffs映像文件,以供bootloader将其烧录到nand flash上。这只需要执行命令:
#mkyaffs2image /root/rootfs ./rootfs-yaffs2.img
当然在这之前还需要准备两个工具
1,zlib-1.2.3.tar.gz 制作镜像的依赖工具
#tar zxf zlib-1.2.3.tar.gz
#cd zlib-1.2.3
#./configure && make && make install
2,yaffs2-d43e901.tar.gz yaffs镜像生成工具
#tar zxf yaffs2-d43e901.tar.gz
#cd yaffs2-d43e901/utils
#make然后进入yaffs2-d43e901/utils 把mkyaffs2image拷到/usr/bin(注意,这个就是我们宿主机上的哦,至于为什么要拷呢,原因就像我们在哪里都能使用ls一样)
#cp mkyaffs2image /usr/bin
完成上述步骤后,就会在当前目录下(编译时指定好了)产生一个rootfs-yaffs2.img
七,利用usb下载到开发板上
#./dnw ./rootfs-yaffs2.img 0这是usb下载,后面为0,是因为U-boot已经指定好地址了,所以不写即可
之后重启开发板,然开发板跑起来就出现
这就是我们自己创建的文件系统啦,是不是顿时很有成就感啊,以后继续努力,完善这个系统。
后记
小编刚学习如何构建嵌入式开发环境,文中有部分参考了用户手册,有些地方存在不完善,敬请谅解