您的位置:首页 > 其它

用busybox制作根文件系统

2011-10-12 11:03 274 查看
1 获取源码解压

从busybox的官方主页http://www.busybox.net ,下载busybox的源码,目前最新的版本为busybox-1.13.3.tar.bz2

#tar–jvxf busybox-1.13.3.tar.bz2

进入解压后的busybox源码目录

#cdbusybox-1.13.3

2 配置busybox

步骤跟编译linux内核时很像

#makemenuconfig

出现一个图形界面,选择Busybox Settings,这里可以对编译、安装以及调试等模式进行配置。

然后选择Build Options,对交叉编译器以及编译方式进行配置。

其中的第一项是Build Busybox as a static binary(no shared libs),如果选择上,则busybox将以静态形式进行编译,否则将以动态方式编译。此外,还需要对交叉编译环境进行配置,选择其中的Cross Compiler Perfix,输入交叉编译器的前缀,我们的嵌入式平台上使用的是arm-uclinux-linux的交叉编译工具。

这里我们先选择静态编译,动态方式的稍后再讲,注意Build with Large File Support (for accessing files > 2GB)不要选(默认是选上的),否则编译后会出现如下错误:

miscutils/lib.a(readahead.):Infunction ‘readahead_main’

readahead.(.text.readahead_main+0x70):undefinedreference to ‘readahead’

collect2:ldreturned 1 exit status

make:***[busybox_unstripped ]Error 1

3 编译busybox

#make

4 安装busybox

#makeinstall

可以采用perfix参数安装到指定目录下,格式为:make install prefix=xxx目录,如果不特别指定,将默认在busybox源码目录下生成一个_install目录。到此,busybox基本上可以功成身退了。我们需要的就是busybox编译出来的这个_install目录。

进入_install目录,可以看到一共有3个目录和一个文件,分别是:bin、sbin和usr目录以及linuxrc文件。

在对这几个目录进行说明之前,先简单介绍一下编译生成的busybox可执行文件,它存在于bin目录下。Busybox使用了带参的main函数:intmain(int argc,char*argv[]),在这个定义中,argc是传递进来的参数的个数(参数数量),而argv是一个字符串数组,代表从命令行传递进来的参数。argv的索引0是命令行调用的程序名。可以在bin目录下进行如下操作:

#busyboxpwd(注意,busybox这个可执行文件不需要加./)

当为一个可执行程序创建符号链接后,在执行这个符号链接时,就可以获取到这个符号链接的名字。而busybox正是使用符号链接的方式使一个可执行程序看起来像很多程序一样。对于busybox中包含的每个工具来讲,都会创建一个符号链接,这样就可以使用这些符号链接来调用busybox了。然后busybox接着根据argv[0]的值来调用内部工具。

下面分别对install目录下的几个文件进行一些说明。

Ø bin包含用户工具,其中,busybox可执行文件就在这个目录下,该目录下其他所有文件都是指向busybox的符号链接

Ø sbin目录包含操作系统工具,同样也指向busybox。

Ø linuxrc是一个链接文件,指向busybox。

5 添加etc目录及基本配置文件

参考一个正常的linux系统将会发现,此时busybox建立的文件系统还缺少很多文件。如果用这个作为文件系统,将是无法运行的。生成这些配置可以选择的方法有2种,一种是直接从一个正常运行的系统中拷贝,另一种是借助于busybox的examples。显然,选择第二种会容易的多,我们直接拷贝examples/bootfloopy/etc到install目录下。

#cp–a ../examples/bootfloppy/etc/ .

然后可以看看etc目录下的文件,一共有3个目录和文件,下面逐一对以上几个文件进行分析和说明。

Ø inittab文件:系统启动后访问的第一个脚本文件,后续启动的文件都由它指定。下面看一下busybox中原始的inittab文件内容:

::sysint:/etc/init.d/rcS

::respawn:-/bin/sh

tty2::askfirst:-/bin/sh

::ctrlaltdel:/bin/umount–a -r

其中第一行指定系统的启动脚本为/etc/init.d/rcS

第二行指定打开一个登录会话

第三行指定在第三个虚拟终端打开一个无须登录验证的shell

第四行指定了当按下ctrl+alt+del组合键时的执行命令

Ø fstab文件:定义了文件系统的各个“挂载点”,需要与实际的系统相配合。默认的fstab文件内容为:

proc /proc proc defaults 0 0

其他的根据需要再进行添加,比如devpts /dev/ptsdevpts defaults 0 0就是为UNIXPTYs准备的,后面讲telnetd时要用到。

Ø profile文件:终端登陆之后首先运行的脚本。

6 添加dev目录及基本设备文件

调试时要通过串口发送消息到终端显示。因此串口控制台和终端2个设备文件是必不可少的。

#mkdirdev

#mknoddev/console c 5 1

#mknoddev/ttyAMA0 c 204 64

在启动参数中,设置console=ttyAMA0

7 添加其他常用目录

可以选择home、root、proc、mnt、lib、var、opt、tmp。

此时,一个基本的文件系统的功能就已经完成了。可以采用NFS进行调试。但是,此时你可能会遇到如下问题,系统登录后终端上会不断打印:

cannotopen /dev/ttyS2:No such file or directory.

原因出在/etc目录下的inittab文件,我们看一下其内容:

::sysint:/etc/init.d/rcS

::respawn:-/bin/sh

tty2::askfirst:-/bin/sh

::ctrlaltdel:/bin/umount–a -r

这条语句表示在第3个虚拟终端打开一个无须登录验证的shell。而我们之前没有建立这个tty2设备,因此会出错。解决的办法有2个:一是屏蔽该语句,二是建立该设备节点。我们选择将其屏蔽。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: