UBI 文件系统¶
简介¶
UBIFS 文件系统代表 UBI 文件系统。UBI 代表 “Unsorted Block Images”(未排序块镜像)。UBIFS 是一种闪存文件系统,这意味着它被设计为与闪存设备一起工作。重要的是要理解,UBIFS 与 Linux 中任何传统的文件系统(如 Ext2、XFS、JFS 等)完全不同。UBIFS 代表着一个独立的文件系统类别,它与 MTD 设备而不是块设备一起工作。此类的另一个 Linux 文件系统是 JFFS2。
为了更清楚地说明,这里有一个 MTD 设备和块设备的简短比较。
- 1 MTD 设备代表闪存设备,它们由大小相当大的擦除块组成,通常约为 128KiB。块设备由小块组成,通常为 512 字节。
2 MTD 设备支持 3 个主要操作 - 从擦除块内的某个偏移量读取,写入到擦除块内的某个偏移量,以及擦除整个擦除块。块设备支持 2 个主要操作 - 读取整个块和写入整个块。
- 3 必须擦除整个擦除块,然后才能重新写入其内容。块可以被简单地重新写入。
4 擦除块在一定数量的擦除周期后会磨损 - 对于 SLC NAND 和 NOR 闪存,通常为 100K-1G,对于 MLC NAND 闪存,通常为 1K-10K。块没有磨损特性。
- 5 擦除块可能会变坏(仅在 NAND 闪存上),软件应该处理这个问题。硬盘上的块通常不会变坏,因为硬件具有替换坏块的机制,至少在现代 LBA 磁盘中是这样。
应该很明显为什么 UBIFS 与传统文件系统非常不同。
- 4. 擦除块在经过一定数量的擦除周期后会磨损 -
通常对于 SLC NAND 和 NOR 闪存,磨损周期为 10 万到 10 亿次,对于 MLC NAND 闪存,磨损周期为 1 千到 1 万次。块不具有磨损属性。
- 5. 擦除块可能会变坏(仅在 NAND 闪存上),软件应该
处理这种情况。 硬盘驱动器上的块通常不会变坏,因为硬件有机制来替换坏块,至少在现代 LBA 磁盘中是这样。
UBIFS 在 UBI 之上工作。UBI 是一个独立的软件层,可以在 drivers/mtd/ubi 中找到。UBI 基本上是一个卷管理和磨损均衡层。它提供所谓的 UBI 卷,这是一个比 MTD 设备更高层次的抽象。UBI 设备的编程模型与 MTD 设备非常相似 - 它们仍然由大的擦除块组成,它们具有读取/写入/擦除操作,但 UBI 设备没有磨损和坏块的限制(上述列表中的第 4 项和第 5 项)。
从某种意义上说,UBIFS 是下一代的 JFFS2 文件系统,但它与 JFFS2 非常不同且不兼容。以下是主要区别。
JFFS2 在 MTD 设备之上工作,UBIFS 依赖于 UBI 并在 UBI 卷之上工作。
JFFS2 没有在介质上的索引,并且必须在挂载时构建它,这需要完整的介质扫描。UBIFS 在闪存介质上维护 FS 索引信息,不需要完整的介质扫描,因此它的挂载速度比 JFFS2 快很多倍。
JFFS2 是一个写透文件系统,而 UBIFS 支持写回,这使得 UBIFS 在写入时快得多。
与 JFFS2 类似,UBIFS 支持即时压缩,这使得可以将大量数据放入闪存。
与 JFFS2 类似,UBIFS 可以容忍不干净的重启和断电。它不需要像 fsck.ext2 这样的东西。UBIFS 会自动重放其日志并从崩溃中恢复,确保闪存上的数据结构是一致的。
UBIFS 以对数方式缩放(它使用的大多数数据结构都是树),因此挂载时间和内存消耗不线性依赖于闪存大小,就像 JFFS2 的情况一样。这是因为 UBIFS 在闪存介质上维护 FS 索引。但是,UBIFS 依赖于 UBI,而 UBI 以线性方式缩放。因此,总体而言,UBI/UBIFS 堆栈以线性方式缩放。然而,UBI/UBIFS 的缩放效果明显优于 JFFS2。
UBIFS 的作者认为,可以开发 UBI2,它也可以以对数方式缩放。UBI2 将支持与 UBI 相同的 API,但它将与 UBI 二进制不兼容。因此,UBIFS 不需要更改即可使用 UBI2。
挂载选项¶
(*) == 默认。
bulk_read
一次读取更多内容,以利用顺序读取速度更快的闪存介质 |
no_bulk_read (*) |
不批量读取 |
no_chk_data_crc (*) |
跳过对数据节点上的 CRC 的检查,以提高读取性能。仅当闪存介质高度可靠时才使用此选项。此选项的效果是文件内容损坏可能会被忽略。 |
chk_data_crc |
不要跳过对数据节点上的 CRC 的检查 |
compr=none |
覆盖默认的压缩器并将其设置为 “none” |
compr=lzo |
覆盖默认的压缩器并将其设置为 “lzo” |
compr=zlib |
覆盖默认的压缩器并将其设置为 “zlib” |
auth_key= |
指定用于验证文件系统的密钥。传递此选项会使身份验证成为强制性的。传递的密钥必须存在于内核密钥环中,并且必须是 ‘logon’ 类型 |
auth_hash_name= |
用于身份验证的哈希算法。用于哈希和创建 HMAC。典型值包括“sha256”或“sha512” |
快速使用说明¶ |
要挂载的 UBI 卷使用 “ubiX_Y” 或 “ubiX:NAME” 语法指定,其中 “X” 是 UBI 设备号,“Y” 是 UBI 卷号,“NAME” 是 UBI 卷名。
将 UBI 设备 0 上的卷 0 挂载到 /mnt/ubifs
将 UBI 设备 0 的 “rootfs” 卷挂载到 /mnt/ubifs(“rootfs” 是卷名)
$ mount -t ubifs ubi0_0 /mnt/ubifs
以下是将 mtd0 附加到 UBI 并挂载卷 “rootfs” 的内核引导参数示例:ubi.mtd=0 root=ubi0:rootfs rootfstype=ubifs
$ mount -t ubifs ubi0:rootfs /mnt/ubifs
参考文献¶
MTD 网站上的 UBIFS 文档和 FAQ/HOWTO
http://www.linux-mtd.infradead.org/doc/ubifs.html