1. 程式人生 > >用busybox搭建最簡單的Linux檔案系統

用busybox搭建最簡單的Linux檔案系統

最近自己也用busybox製作了一個ramdisk的檔案系統,並還用mkimage工具做成了ramdisk-uboot.img,掛載到三星4412的板子上跑了起來。中途出了很多問題:

1、ramdisk的檔案系統核心載入時說ramdisk format wrong,看用fastboot燒錄的時候ramdisk的格式是ramdisk-uboot.img,於是又編譯u-boot原始碼,在tools目錄下生成了mkimage工具,再把他拷貝到/usr/bin目錄下,利用一下命令生成ramdisk-uboot.img:

mkimage -A arm -O linux -T ramdisk -C none -a 0x40008000 -n "ramdisk" -d ramdisk.img ramdisk-uboot.img

2、u-oot啟動引數bootargs和bootcmd的設定

在這裡折騰了好久,要麼啟動不了,要麼,啟動了,然後不停的重複載入核心。

我以為是核心的問題,在公司的伺服器上下載了核心原始碼,放到公司的伺服器上去編譯,make menuconfig又用不了,說缺少檔案,但缺少的什麼makefile就在哪裡,我又放到自己的虛擬機器裡面編,好像有的地方要用sudo來執行,可能在伺服器上用不了sudo,所以編不了。

其實核心裡面make menuconfig只需要設定Devices Drivers——【*】Block devices——<*>RAM block device support,只要核心支援ramdisk檔案系統就行,當然還有可能核心預設的ramdisk的大小太小了,你的ramdisk超過了,也可能出問題,我的ramdisk大小超不多2M,核心預設的是8M,所以夠用,核心是沒問題的。

那就只可能是u-boot的啟動引數設定了,經過不斷的嘗試,最後得出這樣的設定才能有效:

setenv bootargs root=/dev/ram rw init=/linuxrc console=ttySAC2,115200n8

saveenv

setbootcmd setddrV 77;movi r k 0 40008000;movi r rootfs 0 41000000 300000;bootm 40008000 41000000

這個bootcmd只能臨時設定起效,要想徹底修改,得修改u-boot原始碼中的smdk4412.h檔案,再編譯後生成u-boot.bin。

在這裡其中movi r rootfs 0 41000000 300000引數最開始最後面的引數是100000,也就是載入的檔案系統是1M,但是我的檔案系統大於1M,所以老是載入不起來,核心不斷重啟,改成3M後就好了。

這裡,這篇轉載的文章還是極具參考意義的,至於我的詳細製作過程,有時間再整理出來。

Linux檔案系統不僅包含著檔案中的資料而且還有檔案系統的結構,所有Linux使用者和程式看到的檔案、目錄、軟連線及檔案保護資訊等都儲存在其中。有了檔案系統,使用者就可以很方便的和Linux裝置進行資料互動了。 隨著實際需求的不斷提高,Linux檔案系統也變得越來越龐大。無論它如何千變萬化,歸根結底,都是基於最基本的linux檔案系統不斷豐富而來。因此,我們完全有必要了解最基本的檔案系統的搭建過程,更加複雜的檔案系統可以舉一反三,各個擊破,真正做到一通百通。下面我們將逐步講解最簡單的linux檔案系統的製作方法。 第一步:在ubuntu的使用者目錄下新建一個檔案系統的總目錄,如rootfs_x4412:
  1. mkdir  rootfs_x4412
複製程式碼 第二步:編譯安裝busybox 從busybox官網(www.busybox.net)下載最新的busybox原始碼包,這裡以1.22.1版本為例,原始碼包名稱為busybox-1.22.1.tar.bz2。 解壓原始碼包,開啟busybox根目錄的Makefile檔案,指定交叉編譯工具鏈以及體系架構,注意,請以自己的實際交叉編譯工具安裝路徑為準:
  1. CROSS_COMPILE ?=  /usr/local/arm/arm-2009q3/bin/arm-none-linux-gnueabi-
  2. ARCH ?= arm
複製程式碼

在busybox根目錄下執行make menuconig配置busybox:


進入Busybox Settings目錄,


