aria2 中文手册(一)-详细介绍、编译、交叉编译

文章信息均来自 aria2 官网:aria2 和 开源仓库:https://github.com/aria2/aria2

👾 aria2 是什么?

  • aria2 是一个轻量级、多协议、多数据源的下载工具
  • aria2 支持的协议 HTTP/HTTPSFTPSFTPBitTorrentMetalink
  • aria2 可以从多个来源/协议下载文件,并尝试利用您的最大下载带宽,它支持同时从 HTTP(S)/FTP/SFTP 和 BitTorrent 下载文件,而从 HTTP(S)/FTP/SFTP 下载的数据上传到 BitTorrent 群,可以使用 Metalink 自动验证来自像 BitTorrent 文件这样的数据块;
  • aria2 的使用者可以通过内置的 JSON-RPCXML-RPC 服务进行操作,在操作时可以使用密钥保证操作者是有权限的;

⬇️ 下载 aria2 的方法

在 aria2 仓库中发行的版本:aria2 最新发行版

你可以直接下载适用于 Windows 和 Android 的源代码分发和二进制文件。

✨ aria2 特点

  • 命令行界面
  • 支持 HTTP(S)、FTP、SFTP 和 BitTorrent 下载文件
  • 分段下载
  • 支持 Metalink version 4 (RFC 5854)(HTTP/FTP/SFTP/BitTorrent)
  • 支持 Metalink version 3.0 (HTTP/FTP/SFTP/BitTorrent)
  • 支持 Metalink/HTTP (RFC 6249)
  • 实现 HTTP/1.1
  • 支持 HTTP 代理
  • 支持 HTTP Basic Authentication(HTTP基本认证)
  • 支持 HTTP Proxy authentication(HTTP代理认证)
  • 支持目前已知的代理环境变量,http_proxy https_proxy ftp_proxy all_proxyno_proxy
  • 支持 HTTP gzip、deflate 内容编码
  • 支持验证 HTTS 给定的 CA 证书
  • 支持分块传输编码
  • 支持从 Firefox3、Chromium、Google Chrome 和 Mozilla / Firefox(1.x / 2.x)/ Netscape格式中获取 Cookie
  • 支持以 Mozilla/Firefox (1.x/2.x)/Netscape 格式保存 Cookie
  • 支持自定义 HTTP 标头
  • 支持持久链接
  • 支持通过 HTTP 代理的 FTP/SFTP
  • 限制上传/下载速度
  • BitTorrent 扩展:Fast extension, DHT, PEX, MSE/PSE, Multi-Tracker, UDP tracker
  • BitTorrent WEB-Seeding。aria2 请求大于 piece size 的 chunks 以减少请求开销。它还支持 piece size 的流水线请求。
  • BitTorrent Local Peer Discovery
  • 重命名/更改下载完成的 BitTorrent 目录结构
  • 支持 JSON-RPC (通过 HTTP 和 WebSocket)/XML-RPC 服务接口
  • 支持作为守护进程运行
  • 支持在 multi-file torrent/Metalink 中选择下载
  • 支持 Metalink 中的块校验和验证
  • 支持在 Metalink 中禁用分段下载
  • 支持 Netrc
  • 支持配置文件
  • 支持下载在文本文件和 stdin 中获取的 URIs,可以选择指定输出目录和文件名称
  • 支持 Parameterized URI
  • 支持 IPV6
  • 支持 磁盘缓存以减少磁盘使用

🍂 版本控制和发布计划

我们对 aria2 版本使用 3 段数字:主要.次要.补丁。我们将在每月 15 号发布次要更新,如果自上次发布以来没有任何更改,我们可能会跳过一个版本。

如果我们遇到安全问题,我们可能会在常规版本之间发布 补丁 版本。

主要版本号我们暂时停留在 1 上。

🦋 许可证

