MTD

Memory Technology Device,内存技术设备

/dev/mtdN

字符设备,支持ioctl,MEMGETINFO,MEMERASE等,mtd-utils(用于进行mtd操作的工具集,包含flash_eraseall等工具)就是以此实现的。mtd字符设备主设备号90。

/dev/mtdblockN

块设备,可以在块设备上创建文件系统,不提供ioctl方法,无法使用nandwrite,flash_eraseall,flash_erase等工具进行操作。mtd块设备主设备号31。只读块设备。貌似无法通过dd来写入。

实际上mtdN和mtdblockN是一个MTD分区,只是提供给上层的视图不同,因为mount、umount命令只能挂在块设备(有文件系统),mtd-utils工具(flash_erase等)只能通过字符设备来交互。

常用命令 - 挂载信息

mount

类似/proc/mounts,下面有

rootfs on / type rootfs (rw)
/dev/root on /mnt/.cramfs type cramfs (ro,relatime)
/dev/mmcblk1p1 on / type ext2 (rw,noatime,errors=continue)
proc on /proc type proc (rw,relatime)
ramfs on /tmp type ramfs (rw,relatime)
sysfs on /sys type sysfs (rw,relatime)
usbfs on /proc/bus/usb type usbfs (rw,relatime)
mdev on /dev type tmpfs (rw,relatime)
devpts on /dev/pts type devpts (rw,relatime,mode=600)
/dev/mmcblk1p3 on /mnt/mmcblk1p3 type vfat (ro,relatime,fmask=0022,dmask=0022,codepage=cp437,iocharset=iso8859-1,shortname=mixed,errors=remount-ro)

/proc/partitions

查看mtd块设备的大小,一个block是1KB:cat /proc/partitions

major minor  #blocks  name

  31        0       4608 mtdblock0
  31        1       2176 mtdblock1
  31        2         64 mtdblock2
  31        3         64 mtdblock3
  31        4         64 mtdblock4
  31        5        512 mtdblock5
  31        6         64 mtdblock6
  31        7         64 mtdblock7
  31        8       8192 mtdblock8
  31        9         64 mtdblock9
  31       10        320 mtdblock10
 179        0    3866624 mmcblk1
 179        1     250480 mmcblk1p1
 179        2     250488 mmcblk1p2
 179        3    1000440 mmcblk1p3
 179        4    1953504 mmcblk1p4

/etc/fstab

预先写好的挂载文件,开机后按自动该文件挂载目录。

# <file system>	<mount pt>	<type>	<options>		<dump>	<pass>
none		/proc		proc	defaults		0	0
none		/dev/pts	devpts	defaults		0	0
none		/sys		sysfs	defaults		0	0
none		/dev/shm	tmpfs	defaults		0	0
none		/proc/bus/usb	usbfs	defaults		0	0

# these are for read-only root:
none		/tmp		tmpfs	defaults,mode=1777	0	0
none		/var/run	tmpfs	defaults		0	0
/dev/mtdblock3	/mnt/rootdata	cramfs	defaults		0	0

# writable flash
mtd:spi_jffs2	/mnt/rwflash	jffs2	defaults		0	0
mtd:spi_reserve	/mnt/mpflash	jffs2	defaults		0	0

# writable overlays
/mnt/rwflash/config	/etc/config	none	defaults,bind	0	0
/mnt/rwflash/mail	/etc/mail	none	defaults,bind	0	0

/mnt/rwflash/snmp	/etc/snmp	none	defaults,bind	0	0

none            /root           tmpfs   defaults,mode=1777      0       0
none            /sys/kernel/debug       debugfs defaults        0       0
pvgnas02:/users	/home	nfs 	noauto,tcp,soft,intr,nolock	0	0

/proc/mtd

查看mtd设备分区情况:cat /proc/mtd

dev:    size   erasesize  name
mtd0: 00040000 00010000 "spi_boot"
mtd1: 001c0000 00010000 "spi_kernel"
mtd2: 01100000 00010000 "spi_root"
mtd3: 00b80000 00010000 "spi_rootdata"
mtd4: 00090000 00010000 "spi_jffs2"
mtd5: 000d0000 00010000 "spi_reserve"
mtd6: 00020000 00010000 "spi_bootenv"

