1. 程式人生 > >ubifs燒寫到nand flash中的幾種方法(非常好)

ubifs燒寫到nand flash中的幾種方法(非常好)

折騰了好幾天,突然柳暗花明,繼而思之,發現原來是出門就走錯了路,悲劇之餘,寫下此筆記,以省自己,警他人。

正題,關於UBIFS的介紹在此就不多說,詳見:

http://www.linux-mtd.infradead.org/faq/ubifs.html

http://www.linux-mtd.infradead.org/faq/ubi.html

1. UBIFS檔案系統映象的製作過程

1.1 所需的工具

製作UBIFS映象所需的工具有mkfs.ubifsubinize,可以通過以下方式獲取到此兩個工具:

1. 方法一:從官網通過git工具下載原始碼,編譯可得之,下載命令:

  1. git clone git:
    //git.infradead.org/mtd-utils.git

下載到原始碼後,編譯需要的的軟體包有:uuid-devlzouuib-dev可以通過apt-get直接安裝,lzo需要手動下載編譯,官方網站為:http://www.oberhumer.com/opensource/lzo/download/

2. 方法二:安裝mtd-utils工具包,安裝命令為:

  1. sudo apt-get install mtd-utils

不過此方法不保證安裝的工具可以正常使用(可能版本過低)。

1.2 UBIFS映象的製作

有了mkfs.ubifsubinize兩個工具後,就可以製作UBIFS映象了,具體步驟如下:

1. 使用mkfs.ubifs命令將某個資料夾製作為UBIFS映象,具體命令為:

  1. mkfs.ubifs -r /tmp/rootfs -m 2048 -e 126976 -c 992 -o ubifs.img

以上命令的含義為將/tmp/rootfs資料夾製作為UBIFS檔案系統映象,輸出的映象名為ubifs.img-m引數指定了最小的I/O操作的大小,也就是NAND FLASH一個page的大小,-e引數指定了邏輯擦除快的大小,-c指定了最大的邏輯塊號。

通過此命令製作的出的UBIFS檔案系統映象可在u-boot下使用ubi write命令燒寫到NAND FLASH上。

2. 使用ubinize

命令可將使用mkfs.ubifs命令製作的UBIFS檔案系統映象轉換成可直接在FLASH上燒寫的格式(帶有UBI檔案系統映象卷標):

  1. ubinize -o ubi.img -m 2048 -p 128KiB -s 512 -O 2048 ubinize.cfg

ubinize.cfg為一些配置引數:

  1. [ubifs]
  2. mode=ubi
  3. image=ubifs.img
  4. vol_id=0
  5. vol_size=100MiB
  6. vol_type=dynamic
  7. vol_alignment=1
  8. vol_name=rootfs
  9. vol_flags=autoresize

通過此命令生成的ubi.img可直接使用NAND FLASH的燒寫命令燒寫到FLASH上。

2. UBIFS檔案系統映象的燒寫

以下主要說以下將UBIFS映象燒寫到NAND FLASH中的三種方法。

2.1 u-boot下通過nand write命令燒寫

使ubinize命令製作的帶有卷標的UBIFS檔案系統映象可以直接使用nand flash的燒寫命令燒寫到NAND FLASH上,具體命令為:

  1. tftp 0xc1180000 ubi.img
  2. nand erase 0x400000 0x7c00000
  3. nand write.e 0xc1180000 0x400000 0x3660000

關於tftpnand 等命令使用格式請參見u-boothelp

2.2 u-boot下通過ubi write命令燒寫

使用mkfs.ubifs命令製作的UBIFS檔案系統映象可以使用命令ubi write燒寫到NAND FLASH上,具體命令為:

1. 設定FLASH的分割槽,此處以128M NAND FLASH為例,分為5個區:

  1. setenv mtdids nand0=nand0
  2. setenv mtdparts mtdparts=nand0:0x20000(u-boot env),0x20000(UBL),0x1c0000(u-boot),0x200000(kernel),0x7c00000(filesystem)

設定完後,使用mtdparts命令可以看到分割槽資訊:

  1. device nand0 <nand0>, # parts = 5
  2.  #: name size offset mask_flags
  3.  0: u-boot env 0x00020000 0x00000000 0
  4.  1: UBL 0x00020000 0x00020000 0
  5.  2: u-boot 0x001c0000 0x00040000 0
  6.  3: kernel 0x00200000 0x00200000 0
  7.  4: filesystem 0x07c00000 0x00400000 0
  8. active partition: nand0,0 - (u-boot env) 0x00020000 @ 0x00000000

2. 燒寫檔案系統:

  1. nand erase 0x400000 0x7c00000
  2. tftp 0xc1180000 ubifs.img
  3. ubi create rootfs
  4. ubi part nand filesystem
  5. ubi write 0xc1180000 rootfs 0x1d1000

通過以上命令,可以將檔案系統燒寫到第4個分割槽上,UBIFS檔案系統卷標為rootfs

3. 設定核心啟動引數:

  1. setenv bootargs 'console=ttyS2,115200n8 ubi.mtd=4,2048 root=ubi0:rootfs rootwait rootfstype=ubifs rw ip=off'

這樣就可以將燒寫的UBIFS檔案系統用作根分割槽了。

2.3 linux系統下燒寫

linux系統下,可以使用ubiformat工具燒寫使用ubinize工具製作的UBIFS檔案系統映像,此處以燒寫到NAND FLASH5個分割槽上為例,具體命令為:

1. 檢視FLASH的當前分割槽:

  1. # cat /proc/mtd
  2. dev: size erasesize name
  3. mtd0: 00020000 00020000 "u-boot env"
  4. mtd1: 00020000 00020000 "UBL"
  5. mtd2: 00080000 00020000 "u-boot"
  6. mtd3: 00200000 00020000 "kernel"
  7. mtd4: 07c00000 00020000 "filesystem"

2. 擦除要燒寫的分割槽:

  1. flash_eraseall /dev/mtd/mtd4

3. 燒寫UBIFS檔案系統:

  1.  ubiformat /dev/mtd/mtd4 -f /ubi.img

4. 掛載燒寫好的檔案系統:

  1. ubiattach /dev/ubi_ctrl -m 4 -O 2048
  2. mount -t ubifs ubi0:rootfs /mnt/
3.linux下建立UBIFS分割槽
  1. flash_eraseall /dev/mtd/mtd4
  2. ubiattach /dev/ubi_ctrl -m 4 -O 2048
  3. ubimkvol /dev/ubi0 -N rootfs -s 100MiB
  4. mount -t ubifs ubi0:rootfs /mnt/