这个程序是自由软件;您可以根据自由软件基金会发布的 GNU 通用公共许可证的条款重新分发和/或修改它;许可证的版本 2,或(由您选择)任何更高版本。

🐎 使用示例

命令行吓到你了?不要慌,aria2 真的很容易使用。

从 WEB 下载文件:

1
aria2c http://example.org/mylinux.iso

一次性使用不同的协议下载多个文件:

1
aria2c http://a/f.iso ftp://b/f.iso

每个 Host 使用两个链接下载:

1
aria2c -x2 http://a/f.iso

BitTorrent:

1
aria2c http://example.org/mylinux.torrent

BitTorrent 磁力链接:

1
aria2c 'magnet:?xt=urn:btih:248D0A1CD08284299DE78D5C1ED359BB46717D8C'

Metalink:

1
aria2c http://example.org/mylinux.metalink

下载文本文件中的 URIs:

1
aria2c -i uris.txt

怎么获取源代码?

我们在Github上维护源代码:https://github.com/aria2/aria2

若要获取最新的源代码,请运行以下命令:

1
git clone https://github.com/aria2/aria2.git

这将在当前目录中创建 aria2 目录,源文件将存储在那里。

依赖

特点 依赖
HTTPS OSX or GnuTLS or OpenSSL or Windows
SFTP libssh2
BitTorrent None. Optional: libnettle+libgmp or libgcrypt or OpenSSL (see note)
Metalink libxml2 or Expat.
Checksum None. Optional: OSX or libnettle or libgcrypt or OpenSSL or Windows (see note)
gzip, deflate in HTTP zlib
Async DNS C-Ares
Firefox3/Chromium cookie libsqlite3
XML-RPC libxml2 or Expat.
JSON-RPC over WebSocket libnettle or libgcrypt or OpenSSL

注意

如果安装了两个库,则 libxml2 优先于 Expat。如果您更喜欢 Expat,请运行 --without-libxml2

注意

在 Apple OSX 上支持系统级的 SSL/TLS。因此,在该平台上既不需要 GNUTL 也不需要 OpenSSL 。如果要禁用此行为,请运行 --without-appletls

如果安装了两个库,则 GnuTLS 优先于 OpenSSL。如果您喜欢 OpenSSL,请运行 --without-gnutls --with-openssl

在 Windows 上,可以使用基于本机 Windows SSL 功能(Schannel)的 SSL 实现,这将是首选。因此,在该平台上既不需要 GNUTL 也不需要 OpenSSL 。如果要禁用此行为,请运行 --without-wintls

注意

在 Apple OSX 上,系统级校验和支持将是首选,除非 aria2 配置为 --without-appletls

如果安装了两个库,则 libnettle 优先于 libgcrypt。如果您更喜欢 libgcrypt,请运行--without-libnettle --with-libgcrypt。如果在 GNUTL 上选择 OpenSSL,则不会使用 libnettle 或 libgcrypt。

如果没有安装任何可选依赖项,则将使用仅支持 md5 和 sha1 的内部实现。

在 Windows 上,可以使用基于本机 Windows 功能的 SSL 实现,除非 aria2 配置为 --without-wintls

用户可以具有以下 SSL 和 crypto libraries 配置之一:

  • OpenSSL
  • GnuTLS + libgcrypt
  • GnuTLS + libnettle
  • Apple TLS (OSX only)
  • Windows TLS (Windows only)

在运行时可以提供--disable-bittorrent和 --disable-metalink 来禁用 BitTorrent 和 Metalink 的支持。

为了启用异步 DNS 支持,你需要 c-ares。

如何构建(build)

aria2 主要用 C++ 编写,最初它是基于 C++98/C++03 标准特性编写的。我们现在正在将 aria2 迁移到 C++11 标准。当前的源代码需要支持 C++11 的编译器。对于众所周知的编译器,例如 g++ 和clang,必须支持 or flag。-std=c++11-std=c++0x

