首页 > 代码库 > 用Busybox构建Linux根文件系统(转载)

用Busybox构建Linux根文件系统(转载)

注:本文转载自http://blog.sina.com.cn/u/2478597014

 

用Busybox构建Linux根文件系统

 技术分享 (2015-07-05 14:25:02)
 
虚拟机: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目录下解压:
技术分享
输入解压命令:tar xjf busybox-1.7.0.tar.bz2,然后进入解压后的文件夹找到INSTALL这个文件并复制到共享文件夹:
技术分享
通过windows下的软件打开该文件,里面写有安装busybox的步骤:
技术分享
1.首先再回到busybox解压后目录,make menuconfig
技术分享
然后出来一个配置busybox选项窗口,类似配置内核窗口一样
技术分享
这里主要按照韦东山视频和书本里面配置方式,主要添加一个Tab补全键功能,一般默认的busybox木有这个功能,配置这个功能会给嵌入式开发研究带来极大便利
技术分享
然后需要修改busybox里面的Makefile文件,vi Makefile后将交叉编译器修改为arm-linux-
技术分享
2.然后执行第二步:make,结果出现了2个error
技术分享
通过百度查找分别找到答案:
(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)
技术分享
再次百度得知答案:
技术分享
然后再make就成功了!!!
技术分享
3.接下来是make install,但不能直接在该目录下执行,会引发错乱,应该另外建一个文件系统目录
mkdir -p /home/book/firstfs,然后执行make CONFIG_PREFIX= /home/book/firstfs install,install后进入该目录,就会在该目录下构建了一个根文件系统技术分享
三、构建根文件系统
利用busybox已经构建了一些根文件系统目录,但设备文件,应用执行文件,库和配置文件等都还没生成,所以下面就需要建立这些文件。
1.创建/dev/console和/dev/null
查看虚拟机linux根目录下的/etc里面的这两个设备号信息,然后在新建根文件系统下mknod这两个设备
技术分享
2.创建/etc/inittab
在根文件系统目录下,创建inittab文件,首先mkdir  etc,然后vi etc/inittab,输入以下内容:
技术分享
查看inittab文件内容:
技术分享
3.建立C 库
虚拟机下的linux版本不同C库位置有所区别,先在firstfs根文件系统目录下建立lib目录,然后将虚拟机下linux系统中如下图所示库文件(扩展名含有.so的文件)复制到新建根文件系统下的lib目录中,这里库文件含有.so是我们需要的动态库文件
注:对于一般的虚拟机linux系统,这样的C库是在对应版本交叉编译器下的lib库中,比如我的飞凌开发板对于一般的ubuntu系统是/usr/local/arm/3.4.1/arm-linux/lib
技术分享
4.建立了最小根文件系统
通过以上操作我们已经在虚拟机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文件:
技术分享
进入该目录下的yaffs2目录,再进入utils目录,然后在该目录下执行make
技术分享
生成了mkyaffs2image和mkyaffsimage两个执行文件,由于我的FL2440的Nand Falsh是大页(和JZ2440的Nand Flash一样),所以只需用到mkyaffs2image文件:
技术分享
2.制作yaffs映象文件
将生成的mkyaffs2image文件cp到虚拟机linux系统根目录下/usr/local/bin目录下,并加上可执行权限,然后回到/home/book目录下,准备将整个firstfs根文件系统目录生成映象文件:
技术分享
输入命令mkyaffs2image,可以看到下面会出现该命令的用法(usage),即该命令后面至少有2个参数,第一个参数是根文件系统目录,第二个参数则是生成的映像文件名。根据该用法再次输入完整命令:
mkyaffs2image firstfs/ firstfs.yaffs2
技术分享
然后生成了最小根文件系统对应的映象文件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文件中,没有建立的可以先mkdirvi(有的文件需要添加权限),包括需要挂载的虚拟文件系统目录/proc、/sys、/tmp等:
技术分享

我们可以在开机脚本/etc/init.d/rcS(该目录可以先mkdir,然后vi rcS)下加入一些挂载命令:
技术分享
其中mount -a 命令是调用/etc/fstab文件中的内容来挂接系统的,因而还需要建立fstab文件,vi  /etc/fstab,并添加需要挂接的虚拟文件系统,如下图:
技术分享
而对于/etc/init.d/rcS脚本需要添加到/etc/inittab启动文件中去:
技术分享
然后回到/home/book目录下,再次将根文件系统制作成映象文件烧写到开发板,即:
mkyaffs2image firstfs/ firstfs.yaffs2
技术分享
这样一个比较完整的根文件系统就移植成功了!!!技术分享

用Busybox构建Linux根文件系统(转载)