ubi and ubifs應用手記

來源:互聯網
上載者:User

1.配置ubi and ubifs
in .config
  CONFIG_MTD_UBI=y
    CONFIG_UBIFS_FS=y
    CONFIG_CRYPTO_ALGAPI=y  CONFIG_CRYPTO_DEFLATE=y CONFIG_CRYPTO_LZO=y CONFIG_CRC16=y  CONFIG_LZO_COMPRESS=y CONFIG_LZO_DECOMPRESS=y
注意如果配置成模組(=m),則可以手動載入   

2.manual attach/detach ubi to mtd
  ./ubiattach /dev/ubi_ctrl -m mtdnumber
  ./ubidetaach /dev/ubi_ctrl -m mtdnumber

3.manual create ubi volume
  ./ubimkvol /dev/ubi_device_number -s size -N name
  like:
  ./ubimkvol /dev/ubi0 -s 300MiB -N ubifs1

4.mount ubifs volume
  mount -t ubifs ubi0:ubifs1 /tmp/ubifs1

 
5.ubi node and ubi_ctrl node
#cat /sys/class/misc/ubi_ctrl/dev
10:63
加入/dev下沒有ubi_ctrl,則我們可以sudo mknod ubi_ctrl c 10 63建立一個端點

#./ubiattach /dev/ubi_ctrl -m 6
#cat /sys/class/ubi/ubi0/dev
252:0
當我們attach ubi0 to mtd6後,如果/dev下沒有ubi0,則建立一個,sudo mknod ubi0 c 252 0


6.我們可以手動create volume,然後手動mount ubifs,也可以在PC上建立ubi.img(建立好volume,volume寫有資料)燒錄進mtd device

How to generate ubi image and write to mtd device
  ./mkfs.ubifs -r a205_rootdisk -m 4096 -e 516096 -c 40 -o ubifs.img  
  ./ubinize -o ubi.img -m 4096 -p 512KiB  ubinize.cfg     
  ./ubiformat -q /dev/mtd5 -f ubi.img  
 
 
  -m minimum I/O unit size
  -e  maximum logical erase block count
  -c maximum logical erase block count
  -x compression type - "lzo", "favor_lzo", "zlib" or "none" (default: "lzo")
  -p size of the physical eraseblock of the flash this UBI image is created for in bytes,
 
注意在PC上ubuntu使用mkfs.ubifs and ubinize,則我們要用普通的gcc來編譯它們,同時在ubuntu上裝上lzo庫sudo apt-get install liblzo2-dev
附錄
1).ubinize.cfg
[ubifs]
mode=ubi
image=ubifs.img
vol_id=0
vol_size=500MiB
vol_type=dynamic                     //if vol_type=static, then ubi volume is read only
vol_name=ubifs0
vol_flags=autoresize

這樣這樣當./ubiattach /dev/ubi_ctrl -m n後,就可以mount -t ubifs ubi0:ubifs0 /tmp

2)如果是想mount crafms image,只要
./ubinize -o ubi.img -m 4096 -p 512KiB  ubinize.cfg     
./ubiformat -q /dev/mtd5 -f ubi.img
ubinize.cfg
[ubifs]
mode=ubi
image=cramfs.img
vol_id=0
vol_size=500MiB
vol_type=dynamic                    
vol_name=cramfs
vol_flags=autoresize

這樣當./ubiattach /dev/ubi_ctrl -m n後就可以從cat /proc/mtd中看到一個ubi volume模擬的mtd device,我們只要mount這個mtd裝置對應的mtdblock就可以了(如mount -t cramfs /dev/mtdblock10 /tmp),注意,既然是燒錄了cramfs到ubi volume,則我們只能以cramfs方式mount這個volume,不能再以ubifs方式(mount -t ubifs ubi0:cramfs /tmp)mount這個volume.但如果我們用./ubiupdate /dev/ubi0_0 -t wipe out擦乾淨這個volume後,我們是可以用ubifs方式mount這個volume,但mount起來這個volume,進入mount的目錄,是什麼內容也沒有的。