为了从源软件包构建 aria2,您需要以下开发软件包(软件包名称可能因您使用的发行版而异):

  • libgnutls-dev (Required for HTTPS, BitTorrent, Checksum support)
  • nettle-dev (Required for BitTorrent, Checksum support)
  • libgmp-dev (Required for BitTorrent)
  • libssh2-1-dev (Required for SFTP support)
  • libc-ares-dev (Required for async DNS support)
  • libxml2-dev (Required for Metalink support)
  • zlib1g-dev (Required for gzip, deflate decoding support in HTTP)
  • libsqlite3-dev (Required for Firefox3/Chromium cookie support)
  • pkg-config (Required to detect installed libraries)

您可以使用 libgcrypt-dev 而不是 nettle-dev 和 libgmp-dev:

  • libgpg-error-dev (Required for BitTorrent, Checksum support)
  • libgcrypt-dev (Required for BitTorrent, Checksum support)

您可以使用 libssl-dev 而不是 libgnutls-dev、nettle-dev、libgmp-dev、libgpg-error-dev 和 libgcrypt-dev:

• libssl-dev (Required for HTTPS, BitTorrent, Checksum support)

您可以使用 libexpat1-dev 而不是 libxml2-dev:

• libexpat1-dev (Required for Metalink support)

在 Fedora 上,您需要以下软件包:gcc, gcc-c++, kernel-devel, libgcrypt-devel, libxml2-devel, openssl-devel, gettext-devel, cppunit

如果您从 git 存储库下载了源代码,则必须安装以下软件包才能获得 autoconf macros。

  • libxml2-dev
  • libcppunit-dev
  • autoconf
  • automake
  • autotools-dev
  • autopoint
  • libtool

并运行以下命令以生成配置脚本和生成程序所需的其他文件:

1
autoreconf -i

此外,您还需要 Sphinx 来构建手册页。

如果您正在为 Mac OS X 构建 aria2,请查看 makerelease-osx.mk GNU Make makefile。

构建 aria2 的最快方法是首先运行配置脚本:

1
./configure

要构建静态链接的 aria2,请使用命令行选项:ARIA2_STATIC=yes

1
./configure ARIA2_STATIC=yes

配置完成后,运行编译程序:make

1
make

请看交叉编译 Windows 二进制文件来进行 Windows 的交叉编译;

请看交叉编译 Android 二进制文件来进行 Android 的交叉编译;

configure 会检查可用库并启用尽可能多的功能,在 default 下未启用的实验功能除外。

从 1.1.0 开始,aria2 默认检查 HTTPS 服务器的证书。如果您使用 OpenSSL 或具有 gnutls_certificate_set_x509_system_trust() 功能的最新版本的 GnuTLS 进行构建,并且库已正确配置以定位系统范围的 CA 证书存储,aria2 将在启动时自动加载这些证书。如果不是这样,我建议提供 CA 包文件的路径,例如在Debian中,CA 捆绑文件的路径是 ‘/etc/ssl/certs/ca-certificates.crt’ (in ca-certificates package),这可能因您的发行版本而异,您可以使用 configure 的 --with-ca-bundle option :

1
2
./configure --with-ca-bundle='/etc/ssl/certs/ca-certificates.crt'
make

如果没有 --with-ca-bundle 选项,则在访问 HTTPS 服务器时会遇到错误,因为没有 CA bundle 无法验证证书。在这种情况下,可以使用 aria2 的 --ca-certificate 指定 CA 捆绑文件。如果没有安装 CA bundle 文件,那么最后一种方法是使用 --check-certificate=false 禁用证书验证。

使用本机 OSX(AppleTLS)和 / 或 Windows(WinTLS)实现将自动使用系统证书存储,因此,不需要使用 -with-ca-bundle,在使用这些实现时将被忽略。

默认情况下 aria2c 安装在名为 bash_completion 的目录中,其位置在 $prefix/share/doc/aria2/bash_completion。要更改文件的安装目录,请使用 --with-bashcompletiondir 选项。

