Chinaunix首页 | 论坛 | 博客
  • 博客访问: 183625
  • 博文数量: 82
  • 博客积分: 3005
  • 博客等级: 少校
  • 技术积分: 785
  • 用 户 组: 普通用户
  • 注册时间: 2010-01-08 16:05
文章分类

全部博文(82)

文章存档

2012年(5)

2011年(18)

2010年(59)

我的朋友

分类: 嵌入式

2010-02-12 22:05:30

Busybox根文件系统制作

1         目的

本文主要介绍基于busybox根文件系统的制作,并介绍linux根文件系统的相关知识。

2         Linux文件系统概述

根文件系统概念:内核镜像文件,内核启动后运行的第一个程序(init),给用户提供操作界面的shell程序,应用程序所依赖的库。这些必须,基本的文件合成为根文件系统。

这些文件存放在一个分区中。根文件系统挂接(mount)在根目录下。

Linux支持比较多的文件格式:如fat16,fat32,ntfs,ext2,ext3,jffs2,yaffs等,除此之外,还支持虚拟文件系统,sysfs,proc,这些虚拟文件并不存在于实际的存储设备上,而是在访问时,linux内核临时生成。

3         Linux根文件系统目录结构

 

3.1       文件系统目录描述

3.1.1        /bin目录

该目录存放所有用户都可以使用的,基本的命令,这些命令在挂接其他文件系统之前可以使用,所以/sbin目录必须和根文件系统在同一个分区中。

/bin目录中常用的命令有:cat,chgrp,chmod,cp,ls,sh,kill,mount,umount,mkdir,mknod.

3.1.2        /sbin目录

该目录存放系统命令,即只有系统管理员能够使用的命令,系统命令还可以存放在/usr/bin/usr/local/sbin目录下。/sbin目录中存放的是基本的系统命令,它们用于启动系统,修复系统等。与/bin目录类似,在挂接其他文件系统之前就可以使用/sbin,所以/sbin目录必须和根文件系统在同一个分区。

/sbin中常用的命令有:shutdown,reboot,fdisk,fsck

不是急迫需要使用的系统命令存放在/usr/bin目录下。本地安装的系统命令存放在/usr/local/sbin目录下。

3.1.3        /dev目录

该目录下存放的是设备文件。设备文件是linux中特有的数据类型,在linux系统中,以文件的方式访问各种外设,即通过读写某个设备文件操作某个具体硬件。比如/dev/ttySAC0可以访问到串口0

设备文件有字符设备和块设备。执行ls /dec/命令能查看实际的硬件设备的主设备号,次设备号。主设备号用来表示是哪类设备,次设备号用来标示是同类设备中的第几个。

3.1.4        /etc目录

该目录下存放各种配置文件。对于busybox存放的系统启动的相关配置文件。

3.1.5        /lib目录

该目录存放下存放的是共享库和可加载模块,共享库用于启动系统,运行根文件系统中的可执行程序,比如/bin,/sbin下的程序。其他不是根文件系统必须的库文件可以存放在其他目录,/usr/lib,/var/lib

3.1.6        /home目录

此目录是可选目录,对于普通用户,在/home目录下都有一个子目录,里面存放相应的配置文件。

3.1.7        /root目录

根目录用户

3.1.8        /usr目录

此目录可以存放在另一个分区中,在系统启动后在挂接到根文件系统中的usr目录下。里面存放的是共享目录和只读的程序和数据。

3.1.9        /var目录

存放的是可变数据。

3.1.10    /proc目录

这是一个空目录,用作proc文件系统的挂载点,proc文件系统式虚拟的文件系统。它没有对应实际的硬件设备。

3.1.11    /mnt目录

用于临时挂接某个文件系统的挂接点,通常是空目录。

3.1.12    /tmp目录

存放临时文件的,通常是空目录。

4         Linux文件属性介绍

linux包含以下几种文件属性:普通文件,目录文件,字符设备文件,块设备文件,FIFO,套接口,连接文件。

5         Busybox移植

5.1       简介

Busybox是一个遵循GPL v2协议的开源项目。Busybox将众多的unix命令集集合到一个很小的可执行程序中,可以用来替换GNU fileutils,shellutils工具集,它设置还集成了http服务器和telnet服务器。但与相应的GNU工具相比,所提供的选项较少,但是能够满足一般应用。

Busybox在编写过程中对文件大小进行优化,并考虑系统资源有限的情况。动态链接的busybox只有几百KB,即使静态链接也只有1M左右。

创建一个最小系统,使用busybox,只需要在/dev目录下创建必要的设备节点,在/etc目录下 创建一些配置文件就可以了,如果busybox是动态链接,还需要在/lib目录下包含相应的库文件。

5.2       编译和安装busybox

5.3       获取源码

,版本任意选择,本版本选择的是1.13.4busybox

获得源码包后,解压到相应目录。

5.4       配置busybox

busybox1.13.4目录下,执行make menuconfig命令进入busybox配置界面。

下面对配置界面的相关界面做简要介绍,对于不同的版本,配置界面可能有细微差别,但是这个不影响busybox的功能配置

5.4.1        Busybox settings

这个包含通用的设置,在它的子目录中包含以下配置选项

Busybox settings build option

这个选项中可以指定交叉编译的路径和使用静态库还是动态库。本文实现的交叉编译路径是在busybox根目录下修改Makefile中指定,而库是用的动态库。

同时还包括调试选项和busybox选项微调功能选项,移植过程中,选择的是默认状态,不需要更改。

Installation optionsbusybox的安装路径,安装路径也可以在命令行通过显示的指定。

5.4.2        Archival utilities

这个配置选项中包含各种格式的解压或打包命令的配置如:tar,rpm,gzip等。

