工作平台: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:/:
這時,進入文件系統後,在#前面會有~提示,否則為/