make 后,可执行文件位于src/aria2c。

aria2 使用 CppUnit 进行自动单元测试。要运行单元测试:

1
make check

交叉编译 Windows 二进制文件

在本节中,我们将介绍如何在 Debian Linux 上使用 mingw-w64 (http://mingw-w64.org/doku.php ) 交叉编译器构建 Windows 二进制文件,MinGW(http://www.mingw.org/ )可能无法 aria2。

构建 Windows 二进制文件的最简单方法是使用 Dockerfile,请参考 Dockerfile.mingw 来构建二进制文件,如果您不能使用 Dockerfile 请继续阅读以下内容。

基本上,在编译和安装依赖库之后,您可以进行交叉编译,只需传递适当的 --host 选项并指定要配置的 CPPFLAGS LDFLAGS PKG_CONFIG_LIBDIR 变量。为了方便和降低我们自己的开发成本,我们提供了更简单的方法来配置构建设置。

mingw-config 脚本是用于 mingw-w64 的 configure 脚本包装器。我们使用它来创建正式的 Windows 版本。此脚本假设已为交叉编译构建以下库:

  • c-ares
  • expat
  • sqlite3
  • zlib
  • libssh2
  • cppunit

可以调整某些环境变量以更改生成设置:

HOST

通过 HOST 环境变量可以编译为 HOST 指定的系统,它默认为 i686-w64-mingw32 ,要生成64位二进制文件,请指定为 x86_64-w64-mingw32

PREFIX

PREFIX 是安装依赖库的目录的前缀,默认为 /usr/local/$HOSTI$PREFIX/include 将添加到 CPPFLAGSL$PREFIX/lib 将添加到 LDFLAGS$PREFIX/lib/pkgconfig 将添加到 PKG_CONFIG_LIBDIR

例如,要构建64位二进制文件,请执行以下操作:

1
HOST=x86_64-w64-mingw32 ./mingw-config

如果您想使用 libaria2 dll 可以指定 --enable-libaria2 ,然后不要使用 ARIA2_STATIC=yes 并准备外部库的 DLL 版本。

交叉编译 Android 二进制文件

在本节中,我们将介绍如何在 Debian Linux 上使用 Android NDK 交叉编译器构建 Android 二进制文件。

在撰写本文时,Android NDK r21e 应该可以无误的编译 aria2。

android-config 脚本是 Android build 的配置脚本包装器,我们用它来创建正式的 Android 版本,此脚本假设已为交叉编译构建以下库:

  • c-ares
  • openssl
  • expat
  • zlib
  • libssh2

在构建上述库时,请确保禁用共享库并仅启用静态库,我们将静态链接这些库。

android-config 假设定义了 $ANDROID_HOME 和 $NDK 环境变量。

我们目前使用 Android NDK r21e,$NDK 应指向 Anroid NDK 的目录,构建工具位于 $NDK/toolchains/llvm/prebuilt/linux-x86_64/bin/

所有依赖库必须安装在 $ANDROID_HOME/usr/local

android-config 之后,运行 make 编译源代码。

构建文档

Sphinx 用于构建文档。如果 aria2 手册页不是最新的,则会在运行 make 时生成。您还可以通过生成 HTML 来构建 aria2 手册页的 HTML 版本。HTML 版本手册也可在线获取俄语翻译葡萄牙语翻译)。

BitTorrent

关于文件名

下载文件的文件名确定如下:

  • 单文件模式

如果 “name” 键存在于 .torrent 文件中,则文件名是 “name” 键的值。

否则,文件名就是 BitTorrent 的文件名称加上 “.file” ,例如 BitTorrent 的文件名称是 “test.torrent”,那么下载的文件名就是 “test.torrent.file”,下载文件的目录可以通过 -d 选项指定。

  • 文件模式

