用Busybox构建Linux根文件系统(转载)
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用Busybox构建Linux根文件系统(转载)相关的知识,希望对你有一定的参考价值。
虚拟机:Virtual Box4.2.6 和VMware Workstation6.5.2(这两种虚拟机都成功实作过)
开发环境:Linux版本2.6.32,采用Ubuntu10.04
arm-linux-gcc版本:3.4.1
Busybox版本:1.7.0
开发板:飞凌嵌入式S3C2440
开发板linux内核版本:linux2.6.28
一、概念:Linux不像windows有C、D、E、F等盘符概念,它是以速树状结构管理所有目录和文件,其他分区挂接在某个目录上,这个目录就被称为挂接点,然后可以通过这个目录来访问这个分区上的文件。根文件系统被挂接在根目录“/"上,在根目录下就有根文件系统的各个目录。
与windows下C盘类似,Linux需要在一个分区上存放系统启动说必须的文件(如内核映象文件,内核启动后运行的第一个程序(init),shell,应用程序依赖的库等),这些必须的文件合称为根文件系统,它存放在一个分区中。linux启动后首先挂接这个分区,称为挂接根文件系统。
二、安装配置Busybox
首先需要安装并配置busybox,这里使用busybox-1.7.0.tar.bz2,将其放在虚拟机/home/book目录下解压:
通过windows下的软件打开该文件,里面写有安装busybox的步骤:1.首先再回到busybox解压后目录,make menuconfig
(1)miscutils/taskset.c:17: error: parse error before ‘*‘ token
miscutils/taskset.c:18: warning: function declaration isn‘t a prototype miscutils/taskset.c: In function `__from_cpuset‘:
miscutils/taskset.c:22: error: `CPU_SETSIZE‘ undeclared (first use in this function) miscutils/taskset.c:22: error: (Each undeclared identifier is reported only once miscutils/taskset.c:22: error: for each function it appears in.)
miscutils/taskset.c:26: warning: implicit declaration of function `CPU_ISSET‘ miscutils/taskset.c:26: error: `mask‘ undeclared (first use in this function) miscutils/taskset.c: In function `taskset_main‘:
miscutils/taskset.c:47: error: `cpu_set_t‘ undeclared (first use in this function) miscutils/taskset.c:47: error: parse error before "mask"
miscutils/taskset.c:68: warning: implicit declaration of function `CPU_ZERO‘ miscutils/taskset.c:68: error: `new_mask‘ undeclared (first use in this function) miscutils/taskset.c:69: error: `CPU_SETSIZE‘ undeclared (first use in this function) miscutils/taskset.c:71: warning: implicit declaration of function `CPU_SET‘ miscutils/taskset.c:78: error: `mask‘ undeclared (first use in this function)
make[1]: *** [miscutils/taskset.o] Error 1 make: *** [miscutils] Error 2
解决方法:make menuconfig
找到[Miscellaneous Utilities],去掉[task set]
(2)解决了(1)的问题再make又有了问题(2)
3.接下来是make install,但不能直接在该目录下执行,会引发错乱,应该另外建一个文件系统目录
三、构建根文件系统利用busybox已经构建了一些根文件系统目录,但设备文件,应用执行文件,库和配置文件等都还没生成,所以下面就需要建立这些文件。
1.创建/dev/console和/dev/null
查看虚拟机linux根目录下的/etc里面的这两个设备号信息,然后在新建根文件系统下mknod这两个设备
在根文件系统目录下,创建inittab文件,首先mkdir etc,然后vi etc/inittab,输入以下内容:
3.建立C 库
虚拟机下的linux版本不同C库位置有所区别,先在firstfs根文件系统目录下建立lib目录,然后将虚拟机下linux系统中如下图所示库文件(扩展名含有.so的文件)复制到新建根文件系统下的lib目录中,这里库文件含有.so是我们需要的动态库文件。
注:对于一般的虚拟机linux系统,这样的C库是在对应版本交叉编译器下的lib库中,比如我的飞凌开发板对于一般的ubuntu系统是/usr/local/arm/3.4.1/arm-linux/lib
通过以上操作我们已经在虚拟机linux环境下的/home/book/firstfs目录下建立了最小根文件系统,如上图所示。
四、制作yaffs映象文件,烧写到开发板
1.安装生成yaffs2映像文件的命令
这里使用JZ2440提供的yaffs_source_util_larger_small_page_nand.tar.bz2文件,是包含了大页小页flash的yaffs版本,进入所在目录,解压tar xjf yaffs_source_util_larger_small_page_nand.tar.bz2
得到Development_util_ok文件:
生成了mkyaffs2image和mkyaffsimage两个执行文件,由于我的FL2440的Nand Falsh是大页(和JZ2440的Nand Flash一样),所以只需用到mkyaffs2image文件:
将生成的mkyaffs2image文件cp到虚拟机linux系统根目录下/usr/local/bin目录下,并加上可执行权限,然后回到/home/book目录下,准备将整个firstfs根文件系统目录生成映象文件:
mkyaffs2image firstfs/ firstfs.yaffs2
接着启动开发板,在u-boot界面命令菜单下通过USB将该映象文件firstfs.yaffs2烧写到开发板对应的文件系统分区fs_kernel,然后重启开发版linux系统,成功进入命令行界面,从而最小根文件系统移植成功:
虽然最小根文件系统成功移植成功了,但毕竟是最小根文件系统,类似单片机最小系统一样,很多应用程序都没添加上来,包括最简单的ps命令都不能使用,而且还没添加udev机制,以至于驱动设备都没法自动添加,因而需要对该文件系统进一步完善。
1.挂接虚拟文件系统
很对应用程序命令(如ps),或者mdev(属于udev机制的一种简易版本)都需要挂接对应的虚拟文件系统(VFS)来实现,当然我们可以在开发板shell命令行输入:mount -t proc none /proc来实现在目录/proc挂接proc文件系统。但对于更多的文件系统手动添加比较麻烦,我们也可以将挂载命令加入到linux开机启动脚本中,使得开发板linux启动后自动挂接那些虚拟文件系统。
2.mdev机制的建立
在Busybox中存在一种mdev机制,它是属于udev机制的简易版本,我们可以到Busybox安装文件夹下去寻找其信息,可以找到mdev.txt,在windows下打开后,其基本用法(Basic Use)有6条:
我们将这6小点分别添加到/etc/fstab和/etc/init.d/rcS文件中,没有建立的可以先mkdir和vi(有的文件需要添加权限),包括需要挂载的虚拟文件系统目录/proc、/sys、/tmp等:
我们可以在开机脚本/etc/init.d/rcS(该目录可以先mkdir,然后vi rcS)下加入一些挂载命令:
mkyaffs2image firstfs/ firstfs.yaffs2