1. 程式人生 > >最新busybox-1.28.1製作根檔案系統

最新busybox-1.28.1製作根檔案系統

本文適配fs4412開發板,使用的核心為linux4.9.9。
1.原始碼下載
Busybox的官方原始碼下載路徑為:
http://busybox.net/downloads/
可以下載最新的busybox-1.28.1
2.解壓原始碼

tar xvf busybox-1.28.1.tar.bz2

3.進入原始碼目錄

cd busybox-1.28.1

4.配置busybox
Busybox官方已經對其做了大量的預設的配置(如一些常用的shell命令:ls ,cd,mkdir等預設選擇),所以我們只需要做幾步簡單的適配即可。
首先,執行

make menuconfig

4.1 busybox執行使用的庫的選擇

Settings --->
 [*] Build static binary (no shared libs)   

在這裡選擇編譯編譯靜態庫不依賴與任何動態連結庫,編譯出來的可執行檔案busybox會大一點但是不過也只是1M大小。
4.2 交叉編譯工具鏈的選擇

Settings --->
    ( arm-none-linux-gnueabi-) Cross compiler prefix 

根據你自己的平臺選擇填寫自己的工具鏈
4.3 安裝目錄的選擇

Settings --->
        (./_install) Destination path for
'make install'

這裡安裝目錄選擇當前目錄的_install目錄
4.4 usr相關檔案生成選擇

Settings --->
        [ ] Don't use /usr  

注:此編譯選擇預設是選上的,我們要手動去掉,才能編譯出/usr相關目錄。
5.編譯
執行

make 

等待幾分鐘即可編譯完成。
6.安裝
執行

make install
結果如下:
......
   ./_install//usr/sbin/svlogd -> ../../bin/busybox
  ./_install//usr/sbin/telnetd -> ../
../bin/busybox ./_install//usr/sbin/tftpd -> ../../bin/busybox ./_install//usr/sbin/ubiattach -> ../../bin/busybox ./_install//usr/sbin/ubidetach -> ../../bin/busybox ./_install//usr/sbin/ubimkvol -> ../../bin/busybox ./_install//usr/sbin/ubirename -> ../../bin/busybox ./_install//usr/sbin/ubirmvol -> ../../bin/busybox ./_install//usr/sbin/ubirsvol -> ../../bin/busybox ./_install//usr/sbin/ubiupdatevol -> ../../bin/busybox ./_install//usr/sbin/udhcpd -> ../../bin/busybox -------------------------------------------------- You will probably need to make your busybox binary setuid root to ensure all configured applets will work properly. --------------------------------------------------

7.檢視編譯生成的檔案
進入_install目錄

cd _install/
l$ ls
bin  linuxrc  sbin  usr

可以發現生成了4個檔案。
可以發現:/bin下的busybox大小為1.9M,其他的命令可執行檔案都是指向它的符號連結。
如執行:ls <===> busybox ls
執行

$file bin/busybox
bin/busybox: ELF 32-bit LSB executable, ARM, version 1 (SYSV), statically linked, for GNU/Linux 2.6.38, stripped

可以看到生成了arm架構的使用靜態庫的可執行檔案busybox,即是安裝成功
下面的步驟不進行操作,直接把以上的目錄拷貝到/source/rootfs下啟動開發板網路掛載,可以發現也可以進入系統且可以輸入shell命令(能夠輸入shell命名說明了shell命令本身不是動態連結的,因為我們還沒有在檔案系統中放入庫檔案)。功能一樣不少(/dev下也創建出了裝置節點)但是一下的功能是沒有的:
1) 系統不能執行使用動態庫連結的可執行檔案(何況預設情況下系統編譯時會連結動態庫,為了減可執行檔案的體積,可以使用-static選項編譯和不適用此選項編譯放在根檔案系統中試一下?)
2)/sys目錄時空的,所以我們無法通過sysfs看到匯流排-裝置-驅動的資訊
3)/proc目錄是空的,我們無法看不到核心匯出的一些核心和程序資訊(mount命令檢視系統掛載情況都看不了,ps命令也看不到資訊了)
4)Init程序解析的inittab檔案沒有所以採用了預設的配置
5)無法執行我們的啟動程式等
這對於實際應用來說是不可忍受的,所以還需要加入其它的目錄檔案。
8.建立其他需要的目錄

mkdir dev etc lib sys proc tmp var home root mnt  

9.lib目錄下新增庫檔案
需要拷貝交叉工具鏈的庫拷貝到此目錄下(這裡拷貝的是動態庫的原因是一般程式使動態編譯需要板子上動態庫的支援,而靜態庫一般在靜態編譯的時候用到是編譯階段,由於交叉編譯的工作放在了PC上所以不需要靜態庫,這樣還可以減小根檔案系統的體積):