.torrent 文件内部已存在目录结构,所以 aira2 直接按照已有的结构创建文件和目录,下载文件的根目录可以通过 -d 选项指定。

在下载开始之前,如果需要,将创建一个完整的目录结构。

默认情况下 aria2 最多从 .torrent 中同时打开 100 个文件,并直接写入和读取这些文件。

要修改 aria2 同时打开文件的数量,请指定 --bt-max-open-files 选项。

DHT

aria2 支持与主线兼容的DHT。

默认情况下,IPv4 DHT的路由表保存到 $XDG_CACHE_HOME/aria2/dht.dat,dat 和 IPv6 DHT 的路由表保存到 $XDG_CACHE_HOME/aria2/dht6.dat。除非文件存在于 $HOME/.aria2/dht.dat or $HOME/.aria2/dht6.dat

aria2 使用相同的端口号侦听 IPv4 和 IPv6 DHT。

UDP tracker

启用 IPv4 DHT 时,将启用 UDP 跟踪器支持。UDP 跟踪器的端口号与 DHT 共享。

使用 --dht-listen-port 选项更改端口号。

当前的实现支持 HTTP(S)/FTP/SFTP/BitTorrent,其他 P2P 协议被忽略,支持 Metalink4(RFC 5854)和 Metalink 3.0 版文档。

对于校验和验证,支持 md5、sha-1、sha-224、sha-256、sha-384 和 sha-512,如果提供了多个哈希算法,aria2 将使用更强的哈希算法,如果整个文件校验和验证失败,aria2 不会重试下载,只会以非零返回代码退出。

支持用户的首选项包括:version, language, location, protocol and os。

如果 Metalink 文件中提供了块校验和,aria2 会在下载过程中自动验证数据块,此行为可以通过命令行选项关闭。

如果签名包含在 Metalink 文件中,aria2 会在下载完成后将其保存为文件,文件名为下载文件名+“.sig”。如果同一文件已存在,则不会保存签名文件。

在 Metalink4 中,多文件 torrent 可能出现在 metalink:metaurl 元素中,由于 aria2 无法同时下载两个相同的 Torrent,aria2 将文件分组在 metalink 中:文件元素具有相同的 BitTorrent metaurl,并从单个 BitTorrent swarm 下载。

这基本上是带有文件选择的多文件 torrent 下载,因此也会创建不在 Metalink 文档中但与所选文件共享同一部分的相邻文件。

如果在 metalink:url 或 metalink:metaurl 元素中指定了相对 URI,则 aria2 使用 metalink 文件的 URI 作为基本 URI 来解析相对 URI。如果在从本地磁盘读取的 Metalink 文件中找到相对 URI,则 aria2 使用 --metalink-base-uri 选项的值作为基本 URI。如果未指定此选项,则将忽略相对 URI。

Metalink/HTTP

Metalink/HTTP 的实现仅限于 rel=duplicate 的链接。

aria2 解析 Digest header 字段,并检查它是否与其他来源的 digest 值匹配。如果不同,就断开连接,aria2 还使用此 Digest 值在下载完成后执行校验和验证。

让 aria2 知道优先使用的 metalink 地址,可以使用 --metalink-location 选项。

netrc

默认情况下,HTTP/FTP/SFTP 支持 netrc,要禁用 netrc 支持,请指定 -n 命令行选项

你的 netrc 文件应具有相应的权限:(600)。

WebSocket

aria2 中嵌入的 WebSocket 服务器实现了 RFC 6455 中定义的规范。支持的协议版本为 13。

libaria2

libaria2 是一个 C++ 库,它为客户端的开发提供 aria2 功能。

目前,libaria2 不是默认构建的,要启用 libaria2,请使用 --enable-libaria2 配置选项。

默认情况下,只生成共享库,要构建静态库,还可以使用 --enable-static 配置选项。

了解如何使用API,请参阅 libaria2 文档。

aria2 开发时的参考