ubifs檔案系統的製作過程&&遇到的問題及解決方案總結—之三“UBIFS鏡像的製作&&燒寫”

來源:互聯網
上載者:User

一、移植環境

§主機:vmware-redhat5     

§開發板:mini2440--256MB nandflash

§kernel:2.6.29    
編譯器:arm-linux-gcc-4.3.2.tgz    

§uboot: u-boot-2008.10

 

二、製作ubifs鏡像

步驟1:將檔案系統製作成 ubifs鏡像檔案,需要使用mkfs.ubifs工具,該工具可以在網址:http://git.infradead.org/mtd-utils.git ,下載mtd-utils工具包源碼編譯後獲得。

在安裝mtd-utils之前首先在系統中安裝如下兩個軟體:

(因為原先我看一些博文給的地址都不可訪問,只好按名稱東下一個西下一個,編譯後都出錯沒法解決,特此提醒,後來暮然回首,在我的以前做過的檔案系統中找到了以下三個經編譯後可成功產生ubifs命令工具,(現放我資源裡,提供給大家)請放心下載)

 

a.安裝libacl,(我資源裡):http://download.csdn.net/detail/yx_l128125/4243336 

輸入命令:rpm  -ivh  libacl-2.2.23-5.4.e14.i386.rpm

b.安裝lzo-2.05, (我資源裡):http://download.csdn.net/detail/yx_l128125/4243343 

執行如下命令:

#    tar   zxvf   lzo-2.05.tar.gz

#    cd  lzo-2.05

#   ./configure

#   make

#   make install

c.安裝 mtd-utils.tar.gz  (我資源裡):http://download.csdn.net/detail/yx_l128125/4243333

#  tar  zxvf mtd-utils.tar.gz

# cd  mtd-utils

# ./configur

# make

# make install

 

步驟2.使用上述安裝命令後,mkfs.ubifs被安裝到了/usr/local/usr/sbin目錄下,可使用命令:export PATH=$PATH:/usr/local/usr/sbin將該路徑包含進環境變數,

然後使用命令:mkfs.ubifs  -m 2048  -c 2048 -e  126976  -r  /nfsroot/rootfs  -o   rootfs.bin ,將根檔案系統所在目錄rootfs製作為ubifs鏡像檔案rootfs.bin,將該檔案拷貝到/tftpboot/目錄下等待下載燒寫。(注意,你在哪執行這個命令,產生的.bin鏡像就在執行此命令的目前的目錄下產生)

【注意點:1.上面製作的ubifs鏡像檔案使用的命令參數是根據開發板所使用的NAND
Flash來確定的,我的NAND Flash容量是256MB,可以適應命令:mkfs.ubifs 
-h 來查看各個命令選項的意思,我這裡只簡單的介紹一下:

-r :要製作成鏡像的根檔案系統的路徑

-m:最小的I/O操作的大小(也就是NAND
FLASH的一個page的大小)

-e : 邏輯擦除塊的大小

-p :物理擦除塊的大小

-c :最大邏輯擦除塊的數量

-o :最終製作成的根檔案鏡像的檔案名稱

注意點:2.我原來用mkfs.ubifs  -m 2048  -c 2048 -e  126976 
-r  /nfsroot/rootfs  -o   rootfs.bin 製作成的鏡像,啟動核心時有錯,我曾經的出錯現象:http://www.arm9home.net/read.php?tid-19717.html  但是發現啟動核心時列印此出錯資訊:

UBI error: validate_ec_hdr: bad VID header offset 512, expected 2048
UBI error: validate_ec_hdr: bad EC header
UBI error: ubi_io_read_ec_hdr: validation failed for PEB 556
UBI error: ubi_init: cannot attach mtd3
UBI error: ubi_init: UBI error: cannot initialize UBI, error -22
後來找到了相近的解決方案:http://blog.chinaunix.net/space.php?uid=20632682&do=blog&id=82414  按照這篇文章最終核心成功的啟動了

我現在還不太懂為什麼“-e  126976”而不是大多數製作ubifs檔案系統寫的 “-e  129024 ”如果大家知道請通知我,不勝感激!】

 

步驟3.通過Jlink或者H-JTAG將u-boot.bin先燒進norflash,之後串連好串口線和網線,從norflash啟動開發板。

步驟4.設定好網路相關的環境變數,重點是先設定好ipaddr和serverip(因為下面用到tftp協議下載)之後用sav命令儲存環境變數;

之後用命令:tftp  31000000  u-boot.bin    
下載uboot.bin到記憶體位址31000000處。

步驟5:使用命令:nand erase 0 60000,將nand flash的前0x60000位元組空間擦除掉。在使用命令:nand write 31000000  
0   60000,將記憶體31000000處的u-boot.bin燒寫到nand flash中。

步驟6:使用命令:tftp  31000000 uImage     使用命令: nand erase 80000   300000,將nand flash的kernel分區擦除掉,在使用命令:nand
write  31000000 80000  300000 ,將記憶體31000000處的uImage燒寫到nand flash中。

步驟7:使用命令:mtdparts default   使用預設分區對Nand Flash進行分區。使用命令:nand  erase root ,擦除root分區。使用命令:ubi
part  root  2048  ,啟用root分區進行ubi格式化。最後使用命令:ubi   create  rootfs  ,建立rootfs分區。

【注意點:原來我用命令:  ubi     part  root 來啟用root分區進行ubi格式化,但是啟動核心時出現報錯資訊(看紅字部分),所以按這篇博文http://blog.chinaunix.net/space.php?uid=20632682&do=blog&id=82414改成:ubi
part  root  2048    之後就沒有報錯了

UBI error: validate_ec_hdr: bad VID header offset 512, expected 2048
UBI error: validate_ec_hdr: bad EC header
UBI error: ubi_io_read_ec_hdr: validation failed for PEB 556
UBI error: ubi_init: cannot attach mtd3
UBI error: ubi_init: UBI error: cannot initialize UBI, error -22

步驟8:使用命令:tftp 31000000  rootfs.bin 下載rootfs到預設記憶體位址31000000處,使用命令:ubi   write
31000000  rootfs   $filesize,將記憶體31000000處大小為$filesize的rootfs.bin通過ubi方式燒寫到nand
flash的對應分區中。

步驟9:
設定啟動變數: bootargs ,(bootargs是uboot傳給核心的參數,使用命令:set   bootargs  "ubi.mtd=3  root=ubi0:rootfs   rootfstype=ubifs  console=ttySAC0  init=/linuxrc   rw "

 設定啟動命令:bootcmd,(bootcmd
是uboot啟動的命令,輸入命令:set  bootcmd  " nand  read 31000000   80000  $filesize;  bootm  31000000" 最後使用sav命令儲存環境變數)

步驟10:關掉電源,讓開發板重新從nand  flash啟動,可以看到核心成功載入了我們只做的ubifs檔案系統,

[注意點1:set  bootcmd 
" nand  read 31000000   80000  $filesize;  bootm  31000000 " 中的"31000000"是啟動核心的地址,核心啟動時自動找到31000000這個地方來啟動kernel ;而前面用過的tftp  
31000000   xxx 中的"31000000"是記憶體中的地址(存放在記憶體位址中的資料掉電後就沒了)

注意點2:如果 bootm後面不跟地址,預設是到30008000處尋在核心啟動的;如果bootcmd環境變數寫成:set 
bootcmd  " nand  read 31000000   80000  $filesize;  bootm   最終這種現象:(因為它到30008000沒有找到核心,核心原來由80000的記憶體位址讀到了31000000地址處)

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.