3)三個volume的ubinize.cfg(注意[]中名字不能一樣,vol_id不能一樣,vol_name不能一樣,另vol_flags=auto_resize只能使用在一個volume上)
[ubifs1]
mode=ubi
image=ubifs.img
vol_id=0
vol_size=20MiB
vol_type=dynamic
vol_name=ubifs0
vol_alignment=1

[cramfs1]
mode=ubi
image=smallroot.cramfs
vol_id=1
vol_size=20MiB
vol_type=dynamic
vol_name=cramfs
vol_alignment=1

[cramfs2]
mode=ubi
image=qtroot.cramfs
vol_id=2
vol_size=50MiB
vol_type=dynamic
vol_name=cramfs2
vol_alignment=1
vol_flags=autoresize

這樣當使用./ubiformat寫入ubi.img後,則./ubiattach後,我們可以知道多了三個假的mtd device.
第一個可以用mount -t ubifs ubi0:ubifs0 /tmp/ubifs1
第二個可以用mount -t cramfs /dev/mtdblockn /tmp/cramfs1
第二個可以用mount -t cramfs /dev/mtdblockm /tmp/cramfs2

7. How to disable compression?
UBIFS compression may be disabled for whole file system during the image creation time using the "-x none" mkfs.ubifs option. However, if UBIFS compression is enabled, it may be disabled for individual files by cleaning the inode compression flag:

$ chattr -c /mnt/ubifs/file
in shell, or

ioctl(fd, FS_IOC_GETFLAGS, &flags);

flags &= ~FS_COMPR_FL;

ioctl(fd, FS_IOC_SETFLAGS, &flags);
in C programs. Similarly, if compression is disabled by default, you may enable if for individual inodes by setting the compression flag. Note, the code which uses the compression flag works fine on other Linux file-systems, because the flag is just ignored in this case.

It might be a good idea to disable compression for say, mp3 or jpeg files which would anyway not compress and UBIFS would just waste CPU time trying to compress them. The compression may also be disabled if one wants faster file I/O, because UBIFS would not need to compress or decompress the data on reads and write. However, I/O speed may actually become slower if compression is disabled. Indeed, in case of a very fast CPU and very slow flash compressed writes are faster, but this is usually not true for embedded systems.

8.mount cramfs on ubi volume
  ubi volume is fake mtd device.

# cat /proc/mtd
dev:    size   erasesize  name
mtd0: 180000 00080000 "Bootloader"
mtd1: 400000 00080000 "Kernel 0"
mtd2: 400000 00080000 "Kernel 1"
mtd3: 80000 00080000 "Boot up screen"
mtd4: a00000 00080000 "Rescue file system"
mtd5: 1400000 00080000 "Root file system"
mtd6: 3e800000 00080000 "Data area1"
mtd7: 3e800000 00080000 "Data area2"
mtd8: 6a400000 00080000 "Data area3"
mtd9: 16380000 00080000 "reserve"
 
 
#./ubiattach /dev/ubi_ctrl -m 6
#./ubimkvol /dev/ubi0 -s 300MiB -N ubifs1
# cat /proc/mtd
dev:    size   erasesize  name
mtd0: 180000 00080000 "Bootloader"
mtd1: 400000 00080000 "Kernel 0"
mtd2: 400000 00080000 "Kernel 1"
mtd3: 80000 00080000 "Boot up screen"
mtd4: a00000 00080000 "Rescue file system"
mtd5: 1400000 00080000 "Root file system"
mtd6: 3e800000 00080000 "Data area1"
mtd7: 3e800000 00080000 "Data area2"
mtd8: 6a400000 00080000 "Data area3"
mtd9: 16380000 00080000 "reserve"
mtd10: 12c3c000 0007e000 "ubifs1"

# cp cramfs.img /dev/mtdblock10
# mount -t cramfs /dev/mtdblock6 /tmp

After create fake mtd device(ubi volume), mount jffs2
#mount -t jffs2 /dev/mtdblock10 /mnt