再進入Build Options目錄,


選中第一項,即將Busybox編譯成靜態的二進位制檔案。使用靜態的檔案,可以不依賴於共享庫,後面我們將會進一步說明。其他選項暫且預設,當然我們也可以根據自己的實際需要新增或是刪剪一些busybox指令,以及其他的一些特色選項。     退出menuconfig並儲存配置後,在busybox根目錄下執行如下指令編譯安裝:
  1. make
  2. make  install
複製程式碼     這時在busybox根目錄會生成_install目錄,裡面存放著bin,sbin,usr三個目錄以及linuxrc檔案。這些檔案構成了busybox的各種指令集。     前面我們提到,將busybox編譯成靜態檔案後,不再依賴共享庫。進入busybox的根目錄,使用如下指令檢視busybox依賴的共享庫:
  1. arm-none-linux-gnueabi-readelf -d busybox
複製程式碼     可以看到如下列印提示:
  1. There is no dynamic section in this file.
複製程式碼     說明我們編譯的busybox檔案確實不依賴於任何的動態庫。     提示:這裡如果找不到arm-none-linux-gnueabi-readelf檔案,請在ubuntu使用者目錄的.bashrc檔案的最後面宣告PATH環境變數,宣告內容如下:
  1. PATH=/usr/local/arm/arm-2009q3/bin:$PATH
  2. export PATH
複製程式碼     再執行如下指令即可:
  1. source  ~/.bashrc
複製程式碼     第三步:填充檔案系統內容     將上一步_install目錄下bin,sbin目錄全部複製到檔案系統目錄rootfs_x4412,注意在bin和sbin目錄下有很多都是軟連結,複製時千萬不要丟失了檔案屬性:
  1. cp -a  _install/bin  ../rootfs_x4412
  2. cp -a  _install/sbin  ../rootfs_x4412
複製程式碼     進入檔案系統目錄rootfs_x4412,新建其他目錄:
  1. mkdir  dev  etc  lib  mnt  proc  sys  tmp  usr  var
複製程式碼     在etc下新建init.d目錄,然後在init.d目錄下新建rcS檔案:
  1. cd  etc
  2. mkdir  init.d
  3. cd  init.d
  4. touch  rcS
  5. chmod  777  rcS
複製程式碼     編輯rcS檔案,新增內容如下:
  1. #!/bin/sh
  2. /bin/mount -a       #mount all stuff from /etc/fstab
  3. /sbin/ifconfig eth0 192.168.1.15 up #開機自動設定eth0的IP地址
  4. /sbin/ifconfig eth1 192.168.1.16 up #開機自動設定eth1的IP地址
複製程式碼     在etc目錄下新建fstab檔案,該檔案將會被rcS中的mount –a語句呼叫。編輯fstab檔案內容如下:
  1. none           /proc           proc  defaults      0 0
複製程式碼 這裡表示分別將proc檔案系統掛載到相應的目錄,第二列為所掛載的目錄,第三列為要掛載的檔案系統,第四列為掛載所使用的屬性。     在檔案系統根目錄下建立linuxrc檔案,編輯內容如下:
  1. #!/bin/sh
  2. /bin/mount -t proc proc /proc
  3. /bin/mount -t sysfs sysfs /sys
  4. /sbin/mdev -s
  5. exec /sbin/init
複製程式碼     這裡將procsysfs檔案系統分別掛載到procsys目錄。 proc檔案系統是一個偽檔案系統,它只存在記憶體當中,而 不佔用外存空間。它以檔案系統的方式為訪問系統核心資料的操作提供介面。使用者和應用程式可以通過proc得到系統的資訊,並可以改變核心的某些引數。由於 系統的資訊,如程序,是動態改變的,所以使用者或應用程式讀取proc檔案時,proc檔案系統是動態從系統核心讀出所需資訊並提交的。 sysfs 把連線在系統上的裝置和匯流排組織成為一個分級的檔案,它們可以被從使用者的空間存取到。這是被設計用來處理那些以前駐留在 /proc/ 的裝置和驅動程式指定的選件以及用來處理那些以前由 devfs 提供支援的動態載入裝置。注意一定要修改linuxrc檔案的屬性為777,否則會提示failedto execute /linuxrc的錯誤。        在/etc下建立mdev.conf檔案,內容為空即可。如果不建立這個檔案,將會提示下面的錯誤:
  1. mdev: /etc/mdev.conf: No such file or directory
