使用ubifs

来源:互联网 发布:java常见的异常 编辑:程序博客网 时间:2024/06/07 14:59


  我是通过NFS启动系统的,在系统启动后操作板子的NAND FLASH分区。
[root@zlg /]# more /proc/partitions
major minor  #blocks  name
  31     0       1536 mtdblock0
  31     1        256 mtdblock1
  31     2       4096 mtdblock2
  31     3      16384 mtdblock3
  31     4     239616 mtdblock4


  一共有5个mtd分区,我想将mtdblock4做为ubifs分区使用。
  先擦除FLASH 分区mtd4:
[root@zlg /]# flash_eraseall /dev/mtd4
  然后使用ubiattach:
[root@zlg /]# ubiattach /dev/ubi_ctrl -m 4
UBI: attaching mtd4 to ubi0
UBI: physical eraseblock size:   131072 bytes (128 KiB)
UBI: logical eraseblock size:    129024 bytes
UBI: smallest flash I/O unit:    2048
UBI: sub-page size:              512
UBI: VID header offset:          512 (aligned 512)
UBI: data offset:                2048
UBI: empty MTD device detected
UBI: create volume table (copy #1)
UBI: create volume table (copy #2)
UBI: attached mtd4 to ubi0
UBI: MTD device name:            "smartarm3250-rootfs"
UBI: MTD device size:            234 MiB
UBI: number of good PEBs:        1870
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:     0
UBI: available PEBs:             1848
UBI: total number of reserved PEBs: 22
UBI: number of PEBs reserved for bad PEB handling: 18
UBI: max/mean erase counter: 0/0
UBI: background thread "ubi_bgt0d" started, PID 609
UBI device number 0, total 1870 LEBs (241274880 bytes, 230.1 MiB), available 1848 LEBs (238436352 bytes, 227.4 MiB), LEB size 129024 bytes (126.0 KiB)
  提示available 1848 LEBs (238436352 bytes, 227.4 MiB),238436352字节可用,但是ubi工具只识别KiB MiB GiB,并且只识别整数,所以需要进行换算。
238436352 bytes = 232848KiB
  再使用ubimkvol在ubi设备上创建ubi卷: 
[root@zlg /]# ubimkvol /dev/ubi0 -N rootfs -s 232848KiB
Volume ID 0, size 1848 LEBs (238436352 bytes, 227.4 MiB), LEB size 129024 bytes (126.0 KiB),dynamic, name "rootfs", alignment 1
  提示创建ubi0成功,卷名为rootfs。


  最后挂载:
[root@zlg /]# mount -t ubifs ubi0_0 /mnt 或者
mount -t ubifs ubi0:rootfs /mnt
UBIFS: default file-system created
UBIFS: background thread "ubifs_bgt0_0" started, PID 619
UBIFS: mounted UBI device 0, volume 0, name "rootfs"
UBIFS: file system size: 237017088 bytes (231462 KiB, 226 MiB, 1837 LEBs)
UBIFS: journal size: 11870208 bytes (11592 KiB, 11 MiB, 92 LEBs)
UBIFS: default compressor: LZO
UBIFS: media format 4, latest format 4
  挂载上之后可用df查看:
[root@zlg /]# df
Filesystem           1k-blocks      Used Available Use% Mounted on
rootfs                39994768  26688892  11274260  70% /
/dev/root             39994768  26688892  11274260  70% /
tmpfs                    30636        24     30612   0% /dev
shm                      30636         0     30636   0% /dev/shm
df: /mnt/rwfs: No such file or directory
ubi0:rootfs             217224         0    212160   0% /mnt

 


  使用完毕可以卸载:
[root@zlg /]# umount /mnt/
UBIFS: un-mount UBI device 0, volume 0


  可以通过NFS启动系统,挂载ubi分区后将根文件系统解压到ubi中,然后设置参数,使用ubifs作为根文件系统,设置参数:

setenv bootargs 'root=ubi0:system rw ubi.mtd=4 rootfstype=ubifs ip=192.168.1.82:::::eth0:off  init=/linuxrc console=ttySAC0'




setenv bootargs 'root=/dev/nfs rw nfsroot=192.168.1.56:/icool ip=192.168.1.82:::::eth0:off  init=/linuxrc console=ttySAC0'
setenv bootcmd 'tftp 21000000 uImage_icool;bootm 21000000'
setenv ipaddr 192.168.1.82
setenv serverip 192.168.1.56




//ubi rootfs 
setenv bootargs 'root=ubi0:system rw ubi.mtd=4 rootfstype=ubifs ip=192.168.1.82:::::eth0:off  init=/linuxrc console=ttySAC0'


有了mkfs.ubifs和ubinize两个工具后,就可以制作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上。

OMAP3 DevKit8000 # mmcinit
    OMAP3 DevKit8000 # fatload mmc 0:1 81000000 ubi.img
    reading ubi.img
    12845056 bytes read
    OMAP3 DevKit8000 # nand unlock
    device 0 whole chip
    nand_unlock: start: 00000000, length: 268435456!
    NAND flash successfully unlocked
    OMAP3 DevKit8000 # nand ecc sw
    OMAP3 DevKit8000 # nand erase 680000 7980000
    NAND erase: device 0 offset 0x680000, size 0x7980000
    Erasing at 0x7fe0000 -- 100% complete.
    OK
    OMAP3 DevKit8000 # nand write.i 81000000 680000 $(filesize)
    NAND write: device 0 offset 0x680000, size 0xc40000
    Writing data at 0x12bf800 -- 100% complete.
    12845056 bytes written: OK

烧写过程和烧写内核镜像的过程一致,所以UBI文件系统应该不像yaffs文件系统那样用到了nand的OOB区域。

三、如何使用UBIFS

            1) 制作根文件系统,比如我们的根文件目录为rootfs
            2) 生成ubi烧写映像
                mkfs.ubifs -r rootfs -m 512 -e 15872 -c 7976 -o ubifs.img
            3) 通过UBOOT制作UBI分区
                目前最新的UBOOT已经支持UBI分区,进入UBOOT命令行 
