dd if=/dev/zero of=25GBfile bs=1G count=25 conv=fdatasync status=progress
dd
命令中的 conv=fdatasync
参数是一个用于控制写入数据时同步磁盘的选项。下面是对这个参数的详细解释:
🧾 基本语法示例:
dd if=/dev/zero of=test.img bs=1G count=1 conv=fdatasync
这条命令的意思是:
- 从
/dev/zero
读取 1 个块(block),每个块大小为 1G。 - 写入到
test.img
文件中。 - 写入后 使用
fdatasync()
系统调用 把数据(但不一定包括元数据)强制刷入磁盘。
✅ conv=fdatasync
的作用
- 在
dd
命令执行 完成写入后,通过fdatasync()
同步文件数据到磁盘。 - 保证数据写入操作不仅停留在内存页缓存中,而且实际落盘,提升数据持久性和安全性。
🔍 与其他选项比较:
参数 | 说明 |
---|---|
conv=sync | 对每个输入块进行填充,以保证输出块大小一致 |
conv=fsync | 使用 fsync() 刷新数据和元数据到磁盘(更彻底) |
conv=fdatasync | 使用 fdatasync() 只刷新数据(不强制刷新元数据) |
oflag=direct | 使用直接 I/O(绕过文件系统缓存),实现落盘 |
🚨 注意事项
conv=fdatasync
是在 写入完成之后 执行一次同步,不是每个块都同步。- 如果你更关注数据完整性并且还希望元数据(如修改时间)也一并落盘,可以用
conv=fsync
。 - 如果你对写入性能非常敏感(如压测),慎用这个选项,因为它会显著增加 I/O 时间。
📌 常见用途
- 文件系统或磁盘性能测试时,为了获得更真实的写入耗时:
dd if=/dev/zero of=testfile bs=1G count=1 oflag=direct
# 或者
dd if=/dev/zero of=testfile bs=1G count=1 conv=fdatasync
- 防止写入数据因断电或系统崩溃未能及时落盘。
如需我演示一个对比测试(有无 conv=fdatasync
的时间差),可以帮你写脚本。需要吗?