linux - 写入磁盘镜像后是否需要运行 `sync`?

标签 linux linux-kernel filesystems

将图像写入磁盘的常用方法如下所示:

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 use BLKFLSBUF .
  • 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/

相关文章:

linux - 将某个日期之前创建的目录移动到另一个目录?

PHP shell tar 问题,返回代码 2

linux-kernel - NetFilter Hook 中的数据包处理?

Linux内核调度

编译单独的内核模块 (Debian/Ubuntu)

hadoop - HDFS 以外的文件系统是否支持 Hadoop 序列文件

c# - 在 C# 中使用自定义 Linux 驱动程序

c++ - 在 Mac/Linux 上查找已安装的应用程序

linux - 装载点不存在,即使文件夹存在。可以手动挂载

c++ - 为什么 fwrite 向我抛出访问冲突?