前言
一.什么是ubfis
UBIFS 是诺基亚工程师在塞格德大学的帮助下开发的一种新的闪存文件系统。 在某种程度上,UBIFS 可以被视为 JFFS2 文件系统的下一代。UBIFS工作在UBI卷之上,不能在MTD设备之上运行,也不能在block设备上运行。
UBIFS需要3个子系统参与:
1.MTD 子系统,它提供了访问闪存芯片的统一接口。 MTD 提供了 MTD 设备的概念(例如,/dev/mtd0),它基本上代表原始闪存;
2.UBI 子系统,这是一个用于闪存设备的磨损均衡和卷管理系统; UBI 在MTD设备之上工作并提供UBI卷的概念; UBI 卷是比 MTD 设备更高级别的实体,它们没有 MTD 设备存在的许多令人不快的问题(例如,磨损和坏块);
3.UBIFS 文件系统,它在 UBI卷之上工作。
二、2440支持ubifs文件系统
1.u-boot修改
首先在uboot 里面对nand flash进行分区设置,源文件在/include/configs/smdk2440.h
#define CONFIG_CMD_UBI
#define CONFIG_CMD_UBIFS
#define CONFIG_CMD_MTDPARTS
#define CONFIG_MTD_DEVICE
#define CONFIG_MTD_PARTITIONS
#define MTDIDS_DEFAULT "nand0=jz2440_nand.0"
#define MTDPARTS_DEFAULT "mtdparts=jz2440_nand.0:" \
"256k(uboot)ro," \
"128k(params)ro," \
"4m(kernel)," \
"30m(app)," \
"30m(data)," \
"-(rootfs)"
-指的是后面的空间全部留给rootfs
如果制作的ubi 映像使用了压缩格式,还需要把下面的选项选上:
#define CONFIG_BZIP2
#define CONFIG_LZO
#define CONFIG_LZMA
2.内核修改
2.1 修改分区表,修改smdk_default_nand_part[] 数组如下(arch/arm/mach-s3c24xx/common-smdk.c文件中),需要保持和u-boot里的分区表一致。
static struct mtd_partition smdk_default_nand_part[] = {
[0] = {
.name = "bootloader",
.size = SZ_256K,
.offset = 0,
},
[1] = {
.name = "params",
.offset = MTDPART_OFS_APPEND,
.size = SZ_128K,
},
[2] = {
.name = "kernel",
.offset = MTDPART_OFS_APPEND,
.size = SZ_4M,
},
[3] = {
.name = "app",
.offset = MTDPART_OFS_APPEND,
.size = SZ_1M * 30,
},
[4] = {
.name = "data",
.offset = MTDPART_OFS_APPEND,
.size = SZ_1M * 30,
},
[5] = {
.name = "rootfs",
.offset = MTDPART_OFS_APPEND,
.size = MTDPART_SIZ_FULL,
}
};
2.2 修改内核的配置,把initramfs的根目录设置为空,并且把内核mtd和ubi 文件系统相关的选项都选上。
make menuconfig
Device Drivers --->
<*> Memory Technology Device (MTD) support --->
<*> Enable UBI - Unsorted block images --->
--- Enable UBI - Unsorted block images
(4096) UBI wear-leveling threshold (NEW)
(1) Percentage of reserved eraseblocks for bad eraseblocks handling (NEW)
< > MTD devices emulation driver (gluebi) (NEW)
[ ] UBI debugging (NEW)
File systems --->
[*] Miscellaneous filesystems --->
<*> UBIFS file system support
[*] Extended attributes support
[*] Advanced compression options
[*] LZO compression support (NEW)
[*] ZLIB compression support (NEW)
[ ] Enable debugging support (NEW)
3.u-boot 启动参数设置和ubifs文件系统制作
3.1 设置 uboot的启动参数,ro是以只读方式挂载文件系统,如果不设置,默认采用读写方式挂载
set bootargs console=ttySAC0,115200 ubi.mtd=5 root=ubi0:rootfs rootfstype=ubifs
3.2 制作ubifs镜像文件
先用busybox制作文件系统所需要的材料,可以参考:
https://blog.csdn.net/mybelief321/article/details/10001927
然后执行
mkfs.ubifs -r ubifs -m 2048 -e 126KiB -c 1300 -o fs_ubifs.img //size = 126KiB * 1300 = 160M
ubinize -o fs_ubi.img -m 2048 -p 128KiB -s 512 ubinize.cfg
-m 最小 I/O 单元大小,一般是页大小, 是2K,2048
-r 是指定哪个目录,制作文件系统。
-e 是可擦除逻辑块大小,一般等于 (每块的页数 - 2)* 页大小 = 126K
-c 是最大可擦除逻辑块总数,这边总共是105
-o 生成的 ubifs.img
-p:物理擦除块大小
-m:页面大小
-s: 最小的硬件输入输出页面大小
ubinize.cfg文件的内容
[ubifs]
mode=ubi
image=fs_ubifs.img
vol_id=0
vol_size=160MiB //卷大小
vol_type=dynamic
vol_name=rootfs
vol_flags=autoresize
执行上面两条命令后,最终会生成fs_ubi.img镜像文件。
3.3 然后在u-boot里通过 tftp 烧录到rootfs分区里
查看分区信息
先将镜像文件通过tftp 下载到内存0x30000000里,然后再烧写到rootfs分区里去
tftp 0x30000000 fs_ubi.img
nand erase.part rootfs
nand write 0x30000000 rootfs $filesize
4.ubifs文件系统查看和验证
1.然后执行rest 重新启动系统后,查看有哪些mtd设备,以及分区名对应分区名字
/ # cat /proc/mtd
dev: size erasesize name
mtd0: 00040000 00020000 "bootloader"
mtd1: 00020000 00020000 "params"
mtd2: 00400000 00020000 "kernel"
mtd3: 01e00000 00020000 "app"
mtd4: 01e00000 00020000 "data"
mtd5: 0bfa0000 00020000 "rootfs"
/ #
df -h 查看挂载的分区大小
/ # df -h
Filesystem Size Used Available Use% Mounted on
ubi0:rootfs 148.5M 5.1M 143.4M 3% /
tmpfs 29.2M 0 29.2M 0% /tmp
tmpfs 29.2M 0 29.2M 0% /dev
/ #
/dev目录下默认就会生产ubi0设备和ubi0_0卷
/ # ls /dev/ubi*
/dev/ubi0 /dev/ubi0_0 /dev/ubi_ctrl
/ #
可以通过文件节点,查看ubi的信息
/ # ls /sys/class/ubi/ubi0/
avail_eraseblocks eraseblock_size mtd_num total_eraseblocks
bad_peb_count max_ec power ubi0_0
bgt_enabled max_vol_count reserved_for_bad uevent
dev min_io_size subsystem volumes_count
/ #
/ # ls /sys/class/ubi/ubi0_0/
alignment dev power type usable_eb_size
corrupted device reserved_ebs uevent
data_bytes name subsystem upd_marker
/ #
查看ubi分区信息 ubinfo -a
/ # ubinfo -a
UBI version: 1
Count of UBI devices: 1
UBI control device major/minor: 10:63
Present UBI devices: ubi0
ubi0
Volumes count: 1
Logical eraseblock size: 129024 bytes, 126.0 KiB
Total amount of logical eraseblocks: 1528 (197148672 bytes, 188.0 MiB)
Amount of available logical eraseblocks: 0 (0 bytes)
Maximum count of volumes 128
Count of bad physical eraseblocks: 5
Count of reserved physical eraseblocks: 15
Current maximum erase counter value: 1
Minimum input/output unit size: 2048 bytes
Character device major/minor: 253:0
Present volumes: 0
Volume ID: 0 (on ubi0)
Type: dynamic
Alignment: 1
Size: 1509 LEBs (194697216 bytes, 185.7 MiB)
State: OK
Name: rootfs
Character device major/minor: 253:1
/ #
2.app和data分区的烧写和验证
2.1用制作根文件系统的方法,制作app和data的镜像文件
//app镜像的制作
mkfs.ubifs -r app -m 2048 -e 129024 -c 243 -o app_ubifs.img
ubinize -o app_ubi.img -m 2048 -p 128KiB -s 512 app_ubinize.cfg
//app_ubinize.cfg文件的内容
[ubifs]
mode=ubi
image=app_ubifs.img
vol_id=0
vol_size=25MiB
vol_type=static
vol_name=app
vol_flags=autoresize
//data镜像的制作
mkfs.ubifs -r data -m 2048 -e 129024 -c 243 -o data_ubifs.img
ubinize -o data_ubi.img -m 2048 -p 128KiB -s 512 data_ubinize.cfg
//data_ubinize.cfg文件的内容
[ubifs]
mode=ubi
image=data_ubifs.img
vol_id=0
vol_size=25MiB
vol_type=dynamic
vol_name=data
vol_flags=autoresize
说明:
vol_id 表示volume的编号,一个ubi设备中可以有多个volume。(这种情况下,/dev下会出现 ubi0 和 ubi0_0)
vol_size 表示ubi0_0的大小,即volume0的大小
vol_type 表示volume0的类型,分为dynamic和static两种
vol_name 表示volume0的名称,在挂载ubi分区是会使用到,如在bootargs中的root=ubi0:rootfs
然后将app_ubi.img 和 data_ubi.img 用tftp下载到 app 和 data分区中,由于ubifs是建立再mtd和ubi之上的,rootfs是内核在启动的时候会根据uboot传入的bootargs参数去找mtd设备并创建ubi卷以及挂载,所以就会在dev目录下生成ubi0和ubi0_0节点。可以参考https://blog.csdn.net/oqqYuJi12345678/article/details/103515395 。而其他分区,则需要用ubi相关的命令去创建ubi卷和挂载。挂载操作如下:
一.app分区的挂载
1.与ubi建了连接
ubiattach -p /dev/mtd3
执行完后,就会多出ubi1
/ # ls /dev/ubi*
/dev/ubi0 /dev/ubi0_0 /dev/ubi1 /dev/ubi1_0 /dev/ubi_ctrl
/ #
2.挂载ubifs
mount -t ubifs /dev/ubi1_0 /app
二.data分区挂载
1.与ubi建了连接
ubiattach -p /dev/mtd4
2.挂载ubifs
mount -t ubifs /dev/ubi2_0 /data
三.查看分区挂载结果
/ # df -h
Filesystem Size Used Available Use% Mounted on
ubi0:rootfs 148.5M 5.1M 143.4M 3% /
tmpfs 29.2M 0 29.2M 0% /tmp
tmpfs 29.2M 0 29.2M 0% /dev
/dev/ubi1_0 25.2M 16.0K 25.2M 0% /app
/dev/ubi2_0 25.2M 24.0K 25.2M 0% /data
2.2 也可以通过ubi命令直接格式和写入镜像文件
首先可以使用ubiformat
工具将ubi镜像写入FLASH,使用ubiformat
工具的好处是它可以保留擦除计数器。
1.格式化,并写入镜像
ubiformat /dev/mtd3 -y -f app_ubi.img
2.写入完成后,首先需要进行attach
ubiattach -p /dev/mtd3
3.最后挂载ubifs
mount -t ubifs /dev/ubi2_0 /test
4.我们也可以挂载一个空的ubifs(不需要ubi镜像),操作步骤和上面差不多:
ubiformat /dev/mtd4
ubiattach -p /dev/mtd4
# Create an UBI volume - the created volume will be empty
ubimkvol -N data -s 25MiB /dev/ubi2
mount -t ubifs /dev/ubi2_0 /data
2.3 ubi常见挂载操作
ubi挂载操作:
(1)格式化ubi分区
ubiformat /dev/mtd* 格式化mtdblock*
(2)与ubi建了连接
ubiattach /dev/ubi_ctrl -m * mtdblock*与ubi建立连接
(3)创建volume
ubimkvol /dev/ubi* -s 100MiB -N my_ubi_vol 在ubi*上创建一个volume,名字为my_ubi_vol,大小为100MiB
(4)挂载ubifs
mount -t ubifs /dev/ubi_0 /mnt 挂载对应的/dev/ubi_0,而非/dev/mtd*
(5)卸载ubifs
umount /mnt
(6)断开ubi连接
ubidetach -m *
参考链接:
https://www.cnblogs.com/azan777/p/14789172.html
https://blog.csdn.net/qq_24835087/article/details/125336305