您的位置:首页 > 其它

文件系统的制作步骤

2013-03-09 20:53 169 查看
文件系统的制作步骤

 from:http://blog.sina.com.cn/s/blog_87766e4a0100z6lo.html

1、  建立工作目录(这边设定工作目录为/root/build_rootfs),下载busybox到该目录

[root@localhost /]#mkdir /root/build_rootfs
 

2、  建立根目录, 该目录就是我们要移植到目标板上的目录,对于嵌入式的文件系统,根目录下必要的目录包括bin,dev,etc,usr,lib,sbin,proc
sys tmp


[root@localhost /]# cd /root/build_rootfs/

[root@localhost build_rootfs]#mkdir rootfs

[root@localhost build_rootfs]#cd rootfs

[root@localhost rootfs]# mkdir bin dev etc usr lib sbin proc sys tmp

[root@localhost rootfs]# mkdir usr/bin usr/sbin usr/lib
/bin bin是Binary的缩写。这个目录存放着最经常使用的命令。

/sbin s就是Super User的意思,这里存放的是系统管理员使用的系统管理程序。

/dev dev是Device(设备)的缩写。该目录下存放的是Linux的外部设备,在Linux中访问设备的方式和访问文件的方式是相同的。

/etc这个目录用来存放所有的系统管理所需要的配置文件和子目录。

/usr 我们要用到的很多应用程序和文件几乎都存放在usr目录下

/usr/bin存放着许多应用程序;

/usr/sbin存放root超级用户使用的管理程序;

/usr/lib存放一些常用的动态链接共享库和静态档案库;

/lib这个目录里存放着系统最基本的动态链接共享库,其作用类似于Windows里的DLL文件。几乎所有的应用程序都需要用到这些共享库。

/proc这个目录是一个虚拟的目录,它是系统内存的映射,我们可以通过直接访问这个目录来获取系统信息。

/proc 是系统运行时进程和内核的信息存在这里,它属于伪文件系统,存在于内存中。

/tmp 用于用户程序运行时产生的临时文件。

/sys 内核所支持的sysfs文件系统。Sysfs把系统上的设备和总线组织成一个分级的文件,以被用户空间存取。

 

3、 交叉编译busybox

busybox的源码可以从http://www.busybox.net/downloads/下载,这里我们下载一个1.5.0版本的源码。

我们在配置busybox的时候是基于默认配置之上来配置的;先make defconfig就是把busybox配置成默认,然后再make
menuconfig来配置busybox。

说明:我们在配置一个源代码包之前,可以先阅读源码包目录下的README和INSTALL文件以及Makefile的注释部分,也可以到http://www.busybox.net网站以获取帮助。

http://www.busybox.net/FAQ.html#configure的第二个问题2 How
do I configure busybox?有介绍怎么去配置。

(1)       解压busybox-1.15.3.tar.gz和mkyaffs2image

[root@localhost build_rootfs]# tar -zxvf busybox-1.15.3.tar.gz

[root@localhost build_rootfs]# tar -zxvf mkyaffs2image.tgz

[root@localhost build_rootfs]# tar -zxvf mkyaffs2image.tgz

usr/sbin/mkyaffs2image

usr/sbin/mkyaffs2image-128M

[root@localhost build_rootfs]# mv usr/sbin/mkyaffs2image mkyaffs2image

[root@localhost build_rootfs]# rm -rf usr

[root@localhost build_rootfs]# cd busybox-1.13.3
 

(2)       添加交叉工具链(如果这个编译器已经写入到配置文件中,这步可以省略)

[root@localhost build_rootfs]# export PATH=/usr/local/arm/arm-linux-gcc/bin:$PATH
 

(3)       配置编译

[root@localhost busybox-1.15.3]# make defconfig

[root@localhost busybox-1.15.3]# make menuconfig
手工配置如下:

如果您正在构建一个具有特殊需求的嵌入式设备,那就可以手工使用 make menuconfig目标来配置BusyBox 的内容。如果您熟悉 Linux 内核的编译过程,就会注意到 menuconfig 与配置 Linux 内核的内容所使用的目标相同。实际上,它们都采用了相同的基于 ncurses 的应用程序。

使用手工配置,我们可以指定在最终的 BusyBox 映像中包含的命令。我们也可以对 BusyBox 环境进行配置,例如包括对 NSA(美国国家安全代理)的安全增强 Linux(SELinux),指定要使用的编译器(用来在嵌入式环境中进行交叉编译)以及 BusyBox 应该静态编译还是动态编译。图 1 给出了 menuconfig的主界面。在这里我们应该可以看到可以为 BusyBox 配置的不同类型的应用程序(applet)。

