我在一个shell脚本中使用blockdev --flushbufs /dev/mmcblk0p1
。
我假设它对原始块设备访问具有与同步相同的效果。
我想知道在blockdev --flushbufs
结束时,假设该设备的所有延迟写入都已完成是否安全?
(手册页提到ioctls,所以我认为它应该被阻塞?)
不幸的是,在emmc上,这件事不起作用(普通sd卡也是如此)。ioctl没有在上游驱动程序上实现。
到目前为止,我以为它会照它说的做,直到我意识到它什么都没做。
mmcqd不受ioctl BLKFLSBUF的影响,并处理队列中挂起的异步mmc请求。它需要付出代价,但如果在执行之后立即执行poweroff-f:blockdev—flushbufs或echo 3>/proc/sys/vm/drop_caches区块开发和文件系统不会在emmc或sd卡上完全同步。
blockdev --flushbufs
发送ioctl以刷新设备自己的写缓存(如果有的话),并且可能不可靠(该命令可能未在驱动程序、设备中实现,甚至在途中被截获)。它只会刷新操作系统已经发送到设备的数据,并确保这些数据已写入物理介质。
如果要同步已安装文件系统中的数据,可以使用sync()
或其变体之一。通常,应用程序本身应该关心将数据安全地同步到磁盘,并且在卸载文件系统时,操作系统也会刷新数据。
有关blockdev --flushbufs
和各种同步系统调用之间差异的更多详细信息,请参阅此答案。