/proc/mounts

查看当前分区的挂载情况

rootfs / rootfs rw 0 0
/dev/root / cramfs ro,relatime 0 0
none /proc proc rw,relatime 0 0
none /dev tmpfs rw,relatime 0 0
/tmpfs /mnt/rwflash tmpfs rw,relatime 0 0
/dev/mtdblock4 /mnt/rwflashphy jffs2 rw,relatime 0 0
none /dev/pts devpts rw,relatime,mode=600 0 0
none /sys sysfs rw,relatime 0 0
none /dev/shm tmpfs rw,relatime 0 0
none /proc/bus/usb usbfs rw,relatime 0 0
none /tmp tmpfs rw,relatime,mode=1777 0 0
none /var/run tmpfs rw,relatime 0 0
/dev/mtdblock3 /mnt/rootdata cramfs ro,relatime 0 0
mtd:spi_reserve /mnt/mpflash jffs2 rw,relatime 0 0
/tmpfs /etc/config tmpfs rw,relatime 0 0
/tmpfs /etc/mail tmpfs rw,relatime 0 0
/tmpfs /etc/snmp tmpfs rw,relatime 0 0
none /root tmpfs rw,relatime,mode=1777 0 0
none /sys/kernel/debug debugfs rw,relatime 0 0

df -h -T

查看已经挂载的分区和文件系统类型

Filesystem                Size      Used Available Use% Mounted on
/dev/root                22.8M     22.8M         0 100% /
/dev/mtdblock4          576.0K    288.0K    288.0K  50% /mnt/rwflashphy
/dev/mtdblock3           11.2M     11.2M         0 100% /mnt/rootdata
mtd:spi_reserve         832.0K    244.0K    588.0K  29% /mnt/mpflash

mountpoint

判断当前目录是否为挂载点
选项:
-q:不打印任何信息;
-d:打印文件系统的主设备号和次设备号;
-x:打印块数设备的主设备号和次设备号。

fdick -l

显示出所有挂载和未挂载的分区,但不显示文件系统类型。

Disk /dev/mtdblock0: 4 MB, 4718592 bytes
255 heads, 63 sectors/track, 0 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

Disk /dev/mtdblock0 doesn't contain a valid partition table

Disk /dev/mtdblock10: 0 MB, 327680 bytes
255 heads, 63 sectors/track, 0 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

Disk /dev/mtdblock10 doesn't contain a valid partition table

parted -l

查看未挂载的文件系统类型,以及哪些分区尚未格式化。

lsblk -f

查看未挂载的文件系统类型。

常用命令 - MTD操作

flash_erase

用于清除设备中的块
flash_erase MTD-device [start] [cnt (# erase blocks)] [lock]

flash_eraseall

擦除指定设备上的所有块

Usage: flash_eraseall [OPTION] MTD_DEVICE
Erases all of the specified MTD device.

  -j, --jffs2    format the device for jffs2
  -q, --quiet    don't display progress messages
      --silent   same as --quiet
      --help     display this help and exit
      --version  output version information and exit

flashcp

向指定的设备写文件,与dd命令不同,对坏块是安全的,提供了许多错误检测属性

BusyBox v1.19.3 (2017-04-19 10:54:20 CST) multi-call binary.

Usage: flashcp -v FILE MTD_DEVICE

Copy an image to MTD device

	-v	Verbose

nandwrite

用于把文件写入nand flash
nandwrite [OPTION] MTD_DEVICE [INPUTFILE|-]

读取与写入

读取

通过cat读取(通过网络发送走了):cat /dev/mtdblock2 | nc 192.156.13.235 5555
通过dd读取(未验证):dd if=/dev/mtdblock2 | nc 192.168.1.30 5555

写入

写入命令:flashcp -v /var/run/viewer/media/folder/sda4/mtd2new /dev/mtd2 2>&1
效果:

Erasing block: 148/148 (100%) 
Writing kb: 9432/9440 (99%) 
Verifying kb: 9432/9440 (99%)

参考链接

[Android] 查看MTD,EMMC,MMC三种设备的分区
How To Use MTD

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