从
/dev/block/mmcblk0
读取返回旧数据,而从 /dev/block/mmcblk0p1
读取则给出最新数据。我的问题是,如果数据写入 /dev/block/mmcblk0
,Linux 是否会维护备份?这是因为我能够通过读取该节点来读取 SD 卡的旧内容。
Linux内核中的mmc子系统注册格式为
mmcblkXpY
的设备节点。
挂载指向分区的设备节点后即可进行正常的文件I/O。
另请注意,除非
/dev/mmcblkX
设备上存在有效的分区表,否则系统上不会有后续 /dev/mmcblkXpY
节点。
Linux 不维护备份。 它维护缓存。 这与特定的块设备或驱动程序无关(在您的情况下是
/dev/mmcblk*
),而是与块缓存的工作方式有关。
因此你的观察是正常的,但是很危险。(通常这不是问题,因为只有root才能找到这个“功能”。)
在 Linux 中,当涉及到缓存时,每个块设备在内核中都是独立处理的。 由于原始设备(在您的情况下为
/dev/mmcblk0
)和分区(dev/mmcblk0p1
)是不同的块设备,两者都有独立的缓存!
如果分区(
/dev/mmcblk0p1
)更新,当然分区的缓存也会更新,但是原始设备的缓存根本没有更新,因此它变得陈旧(从映射数据来看,缓存实例仍然被认为是新鲜的)。
如果您再次重新访问原始设备,只要缓存未刷新,就可能会返回仍然(过时)的缓存数据。
反之亦然,例如通过原始设备更新分区数据时。后者通常会杀死分区上的文件系统!
如果您想摆脱缓存,则需要在重新访问驱动器之前刷新所有缓存。 这有两个效果:
sync
是磁盘上的数据,因此如果强制将缓存中的脏数据移至文件系统(又称分区)。
echo 3 >/proc/sys/vm/drop_caches
但要小心。 之后活动分区仍然可能会快速变化。 并且您无法从原始设备读取分区缓存的脏数据,反之亦然。