Busybox setting

->builds options

         [*] build busybox as a static binary(a)//选择将busybox进行静态编译 

->installitation options

         [*] don’t use /usr (b)    //选择上 Don’t
use /usr
 

->Busybox Library Tuning->

     [ *]Username completion

     [ *]Fancy shell prompts

           //编译出的busybox的shell命令解释器支持显示当前路径及主机信息

Miscellaneous Utilities ―> (c)

         [  ] taskset

其他选项都是一些linux基本命令选项,自己需要哪些命令就编译进去,一般用默认的就可以了。保存退出。

(a)这个选项是一定要选择的,这样才能把busybox编译成静态链接的可执行文件,运行时才独立于其他函数库.否则必需要其他库文件才能运行,在单一个linux内核不能使他正常工作。

(b)这个选项也一定要选,否则make
install后,busybox将安装在原系统的/usr下,这将覆盖掉系统原有的命令.选择这个选项后,make
install后会在busybox目录下生成一个叫_install的目录,里面有busybox和指向他的链接.

( c)





  Taskset命令能够为即将执行的程式或已有进程指定affinity属性,让该程式或进程运行在指定的CPU上。下面是几个例子:

taskset ?c 1 nohup perl pi.pl &    ---指定在1号CPU上执行指定的perl程式

taskset ?c 1 ?P 10284                  ---将10284号进程限定在1号CPU上执行

 

4、  编译安装

[root@localhost busybox-1.15.3]# make ARCH=arm CROSS_COMPILE=arm-linux- CONFIG_PREFIX=/root/build_rootfs/rootfs all install
(此时bin(195个 290M) sbin(58个 86.4M
---windows下看的结果) 已安装了文件,其实是busybox的可执行文件和指向它的链接。不同的链接名完成不同的功能,命令行调用作为一个参数传给busybox,即可完成相应的功能,即于 BusyBox 中包含的每个工具来说,都会创建一个符号链接,这样就可以使用这些符号链接来调用 BusyBox 了。BusyBox 然后可以通过 argv[0] 来调用内部工具)

ARCH指定平台

CROSS_COMPILE指定交叉编译

CONFIG_PRRFIX指定安装的路径

 

5、  复制c库

[root@localhost build_rootfs]#

