linux根文件系統制作之busybox編譯和系統構建【轉】


轉自:http://blog.chinaunix.net/uid-29401328-id-5019660.html

介紹完相關文件后我們開始構建文件系統,涉及到的文件等到具體用到的時候再講。

一、編譯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



二、正式構建根文件系統

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.3、libm.so.6、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.3、libm.so.6、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

對於我的系統不創建也可以,原因參見上篇博文


三、制作yaffs2文件系統

進入到/nfsdir/tools/(根文件系統的上次目錄)

[root@localhost tools]# mkyaffs2image rootfs root.bin  // mkyaffs2image工具是交叉編譯工具自帶的

生成的root.bin鏡像可直接拷貝到nand flash的文件系統分區,接下來就可以直接啟動了



上面只是制作了一個最簡單的文件系統,實際可以根據自己的需要添加啟動程序、豐富自己的配置及功能等


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM