uboot支持ubi和ubifs遇到的问题
2017-01-20 18:08
337 查看
uboot version 2012.10
nand type:Micron MT29F16G08CBACA
一、执行ubi part kernel时报错-12
Creating 1 MTD partitions on "nand0":
0x000004200000-0x00001e200000 : "mtd=3"
UBI: attaching mtd1 to ubi0
UBI warning: io_init: EC and VID headers are in thesame minimal I/O unit, switch to read-only mode
UBI: physical eraseblock size: 1048576 bytes (1024KiB)
UBI: logical eraseblock size: 1044480 bytes
UBI: smallest flash I/O unit: 4096
UBI: VID header offset: 2048 (aligned 0)
UBI: data offset: 4096
UBI error: ubi_init: cannot attach mtd1
UBIerror: ubi_init: UBI error: cannot initialize UBI, error -12
UBI init error 12
Error, no UBI device/partition selected!
网上一般都是说将CONFIG_SYS_MALLOC_LEN,增大到1M(1024*1024)。但我修改后同样报错
找到源码中报错的地方(/drivers/mtd/ubi/build.cubi_attach_mtd_dev函数)
err = -ENOMEM;
ubi->peb_buf1 = vmalloc(ubi->peb_size);
if (!ubi->peb_buf1)
goto out_free;
ubi->peb_buf2 = vmalloc(ubi->peb_size);
if (!ubi->peb_buf2)
goto out_free;
malloc大小为ubi->peb_size,经过查找最终是在(/driver/mtd/nand/nand_base.cnand_get_flash_type函数)
/* Calc blocksize */
mtd->erasesize = (128 * 1024) <<
(((extid >> 1) & 0x04) | (extid &0x03));
实际该值就是物理擦出块大小,通过芯片ID获取芯片类型,查看手册
该值为1024KB,那么问题就来了,CONFIG_SYS_MALLOC_LEN设置成1M,现在一次malloc的大小也是1M,连续两次malloc就会报错了,所以当nand芯片的块大小大于等于1M时,CONFIG_SYS_MALLOC_LEN就应该相应增大,我设置成4M了
二、执行ubi part kernel时报错
Creating 1 MTD partitions on "nand0":
0x000004200000-0x00001e200000 : "mtd=3"
UBI: attaching mtd1 to ubi0
UBI warning: io_init: EC and VID headers are in the same minimal I/O unit, switch to read-only mode
UBI: physical eraseblock size: 1048576 bytes (1024 KiB)
UBI: logical eraseblock size: 1044480 bytes
UBI: smallest flash I/O unit: 4096
UBI: VID header offset: 2048 (aligned 0)
UBI: data offset: 4096
UBI: empty MTD device detected
UBI: create volume table (copy #1)
UBI error: ubi_io_sync_erase: read-only mode
UBI error: ubi_io_sync_erase: read-only mode
UBI error: ubi_io_sync_erase: read-only mode
UBI error: ubi_io_sync_erase: read-only mode
可以看到创建卷时提示ubi处于只读模式,同时注意到一个warning,找到源码位置(/drivers/mtd/ubi/build.c io_init函数)
/*
* It may happen that EC and VID headers are situated in one minimal
* I/O unit. In this case we can only accept this UBI image in
* read-only mode.
*/
if (ubi->vid_hdr_offset + UBI_VID_HDR_SIZE <= ubi->hdrs_min_io_size) {
ubi_warn("EC and VID headers are in the same minimal I/O unit, "
"switch to read-only mode");
ubi->ro_mode = 1;
}
经过打印
UBI_VID_HDR_SIZE = 64
ubi->vid_hdr_offset = 2048
ubi->hdrs_min_io_size = 4096
确实有问题,从nand手册上来看,最小的页为4k,所以hdrs_min_io_size应该没问题
而vid_hdr_offset就有点奇怪,最后找到这个值是由ubi part传进来的参数
修正命令
ubi part kernel -->ubi part kernel 4096
三、执行 ubifsmount kernel报错-19
UBIFS error (pid 0): ubifs_get_sb: cannot open"ubi:kernel1", error -19
UBIFS error (pid 0): ubifs_mount: Error readingsuperblock on volume 'ubi:kernel1' errno=-19!
这应该是制作kernel镜像时mkfs.ubifs参数的问题了(都是跟nand相关的参数)
再次介绍mkfs.ubifs的用法
Usage: mkfs.ubifs [OPTIONS] target
Make a UBIFS file system image from an existingdirectory tree
Examples:
Build file system from directory /opt/img, writtingthe result in the ubifs.img file
mkfs.ubifs-m 512 -e 128KiB -c 100 -r /opt/img ubifs.img
The same, but writting directly to an UBI volume
mkfs.ubifs-r /opt/img /dev/ubi0_0
Creating an empty UBIFS filesystem on an UBIvolume
mkfs.ubifs/dev/ubi0_0
Options:
-r, -d, --root=DIR buildfile system from directory DIR
-m, --min-io-size=SIZE minimum I/O unit size,最小输入输出大小
-e, --leb-size=SIZE logical erase block size逻辑可擦出块大小
-c, --max-leb-cnt=COUNT maximumlogical erase block count最大逻辑可擦出块数目
-o, --output=FILE output to FILE输出文件名
-j, --jrn-size=SIZE journal size
-R, --reserved=SIZE howmuch space should be reserved for the super-user
-x, --compr=TYPE compression type - "lzo","favor_lzo", "zlib" or
"none"(default: "lzo")
-X, --favor-percent may only be used with favor LZO compressionand defines
howmany percent better zlib should compress to make
mkfs.ubifsuse zlib instead of LZO (default 20%)
-f, --fanout=NUM fanout NUM (default:8)
-F, --space-fixup file-system free space has tobe fixed up on first moun
(requireskernel version 3.0 or greater)
-k, --keyhash=TYPE key hash type - "r5" or"test" (default: "r5")
-p, --orph-lebs=COUNT count oferase blocks for orphans (default: 1)
-D, --devtable=FILE usedevice table FILE
-U, --squash-uids squash owners making all filesowned by root
-l, --log-lebs=COUNT count oferase blocks for the log (used only for debugging)
-v, --verbose verboseoperation
-V, --version displayversion information
-g, --debug=LEVEL display debug information (0 -none, 1 - statistics, 2 - files, 3 - more details)
-h, --help displaythis help text
例:
mkfs.ubifs -x lzo -m 2KiB -e 124KiB -c 720 -osystem_ubifs.img -d $path_to_system
压缩格式为lzo
-m最小输入输出大小为2KiB(2048bytes),一般为页大小
-e逻辑可擦除块大小为124KiB=(每块的页数-2)*页大小=(64-2)*2KiB=124KiB
-c最多逻辑可擦除块数目为720(720*128KiB=90MiB),这个可根据ubi volume来设置,实际上是设置此卷的最大容量。
按照例子,
-m参数应该是4096
-e参数应该是blocksize-2*pagesize=1M-2*4k=1040384(一般这2个page是用来存放ubi相关数据的,所以不能擦除)
-c参数应该是存放这个文件的分区大小有多少个块,我分了kernel分区为32M,那么这个值就是32M/1M= 32
nand type:Micron MT29F16G08CBACA
一、执行ubi part kernel时报错-12
Creating 1 MTD partitions on "nand0":
0x000004200000-0x00001e200000 : "mtd=3"
UBI: attaching mtd1 to ubi0
UBI warning: io_init: EC and VID headers are in thesame minimal I/O unit, switch to read-only mode
UBI: physical eraseblock size: 1048576 bytes (1024KiB)
UBI: logical eraseblock size: 1044480 bytes
UBI: smallest flash I/O unit: 4096
UBI: VID header offset: 2048 (aligned 0)
UBI: data offset: 4096
UBI error: ubi_init: cannot attach mtd1
UBIerror: ubi_init: UBI error: cannot initialize UBI, error -12
UBI init error 12
Error, no UBI device/partition selected!
网上一般都是说将CONFIG_SYS_MALLOC_LEN,增大到1M(1024*1024)。但我修改后同样报错
找到源码中报错的地方(/drivers/mtd/ubi/build.cubi_attach_mtd_dev函数)
err = -ENOMEM;
ubi->peb_buf1 = vmalloc(ubi->peb_size);
if (!ubi->peb_buf1)
goto out_free;
ubi->peb_buf2 = vmalloc(ubi->peb_size);
if (!ubi->peb_buf2)
goto out_free;
malloc大小为ubi->peb_size,经过查找最终是在(/driver/mtd/nand/nand_base.cnand_get_flash_type函数)
/* Calc blocksize */
mtd->erasesize = (128 * 1024) <<
(((extid >> 1) & 0x04) | (extid &0x03));
实际该值就是物理擦出块大小,通过芯片ID获取芯片类型,查看手册
该值为1024KB,那么问题就来了,CONFIG_SYS_MALLOC_LEN设置成1M,现在一次malloc的大小也是1M,连续两次malloc就会报错了,所以当nand芯片的块大小大于等于1M时,CONFIG_SYS_MALLOC_LEN就应该相应增大,我设置成4M了
二、执行ubi part kernel时报错
Creating 1 MTD partitions on "nand0":
0x000004200000-0x00001e200000 : "mtd=3"
UBI: attaching mtd1 to ubi0
UBI warning: io_init: EC and VID headers are in the same minimal I/O unit, switch to read-only mode
UBI: physical eraseblock size: 1048576 bytes (1024 KiB)
UBI: logical eraseblock size: 1044480 bytes
UBI: smallest flash I/O unit: 4096
UBI: VID header offset: 2048 (aligned 0)
UBI: data offset: 4096
UBI: empty MTD device detected
UBI: create volume table (copy #1)
UBI error: ubi_io_sync_erase: read-only mode
UBI error: ubi_io_sync_erase: read-only mode
UBI error: ubi_io_sync_erase: read-only mode
UBI error: ubi_io_sync_erase: read-only mode
可以看到创建卷时提示ubi处于只读模式,同时注意到一个warning,找到源码位置(/drivers/mtd/ubi/build.c io_init函数)
/*
* It may happen that EC and VID headers are situated in one minimal
* I/O unit. In this case we can only accept this UBI image in
* read-only mode.
*/
if (ubi->vid_hdr_offset + UBI_VID_HDR_SIZE <= ubi->hdrs_min_io_size) {
ubi_warn("EC and VID headers are in the same minimal I/O unit, "
"switch to read-only mode");
ubi->ro_mode = 1;
}
经过打印
UBI_VID_HDR_SIZE = 64
ubi->vid_hdr_offset = 2048
ubi->hdrs_min_io_size = 4096
确实有问题,从nand手册上来看,最小的页为4k,所以hdrs_min_io_size应该没问题
而vid_hdr_offset就有点奇怪,最后找到这个值是由ubi part传进来的参数
修正命令
ubi part kernel -->ubi part kernel 4096
三、执行 ubifsmount kernel报错-19
UBIFS error (pid 0): ubifs_get_sb: cannot open"ubi:kernel1", error -19
UBIFS error (pid 0): ubifs_mount: Error readingsuperblock on volume 'ubi:kernel1' errno=-19!
这应该是制作kernel镜像时mkfs.ubifs参数的问题了(都是跟nand相关的参数)
再次介绍mkfs.ubifs的用法
Usage: mkfs.ubifs [OPTIONS] target
Make a UBIFS file system image from an existingdirectory tree
Examples:
Build file system from directory /opt/img, writtingthe result in the ubifs.img file
mkfs.ubifs-m 512 -e 128KiB -c 100 -r /opt/img ubifs.img
The same, but writting directly to an UBI volume
mkfs.ubifs-r /opt/img /dev/ubi0_0
Creating an empty UBIFS filesystem on an UBIvolume
mkfs.ubifs/dev/ubi0_0
Options:
-r, -d, --root=DIR buildfile system from directory DIR
-m, --min-io-size=SIZE minimum I/O unit size,最小输入输出大小
-e, --leb-size=SIZE logical erase block size逻辑可擦出块大小
-c, --max-leb-cnt=COUNT maximumlogical erase block count最大逻辑可擦出块数目
-o, --output=FILE output to FILE输出文件名
-j, --jrn-size=SIZE journal size
-R, --reserved=SIZE howmuch space should be reserved for the super-user
-x, --compr=TYPE compression type - "lzo","favor_lzo", "zlib" or
"none"(default: "lzo")
-X, --favor-percent may only be used with favor LZO compressionand defines
howmany percent better zlib should compress to make
mkfs.ubifsuse zlib instead of LZO (default 20%)
-f, --fanout=NUM fanout NUM (default:8)
-F, --space-fixup file-system free space has tobe fixed up on first moun
(requireskernel version 3.0 or greater)
-k, --keyhash=TYPE key hash type - "r5" or"test" (default: "r5")
-p, --orph-lebs=COUNT count oferase blocks for orphans (default: 1)
-D, --devtable=FILE usedevice table FILE
-U, --squash-uids squash owners making all filesowned by root
-l, --log-lebs=COUNT count oferase blocks for the log (used only for debugging)
-v, --verbose verboseoperation
-V, --version displayversion information
-g, --debug=LEVEL display debug information (0 -none, 1 - statistics, 2 - files, 3 - more details)
-h, --help displaythis help text
例:
mkfs.ubifs -x lzo -m 2KiB -e 124KiB -c 720 -osystem_ubifs.img -d $path_to_system
压缩格式为lzo
-m最小输入输出大小为2KiB(2048bytes),一般为页大小
-e逻辑可擦除块大小为124KiB=(每块的页数-2)*页大小=(64-2)*2KiB=124KiB
-c最多逻辑可擦除块数目为720(720*128KiB=90MiB),这个可根据ubi volume来设置,实际上是设置此卷的最大容量。
按照例子,
-m参数应该是4096
-e参数应该是blocksize-2*pagesize=1M-2*4k=1040384(一般这2个page是用来存放ubi相关数据的,所以不能擦除)
-c参数应该是存放这个文件的分区大小有多少个块,我分了kernel分区为32M,那么这个值就是32M/1M= 32
相关文章推荐
- 移植u-boot支持ubi遇到的问题总结
- ubifs文件系统的制作过程&&遇到的问题及解决方案总结---之一“uboot中添加对UBIFS文件系统的支持”
- 移植u-boot支持ubi遇到的问题总结
- 移植u-boot支持ubi遇到的问题总结
- 移植u-boot支持ubi遇到的问题总结
- 移植u-boot支持ubi遇到的问题总结
- ubifs文件系统的制作过程&&遇到的问题及解决方案总结---之二“Linux内核中添加对UBIFS文件系统的支持”
- Apache+PHP,swfupload做批量上传时遇到的文件类型支持问题和文件上传大小限制问题的相应解决方案
- 解决:php+apache+mysql部署中遇到的mysql_connect()不支持问题
- uboot移植遇到大问题
- Uboot遇到的问题汇总
- 重写Repeater,使其支持空模版(列表为空时显示) 后遇到的问题
- m2-Maven编译遇到的不支持注释问题
- UBI文件系统 nand驱动子页支持问题
- .net4.0开发支持MySql的Membership时遇到找不到MembershipProvider类的问题!
- ExtJs项目部署到IIS开启GZIP支持遇到的问题
- UBI文件系统遇到的问题
- 使用Servlet3.0的异步支持时我遇到的一个问题
- JBoss Seam从头学到脚之3---支持多国语言(utf8)时遇到的问题及解决办法
- qemu添加新支持遇到的问题