我正在使用此管道将图像文件写入驱动器$drive
:
wget -o logfile -O - https://route/to/image.gz | \
gunzip -c | \
dd of="$drive" bs=4M conv=fdatasync 2>/dev/null
logfile
是为了跟踪进度而创建的。
我对此有一种不祥的预感,无法说服自己这是万无一失的。图像本身总是 4MB 的倍数,所以这不是问题,但dd
可能会造成问题(例如,请参阅此U&L 答案)。
是我太偏执了吗,或者有更好的方法可以做到这一点?
编辑
根据评论(感谢),我对head -c
和dd bs=1
将图像写入驱动器进行了基准测试。TL;DR:dd
在这个应用程序中基本上毫无意义。远程服务器上的图像通过 gzip 压缩到大约 46M,因此dd
与一起使用bs=1
,所以这对来说可能有点不公平dd
。使用检索图像wget
,动态压缩,然后使用head -c
或写入驱动器dd bs=1
:
选项 1:
# time wget -o logfile -O - https://path/to/foo.img.gz | \
gunzip -c | \
dd of=/dev/sda bs=1 conv=fdatasync 2>/dev/null
real 1m55.665s
user 0m32.323s
sys 2m20.841s
选项 2:
# time wget -o logfile -O - https://path/to/foo.img.gz | \
gunzip -c | \
cat > /dev/sda 2>/dev/null
real 0m7.419s
user 0m0.646s
sys 0m0.507s
通过获取驱动器的前 48159047 个字节md5sum
对这两个选项进行了测试sha256sum
,并且都给出了正确的预压缩md5sum
,并sha256sum
在服务器上找到了:
# time head -c 48159047 /dev/sda | md5sum
b3df12b61df3121ad112f825cc6fe8b7 -
real 0m0.222s
user 0m0.075s
sys 0m0.049s
# time dd status=none if=/dev/sda bs=1 count=48159047 | md5sum
b3df12b61df3121ad112f825cc6fe8b7 -
real 1m31.627s
user 0m49.218s
sys 1m45.406s
结果sha256sum
大致相同: 的实际时间约为 0.25 秒head -c
, 的实际时间约为 1 分 32 秒dd
。