5.4.3        Linux module utilities

配置模块加载命令选项等

5.4.4        Linux system utilities

配置选项包含系统的命令:如mountumountfdisk,mdev(busybox支持udev的一种格式),同时包含各种文件系统的支持等。

5.4.5        Networking utilities

此配置选项包含实际的网络配置命令,如pingtelenetarp命令等。

5.4.6        其他

配置选项中还包括shell的选择,VI编辑器的选择等。在实际配置过程中,都是用的默认,可根据实际应用修改。

选择相应的配置界面后,保存配置退出即可。

5.5       编译修改Makefile

修改busybox根目录下的Makefile指定交叉编译环境变量

164行:CROSS_COMPILE=/usr/local/arm/4.2.2-eabin/usr/bin/arm-linux-

指定交叉编译工具

189行:ARCH?=arm

指定交叉编译工具后,可以执行make命令编译busybox,最后是安装,安装路径可以按busybox默认的路径安装在_install目录中,也可以make CONFIG_PREFIG=dir_path install 可以将busybox安装到指定的目录。

     安装完成后将在指定的安装目录下生成如下4个文件,目录

1bin

2linuxrc->bin/busybox

3sbin

4usr

其中linurc都是到/bin/busybox的连接文件。

5.6       构建根文件系统

5.6.1        简介

所谓构建根文件系统:就是在系统下创建各种目录,并在各种目录中创建各种文件。比如在/bin,/sbin下存放各种可执行程序,在/etc目录下存放配置文件,在/lib目录下存放库文件。

5.6.2        创建目录

创建相应的目录,其中有些目录不是必须的,如 tmp,var等。

# mkdir dev etc lib mnt proc var tmp sys root

5.6.3        构建etc目录

Init进程根据/etc/inittab文件来创建其他子进程,比如调用脚本文件配置ip地址,挂接其他文件系统,最后启动shell等。

etc目录下的内容取决运行的程序,在本文件系统移植过程中,主要创建/etc/inittab,etc/init.d/rcS,etc/fatab三个文件

5.6.3.1         etc/inittab解析

/etc/inittab文件中相关的文档和示例代码在busyboxexampiles/bootfloppy/etc/inittab文件中。

/etc/inittab文件中每个条目用来定义一个子进程,并确定它的启动方法,格式如下:

l         id:表示这个子进程要使用的控制台(即标准输入输出,标准错误设备)如果省略,则使用与init进程一样的控制台。

l         runlevels:对于busybox程序,这个字段没有意义,可以省略

l         action:表示init进程如何控制这个子进程。

l         process:要执行的程序,它可以使可执行程序,也可以是脚本文件。如果process字段前有“-”字符,表示这个程序是可交互的

/etc/inittab文件的控制下,init进程的行为总结如下:

l         在系统启动前期,init进程首先启动sysinit,wait,once3类子进程。

l         在系统正常运行期间,init进程首先启动respawn,askfirst的两类子进程,并监视他们,发现某个子进程退出时则启动它。

l         在系统退出时,执行shutdown,restart,ctrlaltdel3类子进程(之以或全部)

etc/inittabaction字段的含义

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程序

5.6.4        /etc/inittab实例

在实际busybox中配置 inittab文件格式如下:

::sysinit/etc/init.d/rcS

::askfirst-/bin/sh

::ctrlaltdel/sbin/reboot

::shutdown/bin/umount –a –r

6410中使用的配置文件就是此文件配置。

5.6.5        创建/etc/init.d/rcS

这个是一个脚本文件,可以在里面添加想自动执行的命令,例如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

5.6.6        创建etc/fstab

内容如下

#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:挂载参数,以逗号隔开

dumpfcsk order:用来控制dump,fcsk程序的行为,dump是用来备份文件的程序,fcsk是一个检查磁盘的程序。

dump程序根据dumo字段来决定这个文件系统是否需要备份,如果没有这个字段,或其值为0,则dump程序忽略这个文件系统

fsck程序根据fsck order字段来决定磁盘的检查顺序,一般来说对于根文件系统这个字段设为1,其他文件系统设为2,如果设为0,则fsck程序忽略这个文件系统。      

5.6.7        构建dev目录

实际上,各个linux文件系统中dev目录下的内容基本是类似的。

为了保证根文件系统的正确执行,/dev目录下的各种设备节点都是用的三星光盘中dev目中的设备节点。

5.6.8        创建根文件系统库      

创建根文件系统库有两种方法,一种是拷贝交叉编译工具lib中的库文件,其中包括动态库和静态库,目标文件,但是有些库文件不是必须的,可以通过交叉编译工具保留值需要的库文件即可。

方法一:/usr/local/arm/4.2.2-eabi/lib下的文件全部copybusybox中的lib目录下,然后通过交叉编译工具arm-linux-strip 去掉不必要的库文件,主要是去掉目录和静态库。减少库文件的体积

方法2:下载uClibc-0.9.28源码包,进入utils子目录生成ldd.host 工具

 cd uClibc-0.9.28/utils

 make ldd.host

 ldd.host拷贝到ubuntu系统的usr/bin目录下,并修改其权限

 Chmod 777 /usr/bin/ldd.host

 然后在busybox目录中运行ldd.host busybox查找busybox所依赖的库文件,把库文件拷贝到根文件系统的lib目录中即可。

5.6.9         NFS测试

文件系统建立好后,就要通过NFS测试现有的文件系统。测试好后,就可以制作成相应的文件镜像,如yaffs,cramfs,jffs等镜像烧写到实际硬件设备中。根据需求目前不需要做镜像烧写,所以暂时省略该部分的内容。

 

阅读(1404) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~