天天看點

busybox 安裝配置

轉自http://blog.csdn.net/denlee/archive/2008/04/06/2254192.aspx

   這幾天在使用Busybox制作FS2410開發闆的CRAMFS檔案系統,由于開始 下載下傳的是Busybox1.10,每次下載下傳到開發闆中,然後啟動總是出現”Failed to execute /linuxrc.  Attempting defaults...“的錯誤。到網上查了大量的資料,并做了大量的實驗,發現都不能成功。今天下午突然發現一個能夠仿真arm的軟體qemu,在Ubuntu中的安裝方法:sudo apt-get install qemu,Busybox編譯後,可以通過arm仿真來測試:qemu-arm ./busybox ls,如果成功,則會顯示目前目錄下的檔案清單。我對Busybox1.10編譯後的結果進行測試,發現出現錯誤:

qemu: unhandled CPU exception 0x8 - aborting

R00=001c596c R01=00000000 R02=001c5960 R03=00000001

R04=000cbf94 R05=00000000 R06=00000000 R07=00000000

R08=000cbfdc R09=000cbf94 R10=00000000 R11=00000000

R12=ffff0fff R13=b7d6c470 R14=000d4588 R15=ffff0fa0

PSR=20000010 --C- A usr32 ffff0fa0

s00=00000000(       0) s01=00000000(       0) d00=0000000000000000(       0)

s02=00000000(       0) s03=00000000(       0) d01=0000000000000000(       0)

s04=00000000(       0) s05=00000000(       0) d02=0000000000000000(       0)

s06=00000000(       0) s07=00000000(       0) d03=0000000000000000(       0)

s08=00000000(       0) s09=00000000(       0) d04=0000000000000000(       0)

s10=00000000(       0) s11=00000000(       0) d05=0000000000000000(       0)

s12=00000000(       0) s13=00000000(       0) d06=0000000000000000(       0)

s14=00000000(       0) s15=00000000(       0) d07=0000000000000000(       0)

s16=00000000(       0) s17=00000000(       0) d08=0000000000000000(       0)

s18=00000000(       0) s19=00000000(       0) d09=0000000000000000(       0)

s20=00000000(       0) s21=00000000(       0) d10=0000000000000000(       0)

s22=00000000(       0) s23=00000000(       0) d11=0000000000000000(       0)

s24=00000000(       0) s25=00000000(       0) d12=0000000000000000(       0)

s26=00000000(       0) s27=00000000(       0) d13=0000000000000000(       0)

s28=00000000(       0) s29=00000000(       0) d14=0000000000000000(       0)

s30=00000000(       0) s31=00000000(       0) d15=0000000000000000(       0)

FPSCR: 00000000

qemu: uncaught target signal 6 (Aborted) - exiting

說明,所編譯得到的busybox不能使用在arm處理器,由于時間關系就放棄了使用Buxybox1.10版本。後又嘗試了Busybox1.5.x,發現有同樣的問題。(後來和1.00版本對照,發現去掉了對devfs的支援)

于是使用FS2410開發版自帶的源碼中的Busybox1.00版本,編譯後仿真沒有問題,生成cramfs檔案系統後下載下傳、啟動也正常,隻是會出現“/bin/sh: can't access tty; job control turned off”的問題,查閱了一些資料,發現都不能很好的解決這個問題。于是下載下傳了Busybox1.1.3版本,編譯、生成檔案系統、下載下傳、啟動,一切正常,講一講過程:

1.下載下傳BusyBox 1.1.3

2. 執行make menuconfig,然後進行設定,我截了幾張圖,這幾張圖就是在進行配置時需要重點注意的地方:

busybox 安裝配置

(1)在General Configuration中,一定要選擇“Support for devfs”選項,現在的Busybox新版本去掉了這個選項,不過應該可以通過修改配置檔案加入。

busybox 安裝配置

(2)在Build Options選項中,選擇使用“靜态庫”以及設定交叉編譯工具的PREFIX。

busybox 安裝配置

(3)在Linux System Utilities選項中,“Support loopback mounts”和“Support for the old /etc/mtab file”2個選項應該選中。

