工作平台:FL2440
交叉编译环境:arm-linux-gcc 3.4.1
busybox版本:1.9.1
1) 制作文件系统总目录:
mkdir my_rootfs
2) 编译&安装busybox
解压从LinuxIDC.com的1号服务器下载的busybox
本文要用到的文件下载在Linux公社(LinuxIDC.com)的1号服务器。
FTP地址:ftp://www.linuxidc.com
用户名:www.linuxidc.com
密码:www.muu.cc
在2011年LinuxIDC.com\2月\基于嵌入式Linux平台的最小文件系统的制作\
具体下载方法见http://www.linuxidc.net/thread-1186-1-1.html 与 http://www.linuxidc.net/thread-1189-1-1.html
确定交叉编译环境包,配置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.1,libm.so.6以及libc.so.6三个库文件。另外还有一个很重要的库文件是必不可少的,那就是鼎鼎大名的ld-linux.so.2。ld-linux.so.2是linux的动态装载器(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 #开机自动设置eth0的IP地址
/sbin/ifconfig eth1 192.168.1.16 up #开机自动设置eth1的IP地址
注意修改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
这里将proc和sysfs文件系统分别挂载到proc和sys目录。
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下建立console和null两个字符设备文件:
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:/:
这时,进入文件系统后,在#前面会有~提示,否则为/