rootfs所在mtd分区能再mount吗
发布网友
发布时间:2022-04-24 01:31
我来回答
共1个回答
热心网友
时间:2023-10-18 17:56
1.内核配置
在make menuconfig中选中:
Device Drivers ---> Memory Technology Device (MTD) support ---> Command line partition table parsing
Device Drivers → Memory Technology Device (MTD) support →Enable UBI - Unsorted block images
File systems → Miscellaneous filesystems→UBIFS file system support
我是通过uboot的内核命令行给MTD层传递MTD分区信息,在内核中无需进行mtd分区配置,只需修改uboot源码及环境变量参数即可,但要确保源码中分区信息和环境变量的分区信息一致
2.uboot源码修改
在uboot源码目录中,include/conifgs/mx6<custom>.h文件(mx6<custom>.h为自定义板级文件的头文件)中找到:
#define CONFIG_MFG_NAND_PARTITION
修改为"mtdparts=gpmi-nand:8m(boot),2m(env),8m(kernel),1m(dtb),-(rootfs)"
其中gpmi-nand为mtd-id,要与平台flash的mtd-id一致才行,后面为我的分区,仅供参考
我的mx6<custom>.h文件还包含了include/configs/mx6sabre_common.h文件,在其中找到:
#define CONFIG_EXTRA_ENV_SETTINGS
将其修改为如下内容:
#define CONFIG_EXTRA_ENV_SETTINGS \
CONFIG_MFG_ENV_SETTINGS \
"fdt_addr=0x18000000\0" \
"fdt_high=0xffffffff\0" \
"bootargs=console=" CONFIG_CONSOLE_DEV ",115200 ubi.mtd=4 " \
"root=ubi0:rootfs rootfstype=ubifs " \
"mtdparts=gpmi-nand:8m(boot),2m(env),8m(kernel),1m(dtb),-(rootfs) "\
CONFIG_SYS_VIDEO "\0" \
"bootcmd=nand read ${loadaddr} 0xA00000 0x800000;"\
"nand read ${fdt_addr} 0x1200000 0x100000;"\
"bootz ${loadaddr} - ${fdt_addr}\0"
主要是对bootargs进行配置:
由于mtd0~4依次为boot,env,kernel,dtb和rootfs,因此ubi.mtd=4(这是rootfs的mtd分区号);
root=ubi0:rootfs中,rootfs为ubi0分区的分区名,后面ubi分区时会进行命名,两者保持一致即可;
rootfstype文件系统类型为ubifs;
mtdparts这个应该和CONFIG_MFG_NAND_PARTITION一致
3.mfgtool烧写工具修改
mfgtool主要修改cfg.ini配置文件和uxl2.xml文件,具体语法可以参考官方文档
cfg.ini文件如下:
[profiles]
chip = Linux
[platform]
board = SabreSD
[LIST]
name = Custom-NAND
[variable]
board = Custom
part_uboot = 0
part_kernel = 1
part_dtb = 2
part_rootfs = 3
其中Custom为自己定义的目标板名称,part_*为各个mtd分区号
uxl2.xml文件应该给出了Nand烧写的demo,只需在它的基础上进行修改即可:
将LIST name 改成Custom-NAND
BootStrap部分不赘述了;
uboot和kernel烧写部分沿用demo,只需修改烧写文件名及mtd分区名即可,也省略了。。
重点分析一下rootfs的ubi分区及烧写:
<CMD state="Updater" type="push" body="$ flash_erase /dev/mtd%part_rootfs% 0 0">Erasing rootfs partition</CMD>
<CMD state="Updater" type="push" body="$ ubiformat /dev/mtd%part_rootfs%"/>
<CMD state="Updater" type="push" body="$ ubiattach /dev/ubi_ctrl -m %part_rootfs%">Attaching UBI partition</CMD>
<CMD state="Updater" type="push" body="$ ubimkvol /dev/ubi0 -Nrootfs -m"/>
<CMD state="Updater" type="push" body="$ mkdir -p /mnt/mtd%part_rootfs%"/>
<CMD state="Updater" type="push" body="$ mount -t ubifs ubi0:rootfs /mnt/mtd%part_rootfs%"/>
<CMD state="Updater" type="push" body="pipe tar -jxv -C /mnt/mtd%part_rootfs%" file="files/Custom-imx6q.rootfs.tar.bz2">Sending and writting rootfs</CMD>
<CMD state="Updater" type="push" body="frf">Finishing rootfs write</CMD>
<CMD state="Updater" type="push" body="$ umount /mnt/mtd%part_rootfs%">Unmounting rootfs partition</CMD>
<CMD state="Updater" type="push" body="$ echo Update Complete!">Done</CMD>
以上为rootfs的分区及烧写,下面说明一下ubi工具的使用:
ubiformat /dev/mtdN是对mtd分区格式化
ubiattach是对指定mtd分区进行attach,-m 后加上分区号即可,这会生成/dev/ubi0的设备文件,若再进行attach,则按顺序生成/dev/ubi1, /dev/ubi2等等。。。
ubimkvol是在指定的/dev/ubiN上进行ubi分区,即make volume,-N后为分区名,此处指定为rootfs,与上文中bootargs中指定的ubi0:rootfs要保持一致,-m 为指定大小为max(ubiN全部分区大小),也可以使用 -s 500MiB来指定你所需要的大小(单位是MiB或KiB),如果空间足够,可以再ubiN上进行多个volume的分区,访问时只需按照分区名挂载即可
mount -t ubifs ubi0:rootfs /mnt/... 就是按照ubi的分区名进行挂载ubi分区
ubi分区总结:
ubiN分区中,N对应某一个mtd分区,需要attach来动态的再/dev下生成,在这个mtd分区基础上,还能使用ubimkvol按照分区名再次进行多个ubi的volume分区,访问时按照ubiN:name的格式进行挂载即可
注意:
在mtd分区上进行ubi分区后,用ubinfo /dev/ubiN命令会发现实际的ubi分区大小会比mtd分区小一些,这是因为ubi的存储管理是将其逻辑擦除块(LEB)映射到物理擦除块(PEB),在这个过程中需要使用一部分存储空间来进行管理,所以实际我们使用的存储空间会比mtd的大小要小一些。
此外,若mtd分区太小,将可能没有足够空间来进行ubi分区,本人经过尝试,40M的mtd空间可以提供约17M的ubi分区,然而20M的mtd空间则无法进行ubi分区(ubinfo查看会提示无可提供的逻辑擦除块)
热心网友
时间:2023-10-18 17:56
1.内核配置
在make menuconfig中选中:
Device Drivers ---> Memory Technology Device (MTD) support ---> Command line partition table parsing
Device Drivers → Memory Technology Device (MTD) support →Enable UBI - Unsorted block images
File systems → Miscellaneous filesystems→UBIFS file system support
我是通过uboot的内核命令行给MTD层传递MTD分区信息,在内核中无需进行mtd分区配置,只需修改uboot源码及环境变量参数即可,但要确保源码中分区信息和环境变量的分区信息一致
2.uboot源码修改
在uboot源码目录中,include/conifgs/mx6<custom>.h文件(mx6<custom>.h为自定义板级文件的头文件)中找到:
#define CONFIG_MFG_NAND_PARTITION
修改为"mtdparts=gpmi-nand:8m(boot),2m(env),8m(kernel),1m(dtb),-(rootfs)"
其中gpmi-nand为mtd-id,要与平台flash的mtd-id一致才行,后面为我的分区,仅供参考
我的mx6<custom>.h文件还包含了include/configs/mx6sabre_common.h文件,在其中找到:
#define CONFIG_EXTRA_ENV_SETTINGS
将其修改为如下内容:
#define CONFIG_EXTRA_ENV_SETTINGS \
CONFIG_MFG_ENV_SETTINGS \
"fdt_addr=0x18000000\0" \
"fdt_high=0xffffffff\0" \
"bootargs=console=" CONFIG_CONSOLE_DEV ",115200 ubi.mtd=4 " \
"root=ubi0:rootfs rootfstype=ubifs " \
"mtdparts=gpmi-nand:8m(boot),2m(env),8m(kernel),1m(dtb),-(rootfs) "\
CONFIG_SYS_VIDEO "\0" \
"bootcmd=nand read ${loadaddr} 0xA00000 0x800000;"\
"nand read ${fdt_addr} 0x1200000 0x100000;"\
"bootz ${loadaddr} - ${fdt_addr}\0"
主要是对bootargs进行配置:
由于mtd0~4依次为boot,env,kernel,dtb和rootfs,因此ubi.mtd=4(这是rootfs的mtd分区号);
root=ubi0:rootfs中,rootfs为ubi0分区的分区名,后面ubi分区时会进行命名,两者保持一致即可;
rootfstype文件系统类型为ubifs;
mtdparts这个应该和CONFIG_MFG_NAND_PARTITION一致
3.mfgtool烧写工具修改
mfgtool主要修改cfg.ini配置文件和uxl2.xml文件,具体语法可以参考官方文档
cfg.ini文件如下:
[profiles]
chip = Linux
[platform]
board = SabreSD
[LIST]
name = Custom-NAND
[variable]
board = Custom
part_uboot = 0
part_kernel = 1
part_dtb = 2
part_rootfs = 3
其中Custom为自己定义的目标板名称,part_*为各个mtd分区号
uxl2.xml文件应该给出了Nand烧写的demo,只需在它的基础上进行修改即可:
将LIST name 改成Custom-NAND
BootStrap部分不赘述了;
uboot和kernel烧写部分沿用demo,只需修改烧写文件名及mtd分区名即可,也省略了。。
重点分析一下rootfs的ubi分区及烧写:
<CMD state="Updater" type="push" body="$ flash_erase /dev/mtd%part_rootfs% 0 0">Erasing rootfs partition</CMD>
<CMD state="Updater" type="push" body="$ ubiformat /dev/mtd%part_rootfs%"/>
<CMD state="Updater" type="push" body="$ ubiattach /dev/ubi_ctrl -m %part_rootfs%">Attaching UBI partition</CMD>
<CMD state="Updater" type="push" body="$ ubimkvol /dev/ubi0 -Nrootfs -m"/>
<CMD state="Updater" type="push" body="$ mkdir -p /mnt/mtd%part_rootfs%"/>
<CMD state="Updater" type="push" body="$ mount -t ubifs ubi0:rootfs /mnt/mtd%part_rootfs%"/>
<CMD state="Updater" type="push" body="pipe tar -jxv -C /mnt/mtd%part_rootfs%" file="files/Custom-imx6q.rootfs.tar.bz2">Sending and writting rootfs</CMD>
<CMD state="Updater" type="push" body="frf">Finishing rootfs write</CMD>
<CMD state="Updater" type="push" body="$ umount /mnt/mtd%part_rootfs%">Unmounting rootfs partition</CMD>
<CMD state="Updater" type="push" body="$ echo Update Complete!">Done</CMD>
以上为rootfs的分区及烧写,下面说明一下ubi工具的使用:
ubiformat /dev/mtdN是对mtd分区格式化
ubiattach是对指定mtd分区进行attach,-m 后加上分区号即可,这会生成/dev/ubi0的设备文件,若再进行attach,则按顺序生成/dev/ubi1, /dev/ubi2等等。。。
ubimkvol是在指定的/dev/ubiN上进行ubi分区,即make volume,-N后为分区名,此处指定为rootfs,与上文中bootargs中指定的ubi0:rootfs要保持一致,-m 为指定大小为max(ubiN全部分区大小),也可以使用 -s 500MiB来指定你所需要的大小(单位是MiB或KiB),如果空间足够,可以再ubiN上进行多个volume的分区,访问时只需按照分区名挂载即可
mount -t ubifs ubi0:rootfs /mnt/... 就是按照ubi的分区名进行挂载ubi分区
ubi分区总结:
ubiN分区中,N对应某一个mtd分区,需要attach来动态的再/dev下生成,在这个mtd分区基础上,还能使用ubimkvol按照分区名再次进行多个ubi的volume分区,访问时按照ubiN:name的格式进行挂载即可
注意:
在mtd分区上进行ubi分区后,用ubinfo /dev/ubiN命令会发现实际的ubi分区大小会比mtd分区小一些,这是因为ubi的存储管理是将其逻辑擦除块(LEB)映射到物理擦除块(PEB),在这个过程中需要使用一部分存储空间来进行管理,所以实际我们使用的存储空间会比mtd的大小要小一些。
此外,若mtd分区太小,将可能没有足够空间来进行ubi分区,本人经过尝试,40M的mtd空间可以提供约17M的ubi分区,然而20M的mtd空间则无法进行ubi分区(ubinfo查看会提示无可提供的逻辑擦除块)