busybox 安裝配置

(4)在Init Utilities選項中,“Support reading an inittab file”應該選中,這樣可以根據自己編寫的inittab檔案初始化;“Support running commands with a controlling-tty”應該選中,否則會提示非常困擾的“/bin/sh: can't access tty; job control turned off”的提示,盡管可以進入控制台指令行。

busybox 安裝配置

(4)在Shell選項中,應該選中預設shell:ash,否則不會生成sh,導緻不能解釋腳本檔案。

(5)其他的選項根據自己的需要設定。

3. 配置完成後,退出儲存(最好備份.config檔案以供後用),然後開始生成,執行make TARGET_ARCH=arm;此處的TARGET_ARCH是必須的。生成完成後使用qemu-arm測試:qemu-arm ./busybox ls,如果沒有錯誤的話,會顯示出 目前目錄下的檔案清單。

說明:在生成的過程中,提示了“/mnt/extdisk/embedded/busybox-1.1.3/include/bbconfigopts.h:28 hmm, untermina”錯誤,分析相應的檔案,發現應該是一個配置包含檔案,在配置後儲存在.config檔案中,是以這個檔案中的内容應該不是關鍵内容,是以我将此檔案清空儲存,然後重新執行上面的生成指令,成功。

4. 生成結束後,執行make install,生成一個_install檔案夾,内有一個linuxrc檔案和bin、sbin、usr三個檔案夾,删除linuxrc,将三個檔案夾打包。

5. 準備生成cramfs檔案系統:

(1)建立一個檔案夾,比如rootfs,轉到rootfs,執行指令mkdir bin dev etc home lib mnt proc sbin sys tmp  var usr,建立相應的檔案夾,再建立etc下的init.d檔案夾。

(2)準備啟動所需的檔案:linuxrc、rcS、inittab、fstab四個檔案;

linuxrc檔案:

----------------------------------------------

#!/bin/sh

echo "mount /etc as ramfs"

/bin/mount -f -t cramfs -o remount,ro /dev/bon/2 /

/bin/mount -t ramfs ramfs /var

/bin/mkdir -p /var/tmp

/bin/mkdir -p /var/run

/bin/mkdir -p /var/log

/bin/mkdir -p /var/lock

/bin/mkdir -p /var/empty

#/bin/mount -t usbdevfs none /proc/bus/usb

exec /sbin/init

------------------------------------------------

rcS檔案:

-----------------------------------------------------------------------------------

#!/bin/sh

/bin/mount -a

-----------------------------------------------------------------------------------

這兩個檔案生成後,應該使其具有執行的權限,可使用chmod 775 linuxrc rcS來修改,linuxrc應該放在rootfs根目錄,rcS應該放在rootfs/etc/init.d/目錄。

inittab檔案:

-------------------------------------------------

# This is run first except when booting

::sysinit:/etc/init.d/rcS

# Start an "askfirst" shell on the console

#::askfirst:-/bin/bash

::askfirst:-/bin/sh

# Stuff to do when restarting the init process

::restart:/sbin/init

# Stuff to do before rebooting

::ctrlaltdel:/sbin/reboot

::shutdown:/bin/umount -a -r

-------------------------------------------------

fstab檔案:

-------------------------------------------------

none        /proc        proc    defaults    0 0

none        /dev/pts    devpts    mode=0622    0 0

tmpfs        /dev/shm    tmpfs    defaults    0 0

-------------------------------------------------

這兩個檔案應該放在rootfs/etc/目錄,應該注意其權限問題。

(3)如果使用linux 2.6.xx核心,應該實作建立節點console、null。轉到rootfs/dev/目錄來建立:

sudo mknod console c 5 1

sudo mknod null c 1 3

否則就會提示“Warning: unable to open an initial console.

Kernel panic - not syncing: Attempted to kill init!”的類似錯誤。

(4)将剛才在busybox的_install下的三個檔案夾的打封包件複制到rootfs目錄,解壓後删除打封包件。