cp /usr/local/arm/arm-linux-gcc/arm-none-linux-gnueabi/libc/armv4t/lib/* -a

 /root/build_rootfs/rootfs/lib/
交叉应用程序的开发需要用到交叉编译的链接库,交叉编译的链接库是在交叉工具链的lib目录下;我们在移植应用程序到我们的目标板的时候,需要把交叉编译的链接库也一起移植到目标板上,这里我们用到的交叉工具链的路径是/usr/local/arm/3.3.2/,所以链接库的目录是/usr/local/arm/3.3.2/lib(本来跟目标板相关的目录是/usr/local/arm/3.3.2/arm-linux, 因此要拷贝的链接库应该在/usr/local/arm/3.3.2/arm-linux/lib下,但是此目录的很多链接都是链接到/usr/local/arm/3.3.2/lib目录下的库文件,所以我们从/usr/local/arm/3.3.2/lib目录拷贝库),此目录下有四种类型的文件(其实就2种:.so动态库 .a静态库):

         (1) .so动态库

A、实际的共享链接库(libname-version.so)

如:libc-2.3.2.so

B、主修订版本的符号链接. (lib.so.version)

程序一旦链接了特定的链接库,它将会使用其符号链接,程序启动时,加载器在加载程序之前,会加载该文件。

           如:libc.so.6

C、与版本无关的符号链接(libname.so)

这些符号链接的只要功能是为需要链接特定的链接库的所有程序提供一个通用的条目,与版本号无关。

如:libc.so

(2) .a静态库

静态链接库包文件,如libc.a

 

6、  建立配置文件

内核启动的最后,会执行sbin/init程序,init程序在启动的最后会执行/bin/sh,sh在启动的时候会读取文件。

(1)       在/etc/profile文件里设定PATH,LD_RARYLIB_PATH环境变量,目的是配置用户程序运行的环境。

[root@localhost build_rootfs]# cd rootfs/etc/

[root@localhost etc]# vi profile
 

#!/bin/sh

echo "Set seaech library in /etc/profile"

export LD_LIBRARY_PATH=/lib   #定义查找可用共享对象的位置 //usr/lib

echo "Set user path in /etc/profile"

export PATH=/bin:/sbin:/usr/bin   #命令的路径

export PS1=[root@mini2440\ \\W]\\$   #当有自动补齐功能时使用这个

#export PS1=[root@mini2440]\#   #//命令行提示符

(2)       创建inittab文件,内容如下每一条目用来定义一个子进程,并确定它的启动方法(该文件的)

[root@localhost etc]# vim inittab
 

::sysinit:/etc/init.d/rcS

::respawn:-/bin/sh    #注意:“-”要加上

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

 

(3)       创建/etc/init.d/rcS 文件,内容如下(rcS是个可执行的脚步文件,是系统启动之后先执行的命令)

[root@localhost etc]# mkdir init.d

[root@localhost etc]#vi init.d/rcS

[root@localhost etc]#chmod +x rcS
#! /bin/sh

 

//“mount -a”命令后将挂载proc,tmpfs 等包含在该文件中的所有的文件系统。

/bin/mount -a  

 

 //下面三行是配置增加热插拔支持

/bin/mount -t tmpfs mdev /dev        //(1)

/bin/echo /sbin/mdev > /proc/sys/kernel/hotplug   //(2)

mdev –s     //(3)

l  (1)设置dev 目录被用作一个 tmpfs 文件系统的挂载点,该文件系统是由 mdev 填充的。  这样在/dev目录下就可以看到内核已经挂载的驱动的节点。

l  (2)设置内核的hotplug
handler 为 mdev, 即当设备热插拔时,由 mdev 接收来自内核的消息并作出相应的回应, 比如挂载U盘。当有热插拔事件产生时, 内核就会调用位于/sbin目录的 mdev。 这时 mdev通过环境变量中的 ACTION 和 DEVPATH, (这两个变量是系统自带的)来确定此次热插拔事件的动作以及影响了/sys 中的那个目录。接着会看看这个目录中是否有“dev”的属性文件,如果有就利用这些信息为 这个设备在/dev 下创建设备节点文件。

l  (3)
mdev 主要是实现对移动设备的动态挂载,在/dev 目录下建立必要的设备节点。mdev扫描 /sys/class和/sys/block中所有的类设备目录,如果在目录中含有名为“dev”的文件,且文件中包含的是设备号,则mdev 就利用这些信息为这个设备在/dev下创建设备节点文件。

(4)       在/etc/目录下添加文件fstab,内容如下(该文件定义了文件系统的静态信息)

[root@localhost etc]# vim fstab
 

proc /proc proc defaults 0 0

none /tmp ramfs defaults 0 0

sysfs /sys sysfs defaults 0 0

则已经挂载的设备可以通过命令查询#lsmod

         所挂载的设备的设备号可查询#cat
/proc/devices

   其中/proc 是系统运行时进程和内核的信息存在这里,它属于伪文件系统,存在于内存中。

   /tmp 用于用户程序运行时产生的临时文件。

   /sys 内核所支持的sysfs文件系统。Sysfs把系统上的设备和总线组织成一个分级的文件,以被用户空间存取。

 

7、  构建/dev目录

[root@localhost rootfs]# mknod dev/console c 5 1  //建立控制台和终点的节点

[root@localhost rootfs]# mknod dev/null  c 1 3

[root@localhost rootfs]# mknod dev/tty1 c 4 1

[root@localhost rootfs]# mknod dev/tty2 c 4 2

[root@localhost rootfs]# mknod dev/tty3 c 4 3

[root@localhost rootfs]# mknod dev/tty4 c 4 4
 

8、  添加一个用户程序

[root@localhost build_rootfs]# vim hehho.c

[root@localhost build_rootfs]# arm-linux-gcc hello.c -o hello

[root@localhost build_rootfs]# cp hello /rootfs/usr/bin
随便写一个hello.c的用户程序,编译完之后放在usr/bin目录下,用于文件系统烧写后的测试

9、  制作yaffs2映像文件

[root@localhost build_rootfs]# ./mkyaffs2image-128M  rootfs rootfs.yaffs2
 

10、            烧写rootfs.yaffs2的第3分区

[u-boot@mini2440]#tftp 30008000 rootfs.yaffs2

[u-boot@mini2440]#nand erase 560000 40000000

//下载完提示下载了多大就多大,是16进制

[u-boot@mini2440]#nand write.yaffs  30008000 560000 615300

[u-boot@mini2440]#set bootargs 'noinitrd root=/dev/mtdblock3 rootfstype=yaffs2 rw console=ttySAC0,115200 init=/linuxrc mem=64M'

[u-boot@mini2440]#saveenv

[u-boot@mini2440]#reset

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: