使用busybox製作rootfs

來源:互聯網
上載者:User
1        


擷取源碼解壓

從busybox的官方首頁http://www.busybox.net
,下載busybox的源碼,目前最新的版本為busybox-1.13.3.tar.bz2#tar –jvxf busybox-1.13.3.tar.bz2進入解壓後的busybox源碼目錄#cd busybox-1.13.3 2        


配置busybox

步驟跟編譯linux核心時很像#make menuconfig出現一個圖形介面,選擇Busybox Settings,這裡可以對編譯、安裝以及調試等模式進行配置。然後選擇Build Options,對交叉編譯器以及編譯方式進行配置。其中的第一項是Build Busybox as a static binary(no shared
libs),如果選擇上,則busybox將以靜態形式進行編譯,否則將以動態方式編譯。此外,還需要對交叉編譯環境進行配置,選擇其中的Cross
Compiler Perfix,輸入交叉編譯器的首碼,我們的嵌入式平台上使用的是arm-uclinux-linux的交叉編譯工具。這裡我們先選擇靜態編譯,動態方式的稍後再講,注意Build with Large File Support (for
accessing files > 2 GB)不要選(預設是選上的),否則編譯後會出現如下錯誤:miscutils/lib.a(readahead.):In function ‘readahead_main’readahead.(.text.readahead_main+0×70):undefined reference to
‘readahead’collect2:ld returned 1 exit statusmake :***[busybox_unstripped ]Error 1  3        


編譯busybox

#make 4        


安裝busybox

#make install可以採用perfix參數安裝到指定目錄下,格式為:make install
prefix=xxx目錄,如果不特別指定,將預設在busybox源碼目錄下產生一個_install目錄。到此,busybox基本上可以功成身退
了。我們需要的就是busybox編譯出來的這個_install目錄。進入_install目錄,可以看到一共有3個目錄和一個檔案,分別是:bin、sbin和usr目錄以及linuxrc檔案。在對這幾個目錄進行說明之前,先簡單介紹一下編譯產生的busybox可執行檔,它存在於bin目錄下。Busybox使用了帶參的main
函數:int main(int argc,char
*argv[]),在這個定義中,argc是傳遞進來的參數的個數(參數數量),而argv是一個字串數組,代表從命令列傳遞進來的參數。argv的索
引0是命令列調用的程式名。可以在bin目錄下進行如下操作:#busybox pwd(注意,busybox這個可執行檔不需要加./)當為一個可執行程式建立符號連結後,在執行這個符號連結時,就可以擷取到這個符號連結的名字。而busybox正是使用符號連結的方式使一個可
執行程式看起來像很多程式一樣。對於busybox中包含的每個工具來講,都會建立一個符號連結,這樣就可以使用這些符號連結來調用busybox了。然
後busybox接著根據argv[0]的值來調用內部工具。下面分別對install目錄下的幾個檔案進行一些說明。Ø       

bin包含使用者工具,其中,busybox可執行檔就在這個目錄
下,該目錄下其他所有檔案都是指向busybox的符號連結Ø       

sbin目錄包含作業系統工具,同樣也指向busybox。Ø       

linuxrc是一個連結檔案,指向busybox。 5        


添加etc目錄及基本設定檔

參考一個正常的linux系統將會發現,此時busybox建立的檔案系統還缺少很多檔案。如果用這個作為檔案系統,將是無法啟動並執行。產生這些
配置可以選擇的方法有2種,一種是直接從一個正常啟動並執行系統中拷貝,另一種是藉助於busybox的examples。顯然,選擇第二種會容易的多,我們
直接拷貝examples/bootfloopy/etc到install目錄下。#cp –a ../examples/bootfloppy/etc/ .然後可以看看etc目錄下的檔案,一共有3個目錄和檔案,下面逐一對以上幾個檔案進行分析和說明。Ø       

inittab檔案:系統啟動後訪問的第一個指令檔,後續啟動的文
件都由它指定。下面看一下busybox中原始的inittab檔案內容:::sysint:/etc/init.d/rcS::respawn:-/bin/shtty2::askfirst:-/bin/sh::ctrlaltdel:/bin/umount –a -r其中第一行指定系統的啟動指令碼為/etc/init.d/rcS第二行指定開啟一個登入工作階段第三行指定在第三個虛擬終端開啟一個無須登入驗證的shell第四行指定了當按下ctrl+alt+del按鍵組合時的執行命令Ø       