複製程式碼 使用下面命令建立即可:
  1. touch mdev.conf
複製程式碼        在/dev下建立console,null,tty2,tty3,tty4等五個字元裝置檔案:
  1. mknod console c 5 1
  2. mknod null c 1 3
  3. mknod /dev/tty2 c 4 2
  4. mknod /dev/tty3 c 4 3
  5. mknod /dev/tty4 c 4 4
複製程式碼 c表示建立沒有緩衝的字元特殊檔案,後面的兩個數字分別表示主裝置號和次裝置號。     第四步:製作ext4檔案系統     本實驗基於x4412或ibox開發平臺,對應硬體裝置儲存器均為emmc,並不是傳統的nand flash,因此檔案系統格式也不再是傳統的yaffs或是jffs檔案系統了。     在ubuntu使用者目錄下新建目錄rootfs_tmp檔案,用於臨時掛載檔案系統:
  1. mkdir  -p  rootfs_tmp
複製程式碼     製作一個12M的ext4空白檔案:
  1. dd  if=/dev/zero  of=rootfs.ext4  bs=1024  count=12288
複製程式碼     再將新建的rootfs.ext4檔案格式化為ext4格式:
  1. mkfs.ext4  rootfs.ext4
複製程式碼     將rootfs.ext4檔案掛載到前面我們新建的臨時目錄rootfs_tmp,注意這裡我們要使用mount –o loop的屬性,表示我們要把rootfs.ext4當作硬碟分割槽掛載到rootfs_tmp:
  1. sudo  mount  -o  loop  rootfs.ext4  ./rootfs_tmp
複製程式碼     這時,我們就可以給rootfs.ext4填充內容了。執行如下指令拷貝檔案系統內容:
  1. cp  rootfs_x4412/*  ./rootfs_tmp  -ar
複製程式碼     拷貝完後,解除安裝掛載的rootfs.ext4檔案,即完成了檔案系統的製作:
  1. sudo  umount  ./rootfs_tmp
複製程式碼 我們可以將rootfs.ext4檔案燒寫到開發板,測試是否可以正常掛載。實際測試介面如下:
執行到如下語句,說明檔案系統已經掛載起來了。
  1. Please press enter to activate this console
複製程式碼     從上面我們可以看到,整個x4412的啟動過程,只花了3.58秒。當然隨著檔案系統的逐漸龐大,啟動開銷也會不斷增加。     第五步:我們做好檔案系統後,經常要打包檔案系統,燒寫測試。即第四步經常要重複操作。為此,我們可以編寫打包檔案系統的指令碼。參考指令碼如下:
  1. # Description       : Build linux filesystem Script.
  2. # Authors            : lqm
  3. # Version             : 0.01
  4. # Notes                         : None
  5. #
  6. # must root user
  7. echo "making ext4 rootfs now,wait a moment..."
  8. if [ -d rootfs_tmp ]; then
  9.          rm -rf rootfs_tmp
  10. fi
  11. if [ -f rootfs.ext4 ]; then
  12.          rm -rf rootfs.ext4
  13. fi
  14. mkdir -p rootfs_tmp
  15. dd  if=/dev/zero  of=rootfs.ext4  bs=1024  count=12288
  16. mkfs.ext4  rootfs.ext4
  17. mount  -o  loop  rootfs.ext4  ./rootfs_tmp
  18. cp ./rootfs_x4412/* ./rootfs_tmp -ar
  19. umount ./rootfs_tmp
  20. rm -rf rootfs_tmp
  21. echo "^_^ make x4412 rootfs.ext4 successful!"
複製程式碼 做好的精簡檔案系統下載:http://xboot.org/thread-27365-1-1.html

博主的還有利用buildroot製作檔案系統也值得一試呀。

另外製作好的ramdisk-uboot.img的檔案系統也是可以解包、編輯後,再打包成ramdisk-uboot.img的。