This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

UBI 挂载的之后,多了一个分区

Other Parts Discussed in Thread: AM3354

咨询下,根据文档,制作的 UBI 文件系统,是成功启动了,但是存在一些疑问,望解答!

内核的分区为八个分区,分别是 :

static struct mtd_partition am335x_nand_partitions[] = {
/* All the partition sizes are listed in terms of NAND block size */
{
.name = "SPL",
.offset = 0, /* Offset = 0x0 */
.size = SZ_128K,
},
{
.name = "SPL.backup1",
.offset = MTDPART_OFS_APPEND, /* Offset = 0x20000 */
.size = SZ_128K,
},
{
.name = "SPL.backup2",
.offset = MTDPART_OFS_APPEND, /* Offset = 0x40000 */
.size = SZ_128K,
},
{
.name = "SPL.backup3",
.offset = MTDPART_OFS_APPEND, /* Offset = 0x60000 */
.size = SZ_128K,
},
{
.name = "U-Boot",
.offset = MTDPART_OFS_APPEND, /* Offset = 0x80000 */
.size = 15 * SZ_128K,
},
{
.name = "U-Boot Env",
.offset = MTDPART_OFS_APPEND, /* Offset = 0x260000 */
.size = 1 * SZ_128K,
},
{
.name = "Kernel", 
.offset = MTDPART_OFS_APPEND, /* Offset = 0x280000 */
.size = 40 * SZ_128K,
},
{
.name = "File System",
.offset = MTDPART_OFS_APPEND, /* Offset = 0x780000 */
.size = MTDPART_SIZ_FULL,
},

也就是 MTD7 为 File System,整个文件系统的空间大约是 1000MB 大小空间

系统成功挂载 UBI 文件系统之后,查看分区 :

cat /proc/mtd 
dev: size erasesize name
mtd0: 00020000 00020000 "SPL"
mtd1: 00020000 00020000 "SPL.backup1"
mtd2: 00020000 00020000 "SPL.backup2"
mtd3: 00020000 00020000 "SPL.backup3"
mtd4: 001e0000 00020000 "U-Boot"
mtd5: 00020000 00020000 "U-Boot Env"
mtd6: 00500000 00020000 "Kernel"
mtd7: 1f880000 00020000 "File System"
mtd8: 1e349000 0001f000 "rootfs"

变成了九个分区,在内核指定的 "File System"后面,又多了一个  "rootfs"。而且计算可以知道,  "rootfs" 大约从   "File System" 获得了一般的空间大小,大约为 483MB。

下面是关于 UBI 启动的相关信息:

UBI: max. sequence number: 0
[ 4.544769] UBI: volume 1 ("rootfs") re-sized from 1652 to 3991 LEBs
[ 4.551936] UBI: attached mtd7 to ubi0
[ 4.555865] UBI: MTD device name: "File System"
[ 4.561620] UBI: MTD device size: 504 MiB
[ 4.566805] UBI: number of good PEBs: 4035
[ 4.571726] UBI: number of bad PEBs: 1
[ 4.576365] UBI: number of corrupted PEBs: 0
[ 4.581012] UBI: max. allowed volumes: 128
[ 4.585835] UBI: wear-leveling threshold: 4096
[ 4.590753] UBI: number of internal volumes: 1
[ 4.595393] UBI: number of user volumes: 1
[ 4.600040] UBI: available PEBs: 0
[ 4.604679] UBI: total number of reserved PEBs: 4035
[ 4.609886] UBI: number of PEBs reserved for bad PEB handling: 40
[ 4.616255] UBI: max/mean erase counter: 1/0
[ 4.620720] UBI: image sequence number: 578192465
[ 4.625815] UBI: background thread "ubi_bgt0d" started, PID 50

[ 6.239973] UBIFS: start fixing up free space
[ 53.458208] UBIFS: free space fixup complete
[ 53.499746] UBIFS: mounted UBI device 0, volume 1, name "rootfs"
[ 53.506046] UBIFS: file system size: 258523136 bytes (252464 KiB, 246 MiB, 2036 LEBs)
[ 53.514442] UBIFS: journal size: 9023488 bytes (8812 KiB, 8 MiB, 72 LEBs)
[ 53.522094] UBIFS: media format: w4/r0 (latest is w4/r0)
[ 53.528188] UBIFS: default compressor: lzo
[ 53.532474] UBIFS: reserved for root: 0 bytes (0 KiB)

这个是为什么呢?这种现象是正常的么?我应该如何去理解?还是说,我应该将修改我的内核分区?

如何去理解?还是说,我应该将修改我的内核分区?


  • 这个里面有问题,你在uboot里面的分区表是不是就错了?在uboot的环境变量中打印下看看这个NAND 分区表是维护的是一致的么

