将图像写入磁盘的常用方法如下所示:
dd if=file.img of=/dev/device
执行此命令后,是否需要运行sync
?
sync(2) 解释说它只刷新文件系统缓存。由于 dd
命令与任何文件系统无关,我认为没有必要运行 sync
。然而, block 层是复杂的和有疑问的,大多数人更喜欢运行sync
。
有没有人有证据证明它是有用的还是没用的?
最佳答案
TL;DR:在 dd
之后运行 blockdev --flushbufs/dev/device
。
我试图遵循内核中的不同路径。这是我的理解:
ioctl(block_dev, BLKFLSBUF, 0)
调用blkdev_flushbuf()
。考虑到它的名字,它应该刷新与设备相关的缓存(或者我认为你可以认为设备驱动程序中存在错误)。我认为它还应该负责刷新硬件缓存(如果存在)。公告e2fsprogs
useBLKFLSBUF
.fdatasync()
(和fsync()
)将调用blkdev_fsync()
。它看起来像blkdev_flushbuf()
但它只影响当前进程写入的数据范围(它使用filemap_write_and_wait_range()
而BLKFLSBUF
使用filemap_write_and_wait
).- 关闭 block 设备调用不刷新缓冲区的
blkdev_close()
。 sync()
将调用sync_fs()
。它将刷新文件系统缓存并在底层 block 设备上调用fsync()
。- 命令
sync/dev/device
将在/dev/device
上调用fsync()
。但是,我认为它没有用,因为dd
没有触及任何文件系统。
所以我的结论是调用sync
对 block 设备没有(直接)影响。但是,将 fdatasync
(或 fsync
)传递给 dd
是保证数据正确写入媒体的唯一方法.
如果您运行了 dd
但错过了 fdatasync
,运行 sync/dev/device
是不够的。您必须在整个设备上使用 fdatasync
运行 dd
。或者,您可以调用 BLKFLSBUF
来刷新整个设备。不幸的是,没有标准的命令。
编辑
您可以使用 blockdev --flushbufs/dev/device
发出 BLKFLSBUF
。
关于linux - 写入磁盘镜像后是否需要运行 `sync`?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49489798/