ubi and ubifs应用手记

    技术2022-05-20  58

    1.配置ubi and ubifsin .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/dev10:63加入/dev下没有ubi_ctrl,则我们可以sudo mknod ubi_ctrl c 10 63创建一个端点

    #./ubiattach /dev/ubi_ctrl -m 6#cat /sys/class/ubi/ubi0/dev252:0当我们attach ubi0 to mtd6后,如果/dev下没有ubi0,则创建一个,sudo mknod ubi0 c 252 0

    6.我们可以手动create volume,然后手动mount ubifs,也可以在PC上创建ubi.img(创建好volume,volume写有数据)烧录进mtd deviceHow 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=ubiimage=ubifs.imgvol_id=0vol_size=500MiBvol_type=dynamic                     //if vol_type=static, then ubi volume is read onlyvol_name=ubifs0vol_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.imgubinize.cfg[ubifs]mode=ubiimage=cramfs.imgvol_id=0vol_size=500MiBvol_type=dynamic                    vol_name=cramfsvol_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=ubiimage=ubifs.imgvol_id=0vol_size=20MiBvol_type=dynamicvol_name=ubifs0vol_alignment=1

    [cramfs1]mode=ubiimage=smallroot.cramfsvol_id=1vol_size=20MiBvol_type=dynamicvol_name=cramfsvol_alignment=1

    [cramfs2]mode=ubiimage=qtroot.cramfsvol_id=2vol_size=50MiBvol_type=dynamicvol_name=cramfs2vol_alignment=1vol_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/filein 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/mtddev:    size   erasesize  namemtd0: 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/mtddev:    size   erasesize  namemtd0: 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.挂载vfat1)制作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 sync100+0 records in100+0 records outreal    0m 59.13suser    0m 0.00ssys     0m 4.62sreal    0m 1.11suser    0m 0.00ssys     0m 0.74s

    Read speed-----------------------speed=2.27M/s# time cp ubifs1/zero100M /dev/null;time syncs3c-nand: 1 bit(s) error detected, corrected successfullys3c-nand: 1 bit(s) error detected, corrected successfullys3c-nand: 1 bit(s) error detected, corrected successfullyreal    0m 44.06suser    0m 0.14ssys     0m 42.67sreal    0m 0.06suser    0m 0.00ssys     0m 0.01s

    12.配置ubifs as rootfsin .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 6UBI: attaching mtd6 to ubi0UBI: physical eraseblock size:   524288 bytes (512 KiB)UBI: logical eraseblock size:    516096 bytesUBI: smallest flash I/O unit:    4096UBI: VID header offset:          4096 (aligned 4096)UBI: data offset:                8192PEB 0 is badPEB 32 is badUBI: attached mtd6 to ubi0UBI: MTD device name:            "Data area1"UBI: MTD device size:            1000 MiBUBI: number of good PEBs:        1998UBI: number of bad PEBs:         2UBI: max. allowed volumes:       128UBI: wear-leveling threshold:    4096UBI: number of internal volumes: 1UBI: number of user volumes:     3UBI: available PEBs:             0UBI: total number of reserved PEBs: 1998UBI: number of PEBs reserved for bad PEB handling: 19UBI: max/mean erase counter: 7/0UBI: background thread "ubi_bgt0d" started, PID 940

    ./ubiupdatevol /dev/ubi0_0 -tUBI error: ubi_io_write: error -5 while writing 4096 bytes to PEB 21:4096, written 0 bytesUBI warning: ubi_eba_write_leb: failed to write VID header to LEB 2147479551:0, PEB 21UBI: try another PEBUBI error: ubi_io_write: error -5 while writing 4096 bytes to PEB 12:4096, written 0 bytesUBI warning: ubi_eba_write_leb: failed to write VID header to LEB 2147479551:0, PEB 12UBI: try another PEBUBI error: ubi_io_write: error -5 while writing 4096 bytes to PEB 1999:4096, written 0 bytesUBI warning: ubi_eba_write_leb: failed to write VID header to LEB 2147479551:0, PEB 1999UBI: try another PEBUBI error: ubi_io_write: error -5 while writing 24576 bytes to PEB 1998:8192, written 0 bytesUBI warning: ubi_eba_write_leb: failed to write 24576 bytes at offset 0 of LEB 2147479551:0, PEB 1998UBI warning: ubi_ro_mode: switch to read-only modeUBI error: ubi_io_write: read-only modeUBI error: erase_worker: failed to erase PEB 7, error -30UBI error: do_work: work failed with error code -30UBI error: ubi_thread: ubi_bgt0d: work failed with error code -30ubiupdatevol: 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_nonelibmtd: 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 0x400000ret:0 erase.addr:600000Erasing at 0x600000 --  12% complete.ret:0 erase.addr:680000Erasing at 0x680000 --  25% complete.ret:0 erase.addr:700000Erasing at 0x700000 --  37% complete.ret:0 erase.addr:780000Erasing at 0x780000 --  50% complete.ret:0 erase.addr:800000Erasing at 0x800000 --  62% complete.ret:0 erase.addr:880000Erasing at 0x880000 --  75% complete.ret:0 erase.addr:900000Erasing at 0x900000 --  87% complete.ret:0 erase.addr:980000Erasing at 0x980000 -- 100% complete.OKSMDK2450 # 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.imgError: too low max. count of LEBs, minimum is 17dannylo@fs1:~/cram2fs_tools$ ./mkfs.ubifs -r fat  -m 4096 -e 516096 -c 19 -o test.imgError: too many log LEBs, maximum is 2dannylo@fs1:~/cram2fs_tools$ ./mkfs.ubifs -r fat  -m 4096 -e 516096 -c 21 -o test.imgError: too many log LEBs, maximum is 4dannylo@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.


    最新回复(0)