fstab檔案:定義了檔案系統的各個“掛載點”,需要與實際的系統
相配合。預設的fstab檔案內容為:proc   /proc proc defaults 0 0其他的根據需要再進行添加,比如devpts  /dev/pts devpts defaults 0 0就是為UNIX
PTYs準備的,後面講telnetd時要用到。Ø       

profile檔案:終端登陸之後首先啟動並執行指令碼。  6        


添加dev目錄及基本裝置檔案

調試時要通過串口發送訊息到終端顯示。因此串口控制台和終端2個裝置檔案是必不可少的。#mkdir dev#mknod dev/console c 5 1#mknod dev/ttyAMA0 c 204 64在啟動參數中,設定console=ttyAMA0 7        


添加其他常用目錄

可以選擇home、root、proc、mnt、lib、var、opt、tmp。此時,一個基本的檔案系統的功能就已經完成了。可以採用NFS進行調試。但是,此時你可能會遇到如下問題,系統登入後終端上會不斷列印:cannot open /dev/ttyS2:No such file or directory.原因出在/etc目錄下的inittab檔案,我們看一下其內容:::sysint:/etc/init.d/rcS::respawn:-/bin/shtty2::askfirst:-/bin/sh::ctrlaltdel:/bin/umount –a -r這條語句表示在第3個虛擬終端開啟一個無須登入驗證的shell。而我們之前沒有建立這個tty2裝置,因此會出錯。解決的辦法有2個:一是屏
蔽該語句,二是建立該裝置節點。我們選擇將其屏蔽。 8        


相關問題

8.1     

使用動態方式編譯
busybox
進入Build Options時,不要選擇Build Busybox as a static
binary,其他所有操作步驟跟靜態編譯一樣,你會發現這樣建立的檔案系統無法啟動,終端上列印出如下訊息:Kernel panic-not synving:No init found. Try passing init=option to
kernel.為什麼會出現這種問題呢?這就得回到兩種編譯方式的特點上來。靜態編譯時間是將所用到的庫檔案一起編譯了進去,而動態編譯時間是在需要時才調用相應
的庫。我們選擇動態編譯後,沒有添加任何庫檔案就運行,顯然是會出錯的。那麼如何查看busybox可執行檔裡使用的庫呢。Readelf這個工具提供
瞭解決辦法。使用如下命令,參數d表示將檔案中所有的動態部分予以顯示。# arm-uclibc-linux-readelf -d busybox Dynamic section at offset 0xca014 contains 18 entries: 
標記       
類型                        

名稱/值 0×00000001 (NEEDED)                    
共用庫:
[libm.so.0] 0×00000001 (NEEDED)                    
共用庫:
[libc.so.0] 0×0000000c (INIT)                       0xbe24 0×0000000d (FINI)                       0xb2054 0×00000004 (HASH)                       0×80e8 0×00000005 (STRTAB)                     0xa500 0×00000006 (SYMTAB)                     0×8b70 0×0000000a (STRSZ)                      3259 (bytes) 0×0000000b (SYMENT)                     16 (bytes) 0×00000015 (DEBUG)                      0×0 0×00000003 (PLTGOT)                     0xda0cc 0×00000002 (PLTRELSZ)                   3040 (bytes) 0×00000014 (PLTREL)                     REL 0×00000017 (JMPREL)                     0xb244 0×00000011 (REL)                        0xb1bc 0×00000012 (RELSZ)                      136 (bytes) 0×00000013 (RELENT)                     8 (bytes) 0×00000000 (NULL)                       0×0從上面的結果中,我們可以看到,busybox這個程式使用到了libm.so.0和libc.so.0兩個庫檔案,實際上這是2個符號連結,
分別指向libc-0.9.28.so和libuClibc-0.9.28.so。將以上四個檔案分別拷貝到lib目錄下。按理說,這樣應該就可以了,但
是仍然無法正常運行。顯示的錯誤資訊和剛剛沒加庫之前一樣。可能的原因有2種:一是庫檔案沒有添加全,二是庫檔案沒有正確被載入。根據readelf顯示
的結果應該不是第一種原因。那麼到底為什麼沒被正確載入呢?原來庫檔案的載入,還需要一個共用庫載入器。找到對應的檔案ld-uClibc-
0.9.28.so和ld-uClibc.so.0添加到lib目錄下後。運行正常。 8.2     