  • 是一致的,UBOOT 的分区和内核的分区是完全一致的。

    U-Boot# mtdparts

    device nand0 <nand.0>, # parts = 8
    #: name size offset mask_flags
    0: SPL 0x00020000 0x00000000 0
    1: SPL.backup1 0x00020000 0x00020000 0
    2: SPL.backup2 0x00020000 0x00040000 0
    3: SPL.backup3 0x00020000 0x00060000 0
    4: u-boot 0x001e0000 0x00080000 0
    5: u-boot-env 0x00020000 0x00260000 0
    6: kernel 0x00500000 0x00280000 0
    7: rootfs 0x3f880000 0x00780000 0

    active partition: nand0,0 - (SPL) 0x00020000 @ 0x00000000

    defaults:
    mtdids : nand0=nand.0
    mtdparts: mtdparts=nand.0:128k(SPL),128k(SPL.backup1),128k(SPL.backup2),128k(SPL.backup3),1920k(u-boot),128k(u-boot-env),5m(kernel),-(rootfs)

    它们都是八个分区。

    UBOOT 的分区,是在 am335x_evm.h 的 定义的 :

    #define MTDPARTS_DEFAULT "mtdparts=nand.0:" \
    "128k(SPL)," \
    "128k(SPL.backup1)," \
    "128k(SPL.backup2)," \
    "128k(SPL.backup3)," \
    "1920k(u-boot)," \
    "128k(u-boot-env)," \
    "5m(kernel)," \
    "-(rootfs)"

     消息比对了,没错。

    SoC 使用的是  AM3354,内核是基于 TI-Android-JB-4.2.2-DevKit-4.1.1  SDK 。但是 UBOOT 因为一些原因,没有使用 SDK 提供的 UBOOT。

  • 没见过这种情况,不过突然想到还有一点可以查的,就是你做的ubifs配置的时候是有个选项配置大小的,下面这个,做ubifs的时候,这个配置确认是对的吧

    -c:文件系统所占用的最大 block 数,一般小于等于 block count -1

  • -c 的参数尝试其他的了,还是不行。今天看数据手册,

    我重新查阅了 TRM ,在 7.1.1.1 GPMC Features 介绍了 :


     AM3354,只支持 512 MB NAND FLASH ?我这边设备接的是 MX60LF8G18AC,是 1GB 的设备,是不是不被支持的原因呢?所以才会多出一个分区呢?

  • 不是这个问题吧

    上面说的512M不是指nand,是指寻址空间吧

    nand的寻址是行列寻址的,用不到那么大

  • 嗯,确实不是这个问题,查看了 TRM 的  Table 26-14. Supported NAND Devices, nand flash 确实是被支持的。至于 系统多了一个分区,这个问题也还没有找到问题。

  • 你的NAND 上的rootfs挂载成功么?系统运行正常么?

    另外你的内核是什么版本的?

  • 挂载成功了,且系统运行正常。调试系统期间,没有发现任何的异常。内核的版本是,Linux version 3.2.0。使用的 SDK 是 TI-Android-JB-4.2.2-DevKit-4.1.1,但是 uboot 使用的不是 SDK 提供的,使用的是自己移植的 2014.10 的 UBOOT 版本。

  • 你是安卓系统啊,怪不得,安卓下面印象里就是多一个文件系统数据分区的

  • 多一个分区,应该不是哦。

    下面是内核启动的主要 LOG :

    [ 1.335048] 0x000000000000-0x000000020000 : "SPL"
    [ 1.340858] 0x000000020000-0x000000040000 : "SPL.backup1"
    [ 1.347111] 0x000000040000-0x000000060000 : "SPL.backup2"
    [ 1.353367] 0x000000060000-0x000000080000 : "SPL.backup3"
    [ 1.359635] 0x000000080000-0x000000260000 : "U-Boot"
    [ 1.366131] 0x000000260000-0x000000280000 : "U-Boot Env"
    [ 1.372324] 0x000000280000-0x000000780000 : "Kernel"
    [ 1.380184] 0x000000780000-0x000020000000 : "File System"

    上面的分区,是内核自定义的分区。

