天天看點

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

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

原創 2018年03月05日 19:50:36

  • 标簽:
  • busybox /
  • 根檔案系統 /
  • 移植

本文适配fs4412開發闆,使用的核心為linux4.9.9。

1.源碼下載下傳

Busybox的官方源碼下載下傳路徑為:

http://busybox.net/downloads/

可以下載下傳最新的busybox-1.28.1

2.解壓源碼

tar xvf busybox-.tar.bz2
           
  • 1

3.進入源碼目錄

cd busybox-.
           
  • 1

4.配置busybox

Busybox官方已經對其做了大量的預設的配置(如一些常用的shell指令:ls ,cd,mkdir等預設選擇),是以我們隻需要做幾步簡單的适配即可。

首先,執行

make menuconfig
           
  • 1

4.1 busybox運作使用的庫的選擇

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

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

4.2 交叉編譯工具鍊的選擇

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

根據你自己的平台選擇填寫自己的工具鍊

4.3 安裝目錄的選擇

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

這裡安裝目錄選擇目前目錄的_install目錄

4.4 usr相關檔案生成選擇

Settings --->
        [ ] Don't use /usr  
           
  • 1
  • 2

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

5.編譯

執行

  • 1

等待幾分鐘即可編譯完成。

6.安裝

執行

  • 1
結果如下:
......
   ./_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
           
  • 1
  • 2
  • 3

可以發現生成了4個檔案。

可以發現:/bin下的busybox大小為1.9M,其他的指令可執行檔案都是指向它的符号連結。

如執行:ls <===> busybox ls

執行

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

可以看到生成了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  
           
  • 1

9.lib目錄下添加庫檔案

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

  • 1

對庫檔案進行瘦身(去除符号表和調試資訊):

  • 1

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

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

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
           
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

可以看到我們自定義了指令提示符,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
           
  • 1

進入 etc/init.d

建立檔案rcS這是個啟動腳本(裡面可以放一些系統啟動的時候需要執行的腳本或者程式)

寫入一段語句如:

echo “welcome to linux” > rcS
           
  • 1

加可執行權限:

chmod +x rcS
           
  • 1

重新開機開發闆觀察列印,列印出了這句話說明配置檔案配置成功,可以在裡面添加自己的可執行程式。

10.3 添加fstab檔案

為了讓那個系統自動挂載一些檔案,需要一個fstab檔案,dev下建立fstab檔案:

touch fstab
           
  • 1

檔案内容如下:

#device  mount-point    type     options   dump   fsck order
sysfs    /sys          sysfs     defaults           
proc     /proc         proc      defaults           
tmp      /tmp          tmpfs     defaults           
tmp      /dev          tmpfs     defaults           
           
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

指定挂載的檔案系統。

這裡我們挂在的檔案系統有三個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
           
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

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

啟動腳本/etc/init.s/rcS中添加自動挂載指令:

/bin/mount -a
/bin/mkdir /dev/pts
/bin/mount -t devpts devpts /dev/pts
           
  • 1
  • 2
  • 3

第一句話為:将會執行/etc/fstab檔案

第二三句為:建立虛拟的devpts 檔案系統用于用于僞終端裝置(當我們使用telnet或者ssh等登陸系統的時候就會自動在/dev/pts/下建立/dev/pts/0,/dev/pts/1等表示這些終端裝置)

重新開機開發闆,執行mount指令:

[[email protected]:/]#mount
:/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)
           
  • 1
  • 2
  • 3

挂載上了我們需要挂載的檔案系統,這個時候檢視/sys和/proc下都有了相應的檔案(這時ps指令才可以從proc中讀取程序相關資訊)。

10.4 使能mdev功能

以上基本上實作了檔案系統應該有的功能,但是我們知道“linux一切皆檔案”,對于裝置的通路都抽象為對檔案的通路,是以就有了裝置檔案節點的概念,是以需要建立出裝置節點後才能通路裝置,手動建立不切實際,linux采用udev機制自動建立裝置節點,嵌入式中使用小型的mdev來讀取核心資訊建立裝置檔案。

在/etc/init.d/rcS中添加:

/sbin/mdev > /proc/sys/kernel/hotplug
/sbin/mdev -s
           
  • 1
  • 2

第一句:為設定核心熱插拔,當有裝置的熱插拔時調用/sbin/mdev

第二句:為在/dev下生成核心支援的所有的裝置節點

重新開機開發闆,系統mdev就會掃描/sys/dev/block 和/sys/dev/char下的檔案自動建立裝置節點。

11.dev目錄下添加裝置檔案

需要建立兩個裝置檔案:

mknod /dev/console c  
mknod /dev/null c  
           
  • 1
  • 2

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

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

注:有關linux4.9.9核心的移植見《移植最新的linux4.9.9核心(适配fs4412平台)》:

http://blog.csdn.net/liebao_han/article/details/79436819

文章内容持續更新。