从 /dev/block/mmcblk0 和 /dev/block/mmcblk0p1 读取的区别

问题描述 投票:0回答:2

/dev/block/mmcblk0
读取返回旧数据,而从
/dev/block/mmcblk0p1
读取则给出最新数据。我的问题是,如果数据写入
/dev/block/mmcblk0
,Linux 是否会维护备份?这是因为我能够通过读取该节点来读取 SD 卡的旧内容。

linux file-io filesystems linux-kernel linux-device-driver
2个回答
19
投票

Linux内核中的mmc子系统注册格式为

mmcblkXpY
的设备节点。

  • 在 Linux 内核中注册的每个 mmc 设备都会收到自己的 mmc 设备号 X
  • 特定设备上的每个分区都会收到自己的编号 Y

挂载指向分区的设备节点后即可进行正常的文件I/O。

另请注意,除非

/dev/mmcblkX
设备上存在有效的分区表,否则系统上不会有后续
/dev/mmcblkXpY
节点。


1
投票

Linux 不维护备份。 它维护缓存。 这与特定的块设备或驱动程序无关(在您的情况下是

/dev/mmcblk*
),而是与块缓存的工作方式有关。

因此你的观察是正常的,但是很危险。(通常这不是问题,因为只有root才能找到这个“功能”。)

在 Linux 中,当涉及到缓存时,每个块设备在内核中都是独立处理的。 由于原始设备(在您的情况下为

/dev/mmcblk0
)和分区(
dev/mmcblk0p1
)是不同的块设备,两者都有独立的缓存

如果分区(

/dev/mmcblk0p1
)更新,当然分区的缓存也会更新,但是原始设备的缓存根本没有更新,因此它变得陈旧(从映射数据来看,缓存实例仍然被认为是新鲜的)。

如果您再次重新访问原始设备,只要缓存未刷新,就可能会返回仍然(过时)的缓存数据。

反之亦然,例如通过原始设备更新分区数据时。

后者通常会杀死分区上的文件系统!

如果您想摆脱缓存,则需要在重新访问驱动器之前刷新所有缓存。 这有两个效果:

  • 刷新也

    sync

    是磁盘上的数据,因此如果强制将缓存中的脏数据移至文件系统(又称分区)。

  • 刷新还会清除原始块设备上旧的缓存数据。

冲洗完成:

echo 3 >/proc/sys/vm/drop_caches
但要小心。  之后活动分区仍然可能会快速变化。  并且您无法从原始设备读取分区缓存的脏数据,反之亦然。

© www.soinside.com 2019 - 2024. All rights reserved.