    [ 1.598350] UBI: attaching mtd7 to ubi0
    [ 1.602406] UBI: physical eraseblock size: 131072 bytes (128 KiB)
    [ 1.608964] UBI: logical eraseblock size: 126976 bytes
    [ 1.614604] UBI: smallest flash I/O unit: 2048
    [ 1.619525] UBI: VID header offset: 2048 (aligned 2048)
    [ 1.625800] UBI: data offset: 4096
    [ 1.838944] usb 1-1: new high-speed USB device number 2 using musb-hdrc
    [ 2.020442] usb 1-1: New USB device found, idVendor=0bda, idProduct=8179
    [ 2.027449] usb 1-1: New USB device strings: Mfr=1, Product=2, SerialNumber=3
    [ 2.034921] usb 1-1: Product: 802.11n NIC
    [ 2.039116] usb 1-1: Manufacturer: Realtek
    [ 2.043396] usb 1-1: SerialNumber: 38A28CC0DDE8
    [ 5.925283] UBI: max. sequence number: 5042
    [ 5.947213] UBI: attached mtd7 to ubi0
    [ 5.951205] UBI: MTD device name: "File System"
    [ 5.956944] UBI: MTD device size: 504 MiB
    [ 5.962139] UBI: number of good PEBs: 4035
    [ 5.967051] UBI: number of bad PEBs: 1
    [ 5.971700] UBI: number of corrupted PEBs: 0
    [ 5.976340] UBI: max. allowed volumes: 128
    [ 5.981168] UBI: wear-leveling threshold: 4096
    [ 5.986082] UBI: number of internal volumes: 1
    [ 5.990728] UBI: number of user volumes: 1
    [ 5.995367] UBI: available PEBs: 0
    [ 6.000031] UBI: total number of reserved PEBs: 4035
    [ 6.005216] UBI: number of PEBs reserved for bad PEB handling: 40
    [ 6.011592] UBI: max/mean erase counter: 6/1
    [ 6.016052] UBI: image sequence number: 2076596195
    [ 6.021248] UBI: background thread "ubi_bgt0d" started, PID 50

    [ 7.231816] UBIFS: recovery needed
    [ 7.399384] UBIFS: recovery completed
    [ 7.403235] UBIFS: mounted UBI device 0, volume 0, name "rootfs"
    [ 7.409538] UBIFS: file system size: 505364480 bytes (493520 KiB, 481 MiB, 3980 LEBs)
    [ 7.417918] UBIFS: journal size: 9023488 bytes (8812 KiB, 8 MiB, 72 LEBs)
    [ 7.425576] UBIFS: media format: w4/r0 (latest is w4/r0)
    [ 7.431686] UBIFS: default compressor: lzo
    [ 7.435968] UBIFS: reserved for root: 0 bytes (0 KiB)

    启动之后,查看分区的情况:

    root@android:/ # cat /proc/mtd
    dev: size erasesize name
    mtd0: 00020000 00020000 "SPL"
    mtd1: 00020000 00020000 "SPL.backup1"
    mtd2: 00020000 00020000 "SPL.backup2"
    mtd3: 00020000 00020000 "SPL.backup3"
    mtd4: 001e0000 00020000 "U-Boot"
    mtd5: 00020000 00020000 "U-Boot Env"
    mtd6: 00500000 00020000 "Kernel"
    mtd7: 1f880000 00020000 "File System"
    mtd8: 1e349000 0001f000 "rootfs"

    rootfs 就是最后生成的分区,名字就是 UBI 挂载的名字

    busybox df -h
    Filesystem Size Used Available Use% Mounted on
    ubi0:rootfs 445.1M 154.1M 291.0M 35% /
    tmpfs 249.1M 68.0K 249.0M 0% /dev
    tmpfs 249.1M 0 249.1M 0% /mnt/secure
    tmpfs 249.1M 0 249.1M 0% /mnt/asec
    tmpfs 249.1M 0 249.1M 0% /mnt/obb

    cat /proc/partitions
    major minor #blocks name

    31 0 128 mtdblock0
    31 1 128 mtdblock1
    31 2 128 mtdblock2
    31 3 128 mtdblock3
    31 4 1920 mtdblock4
    31 5 128 mtdblock5
    31 6 5120 mtdblock6
    31 7 516608 mtdblock7
    31 8 494884 mtdblock8

    mtdblock8 就是最后生成的分区。

    root@android:/ # mount

    rootfs / rootfs rw 0 0
    ubi0:rootfs / ubifs rw,relatime 0 0
    tmpfs /dev tmpfs rw,nosuid,relatime,mode=755 0 0
    devpts /dev/pts devpts rw,relatime,mode=600 0 0
    proc /proc proc rw,relatime 0 0
    sysfs /sys sysfs rw,relatime 0 0
    debugfs /sys/kernel/debug debugfs rw,relatime 0 0
    tmpfs /mnt/secure tmpfs rw,relatime,mode=700 0 0
    tmpfs /mnt/asec tmpfs rw,relatime,mode=755,gid=1000 0 0
    tmpfs /mnt/obb tmpfs rw,relatime,mode=755,gid=1000 0 0

    从挂载的分区情况来看,应该不是  userdata 分区

    使用的 NAND FLASH 是 MX60LF8G18AC ,制作 UBI 的命令是,

