基于嵌入式Linux平台的最小文件系统的制作

来源:互联网 发布:中国服装存货数据分析 编辑:程序博客网 时间:2024/04/28 19:22
工作平台:FL2440
交叉编译环境:arm-linux-gcc 3.4.1
busybox版本:1.9.1

1) 制作文件系统总目录:

mkdir my_rootfs

2) 编译&安装busybox

解压网上下载的busybox,确定交叉编译环境包,配置busybox选项,然后

make

make install

busybox根目录会生成_install的文件夹,里面存放有bin,sbin文件夹以及

linuxrc文件;

3) _install目录下的busybox修改为777属性;

chmod 777 busybox

4) bin,sbin目录全复制到my_rootfs目录,注意不要丢失了文件属性:

cp -a ***/buxybox-1.9.2/_install/bin  ***/myrootfs

cp -a ***/buxybox-1.9.2/_install/sbin ***/myrootfs

5) 进入myrootfs目录,新建其他文件系统目录:

mkdir dev etc lib mnt proc sys tmp usr var

6) 添加busybox使用到的lib库文件:

进入busybox根目录,使用如下命令查询它使用到的lib库:

arm-linux-readelf -d busybox

打印如下:

[root@lqm busybox-1.9.2]# arm-linux-readelf -d busybox

 

Dynamic segment at offset 0xc32cc contains 22 entries:

  Tag        Type                         Name/Value

 0x00000001 (NEEDED)                     Shared library:

 

[libcrypt.so.1]

 0x00000001 (NEEDED)                     Shared library: [libm.so.6]

 0x00000001 (NEEDED)                     Shared library: [libc.so.6]

 0x0000000c (INIT)                       0xd2b8

 0x0000000d (FINI)                       0xad848

 0x00000004 (HASH)                       0x8128

 0x00000005 (STRTAB)                     0xab94

 0x00000006 (SYMTAB)                     0x8cf4

 0x0000000a (STRSZ)                      4807 (bytes)

 0x0000000b (SYMENT)                     16 (bytes)

 0x00000015 (DEBUG)                      0x0

 0x00000003 (PLTGOT)                     0xd33b8

 0x00000002 (PLTRELSZ)                   3000 (bytes)

 0x00000014 (PLTREL)                     REL

 0x00000017 (JMPREL)                     0xc700

 0x00000011 (REL)                        0xc300

 0x00000012 (RELSZ)                      1024 (bytes)

 0x00000013 (RELENT)                     8 (bytes)

 0x6ffffffe (VERNEED)                    0xc230

 0x6fffffff (VERNEEDNUM)                 3

 0x6ffffff0 (VERSYM)                     0xbe5c

 0x00000000 (NULL)                       0x0

[root@lqm busybox-1.9.2]#

可以看到,busybox用到了libcrypt.so.1libm.so.6以及libc.so.6三个库文件。另外还有一个很重要的库文件是必不可少的,那就是鼎鼎大名的ld-linux.so.2ld-linux.so.2linux的动态装载器(dynamic loader)。大多数的linux应用程序都是用这个装载器来装载的,除非在编译的过程中使用了-static参数。所以这个装载器在运行时的时候是必需的。它帮助去定位和装载该应用所需要的动态库。这些库都放在交叉编译环境的lib目录下,注意一定要用编译busybox使用的交叉编译环境所提供的库!

cd /usr/local/arm/3.4.1/arm-linux/lib

cp libcrypt.so.1 libm.so.6 libc.so.6 ld-linux.so.2 ***/my_rootfs/lib

注意,因为这些文件都是符号链接文件,不要使用cp -a复制!否则复制过来的只是个快捷方式而已。

7) etc目录下建立init.d目录,在init.d目录下建立rcS文件:

cd /etc

mkdir init.d

vi rcS

添加如下内容:

#!/bin/sh

/bin/mount -a       #mount all stuff from /etc/fstab

/sbin/ifconfig eth0 192.168.1.15 up #开机自动设置eth0IP地址

/sbin/ifconfig eth1 192.168.1.16 up #开机自动设置eth1IP地址

注意修改rcS的权限,否则无法执行rcS:

chmod 777 rcS

 

8) /etc目录下建立fstab文件,该文件会被rcS脚本中的mount -a指令调用:

cd /etc

vi fstab

编辑如下内容:

none           /proc           proc  defaults      0 0

这三条指令表示分别将proc,devpts,tmpfs文件系统挂载到相应的目录,第二列为所挂载的目录,第三列为要挂载的文件系统,第四列为挂载所使用的属性。

 

9) 在文件系统根目录下建立linuxrc文件:

cd ***/my_rootfs

vi linuxrc

编辑如下内容:

#!/bin/sh

/bin/mount -t proc proc /proc

/bin/mount -t sysfs sysfs /sys

/sbin/mdev -s #????????

 

exec /sbin/init

这里将procsysfs文件系统分别挂载到procsys目录。

proc文件系统是一个伪文件系统,它只存在内存当中,而 不占用外存空间。它以文件系统的方式为访问系统内核数据的操作提供接口。用户和应用程序可以通过proc得到系统的信息,并可以改变内核的某些参数。由于 系统的信息,如进程,是动态改变的,所以用户或应用程序读取proc文件时,proc文件系统是动态从系统内核读出所需信息并提交的。

sysfs 把连接在系统上的设备和总线组织成为一个分级的文件,它们可以被从用户的空间存取到。这是被设计用来处理那些以前驻留在 /proc/ 的设备和驱动程序指定的选件以及用来处理那些以前由 devfs 提供支持的动态加载设备。注意一定要修改linuxrc文件的属性为777,否则会提示failed to execute /linuxrc的错误:

chmod 777 linuxrc

 

10) /etc下建立mdev.conf文件,内容为空即可。如果不建立这个文件,将会提示下面的错误:

mdev: /etc/mdev.conf: No such file or directory

使用下面命令创建即可:

touch mdev.conf

 

11) /dev下建立consolenull两个字符设备文件:

mknod console c 5 1

mknod null c 1 3

 

c表示创建没有缓冲的字符特殊文件,后面的两个数字分别表示主设备号和次设备号。

 

12)使用mkyaffs2image工具制作文件系统映像文件:

./mkyaffs2image my_rootfs rootfs.yaffs2

 

补:在/etc下新建passwd文件:

cd /etc

vi passwd

编辑如下内容:

root::0:0:root:/:/bin/sh

bin:*:1:1:bin:/bin:

daemon:*:2:2:daemon:/sbin:

ftp::95:95::/ftp:

nobody:*:99:99:Nobody:/:

这时,进入文件系统后,在#前面会有~提示,否则为/