(5)也可以将一些常用的lib檔案複制到rootfs/lib/目錄下,比如:ld-2.5.so      libc-2.5.so      libcrypt.so.1  libgcc_s.so.1  libm.so.6 ld-linux.so.3  libcrypt-2.5.so  libc.so.6      libm-2.5.so等檔案或符号連接配接,在複制時應該注意采用圖形化的界面複制活打包後解包方式複制。

(6)轉到rootfs的上一級目錄,使用mkcramfs制作檔案系統:./mkcramfs rootfs xxxxx.cramfs,然後下載下傳、少錄、啟動,成功,如下圖所示:

busybox 安裝配置

6. 後記

(1)qemu-arm仿真工具

花費了2天多的時間來使用Busybox制作檔案系統,時間有點長,主要是開始走了彎路,使用Busybox1.10版本,當時不太清楚有qemu-arm仿真arm的工具,借助qemu-arm仿真工具可以很友善的驗證自己的busybox編譯結果是否正确,可以節省很多時間。就如剛開始我使用busybox1.10版本,沒有借助qemu-arm仿真,下載下傳後啟動出現”Failed to execute /linuxrc.  Attempting defaults...“的錯誤,這個錯誤很難排除,這幾天一有時間就查資料看解決這個問題的方法,隻可惜浪費了時間。

(2)交叉編譯工具

看網上有資料說,linux核心以及busybox最好使用相同的交叉編譯工具編譯,否則可能會出現問題。我使用的是不同版本的交叉編譯工具,沒有出現問題。因為linux2.6.24核心是幾天前編譯的,采用的是4.2.1版本;今天編譯busybox1.1.3用的是3.3.2版本。

(3)BusyBox

Linux2.6.xx核心取消了devfs的支援,Busybox也跟上了這個步伐,前面我也提到過,對于busybox的新版本應該可以通過修改配置檔案十七支援devfs,具體方法:修改Config.in檔案,找到menu "General Configuration",然後在其後适當位置加入如下内容:

config CONFIG_FEATURE_DEVFS

    bool "Support for devfs"

    default n

    help

      Enable if you want BusyBox to work with devfs.

這樣,在進行配置時就會出現“Support for devfs”選項。隻是我加入後,在進行編譯,所得到的busybox也沒有在qemu-arm仿真中通過。

轉自http://apps.hi.baidu.com/share/detail/1529790

編譯busybox 出錯 $ make meuncnfig

> miscutils/ionice.c: In function 'ioprio_set':
> miscutils/ionice.c:16: error: 'SYS_ioprio_set' undeclared (first use in
> this function)
> miscutils/ionice.c:16: error: (Each undeclared identifier is reported
> only once
> miscutils/ionice.c:16: error: for each function it appears in.)
> miscutils/ionice.c: In function 'ioprio_get':
> miscutils/ionice.c:21: error: 'SYS_ioprio_get' undeclared (first use in
> this function)
> make[1]: *** [miscutils/ionice.o] Error 1
> make: *** [miscutils] Error 2
      

***********************************************************************************************

解決方法:

将在busybox應用裡關閉 ionice 選項。

$  make meunconfig 

選擇下面的菜單:

Miscellaneous Utilities  --->     

[ * ] ionice                                     

按空格去掉這個選項。改成下面這樣。

[ ] ionice          

然後按 Y 儲存退出。

$  make 

$  make install

轉自http://blog.csdn.net/huihui1988

///

主控端:Fedora13

目标 機:s3c2440

交叉 編譯 器:arm-linux-gcc- 3.4.1

交叉編譯器路徑:/usr/local/arm/3.4.1

busybox版本:1.17.2

一、準備工作

1、配置交叉編譯環境

從http://www.handhelds.org/download/projects/toolchain/ 下 載arm-linux-gcc-3.4.1.tar.bz2

解壓:

将交叉編譯工具裝到/usr/local下

2、從http://www.busybox.net/downloads/下載下傳最新的busybox1.17.2版本

二、配置

1、修改Makefile

進入busybox的解壓目錄,

vim Makefile,将

ARCH ?= $(SUBARCH) 改為

ARCH ?= arm

CROSS_COMPILE ?=改為

CROSS_COMPILE ?= /usr/local/arm/3.4.1/bin/arm-linux-(根據你自己的路徑定義)

