使用平台:君正x2600 ubi文件系统使用问题
1.ubi文件和ubifs文件
2 方法:mkfs.ubifs和ubinize两步打包ubi文件系统
mkfs.ubifs工具
mkfs.ubifs命令用于制作ubifs文件系统,命令示例如下:mkfs.ubifs -x lzo -m 2KiB -e 124KiB -c 360 -o ./tmp_ubifs.img -d ./rootfs
1 参数含义:-x:指定压缩算法
-m:最小读写单位,也就是页的大小
-e:逻辑擦除块的大小,注:逻辑擦除块不等同于物理擦除块,常用计算方法是:(一个擦除块的页数 - 2)* 页大小,在这里即:(64 - 2) * 2048 = 124KiB
-c:最大的逻辑擦除块个数,这个需要根据分区大小进行计算,常用计算方法是:总块数- 2(volume table) - 1(Wear-leveling) - 1(atomic LEB change) - ?(bad blocks) ,当前的系统中,文件系统分区的大小为:0x3200000 / (64 * 2048) = 400,也就是400个块,如果我们为坏块保留36个块,那么该值即为:400 – 2 -1 -1 -36 = 360
-o:指定输出文件的文件名
-d:指定根文件系统目录
ubinize工具
ubinize命令:ubinize -o rootfs_ubifs.bin -m 2KiB -p 128KiB -s 2KiB ./ubinize_config
参数含义:-o rootfs_ubifs.bin:输出的BIN文件名称,后继U-BOOT烧录(nand wirte),应用升级,烧录器烧片,均使用的是此文件
-m 2KiB:最小读写单位,也就是页的大小
-p 128KiB:物理擦除块的大小
-s 2KiB:SUB PAGE的大小
./ubinize_config:上面的配置文件
ubinize配置文件的内容如下:ubinize.cfg是ubiniz工具制作ubi镜像需要指定的配置文件
[ubifs]
mode=ubi
image=rootfs.ubifs # mkfs.ubi生成的源镜像
vol_id=0 #卷序号
vol_size=70MiB #卷大小
vol_type=dynamic #动态卷
vol_name=rootfs #卷名
vol_flags=autoresize1) [rootfs]:为INI文件SECTION名字,没有特别含义
2) mode=ubi,具体含义未知
3) image=./tmp_ubifs.img:使用mkfs.ubifs生成的镜像文件的路径
4) vol_id=0:卷ID,注意其必须与bootargs参数对应上
5) vol_size=45711360:卷大小,其计算方式是:最大逻辑擦除块个数 * 逻辑块大小,这两个参数就是mkfs.ubifs的参数,360 * 124KiB = 45711360
6) vol_name=rootfs:卷名字,注意其必须与bootargs参数对应上
7) vol_type=dynamic,具体含义未知
8) vol_alignment=1,具体含义未知
mkfs.ubifs和ubinize两个工具 制作UBIFS镜像 ,具体步骤如下:
我的GD5F2GM7UEYIGR的参数:页面大小:2KB。容量:2Gb(或256MB)
- 1.使用mkfs.ubifs命令将某个文件夹(目前我是将buildroot下output/target文件夹),制作为UBIFS镜像,具体命令为:
mkfs.ubifs -d ./target -e 0x1f800 -c 2048 -m 0x800 -x lzo -o rootfs.ubifs
修正:
mkfs.ubifs -r ./target -o rootfs.ubifs -m 2048 -e 126976 -c 560
- 2.新建和设置ubinize.cfg文件内容:
[ubifs]
mode=ubi
image=rootfs.ubifsvol_id=0
vol_size=70MiB
vol_type=dynamic
vol_name=rootfs
vol_flags=autoresize
- 3.使用ubinize命令可将使用mkfs.ubifs命令制作的UBIFS文件系统镜像(rootfs.ubifs)转换成可直接在FLASH上烧写的格式(带有UBI文件系统镜像卷标)
ubinize -o rootfs.ubi -m 0x800 -p 0x20000 -s 512 ubinize.cfg
修正:
ubinize -o rootfs.ubi -m 2048 -p 128KiB ubinize.cfg
- 4.生成的rootfs.ubi可直接使用NAND FLASH的烧写命令烧写到FLASH上。
经过上述两个步骤,可以成功的编译出ubi文件系统,并烧录成功!
烧录的时候,在烧录conler.exe软件,要正确的配置
其他问题记录:在使用的时候,出现了两个问题,导致无法挂载。
3.错误解决1:
Loading compiled-in X.509 certificates
[ 1.754057] Speaker enable pin(145) request ok
[ 1.758696] ingenic-x2660-halley sound_x2600e_cdc: snd_soc_register_card failed -517
[ 1.767023] Speaker enable pin(145) request ok
[ 1.771690] ingenic-x2660-halley sound_x2600e_cdc: snd_soc_register_card failed -517注册声卡时失败,错误码为
-517
,即EINVAL
(无效的参数)。这通常意味着传递给函数的参数不正确,或者函数无法执行所请求的操作
[ 1.780066] ubi0: attaching mtd2
[ 1.783665] ubi0 error: validate_ec_hdr: bad VID header offset 512, expected 2048
[ 1.791437] ubi0 error: validate_ec_hdr: bad EC header函数检测到VID(Volume Identifier)头部偏移不正确(实际为512,但期望为2048),并且EC(Erase Counter)头部也是坏的。这通常意味着UBI卷的数据可能已损坏,或者UBI卷在格式化或创建时发生了错误。
[ 1.796747] Erase counter header dump:
[ 1.800658] magic 0x55424923
[ 1.804528] version 1
[ 1.807602] ec 0
[ 1.810678] vid_hdr_offset 512
[ 1.813918] data_offset 2048
[ 1.817246] image_seq 839296234
[ 1.821066] hdr_crc 0x6411217b
[ 1.824934] erase counter header hexdump:
[ 1.829095] CPU: 0 PID: 1 Comm: swapper/0 Not tainted 5.10.186 #22
[ 1.835474] Stack : 80ad0000 00000000 00000000 00000000 809f5200 8184e800 00000000 80098ad0
[ 1.844127] 00000000 00000000 00000000 f4a4a03a 80ce1c54 00000001 80ce1be8 f4a4a03a
[ 1.852776] 00000000 00000000 809c7100 80ce1aa0 000000f3 80ce1ab4 00000000 00002008
[ 1.861421] 316afcf7 80ce1ab3 ffffffff 00000030 80ac0000 00000000 00000000 809c0000
[ 1.870063] 00000000 811a5000 55424923 8184e800 00000000 00000000 00000000 80b70000
[ 1.878706] ...
[ 1.881235] Call Trace:
[ 1.883766] [<8001f558>] show_stack+0x94/0x12c
[ 1.888364] [<808ac548>] dump_stack+0xac/0xe8
[ 1.892868] [<80555ed8>] validate_ec_hdr+0xd8/0x12c
[ 1.897909] [<80556e90>] ubi_io_read_ec_hdr+0x32c/0x3a0
[ 1.903308] [<8055db84>] ubi_attach+0x250/0x17fc
[ 1.908078] [<8054efc8>] ubi_attach_mtd_dev+0x708/0xee4
[ 1.913476] [<80b2f6bc>] ubi_init+0x1c0/0x274
[ 1.917976] [<800106d8>] do_one_initcall+0x50/0x1e8
[ 1.923017] [<80b14f38>] kernel_init_freeable+0x224/0x2b4
[ 1.928596] [<808af994>] kernel_init+0x14/0x104
[ 1.933284] [<
解决修正: mkfs.ubifs -d ./target -e 0x1f800 -c 2048 -m 0x800 -x lzo -o rootfs.ubifs
修正:
mkfs.ubifs -r ./target -o rootfs.ubifs -m 2048 -e 126976 -c 560
ubinize -o rootfs.ubi -m 0x800 -p 0x20000 -s 512 ubinize.cfg
修正:
ubinize -o rootfs.ubi -m 2048 -p 128KiB ubinize.cfg
4 错误解决:
[ 1.790175] ubi0: attaching mtd2 系统尝试附加MTD设备mtd2到UBI设备ubi0。
[ 1.950564] ubi0: scanning is finished UBI扫描mtd2的过程已完成
[ 1.958117] ubi0 error: vtbl_check: too large reserved_pebs 826, good PEBs 768[ 解释:UBI在检查卷表时遇到错误。具体来说,预留的物理擦除块(PEBs)数量太大(826个),但是可用的好的PEBs数量只有768个。这导致卷表检查失败,错误码为9。]
[ 1.965617] ubi0 error: vtbl_check: volume table check failed: record 0, error 9
[ 1.973271] Volume table record 0 dump:
[ 1.977231] reserved_pebs 826
[ 1.980581] alignment 1
[ 1.983735] data_pad 0
[ 1.986881] vol_type 1
[ 1.990039] upd_marker 0
[ 1.993186] name_len 6
[ 1.996331] name rootfs
[ 1.999928] crc 0x39a49ffc
[ 2.004076] ubi0 error: ubi_attach_mtd_dev: failed to attach mtd2, error -22
[ 2.011407] UBI error: cannot attach mtd2
由于前面的卷表检查错误,UBI无法附加mtd2设备,错误码为-22(EINVAL即无效的参数)
[ 2.015557] ubi0: attaching mtd3
[ 2.222953] ubi0: scanning is finished
[ 2.232183] ubi0: attached mtd3 (name "userdata", size 151 MiB)
[ 2.238319] ubi0: PEB size: 131072 bytes (128 KiB), LEB size: 126976 bytes
[ 2.245451] ubi0: min./max. I/O unit sizes: 2048/2048, sub-page size 2048
[ 2.252497] ubi0: VID header offset: 2048 (aligned 2048), data offset: 4096
[ 2.259693] ubi0: good PEBs: 1208, bad PEBs: 0, corrupted PEBs: 0
[ 2.266005] ubi0: user volume: 0, internal volumes: 1, max. volumes count: 128
[ 2.273482] ubi0: max/mean erase counter: 1/1, WL threshold: 4096, image sequence number: 858485108
[ 2.282843] ubi0: available PEBs: 1164, total reserved PEBs: 44, PEBs reserved for bad PEB handling: 40
[ 2.292576] ubi0: background thread "ubi_bgt0d" started, PID 828
[ 2.299183] input: gpio_keys as /devices/platform/gpio_keys/input/input0
[ 2.306809] Speaker enable pin(145) request ok
[ 2.311546] ingenic-x2660-halley sound_x2600e_cdc: snd_soc_register_card failed -517
[ 2.320002] ALSA device list:
[ 2.323169] No soundcards found.
[ 2.327008] VFS: Cannot open root device "ubi0:rootfs" or unknown-block(0,0): error -19
[ 2.335329] Please append a correct "root=" boot option; here are the available partitions:
[ 2.344017] 0100
修正:vol_size=70MiB ,一开始给的200MiB、100MiB,过大,导致nandflash没有剩余空间了!