所以,这是基本问题,我需要将 qcow2 映像分发到一堆远程计算机;没什么大不了的,对吧?嗯,复杂的是,其中一些恰好依赖于 4/5G 调制解调器,每晚下载 5-10G 是行不通的。
我在下面提出的解决方案效果非常好,但感觉不是最好的方法。还有其他人有更好的解决方案吗?
远程哈希:
#!/bin/bash
RX_AMT=1 # How many kilobytes to recv
RX_OFFSET=0 # How many kilobytes to skip
# Create Temporary files
FILE_HEADERS=$(tempfile)
HASH_FILE=$(tempfile)
# Read the first RX_AMT Kb from the remote file,
# And set the target download rate to RX_AMT/Second
curl -m 30 --limit-rate ${RX_AMT}k \
-C $(( $RX_OFFSET * 1024 )) \
-LD $FILE_HEADERS \
-so /dev/stdout "$@" | \
head -c $(( $RX_AMT * 1024 )) > $HASH_FILE
# Append the headers you expect will change when the file does,
# such as content-size or filename to the hash file
egrep -i 'content-length|location|filename' $FILE_HEADERS | \
grep -v '[.]boxcloud[.]' >> $HASH_FILE
# boxcloud addresses are nonces, so we dump them
# Return the sha256 of the hash file,
# trimming off everything training the hash
sha256sum < $HASH_FILE | sed -r "s/ *- *$//"
# Best effort to clean up our temporary files
rm $FILE_HEADERS $HASH_FILE 2> /dev/null
目前,我正在使用该脚本的输出来检查远程文件是否已更改,而无需实际下载整个文件。我正在下载的文件是加密的,因此我很可能通过检查几个块来检测到存档的任何更改。对于我来说,单独的文件大小也不是一个好的衡量标准,我正在即时提取此存档,而不是将其存储在任何地方(另外,它是加密的,因此它的长度只会因blocksize_chunks而变化)