2、配置busybox的相關工具

執行 make menuconfig,進入配置菜

view plain copy to clipboard print ?

  1. Busybox Settings --->  
  2.      Build Options --->  
  3.           [*] Build BusyBox as a static binary (no shared libs) //這裡編譯為靜态庫  
  4.           [ ] Build with Large File Support //這裡要去掉這一項  
  5.           () Cross Compiler perfix //設定交叉編譯器路徑  
  6.      Installation Options --->  
  7.           [*] Don't use /usr //不安裝到系統的usr目錄下,以解壓目錄下的_install來代替  
  8. Linux System Utilities --->  
  9.      [ ] mkfs_ext2  
  10.      [ ] mkfs_vfat  //這兩項不選,否則編譯會報錯  
  11. 别的選項工具自己需要進行選擇  
  12. Miscellaneous Utilities --->  
  13.      [ ] ionice //去掉,否則編譯報錯  
  14. 其他選項根據個人需要  
  15. Networking Utilities --->  
  16.      可以去除一些不必要的選項  

3、編譯

下面進行編譯:make ARCH=arm CROSS_COMPILE=/usr/local/arm/3.4.1/bin/arm-linux-

這裡,我們會發現出錯了,錯誤資訊如下:

networking/interface.c:807: error: `ARPHRD_INFINIBAND' undeclared here (not in a function)

通過檢視核心源代碼目錄中的“include/linux/ifarp.h”檔案可得知“ARPHRDINFINIBAND”的值為“32”,然後 修改“networking/interface.c”檔案,在其中添加:

#define ARPHRD_INFINIBAND 32

繼續編譯,發現還是有錯誤:

networking/libiproute/ipaddress.c:167: error: `IFLA_OPERSTATE' undeclared (first use in this function)

這個錯誤其實是busybox的一個bug,一直未解決,我們對代碼做如下修改:

networking/libiproute/ipaddress.c

view plain copy to clipboard print ?

  1. 164 164                 printf("master %s ", ll_idx_n2a(*(int*)RTA_DATA(tb[IFLA_MASTER]), b1));   
  2. 165 165         }   
  3. 166 166 #endif   
  4.     167 #ifdef IFLA_OPERSTATE   
  5. 167 168         if (tb[IFLA_OPERSTATE]) {   
  6. 168 169                 static const char operstate_labels[] ALIGN1 =   
  7. 169 170                         "UNKNOWN/0""NOTPRESENT/0""DOWN/0""LOWERLAYERDOWN/0"   
  8. …   …      
  9. 171 172                 printf("state %s ", nth_string(operstate_labels,   
  10. 172 173                                         *(uint8_t *)RTA_DATA(tb[IFLA_OPERSTATE])));   
  11. 173 174         }   
  12.     175 #endif   
  13. 174 176         if (G_filter.showqueue)   
  14. 175 177                 print_queuelen((char*)RTA_DATA(tb[IFLA_IFNAME]));   
  15. 176 178    

networking/libiproute/iplink.c

