轉自:http://blog.chinaunix.net/uid-29401328-id-5019660.htmlhtml
介紹完相關文件後咱們開始構建文件系統,涉及到的文件等到具體用到的時候再講。
1、編譯busybox
首先下載busybox源碼,編譯busybox,獲得一些初始化文件及咱們須要的各類命令。關於busybox的做用請百度,這裏不詳細講。
我下載的是busybox-1.23.1,解壓以後進入到頂層目錄。
1.修改頂層Makefile
把CROSS_COMPILE和ARCH修改爲你本身的交叉編譯器和硬件平臺,如:
CROSS_COMPILE = arm-none-linux-gnueabi-
ARCH = arm
2.make menuconfig,修改下面的選項,否則會編譯出錯
Busybox Settings --->
Build Options --->
[*]Build shared libbusybox
[ ] Produce a binary for each applet, linked against libbusybox
[ ] Produce additional busybox binary linked against libbusybox
Busybox Settings --->
Installation Options ("make install" behavior) --->
(/nfsdir/tools/rootfs) BusyBox installation prefix // 編譯生成文件的存放路徑
其餘都保持默認
關於須要注意的一些選項說明以下:
Busybox Settings --->
Build Options --->
[ ] Build BusyBox as a static binary (no shared libs) (NEW)
這個意思是運行busybox才動態連接庫,busybox須要的庫要咱們提供
Busybox Settings --->
Installation Options ("make install" behavior) --->
What kind of applet links to install (as soft-links) --->
設置busybox生成後各類命令均爲指向busybox主程序的軟連接
Busybox Settings --->
Busybox Library Tuning --->
(255) History size
[*] History saving (NEW) // 支持歷史記錄
[*] Tab completion (NEW) // 支持Tab補全操做
選項Applets就是將busybox支持的幾百個命令分門別類,咱們能夠在各個門類下選擇想要的命令。
3.make
最後出現下面的信息,make成功
CC util-linux/volume_id/xfs.o
AR util-linux/volume_id/lib.a
LINK busybox_unstripped
Trying libraries: crypt m
Library crypt is not needed, excluding it
Library m is needed, can't exclude it (yet)
Final link with: m
libbusybox: 0_lib/libbusybox.so.1.23.1
DOC busybox.pod
DOC BusyBox.txt
DOC busybox.1
DOC BusyBox.html
4.make install
出現下面的信息安裝成功
--------------------------------------------------
You will probably need to make your busybox binary
setuid root to ensure all configured applets will
work properly.
--------------------------------------------------
至此busubox的安裝就完成了,如今查看/nfsdir/tools/rootfs文件夾,會發現多了下面幾個文件:
bin linuxrc sbin usr
能夠在bin目錄查看,busybox只有970K
2、正式構建根文件系統
1.建立所需文件夾(根據FHS標準)
mkdir dev etc home lib media mnt opt proc sys tmp var root
2.添加相應的庫
須要添加的庫是從編譯busybox所使用的交叉編譯工具裏拷貝的,但交叉編譯工具裏的庫文件不少,沒必要所有拷貝。
那麼咱們怎麼知道哪些庫是須要的呢?
能夠用一下方法肯定
[root@localhost bin]# arm-linux-readelf -d busybox
Dynamic section at offset 0xf16b4 contains 25 entries:
Tag Type Name/Value
0x00000001 (NEEDED) Shared library: [libm.so.6]
0x00000001 (NEEDED) Shared library: [libc.so.6]
而ld-linux.so.3屬於固有須要的庫,因此busybox至少須要三個庫:ld-linux.so.三、libm.so.六、libc.so.6
下面要睜大眼睛了,上面的庫都是連接文件,不要把連接文件拷進去了,真正的文件沒拷貝
[root@localhost lib]# ls -l libc.so.6
lrwxrwxrwx 1 root root 11 Apr 23 21:13 libc.so.6 -> libc-2.8.so
[root@localhost lib]# ls -l libm.so.6
lrwxrwxrwx 1 root root 11 Apr 23 21:13 libm.so.6 -> libm-2.8.so
[root@localhost lib]# ls -l ld-linux.so.3
lrwxrwxrwx 1 root root 9 Apr 23 21:13 ld-linux.so.3 -> ld-2.8.so
因此要把ld-linux.so.三、libm.so.六、libc.so.6和libc-2.8.so、libm-2.8.so、ld-2.8.so都拷貝到/lib下。
可是上面的這幾個庫只是busybox運行所須要的庫,這個時候系統雖然能夠啓動,但會出現下面的打印信息:
feed_wdg: error while loading shared libraries: libgcc_s.so.1: cannot open shared object file: No such file or directory
這個意思是因爲缺乏libgcc_s.so.1庫,致使看門狗程序啓動不了,而後看到開發板過之後重啓了,因此要想正常運行還須要拷貝libgcc_s.so和libgcc_s.so.1
可是實際使用的時候要一個一個去查看嘛,這樣太麻煩了,因此通常把正常須要的庫都拷貝到/lib下,這樣也不會太大,包括:
ld-linux:動態連接庫,必需
libc: 標準c函數庫,必需
libm: 數學庫,通常須要
libdl: 用於動態裝載共享庫,較少用到
libcrypt: 加密附加庫,須要認證的程序用到,較少用
libpthread: POSIX線程庫,通常須要
3.添加配置文件(即/etc下的文件)
這裏對照咱們以前的分析步驟
a.首先是inittab文件,內容以下:
# /etc/inittab
::sysinit:/etc/init.d/rcS
console::askfirst:-/bin/sh
::once:/usr/sbin/telnetd -l /bin/login
::ctrlaltdel:/sbin/reboot
::shutdown:/bin/umount -a -r
b.添加init.d/rcS文件,內容以下:
#!/bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin
export PATH
#
# Trap CTRL-C &c only in this shell so we can interrupt subprocesses.
#
mount -a
mkdir -p /dev/pts
mount -t devpts devpts /dev/pts
echo /sbin/mdev > /proc/sys/kernel/hotplug
mdev -s
mkdir -p /var/lock
hwclock -s
feed_wdg &
ifconfig lo 127.0.0.1
ifconfig eth0 192.168.2.99
/bin/hostname -F /etc/HOSTNAME
c.添加HOSTNAME文件,內容就是表明主機名,能夠隨意定,如:
Blue
d.添加fstab文件:
#device mount-point type options dump fsck order
proc /proc proc defaults 0 0
tmpfs /tmp tmpfs defaults 0 0
sysfs /sys sysfs defaults 0 0
tmpfs /dev tmpfs defaults 0 0
var /dev tmpfs defaults 0 0
ramfs /dev ramfs defaults 0 0
e.根據inittab文件的內容console::askfirst:-/bin/sh,
在啓動腳本etc/init.d/rcS執行完後將在終端啓動一個shell。Shell啓動過程當中會根據文件/etc/profile配置登錄環境。
因此須要添加profile文件,內容以下:
USER="`id -un`"
LOGNAME=$USER
PS1='[\u@\h \W]# ' # 這個顯示的是命令行下的主機名和用戶名格式,如:[root@Blue etc]#
PATH=$PATH
HOSTNAME=`/bin/hostname`
export USER LOGNAME PS1 PATH
f.若是要配置正確的用戶,必須具備兩個文件:group和passwd
group內容以下:
root:x:0:root
passwd內容以下:
root::0:0:root:/:/bin/sh
具體什麼意義請百度
到此/etc配置完畢,包含以下:
HOSTNAME fstab group init.d inittab passwd profile
4.在/dev/下建立設備節點:
mknod console c 5 1
mknod null c 1 3
對於個人系統不建立也能夠,緣由參見上篇博文
3、製做yaffs2文件系統
進入到/nfsdir/tools/(根文件系統的上次目錄)
[root@localhost tools]# mkyaffs2image rootfs root.bin // mkyaffs2image工具是交叉編譯工具自帶的
生成的root.bin鏡像可直接拷貝到nand flash的文件系統分區,接下來就能夠直接啓動了
上面只是製做了一個最簡單的文件系統,實際能夠根據本身的須要添加啓動程序、豐富本身的配置及功能等linux