从 /dev/block/mmcblk0 读取返回旧数据,而从 /dev/block/mmcblk0p1 读取则返回最新数据。我的问题是,如果数据写入 /dev/block/mmcblk0,linux 是否会维护备份?这是因为我能够通过读取该节点来读取 SD 卡的旧内容。
2 回答
Linux 内核中的 mmc 子系统注册格式为 的设备节点mmcblkXpY
。
- 在 Linux 内核中注册的每个 mmc 设备都会收到它自己的 mmc 设备编号X。
- 特定设备上的每个分区都有自己的编号Y
挂载指向分区的设备节点后,可以进行普通文件 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
但要小心。活动分区之后仍可能快速更改。而且您无法从原始设备读取分区缓存的脏数据,反之亦然。