全部博文(82)
分类: 嵌入式
2010-02-12 22:05:30
Busybox根文件系统制作
本文主要介绍基于busybox根文件系统的制作,并介绍linux根文件系统的相关知识。
根文件系统概念:内核镜像文件,内核启动后运行的第一个程序(init),给用户提供操作界面的shell程序,应用程序所依赖的库。这些必须,基本的文件合成为根文件系统。
这些文件存放在一个分区中。根文件系统挂接(mount)在根目录下。
Linux支持比较多的文件格式:如fat16,fat32,ntfs,ext2,ext3,jffs2,yaffs等,除此之外,还支持虚拟文件系统,sysfs,proc,这些虚拟文件并不存在于实际的存储设备上,而是在访问时,linux内核临时生成。
该目录存放所有用户都可以使用的,基本的命令,这些命令在挂接其他文件系统之前可以使用,所以/sbin目录必须和根文件系统在同一个分区中。
/bin目录中常用的命令有:cat,chgrp,chmod,cp,ls,sh,kill,mount,umount,mkdir,mknod.
该目录存放系统命令,即只有系统管理员能够使用的命令,系统命令还可以存放在/usr/bin,/usr/local/sbin目录下。/sbin目录中存放的是基本的系统命令,它们用于启动系统,修复系统等。与/bin目录类似,在挂接其他文件系统之前就可以使用/sbin,所以/sbin目录必须和根文件系统在同一个分区。
/sbin中常用的命令有:shutdown,reboot,fdisk,fsck
不是急迫需要使用的系统命令存放在/usr/bin目录下。本地安装的系统命令存放在/usr/local/sbin目录下。
该目录下存放的是设备文件。设备文件是linux中特有的数据类型,在linux系统中,以文件的方式访问各种外设,即通过读写某个设备文件操作某个具体硬件。比如/dev/ttySAC0可以访问到串口0
设备文件有字符设备和块设备。执行ls /dec/命令能查看实际的硬件设备的主设备号,次设备号。主设备号用来表示是哪类设备,次设备号用来标示是同类设备中的第几个。
该目录下存放各种配置文件。对于busybox存放的系统启动的相关配置文件。
该目录存放下存放的是共享库和可加载模块,共享库用于启动系统,运行根文件系统中的可执行程序,比如/bin,/sbin下的程序。其他不是根文件系统必须的库文件可以存放在其他目录,/usr/lib,/var/lib等
此目录是可选目录,对于普通用户,在/home目录下都有一个子目录,里面存放相应的配置文件。
根目录用户
此目录可以存放在另一个分区中,在系统启动后在挂接到根文件系统中的usr目录下。里面存放的是共享目录和只读的程序和数据。
存放的是可变数据。
这是一个空目录,用作proc文件系统的挂载点,proc文件系统式虚拟的文件系统。它没有对应实际的硬件设备。
用于临时挂接某个文件系统的挂接点,通常是空目录。
存放临时文件的,通常是空目录。
linux包含以下几种文件属性:普通文件,目录文件,字符设备文件,块设备文件,FIFO,套接口,连接文件。
Busybox是一个遵循GPL v2协议的开源项目。Busybox将众多的unix命令集集合到一个很小的可执行程序中,可以用来替换GNU fileutils,shellutils工具集,它设置还集成了http服务器和telnet服务器。但与相应的GNU工具相比,所提供的选项较少,但是能够满足一般应用。
Busybox在编写过程中对文件大小进行优化,并考虑系统资源有限的情况。动态链接的busybox只有几百KB,即使静态链接也只有
创建一个最小系统,使用busybox,只需要在/dev目录下创建必要的设备节点,在/etc目录下 创建一些配置文件就可以了,如果busybox是动态链接,还需要在/lib目录下包含相应的库文件。
从,版本任意选择,本版本选择的是
获得源码包后,解压到相应目录。
在busybox
下面对配置界面的相关界面做简要介绍,对于不同的版本,配置界面可能有细微差别,但是这个不影响busybox的功能配置
这个包含通用的设置,在它的子目录中包含以下配置选项
Busybox settings build option:
这个选项中可以指定交叉编译的路径和使用静态库还是动态库。本文实现的交叉编译路径是在busybox根目录下修改Makefile中指定,而库是用的动态库。
同时还包括调试选项和busybox选项微调功能选项,移植过程中,选择的是默认状态,不需要更改。
Installation options:busybox的安装路径,安装路径也可以在命令行通过显示的指定。
这个配置选项中包含各种格式的解压或打包命令的配置如:tar,rpm,gzip等。
配置模块加载命令选项等
配置选项包含系统的命令:如mount,umount,fdisk,mdev(busybox支持udev的一种格式),同时包含各种文件系统的支持等。
此配置选项包含实际的网络配置命令,如ping,telenet,arp命令等。
配置选项中还包括shell的选择,VI编辑器的选择等。在实际配置过程中,都是用的默认,可根据实际应用修改。
选择相应的配置界面后,保存配置退出即可。
修改busybox根目录下的Makefile指定交叉编译环境变量
第164行:CROSS_COMPILE=/usr/local/arm/
指定交叉编译工具
第189行:ARCH?=arm
指定交叉编译工具后,可以执行make命令编译busybox,最后是安装,安装路径可以按busybox默认的路径安装在_install目录中,也可以make CONFIG_PREFIG=dir_path install 可以将busybox安装到指定的目录。
安装完成后将在指定的安装目录下生成如下4个文件,目录
1:bin
2:linuxrc->bin/busybox
3:sbin
4:usr
其中linurc都是到/bin/busybox的连接文件。
所谓构建根文件系统:就是在系统下创建各种目录,并在各种目录中创建各种文件。比如在/bin,/sbin下存放各种可执行程序,在/etc目录下存放配置文件,在/lib目录下存放库文件。
创建相应的目录,其中有些目录不是必须的,如 tmp,var等。
# mkdir dev etc lib mnt proc var tmp sys root
Init进程根据/etc/inittab文件来创建其他子进程,比如调用脚本文件配置ip地址,挂接其他文件系统,最后启动shell等。
etc目录下的内容取决运行的程序,在本文件系统移植过程中,主要创建/etc/inittab,etc/init.d/rcS,etc/fatab三个文件
/etc/inittab文件中相关的文档和示例代码在busybox的exampiles/bootfloppy/etc/inittab文件中。
/etc/inittab文件中每个条目用来定义一个子进程,并确定它的启动方法,格式如下:
l id:表示这个子进程要使用的控制台(即标准输入输出,标准错误设备)如果省略,则使用与init进程一样的控制台。
l runlevels:对于busybox程序,这个字段没有意义,可以省略
l action:表示init进程如何控制这个子进程。
l process:要执行的程序,它可以使可执行程序,也可以是脚本文件。如果process字段前有“-”字符,表示这个程序是可交互的
在/etc/inittab文件的控制下,init进程的行为总结如下:
l 在系统启动前期,init进程首先启动
l 在系统正常运行期间,init进程首先启动
l 在系统退出时,执行
etc/inittab中action字段的含义
Action名称 |
执行条件 |
说明 |
Sysinit |
系统启动后最先执行 |
值执行一次,init进程等待它结束才执行其他动作 |
Wait |
系统执行完sysinit进程后 |
只执行一次,init进程等待它结束才执行其他动作。 |
Once |
系统执行完wait后 |
只执行一次,init进程不等待它结束 |
Respawn |
系统执行完once后 |
Init进程检测发现子进程退出时,重新启动它 |
Askfirst |
启动完respawn后 |
与respawn类似。不过init进程线输出“请激活控制台”,等待用户回车确定才启动子进程 |
Shutdown |
当系统关机时 |
重新启动和关闭系统命令 |
ctrlaltdel |
按下ctrl+alt+del |
|
restart |
Busyboy中配置了CONFIG_FEATURE_USS_INITTAB, 并且init进程接收到SIGHUP信号时 |
先读取,解析/etc/inittab文件,在执行restart程序 |
在实际busybox中配置 inittab文件格式如下:
::sysinit:/etc/init.d/rcS
::askfirst:-/bin/sh
::ctrlaltdel:/sbin/reboot
::shutdown:/bin/umount –a –r
6410中使用的配置文件就是此文件配置。
这个是一个脚本文件,可以在里面添加想自动执行的命令,例如IP,文件系统挂载,创建设备节点,加载驱动程序等。
6410中使用的脚本文件是如下格式:
#!/bin/sh
/bin/mount –a //挂载所有的文件系统
mkdir /dev/pts //创建目录
mount -t devpts devpts /dev/pts //devpts用来支持外部网络连接的虚拟终端
echo /sbin/mdev > /proc/sys/kernel/hotplug //设置内核,当有设备插拔时调用/sbin/mdev
mdev –s //在/dev目录下生成内核支持的所有设备的节点
最后还要修改文件的属性
Chmod 777 etc/init.d/rcS
内容如下
#device mount-point type options dump fsck order
proc /proc proc defaults 0 0
tmpfs /tmp tmpfs defaults 0 0
sysfs /sys sysfs defaults 0 0
tmpfs /dev tmpfs defaults 0 0
device:要挂载的设备
mount-point:挂接点
type:文件系统类型
options:挂载参数,以逗号隔开
dump和fcsk order:用来控制dump,fcsk程序的行为,dump是用来备份文件的程序,fcsk是一个检查磁盘的程序。
dump程序根据dumo字段来决定这个文件系统是否需要备份,如果没有这个字段,或其值为0,则dump程序忽略这个文件系统
fsck程序根据fsck order字段来决定磁盘的检查顺序,一般来说对于根文件系统这个字段设为1,其他文件系统设为2,如果设为0,则fsck程序忽略这个文件系统。
实际上,各个linux文件系统中dev目录下的内容基本是类似的。
为了保证根文件系统的正确执行,/dev目录下的各种设备节点都是用的三星光盘中dev目中的设备节点。
创建根文件系统库有两种方法,一种是拷贝交叉编译工具lib中的库文件,其中包括动态库和静态库,目标文件,但是有些库文件不是必须的,可以通过交叉编译工具保留值需要的库文件即可。
方法一:/usr/local/arm/
方法2:下载uClibc-
cd uClibc-
make ldd.host
将ldd.host拷贝到ubuntu系统的usr/bin目录下,并修改其权限
Chmod 777 /usr/bin/ldd.host
然后在busybox目录中运行ldd.host busybox查找busybox所依赖的库文件,把库文件拷贝到根文件系统的lib目录中即可。
文件系统建立好后,就要通过NFS测试现有的文件系统。测试好后,就可以制作成相应的文件镜像,如yaffs,cramfs,jffs等镜像烧写到实际硬件设备中。根据需求目前不需要做镜像烧写,所以暂时省略该部分的内容。