Linux文件系统--UBI文件系统移植
文章摘要: 本文描述了UBI文件系统的移植与应用。
UBIFS (Unsorted Block Image File System)无排序区块镜像文件系统,由IBM与Nokia的工程师Thomas Gleixner,Artem Bityutskiy所设计,专门为了解决MTD(Memory Technology Device)设备所遇到的瓶颈,用于大容量固态存储设备。
1.添加MTD,NandFlash,UBI驱动支持(内核)
Device Drivers --->
<*> Memory Technology Device (MTD) support --->
[*] MTD partitioning support
<*> NAND Device Support --->
<*> NAND Flash support for Samsung S3C SoCs
<*> Enable UBI - Unsorted block images --->
注意事项:
如果在配置选项中找不到选项,可先修改.config文件中的CONFIG_MTD_UBI=y,再重make menuconfig即可;
如果不添加这里的选项,则后续的配置中找不到UBIFS选项;
2.添加UBI文件系统支持(内核)
File systems --->
[*]Miscellaneous filesystems --->
<*> UBIFS file system support
修改UBOOT添加UBI支持(未验证,主流模式是通过MTD工具)
1.制作根文件系统
#mkfs.ubifs -r root/ -m 2048 -e 129024 -c 2364 -o root-fs.img
2.擦除 root 分区
[uboot]#nand erase root
3.对 root 分区进行 ubi 格式化
[uboot]#ubi part root
4.将文件系统下载到内存
[uboot]#tftp 0x30008000 ubifs.img
5.将文件系统烧写到 rootfs 中
[uboot]#ubi.write 0x30008000 rootfs 0x339600
利用MTD工具,直接在开发板上配置UBI文件系统
1.首先交叉编译MTD工具,得到mkfs.ubifs工具;
2.使用nfs启动系统,执行以下命令挂载ubifs:
#flash_eraseall /dev/mtd2
#ubiattach /dev/ubi_ctrl -m 2
#ubimkvol /dev/ubi0 -N rootfs -s 50 MiB
#mount -t ubifs ubi0_0 /mnt/ubifs
或者
#mount -t ubifs ubi0:rootfs /mnt/ubifs
3.在开发板中执行命令,将文件系统复制至ubifs目录下即可(可以直接解压至此)。
注意事项:
flash_eraseall 擦除flash;
ubiattach 用来关联ubi;
ubimkvol 用来创建ubi文件系统,-N指定卷标的名称,挂载时候要用到;
如果只是挂载已存在的ubi文件系统,只需用ubiattach 和 mount即可(不用再擦除和创建文件系统了);
这里的/dev/mtd2和-m 2是根据分区表中配置的,
-s 50 MiB是指文件系统的大小,需要比分区小几M(用来保存ubifs信息);
-N rootfs是设置卷标(可任意),挂载时候可通过文件名来挂载ubi0:rootfs
这些参数需要调整的与实际相同
如果不能识别MiB参数,原因待查(没有空格??).
内核没有配置,选中如下选项即可
[*] Extended attributes support
[*] Advanced compression options
[*] LZO compression support
[*] ZLIB compression support
具体是哪个稍后再试(啥意思,时间长了我自己都忘记了)。
设置启动参数:
[uboot]#setenv bootargs 'ubi.mtd=2 root=ubi0:rootfs rootfstype=ubifs console=ttySAC0,115200 wvga calibration rw'
常见问题:
[root@localhost /]# mount -t ubifs ubi0_0 /mnt/ubifs
UBIFS error (pid 961): init_constants_early: too few LEBs (1), min. is 17
mount: mounting ubi0_0 on /mnt/ubifs failed: Invalid argument
此问题是由于说明分区太小了,不足于容纳UBI文件系统,经过检测发现是由于ubimkvol不认识MiB单位,造成了文件系统实际只有50Byte.