1.mtdparts default       //加载默认分区表
复制代码
我的分区表配置如下 
1.#define MTDPARTS_DEFAULT "mtdparts=nandflash0:320k(bootloader)," /
2.           "64k(params)," /
3.           "3m(kernel)," /
4.           "-(root)"
复制代码
1.flash erase root      //格式化分区,root为文件系统分区
2.ubi part root          //root分区作为ubi文件系统
3.ubi create  rootfs    //创建UBI volume
4.ubi write  0x30008000 rootfs  0x2f8000
复制代码
现在UBI分区已经创建完毕,我们可以通过tftp等手段把ubifs.img下载到RAM中, 0x30008000 为下载的地址,  0x2f8000 为 长度,文件系统烧写完成,修改uboot中的内核启动参数为 
1.#define CONFIG_BOOTARGS  "ubi.mtd=2 root=ubi0:rootfs rootfstype=ubifs console=ttySAC0 mem=64M init=/linuxrc"
复制代码
内核的下载没有什么变化,不在叙述,OK,工作到此结束,目前ubi文件已经移植到P1310上,工作正常。由于采用了压缩方式,UBI文件系统占用的空间比yaffs要小,而且避免了nand flash中OOB数据的操作,使得移植变得简单,值得推荐.
   
转 http://www.study-bbs.com/thread-30290-1-1.html

/***********************************************************
 * Command definition
 ***********************************************************/
#if 0
#define CONFIG_USB_OHCI
#define CONFIG_USB_STORAGE
#define CONFIG_DOS_PARTITION
#define CONFIG_SUPPORT_VFAT
#define LITTLEENDIAN
#define CONFIG_CMD_USB
#define CONFIG_CMD_FAT
#define CONFIG_SYS_ICACHE_OFF
#define CONFIG_SYS_DCACHE_OFF
#define CONFIG_SYS_ARM_CACHE_WRITETHROUGH


#endif 


#define CONFIG_CMD_UBI
#define CONFIG_CMD_UBIFS
#define CONFIG_CMD_MTDPARTS
#define CONFIG_MTD_DEVICE
#define CONFIG_MTD_PARTITIONS


#define MTDIDS_DEFAULT "nand0=s5pv210-nand"/* temporary */
#define MTDPARTS_DEFAULT "mtdparts=s5pv210-nand:1m(bootloader),5m(recovery),5m(kernel),5m(ramdisk),-(ubidata)"/* temporary */ 

原创粉丝点击