使用 `pv` 写入磁盘似乎一开始很快,最后很慢

Mul*_*ync 1 command-line disk-image

我正在使用此命令将 Kubuntu 图像写入我的 U 盘

pv /home/manuel/Downloads/torrents/kubuntu-16.10-desktop-amd64.iso > /dev/sdb
Run Code Online (Sandbox Code Playgroud)

然而,输出进度条pv从一开始就被填满了一半。因此,看起来传输会以令人难以置信的速度开始并大幅减慢。

1,49GiB 0:03:03 [8,31MiB/s] [===============// //===============>] 100%
Run Code Online (Sandbox Code Playgroud)

这使得使用该pv命令相当无用。

如何禁用此似乎已激活的缓存功能?

小智 6

我在调查尝试将图像写入 SD 卡(通过 USB 读/写器)的类似问题时发现了您的帖子。使用 pv,它几乎会立即显示 100%,但之后需要几分钟才能真正完成。

我找到了使用dd,pv和管道并将写入 dd 设置为直接模式的问题的解决方案。这也有很大的提高写入速度的效果。我不知道使用这种方法是否有任何缺点(我读回了图像并执行了校验和 - 一切看起来都没有问题)。

我的示例是使用 raspbian (2017-09-07-raspbian-stretch-lite.img) 的图像,其大小为 1854590976 字节 (1.8GB)。我已经展示了其他几种方法,您可以看到所用时间的差异。

所以,使用dd | pv | dd直接模式,只用了 2 分 57 秒:

dd if=2017-09-07-raspbian-stretch-lite.img ibs=1M status=none | pv -s 1854590976 | dd of=/dev/sdX obs=1M oflag=direct status=none
Run Code Online (Sandbox Code Playgroud)

(将 status 设置为 none 会阻止显示dd混乱pv)。

单独使用pv立即显示 100%,但实际完成需要 8 分 28 秒:

pv 2017-09-07-raspbian-stretch-lite.img > /dev/sdX
Run Code Online (Sandbox Code Playgroud)

dd在没有任何进度视图的情况下单独使用,耗时 8 分 15 秒:

dd if=2017-09-07-raspbian-stretch-lite.img of=/dev/sdX bs=1M
Run Code Online (Sandbox Code Playgroud)

使用上述相同dd但添加oflag=direct使其成为 2 分钟 54:

dd if=2017-09-07-raspbian-stretch-lite.img of=/dev/sdX bs=1M oflag=direct
Run Code Online (Sandbox Code Playgroud)

我尝试了多种不同的组合,它们要么慢得多(有些需要长达 12 分钟!),要么再次立即显示 100%。

使用pv这种方式的一个警告是,您需要先找出图像的大小,并使用-s选项指定它。如果你像我一样编写脚本,同时确定文件大小很容易。

希望它可以帮助某人。