12

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

4

2 回答 2

17

Linux 内核中的 mmc 子系统注册格式为 的设备节点mmcblkXpY

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

挂载指向分区的设备节点后,可以进行普通文件 I/O。

另请注意,除非/dev/mmcblkX设备上存在有效的分区表,否则系统上将没有后续/dev/mmcblkXpY节点。

于 2014-02-13T10:59:17.920 回答
0

Linux 不维护备份。 它维护一个缓存。这与特定的块设备或驱动程序(/dev/mmcblk*在您的情况下)无关,而是与块缓存的工作方式有关。

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

在 Linux 中,每个块设备在缓存方面都是在内核中独立处理的。由于原始设备(在您的情况下/dev/mmcblk0)和分区(dev/mmcblk0p1)是不同的块设备,它们都有独立的缓存

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

如果您随后再次重新访问原始设备,则可能会返回仍然(陈旧)缓存的数据,只要缓存没有被刷新。

反之亦然,例如通过原始设备更新分区数据时。 后者通常会杀死分区上的文件系统!

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

  • 刷新也是sync磁盘上的数据,因此如果将缓存中的脏数据强制到文件系统(又名分区)。

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

冲洗是通过以下方式完成的:

echo 3 >/proc/sys/vm/drop_caches

但要小心。活动分区之后仍可能快速更改。而且您无法从原始设备读取分区缓存的脏数据,反之亦然。

于 2021-10-01T19:19:03.473 回答