    mkfs.ubifs -r ./ubifs -m 2048 -e 126976 -c 8191 -o ubifs.img -F

    ubinize -o ubi.img -m 2048 -p 128KiB -s 512 -O 2048 ubinize.cfg

    ubinize.cfg 配置文件为 :

    [ubifs]
    mode=ubi
    image=./ubifs.img
    vol_id=0
    vol_size=200MiB
    vol_type=dynamic
    vol_name=rootfs
    vol_flags=autoresize

  • 你的ubi.img烧写到NAND的哪个空间了?uboot下的启动挂载命令是什么?

  • 为将 ubi.img 烧写到内核定义的  File System 空间了,UBOOT 的 mtdparts 命令可以看到,File System分区的起始地址 是 0x780000,整个文件系统的大小是 3F880000。烧写的代码是:

    mmc rescan;fatload mmc 0 0x82000000 ubi.img;nand erase 780000 3F880000;nand write 82000000 780000 ${filesize}

    UBOOT 的启动挂载命令是:

    setenv nandargs 'setenv bootargs console=ttyO0,115200n8 androidboot.console=ttyO0 mem=512M root=ubi0:rootfs rootfstype=ubifs ubi.mtd=7,2048 rw rootwait init=/init ip=off'


    UBOOT 的信息 :

    mtdparts

    device nand0 <nand.0>, # parts = 8
    #: name size offset mask_flags
    0: SPL 0x00020000 0x00000000 0
    1: SPL.backup1 0x00020000 0x00020000 0
    2: SPL.backup2 0x00020000 0x00040000 0
    3: SPL.backup3 0x00020000 0x00060000 0
    4: u-boot 0x001e0000 0x00080000 0
    5: u-boot-env 0x00020000 0x00260000 0
    6: kernel 0x00500000 0x00280000 0
    7: rootfs 0x3f880000 0x00780000 0

    可见,文件系统的分区是从 0x00780000 开始,大小为 0x3f880000 ,空间的大小约为 1009 MB。但是,UBOOT 的分区信息与内核的启动信息,存在不一致

    内核的启动信息:

    [ 1.330929] Creating 8 MTD partitions on "omap2-nand.0":
    [ 1.336500] 0x000000000000-0x000000020000 : "SPL"
    [ 1.342262] 0x000000020000-0x000000040000 : "SPL.backup1"
    [ 1.348511] 0x000000040000-0x000000060000 : "SPL.backup2"
    [ 1.354766] 0x000000060000-0x000000080000 : "SPL.backup3"
    [ 1.361021] 0x000000080000-0x000000260000 : "U-Boot"
    [ 1.367519] 0x000000260000-0x000000280000 : "U-Boot Env"
    [ 1.373723] 0x000000280000-0x000000780000 : "Kernel"
    [ 1.381595] 0x000000780000-0x000020000000 : "File System"

    内核启动的文件系统分区,0x000000780000 到 0x000020000000,计算下来,分区的大小才 504MB。 

    新增的  UBI 分区 的空间大小为 400 多 MB,

    [ 53.529852] UBIFS: mounted UBI device 0, volume 0, name "rootfs"
    [ 53.536145] UBIFS: file system size: 505364480 bytes (493520 KiB, 481 MiB, 3980 LEBs)

    而事实上, 内核的分区代码为:

    {
    .name = "SPL",
    .offset = 0, /* Offset = 0x0 */
    .size = SZ_128K,
    },
    {
    .name = "SPL.backup1",
    .offset = MTDPART_OFS_APPEND, /* Offset = 0x20000 */
    .size = SZ_128K,
    },
    {
    .name = "SPL.backup2",
    .offset = MTDPART_OFS_APPEND, /* Offset = 0x40000 */
    .size = SZ_128K,
    },
    {
    .name = "SPL.backup3",
    .offset = MTDPART_OFS_APPEND, /* Offset = 0x60000 */
    .size = SZ_128K,
    },
    {
    .name = "U-Boot",
    .offset = MTDPART_OFS_APPEND, /* Offset = 0x80000 */
    .size = 15 * SZ_128K,
    },
    {
    .name = "U-Boot Env",
    .offset = MTDPART_OFS_APPEND, /* Offset = 0x260000 */
    .size = 1 * SZ_128K,
    },
    {
    .name = "Kernel",
    .offset = MTDPART_OFS_APPEND, /* Offset = 0x280000 */
    .size = 40 * SZ_128K,
    },
    {
    .name = "File System",
    // .name = "rootfs",
    .offset = MTDPART_OFS_APPEND, /* Offset = 0x780000 */
    .size = MTDPART_SIZ_FULL,
    },

    MTDPART_SIZ_FULL 的定义,应该就是将剩下的 NAND FLASH 的空间,全部给 file system 分区。