用 aria2 拯救传输错误的文件用 aria2 拯救传输错误的文件

因为有时候用的网络,是按照流量计费的。如果从自己的服务器上传输一个很大的文件回来,却发现文件哈希对不上,你会怎么办(后来才知道其实只是坏了几个字节)?

也许你会想到 BitTorrent 的种子,因为这是带有文件分块的校验码。也许你会说不是有些客户端支持 Web Peer 嘛,但是好像这些都挺麻烦的。这时候就有请 aria2c:

  • 支持 BitTorrent,HTTP/HTTPS/FTP/SFTP;
  • 可以通过 BitTorrent 协议之外的方式下载种子里的文件;
  • 断点续传、多线程。

所以,首先在服务器上用 rhash 计算哈希创建种子文件,然后把种子传输到本地,打开 aria2c 就行。

--torrent-file 指示 aria2 使用种子文件提供的信息,-s10 -x10 -k1M 让其对每个文件用 10 个链接、每个服务器开 10 个链接、最小切块 1MiB,--check-integrity=true 指示其检查现有文件的完整性,--seed-time=0 禁止其下载完成后做种(毕竟只是传输自己的文件罢了)。

1 2 3 4 5 6 7 8 9 10
server$ rhash --torrent test.zip
server$ ls test.zip*
test.zip
test.zip.torrent
local$ wget https://example.com/test.zip.torrent
local$ ls test.zip*
test.zip
test.zip.torrent
local$ aria2c --torrent-file=test.zip.torrent -s10 -x10 -k1M --check-integrity=true --seed-time=0 https://example.com/test.zip

其实这个方法,是今天在搜索如何让 aria2 通过 HTTP 下载一个种子的时候突然看到的。当时碰到的页面是 Aria2c with and without using torrent files - Rescuing a failed download,如果你有兴趣,也建议你读一读。

如果你还不知道 aria2,不要再犹豫了,借此机会好好了解一下吧。虽然平常似乎见到最多的地方不是桌面而是路由器上……

顺带一提,aria2 0.19.0 中加入了对 SFTP 的基本支持。只是基本支持,但是也支持通过 SFTP 的多线程和断点续传了,虽然目前还只能用用户名和密码来认证。Homebrew 里的公式还没有更新,不过我是建议你马上就用这个 Homebrew 公式立刻换上崭新的 aria2 0.19.0。所以说刚刚也可以不用 HTTPS 而是利用 SFTP 来更加安全地从服务器上传输文件回来,毕竟 SSH 服务器哪儿都有,HTTP(S) 还得找支持断点续传和支持认证/加密的服务器……


其实用 rsync 也能做到这件事,不过印象中不支持多线程啊,所以我并不喜欢。如果你有需要,可以读一读这篇文章:Force rsync to use delta transfer to fix corrupt remote file

1
rsync -Pa --checksum --inplace --no-whole-file local.file remote.server:

Version History版本历史

  • 9eb57d9 Add new post repair-file-chunks-with-aria2