dd 如何与 oflag 和 conv 参数一起工作?

dd 如何与 oflag 和 conv 参数一起工作?

在以下链接中

为了swap file调整大小,dd命令的使用方法如下:

sudo dd if=/dev/zero of=/swapfile bs=1M count=1024 oflag=append conv=notrunc

问题:

  • oflag和参数如何conv工作?
  • 应该预期新的块具有良好的连续性,并在当前大小上添加零swap file

笔记以防 Ubuntu20.04

答案1

手册dd描述得不是oflag很好,但是来自@guiverc 的这个答案解释得很好:

Write in append mode, so that even if some other process is
writing to this file, every ‘dd’ write will append to the
current contents of the file.  This flag makes sense only for
output.  If you combine this flag with the ‘of=FILE’ operand,
you should also specify ‘conv=notrunc’ unless you want 

conv=notruc部件在注释中明确提及oflag,它告诉系统不是截断现有文件。我在 Ubuntu 特定手册中找不到任何有价值的东西,但是这个 StackOverflow 答案对该标志的解释如下:

If the file already exists and is a regular file and the open mode allows
writing (i.e., is O_RDWR or O_WRONLY) it will be truncated to length 0. If
the file is a FIFO or terminal device file, the O_TRUNC flag is ignored.
Otherwise the effect of O_TRUNC is unspecified.

本质上,现有文件不会减少到 0 字节,而是保持现有数据不变,并将新数据以连续的方式附加到文件末尾。

然而,这应该引发一个问题:如果在交换文件扩展时要占用的空间中存在一个文件,会发生什么情况?

这就是事情变得有趣的地方。

因为你告诉系统要制作该文件连续的,如果在旋转磁盘驱动器上,有另一个文件阻碍了文件的自然扩展,则整个文件将被移动到有足够连续空间来支持该文件的位置。如果磁盘碎片严重,空间不足,No space left on device则会抛出错误。然而,在固态磁盘上,这不是问题,文件将拥有应用于现有文件的额外空间,即使这些0位存储在单独的闪存模块中。

笔记:参见 Mark G. Sobell 的(非常古老的)Ubuntu Linux 实用指南了解更多信息。

因此,这么说吧:

问:oflag 和 conv 参数如何工作?

往上看。

问:在交换文件的当前大小中添加零个新块时,是否应该预期其具有良好的连续性?

是的。请参见上文。

相关内容