9.ubiupdatevol /dev/ubi0_0 -t   //wipe out volume
  ubiupdatevol /dev/ubi0_0 fs.img  //write image to volume
 
  ./ubiupdatevol /dev/ubi0_0 ubifs.img          //之後we can mount ubifs: mount -t ubifs ubi0:ubifs0 /tmp來掛載這個ubifs
  ./ubiupdatevol /dev/ubi0_1 smallroot.cramfs  //之後我們就可以mount -t cramfs /dev/mtdblockn /tmp來掛載這個cramfs

10.掛載vfat
1)製作vfat.img(在PC上製作)
$ dd if=/dev/zero of=vfat.img bs=1M count=20
#losetup /dev/loop0 vfat.img
#mkfs.vfat /dev/loop0
注意這有一個warnning,但不用理會Loop device does not match a floppy size, using default hd params
#mount -t vfat /dev/loop0 vfat_mount_point
往vfat_mount_point目錄寫東西,或copy東西到這目錄
#umount vfat_mount_point
#losetup -d /dev/loop0

2)用ubinize打包成ubi.img,然後用ubiformat寫入mtd devie。方法二是用ubiupdatevol先wipe out volume,然後用ubiupdatevol將vfat.img
寫入volume.

但注意因為emulate mtd device是不支援寫操作的,所以我mount -t /dev/mtdblockn,這個mtdblockn是一個ubi volume emuluate的mtd device,
所以mount的vfat只可以讀,寫是無法儲存的。(測試中寫是能完成,ls也能看到,但sync後重啟unit,重新mount可以看到寫的資料是沒有儲存如vfat的)
 
 
11.ubifs(read/write/attach/mount)speed,
Wrtie speed -------------------speed=1.66M/s
# time dd if=/dev/zero of=/tmp/ubifs1/zero100M  bs=1M count=100;time sync
100+0 records in
100+0 records out
real    0m 59.13s
user    0m 0.00s
sys     0m 4.62s
real    0m 1.11s
user    0m 0.00s
sys     0m 0.74s

Read speed-----------------------speed=2.27M/s
# time cp ubifs1/zero100M /dev/null;time sync
s3c-nand: 1 bit(s) error detected, corrected successfully
s3c-nand: 1 bit(s) error detected, corrected successfully
s3c-nand: 1 bit(s) error detected, corrected successfully
real    0m 44.06s
user    0m 0.14s
sys     0m 42.67s
real    0m 0.06s
user    0m 0.00s
sys     0m 0.01s

12.配置ubifs as rootfs
in .config:
  CONFIG_CMDLINE="console=ttySAC0 ubi.mtd=5 root=ubi0:rootfs rootfstype=ubifs"
 
then if we had wrote root fs ubi image to mtd5, then we can boot up with ubi root fs.

13.遇到的rw filesystem change to read only filesystem
# ./ubiattach /dev/ubi_ctrl -m 6
UBI: attaching mtd6 to ubi0
UBI: physical eraseblock size:   524288 bytes (512 KiB)
UBI: logical eraseblock size:    516096 bytes
UBI: smallest flash I/O unit:    4096
UBI: VID header offset:          4096 (aligned 4096)
UBI: data offset:                8192
PEB 0 is bad
PEB 32 is bad
UBI: attached mtd6 to ubi0
UBI: MTD device name:            "Data area1"
UBI: MTD device size:            1000 MiB
UBI: number of good PEBs:        1998
UBI: number of bad PEBs:         2
UBI: max. allowed volumes:       128
UBI: wear-leveling threshold:    4096
UBI: number of internal volumes: 1
UBI: number of user volumes:     3
UBI: available PEBs:             0
UBI: total number of reserved PEBs: 1998
UBI: number of PEBs reserved for bad PEB handling: 19
UBI: max/mean erase counter: 7/0
UBI: background thread "ubi_bgt0d" started, PID 940

