首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何防止dd的进程在Linux上变得毫无意义?

如何防止dd的进程在Linux上变得毫无意义?
EN

Unix & Linux用户
提问于 2017-07-21 13:44:45
回答 3查看 4.3K关注 0票数 11

当运行dd命令在Linux上复制ISO时,我会得到一个单独的进度打印,它将保持长时间(多分钟)的打开状态。最后再来一次。

问题似乎是正在使用一个非常大的缓存,这混淆了dd的S输出。

代码语言:javascript
运行
复制
sudo dd bs=4M if=my.iso of=/dev/sdc status=progress

输出(第一行显示了很长时间)。

代码语言:javascript
运行
复制
1535115264 bytes (1.5 GB, 1.4 GiB) copied, 1.00065 s, 1.5 GB/s
403+1 records in
403+1 records out
1692844032 bytes (1.7 GB, 1.6 GiB) copied, 561.902 s, 3.0 MB/s

是否有办法防止这种情况发生,从而使进度输出有意义?

EN

回答 3

Unix & Linux用户

回答已采纳

发布于 2017-07-21 14:19:45

从第一行我们可以看出,dd在一秒内读写了1.5GB。即使是SSD也不能写得那么快。

所发生的情况是/dev/sdc块设备接受了它(写回),但没有将它发送到磁盘,而是以磁盘能够接受的速率缓冲它并开始写入磁盘。有点像3 3MiB/s。

系统不能像这样无限期地缓冲数据,在未提交的脏状态下,只有那么多的数据才能被接受。因此,过了一段时间(在您的例子中,写了超过1.5GB,但已经过了不到2秒(因为每秒钟写入进度行)之后,dd的S write()系统调用将被阻塞,直到数据被刷新到磁盘(在此期间它不能写入进度消息)。当它通过时,dd可以发送少数丢失的兆字节,这发生在不到一秒钟的时间内,所以您只能得到一条额外的进度行。

要查看不同的行为,可以强制写入是同步的,除非数据已提交到磁盘,否则不会返回。例如,通过使用oflag=syncoflag=dsyncoflag=direct (但我不建议这样做)。

票数 18
EN

Unix & Linux用户

发布于 2019-01-03 17:12:35

当您将文件写入块设备时,请使用ddoflag=direct。这使用了O_DIRECT写操作,这避免了将RAM用作写回缓存。注意,为了获得良好的性能,oflag=direct通常需要很大的块大小。

这将避免看到不可能的快速进展,除非您有一个奇怪的设备本身有一个非常大的内存缓存

很多设备都有少量的缓存。在这种情况下,oflag=direct将显示出实际的进展速度。这是更有意义的,但它并没有告诉你你想知道的一切:-)。当dd说它完成时,它不能保证最后一次写入完成。通过使用conv=fsync选项,您可以确保所有写入都完成了--并检查是否有任何写入错误。这将在末尾调用fsync(),以确保缓存被刷新。下面是一个示例:

代码语言:javascript
运行
复制
dd if=my.iso of=/dev/sdc oflag=direct bs=4M status=progress conv=fsync

有些人在运行sync命令之后会运行,这是可以理解的,而且不必费心记住conv=fsync。这不太好。sync不会报告其中一个写入是否失败。

如果设备具有非常大的RAM缓存,则必须使用oflag=direct,sync。但通常我认为oflag=sync是影响性能的潜在障碍。您可能希望进一步增加块大小,以减少缓存刷新的频率。在这样做非常同步的IO和读取多个硬件块时,您可能希望使用双缓冲来保持良好的性能,如下面的链接所示,使用第二个dd命令。

有时,您还可能希望从另一个程序(如gunzip )中传输磁盘映像。在这种情况下,良好的性能还取决于iflag=fullblock和通过另一个dd命令的管道。答案中有一个完整的例子:为什么一条通往dd管道的拉链在最后会减速呢?

票数 6
EN

Unix & Linux用户

发布于 2020-04-04 04:30:21

你在使用什么Linux?如果是基于Debian的(Ubuntu,Mint,Debian等等)我会用一个叫做磁盘的程序。它是一个内置的基于GUI磁盘的管理器,可以执行与DD相同的操作,并提供一致的状态。

票数 -1
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/379947

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档