view plain copy to clipboard print ?

  1. *  
  2.   274   274         return ipaddr_list_or_flush(argv, 0);   
  3.   275   275 }   
  4.   276   276    
  5.     277 #ifdef IFLA_LINKINFO   
  6.   277   278 #ifndef NLMSG_TAIL   
  7.   278   279 #define NLMSG_TAIL(nmsg) /   
  8.   279   280         ((struct rtattr *) (((void *) (nmsg)) + NLMSG_ALIGN((nmsg)->nlmsg_len)))   
  9.   …     …      
  10.   360   361                 return 2;   
  11.   361   362         return 0;   
  12.   362   363 }   
  13.     364 #endif   
  14.   363   365    
  15.   364   366    
  16.   365   367 int do_iplink(char **argv)   
  17.   366   368 {   
  18.   367   369         static const char keywords[] ALIGN1 =   
  19.     370 #ifdef IFLA_LINKINFO   
  20.   368   371                 "add/0""delete/0""set/0""show/0""lst/0""list/0";   
  21.     372 #else   
  22.     373                 "set/0""show/0""lst/0""list/0";   
  23.     374 #endif   
  24.   369   375         if (*argv) {   
  25.   370   376                 smalluint key = index_in_substrings(keywords, *argv);   
  26.   371   377                 if (key > 5)    
  27.   372   378                         bb_error_msg_and_die(bb_msg_invalid_arg, *argv, applet_name);   
  28.   373   379                 argv++;   
  29.     380 #ifdef IFLA_LINKINFO   
  30.   374   381                 if (key <= 1)    
  31.   375   382                         return do_change(argv, key ? RTM_DELLINK : RTM_NEWLINK);   
  32.   376   383                 else if (key == 2)    
  33.     384 #else   
  34.     385                 if (key == 0)    
  35.     386 #endif   
  36.   377   387                         return do_set(argv);   
  37.   378   388         }   
  38.   379   389            

完成後繼續編譯

執行 make install,終于在_install檔案夾下生成了工具包

4、制作檔案系統

可以先建立一個工作目錄,如myroot,在工作目錄下 建立以下目錄:bin sbin dev etc lib home root usr var proc mnt tmp sys

執行 mkdir bin sbin dev etc lib home root usr var proc mnt tmp sys

在etc 下面要寫兩個檔案fstab inittab 和一個檔案夾init.d

(a) fstab 的内容是:

view plain copy to clipboard print ?

  1. proc /proc proc defaults 0 0  
  2. tmpfs /tmp tmpfs defaults 0 0  
  3. sysfs /sys sysfs defaults 0 0  
  4. tmpfs /dev tmpfs defaults 0 0  

(b) fstab 檔案的作用

文 件/etc/fstab 存放的是系統中的檔案系統資訊。當正确的設定了該檔案,則可以通過"mount /directoryname" 指令來加載一個文 件系統,每種檔案系統都對應一個獨立的行,每行中的字段都有空格或tab 鍵分開。同時fsck 、mount 、umount 的等指令都利用該程式。

inittab 的内容是:

view plain copy to clipboard print ?

  1. #/etc/inittab  
  2. ::sysinit:/etc/init.d/rcS  
  3. ::askfirst:-/bin/sh   
  4. ::ctrlaltdel:/sbin/reboot  
  5. ::shutdown:/bin/umount -a -r  

(c) init.d/rcS 檔案的内容:

view plain copy to clipboard print ?

  1. #!/bin/sh  
  2. ifconfig eth0 192.168.1.17  
  3. mount -t tmpfs mdev /dev  
  4. mkdir /dev/pts  
  5. mount -t devpts devpts /dev/pts  
  6. mount -t sysfs sysfs /sys  
  7. mount -a  
  8. echo /sbin/mdev > /proc/sys/kernel/hotplug  
  9. mdev –s  
  10. echo leohui1988_busybox  

(d)在/dev 下建立裝置節點:Console null

view plain copy to clipboard print ?

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

(e)将編譯busybox生成的/bin和/sbin下的工具拷貝到myroot下的/bin和/sbin下

(f)使用mkyaffs2image制作yaffs檔案系統鏡像

./mkyaffs2image myroot rootfs.yaffs

将yaffs燒寫至開發闆,可在終端下看到leohui1988_busybox的輸出,最基本的檔案系統制作成功!

注意:

如果使用靜态編譯,那麼後面我們移植到開發闆的程式也必須靜态編譯,這樣的話就比較占存儲空間,為此可以将busybox進行動态編譯,使用共享連結庫來減小體積,同時也友善後面程式進行編譯和移植。

動态編譯步驟與以上類似,隻是把 [ ] Build BusyBox as a static binary (no shared libs)這一項替換掉。其餘步驟一樣,完成後将bin和sbin拷貝到檔案系統的bin,sbin下,然後将linuxrc這個連結檔案也拷入檔案系統根目錄下,最初我沒放linuxrc這個連結檔案時,啟動顯示init錯誤。之後再将arm-linux交叉編譯工具的lib(我的路徑是/usr/local/arm/3.4.1/arm-linux/lib)庫拷貝到檔案系統lib下。制作成鏡像燒寫至flash,啟動成功!

繼續閱讀