./ubiupdatevol /dev/ubi0_0 -t
UBI error: ubi_io_write: error -5 while writing 4096 bytes to PEB 21:4096, written 0 bytes
UBI warning: ubi_eba_write_leb: failed to write VID header to LEB 2147479551:0, PEB 21
UBI: try another PEB
UBI error: ubi_io_write: error -5 while writing 4096 bytes to PEB 12:4096, written 0 bytes
UBI warning: ubi_eba_write_leb: failed to write VID header to LEB 2147479551:0, PEB 12
UBI: try another PEB
UBI error: ubi_io_write: error -5 while writing 4096 bytes to PEB 1999:4096, written 0 bytes
UBI warning: ubi_eba_write_leb: failed to write VID header to LEB 2147479551:0, PEB 1999
UBI: try another PEB
UBI error: ubi_io_write: error -5 while writing 24576 bytes to PEB 1998:8192, written 0 bytes
UBI warning: ubi_eba_write_leb: failed to write 24576 bytes at offset 0 of LEB 2147479551:0, PEB 1998
UBI warning: ubi_ro_mode: switch to read-only mode
UBI error: ubi_io_write: read-only mode
UBI error: erase_worker: failed to erase PEB 7, error -30
UBI error: do_work: work failed with error code -30
UBI error: ubi_thread: ubi_bgt0d: work failed with error code -30
ubiupdatevol: error!: cannot truncate volume "/dev/ubi0_0"
              error 30 (Read-only file system)
UBI warning: vol_cdev_release: update of volume 0 not finished, volume is damaged

遇到此問題後,再flash_eraseall /dev/mt6或/dev/mtd7後,再寫image to /dev/mtd7 or /dev/mtd6都出錯
./ubiformat -q /dev/mtd6 -f ubi.img.20M_none
libmtd: error!: cannot write 32768 bytes to mtd6 (eraseblock 1, offset 0)
        error 5 (Input/output error)
ubiformat: error!: cannot write eraseblock 1
           error 5 (Input/output error)
          
遇到此問題後,我在uboot下執行
NAND erase: device 0 offset 0x600000, size 0x400000
ret:0 erase.addr:600000
Erasing at 0x600000 --  12% complete.ret:0 erase.addr:680000
Erasing at 0x680000 --  25% complete.ret:0 erase.addr:700000
Erasing at 0x700000 --  37% complete.ret:0 erase.addr:780000
Erasing at 0x780000 --  50% complete.ret:0 erase.addr:800000
Erasing at 0x800000 --  62% complete.ret:0 erase.addr:880000
Erasing at 0x880000 --  75% complete.ret:0 erase.addr:900000
Erasing at 0x900000 --  87% complete.ret:0 erase.addr:980000
Erasing at 0x980000 -- 100% complete.
OK
SMDK2450 # nand write c0000000 600000 300000

NAND write: device 0 offset 0x600000, size 0x300000
 0 bytes written: ERROR
 
 
 最後,我重新用筆尖fine tine nand flash的引腳(特別是/WE),終於救回了這片flash
 
 
 結論好像是此flash已經損壞,或者是引腳接觸不好----因為erase是ok的,而且nand read讀也是ok的,導致無法寫入PEB,會使得
 UBIFS變為唯讀。
 
 
 
14.mkfs.ubifs -c issus  (注意 fat directory is empty)
dannylo@fs1:~/cram2fs_tools$ ./mkfs.ubifs -r fat  -m 4096 -e 516096 -c 10 -o test.img
Error: too low max. count of LEBs, minimum is 17
dannylo@fs1:~/cram2fs_tools$ ./mkfs.ubifs -r fat  -m 4096 -e 516096 -c 19 -o test.img
Error: too many log LEBs, maximum is 2
dannylo@fs1:~/cram2fs_tools$ ./mkfs.ubifs -r fat  -m 4096 -e 516096 -c 21 -o test.img
Error: too many log LEBs, maximum is 4
dannylo@fs1:~/cram2fs_tools$ ./mkfs.ubifs -r fat  -m 4096 -e 516096 -c 22 -o test.img

結論即最小的ubifs.img為11M.注意對要燒錄進volume的cramfs or cram2fs format的image的size好像沒有要求。

15.ubi face bad block
我們在uboot中用nand markbad 試過mark bad block(一塊在mtd device的首塊,一塊在中間,一塊在最後),測試表面ubi在attach時的scan能認出
bad block nand skip bad block.同時用ubiformat燒寫ubi.img時也會自動跳過bad block.

聯繫我們

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