mtd和df查看嵌入式系统的分区情况

命令:cat  proc/mtd

dev:    size   erasesize  name
mtd0: 01000000 00010000 "ALL"
mtd1: 00030000 00010000 "Bootloader"
mtd2: 00010000 00010000 "Config"
mtd3: 00010000 00010000 "Factory"
mtd4: 00700000 00010000 "firmware"
mtd5: 00576664 00010000 "rootfs"
mtd6: 001a0000 00010000 "rootfs_data"
mtd7: 00010000 00010000 "preconfig"
mtd8: 00700000 00010000 "firmware2"

通过以上命令 可以查看嵌入式系统的磁盘分区情况。 

    MTD(memory technology device内存技术设备)是用于访问memory设备(ROM、flash)的Linux的子系统。MTD的主要目的是为了使新的memory设备的驱动更加简单,为此它在硬件和上层之间提供了一个抽象的接口,并进行了一个层次划分,层次从上到下大致为:设备文件、MTD设备层、MTD原始设备层、硬件驱动层。MTD的所有源代码在/drivers/mtd子目录下。

命令:df

Filesystem           1K-blocks      Used Available Use% Mounted on
rootfs                    1664       284      1380  17% /
/dev/root                 4864      4864         0 100% /rom
tmpfs                    30100       252     29848   1% /tmp
/dev/mtdblock6            1664       284      1380  17% /overlay
overlayfs:/overlay        1664       284      1380  17% /
tmpfs                      512         0       512   0% /dev  

 该命令可用来查看文件系统的磁盘使用情况,如上面:mtd中的mtd5  rootfs即为嵌入式系统的文件系统分区。

命令:cat  proc/mtd

# cat /proc/partitions 
major minor  #blocks  name

  31        0        256 mtdblock0
  31        1       2048 mtdblock1
  31        2       1536 mtdblock2
  31        3          4 mtdblock3
  31        4        256 mtdblock4
代码位于drivers/mtd/mtdcore.c  if ((proc_mtd = create_proc_entry( "mtd", 0, NULL ))) proc_mtd->read_proc = mtd_read_proc;
module_init(init_mtd);

代码位于block/genhd.c 
    proc_create("diskstats", 0, NULL, &proc_diskstats_operations);
    proc_create("partitions", 0, NULL, &proc_partitions_operations);
module_init(proc_genhd_init);

mtd是字符设备,mtdblock是块设备

通过ubifs的工具可以attach/detach mtd,create/destroy ubi_volume, resize/rename ubi_volume, read/write ubi_volume。

mtd device 代表着物理设备,这个物理设备上存在着许多物理块(nand),这些块大部分是好的,也有少数是坏块,所以mtd device 代表着所有的好块和坏块。对这些mtd device,内核提供了读写等操作。

Ubi device 代表着物理介质上的逻辑设备。跟mtd device一样,也有读写等操作接口。可是这个设备在用户看来是没有坏块的,ubi device 负责了坏块的管理,并且对物理块进行了新的组织,即使在用户层看来这是一个串行的读写设备,但是在ubi device中,却是进行了新的映射。这种映射目的在于负载的均衡。

Mtd 在初始化时,会将同一类型的flash划分成一个mtd device。这个device的大小等于所以芯片容量的总和。这个过程完成后,就会从内核启动参数或者默认的分区表中获得分区信息。最后,将每个分区作为,一个mtd device添加到mtd_tables中。
我们在cat /proc/mtd时,就是返回的mtd_table中的信息。

每个mtd partition 可以attach 到一个ubi device上,在每个ubi device上又可以创建很多ubi volume,而每个ubi volume又被作为一个mtd device 保存于mtd table 中。
从内核中我们可以看到mtd的type分为 nor ,nand,ram,rom,ubivolume。



1.MTD Subsystem:
MTD 子系统, 提供对flash芯片的访问接口, MTD子系统提供了MTD device的概念,比如/dev/mtdx,MTD可以认为是raw flash。
2.UBI subsystem:
为flash device提供了wear-leveling和 volume management功能; UBI工作在MTD设备之上,提供了UBI volume;UBI是MTD设备的高层次表示,对上层屏蔽了一些MTD不得不处理的问题,比如wearing以及坏块管理。
3.UBIFS filesystem
UBIFS 文件系统,工作于UBI之上。

参数示例

下面是一个uboot中的内核启动参数。
Bootargs=console=ttyS0,115200n8 ubi.mtd=4 root=ubi0:rtfs rootfstype=ubifs rw mtdparts=café_nand:200M(part1),300M(part2),400M(part3),500M(part4),-(part5)
其中console部分是定义关于串口的参数,这里不解释了。
ubi.mtd=4 指示整个系统的根文件系统在第四个mtd 上,系统将据此默认把mtd4 attach到ubi0 上。 
root=ubi0:rtfs 指示 根文件系统在ubi0上的名字叫做rtfs的volume上。注意这里ubifs的设备名字的写法,不是以/dev开头。他的写法有两种:
a) 【ubi device名b) 】:【ubi volume名c) 】,d) 例如ubi0:rootfs
e) 【ubi device名f) 】_【ubi volume 编号】,g) 例如ubi0_0
rootfstype=ubifs 指示rootfs的文件系统类型为ubifs
mtdparts=café_nand:200M(part1),300M(part2),400M(part3),500M(rootfs),-(part5)
定义了物理分区表。格式为
Mtd_id:[-]size[@offset](name)[mask_flag], …,…
其中[]中的代表可有可无项。
Mtd_id 对应于某种类型flash init过程中的name,二者必须相同,才能进行有效分区。
- 表示该分区划分所有的剩余空间。
Size 指示当前分区的大小。
@引导offset的开始。
Offset 指示该分区的起始偏移量。
()中表示该物理分区(partition)的名字。
Name 表示该物理分区(partition)的名字.
Mask_flag 表示该分区的读写属性。
, 指示还有其他分区。

整理一下linux 中常用的ubi 命令:
1、新建ubi 卷:
ubimkvol /dev/ubi0 -N new_volume -s 3000KiB
其中new_volume 是新建的卷的名字,3000KiB 为大小,也可以是MiB
2、删除ubi 卷:
ubirmvol /dev/ubi0 -n $volume_id
volume_id 是要删除的卷的编号,ubi为每个卷都分配一个index,从0 开始
3、重命名ubi 卷
ubirename /dev/ubi0 volume1 volume2 volume3 volume4
把volume1 重命名为volume2,volume3 重名名为volume4
4、用可读可写的方式挂载ubi 卷,卷名为rootfs
mount -o rw -t ubifs ubi0:rootfs /mnt
5、用以在运行的时候,把整个系统的内容,备份到另一个卷,并采用zlib格式进行压缩
mount -o rw -t ubifs ubi0:rootfs /media
mkfs.ubifs -r /media /dev/ubi0_2 -x zlib -y yes
先把当前的rootfs分区挂载到一个空目录下面,然后把改目录下的文件写到另一个ubi 分区里面
6、使用ubifs文件更新整个卷
ubiupdatevol /dev/ubi0_2 rootfs.ubifs
rootfs.ubifs 是要写入的那个文件

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值