cp /home/linux/tool_chain/arm-2010.09/arm-none-linux-gnueabi/libc/lib/*.so* . -a

對庫檔案進行瘦身(去除符號表和除錯資訊):

arm-none-linux-strip *

檢視檔案型別已經被瘦身了

 $file ld-2.11.1.so
ld-2.11.1.so: ELF 32-bit LSB shared object, ARM, version 1 (SYSV), dynamically linked, stripped

10.etc目錄下新增配置檔案
10.1 新增profile檔案

#!/bin/sh
export HOSTNAME=liebao
export USER=root
export HOME=home
export PS1="[$USER@$HOSTNAME \W]\# "
PATH=/bin:/sbin:/usr/bin:/usr/sbin
LD_LIBRARY_PATH=/lib:/usr/lib:$LD_LIBRARY_PATH
export PATH LD_LIBRARY_PATH

進入系統就顯示瞭如下:

...
Please press Enter to activate this console.
[root@liebao:/]#
[root@liebao:/]#cd
[root@liebao:/home]#
[root@liebao:/home]#echo $PATH
/bin:/sbin:/usr/bin:/usr/sbin

可以看到我們自定義了命令提示符,cd進入了我們制定的家目錄homes,匯出了環境變數。
10.2 新增inittab和rcS檔案
1)在 etc 下新增檔案 inittab,檔案內容如下:


#this is run first except when booting in single-user mode.
::sysinit:/etc/init.d/rcS
# /bin/sh invocations on selected ttys
# start an "askfirst" shell on the console (whatever that may be)
::askfirst:-/bin/sh
# stuff to do when restarting the init process
::restart:/sbin/init
# stuff to do before rebooting
::ctrlaltdel:/sbin/reboot

這個是init程序解析的配置檔案,通過這個配置檔案決定執行哪個程序,何時執行。
2)建立etc/init.d目錄

mkdir etc/init.d

進入 etc/init.d
建立檔案rcS這是個啟動指令碼(裡面可以放一些系統啟動的時候需要執行的指令碼或者程式)
寫入一段語句如:

echo “welcome to linux” > rcS

加可執行許可權:

chmod +x rcS

重啟開發板觀察列印,打印出了這句話說明配置檔案配置成功,可以在裡面新增自己的可執行程式。
10.3 新增fstab檔案
為了讓那個系統自動掛載一些檔案,需要一個fstab檔案,dev下建立fstab檔案:

touch fstab

檔案內容如下:

#device  mount-point    type     options   dump   fsck order
sysfs    /sys          sysfs     defaults    0       0
proc     /proc         proc      defaults    0       0
tmp      /tmp          tmpfs     defaults    0       0
tmp      /dev          tmpfs     defaults    0       0

指定掛載的檔案系統。
這裡我們掛在的檔案系統有三個proc、sysfs和tmpfs,在核心中proc和sysfs預設都支援,而tmpfs是沒有支援的,我們需要新增tmpfs的支援
修改核心配置:


$ make menuconfig
File systems --->
       Pseudo filesystems --->
              [*] Virtual memory file system support (former shm fs)
              [*] Tmpfs POSIX Access Control Lists

重新編譯核心即可(實際上,我們使用的linux4.9的核心已經配置好了)。

啟動指令碼/etc/init.s/rcS中新增自動掛載命令:

/bin/mount -a
/bin/mkdir /dev/pts
/bin/mount -t devpts devpts /dev/pts

第一句話為:將會執行/etc/fstab檔案
第二三句為:建立虛擬的devpts 檔案系統用於用於偽終端裝置(當我們使用telnet或者ssh等登陸系統的時候就會自動在/dev/pts/下建立/dev/pts/0,/dev/pts/1等表示這些終端裝置)
重啟開發板,執行mount命令:

[[email protected]:/]#mount
172.16.21.104:/source/rootfs on / type nfs (rw,relatime,vers=2,rsize=4096,wsize=4096,namlen=255,hard,nolock,proto=udp,timeo=11,retrans=3,sec=sys,mountaddr=172.16.21.104,mountvers=1,mountproto=udp,local_lock=all,addr=172.16.21.104)
devtmpfs on /dev type devtmpfs (rw,relatime,size=469156k,nr_inodes=117289,mode=755)
sysfs on /sys type sysfs (rw,relatime)
proc on /proc type proc (rw,relatime)
tmpfs on /tmp type tmpfs (rw,relatime)
devpts on /dev/pts type devpts (rw,relatime,mode=600,ptmxmode=000)

掛載上了我們需要掛載的檔案系統,這個時候檢視/sys和/proc下都有了相應的檔案(這時ps命令才可以從proc中讀取程序相關資訊)。
10.4 使能mdev功能
以上基本上實現了檔案系統應該有的功能,但是我們知道“linux一切皆檔案”,對於裝置的訪問都抽象為對檔案的訪問,所以就有了裝置檔案節點的概念,所以需要創建出裝置節點後才能訪問裝置,手動建立不切實際,linux採用udev機制自動建立裝置節點,嵌入式中使用小型的mdev來讀取核心資訊建立裝置檔案。
在/etc/init.d/rcS中新增:

/sbin/mdev > /proc/sys/kernel/hotplug
/sbin/mdev -s

第一句:為設定核心熱插拔,當有裝置的熱插拔時呼叫/sbin/mdev
第二句:為在/dev下生成核心支援的所有的裝置節點
重啟開發板,系統mdev就會掃描/sys/dev/block 和/sys/dev/char下的檔案自動建立裝置節點。
11.dev目錄下新增裝置檔案
需要建立兩個裝置檔案:

mknod /dev/console c 5 1
mknod /dev/null c 1 3

其實,不建立這兩個檔案系統也能夠自動建立。

現在我們的系統就完全可以使用了,功能也基本完善了。