終端登入使用者驗證功
能添加
需要在etc目錄下增加passwd、group和shadow(在編譯busybox時如果不選擇shadow功能將不需要這個檔案)3個文
件。產生這3個檔案的方法有:Ø       

手動產生,按照格式規範自己編寫內容;Ø       

通過busybox提供的工具adderuser自動產生 8.2.1       


手動方式

首先我們介紹一下如何手動添加。以增加root使用者為例,增加passwd檔案,其內容為:#cat passwdroot:x:0:0:root:/root:/bin/sh同時,此時要確定root目錄已經存在。passwd一共由7個欄位組成,6個冒號將其隔開。它們的含義分別為:1    
使用者名稱2    
是否有加密口令,x表示有,不填表示無,採用MD5、DES加密。3    
使用者ID4    
組ID5    
注釋欄位6    
登入目錄7    
所使用的shell程式增加group檔案,其內容為:#cat grouproot:x:0:Group一共由4個欄位組成,3個冒號將其隔開,它們的含義分別為:1    
組名2    
是否有加密口令,同passwd3    
組ID4    
指向各使用者名稱指標的數組由於busybox預設啟動了shadow模式,因此需要增加shadow檔案,其內容為:#cat shadowroot:$1$3jZ93Mwq$oaeef6lWIuThavs8wD0Wh1:0:0:99999:7:::shadow一共由9個欄位組成,8個冒號將其隔開,它們的含義分別為:1    
使用者名稱2    
加密後的口令,若為空白,表示該使用者不需要口令即可登陸,若為*號,表示該帳號被禁用。
上面的表示的是123456加密後的口令。3    
從1970年1月1日至口令最近一次被修改的天數4    
口令在多少天內不能被使用者修改5    
口令在多少天后必須被修改(0為沒有修改過)6    
口令到期多少天后使用者帳號被禁止7    
口令在到期多少天內給使用者發出警告8    
口令自1970年1月1日被禁止的天數9    
保留網域這裡強調一下shadow檔案的由來。/etc/passwd檔案對系統的所有使用者都是可讀的,這樣的好處是每個使用者都知道系統上有哪些使用者,
但缺點是其他使用者的口令容易受到攻擊,尤其是當口令較簡單時。所以一些linux系統中使用到了影子口令檔案shadow,將使用者的口令儲存在另一個檔案
/etc/shadow中,該檔案只有根使用者root可讀,大大提高了安全性。不過,採用這種手動添加檔案的方法有一個缺陷,就是如果要為使用者佈建登陸口令的話,shadow檔案中必須填寫加密後的口令,而這個密碼編譯演算法我
們又不知道,即使知道,要經過轉換後再添加,比較麻煩。此時,不妨試一下第二種方法。 8.2.2       


自動方式

自動產生是使用了busybox提供的adduser工具和passwd工具。在檔案系統正常運行起來後,使用adduser命令,使用方法為:#adduser root然後就會在etc目錄下自動產生passwd 、group和shadow3個檔案。但是運行該命令後會列印出如下訊息:passwd:unknown uid 0這表示不能為該使用者佈建密碼,此時你會發現要passwd命令也無法使用。解決的辦法是,開啟passwd檔案,其內容為:root:x:1000:1000:Linux User…:/home/root:/bin/sh將使用者ID和組ID均更改為0開啟group檔案,其內容為:root:x:1000:同樣將組ID改為0然後,passwd命令就可以正常使用了。這時為root使用者佈建口令:#passwd root根據提示輸入密碼。其中,root使用者登陸後的目錄可以手動變更。 8.3     

telnetd功能
添加
busybox預設已經添加了對telnetd和telnet功能的支援,只需要完成一些相關的設定工作就可以啟動這2個功能了。Ø         

建立/dev/pts目錄Ø       

在/etc/fstab中添加如下資訊,掛載devpts檔案系統devpts /dev/pts devpts defaults 0 0Ø       

在/dev目錄下增加ptmx裝置檔案:#mknod ptmx c 5 2Ø       

在rcS檔案中添加如下指令碼,啟動telnetdif [ -x /usr/sbin/telnetd ] ;then        telnetd&fiØ       

在/dev目錄下增加null裝置檔案,否則上述指令碼運行時會出錯:
提示找不到null檔案。#mknod null c 1 3此時,telnetd功能開機就可以啟動了。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.