歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux教程 >> 基於嵌入式Linux平台的最小文件系統的制作

基於嵌入式Linux平台的最小文件系統的制作

日期:2017/2/28 16:21:23   编辑:Linux教程

工作平台: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:/:

這時,進入文件系統後,在#前面會有~提示,否則為/

Copyright © Linux教程網 All Rights Reserved