aria2 构建与使用完全指南:从源码编译、跨平台交叉编译到 BitTorrent/Metalink 实战
【免费下载链接】aria2aria2 is a lightweight multi-protocol & multi-source, cross platform download utility operated in command-line. It supports HTTP/HTTPS, FTP, SFTP, BitTorrent and Metalink.项目地址: https://gitcode.com/gh_mirrors/ar/aria2
aria2 是一款轻量级、支持多协议与多来源的命令行下载工具,本指南以仓库内的 doc/manual-src/pt/README.rst 官方手册(葡萄牙语版)为骨架,系统梳理其功能特性、依赖选择、Linux/Windows/Android 三种平台的编译方式,并深入讲解 BitTorrent、Metalink、netrc 与 WebSocket 等核心特性的配置要点。读完本文,你将掌握 aria2 从获取源码、配置构建到日常下载实战的完整技能,并能理解底层源码对这些能力的具体支撑。
aria2 是什么
aria2 是一个文件下载实用工具,支持 HTTP、HTTPS、FTP、BitTorrent 与 Metalink 五种协议/格式。它可以同时从多个来源、多个协议下载同一个文件,并尽可能榨取最大带宽;支持 GNU/Linux、macOS、Windows、Android 等多种平台。它能在下载 HTTP/HTTPS/FTP/BitTorrent 数据的同时,将这些数据即时分享(上传)给 BitTorrent swarm,也可以让你边下载边观看影片。通过 Metalink 提供的分块校验值,aria2 还能自动校验 BitTorrent 各分块(chunk)的数据完整性。
当前仓库对应 aria2 1.37.0(见 configure.ac 中的AC_INIT声明)。
功能特性清单
官方手册列出的核心能力包括:
- 命令行接口
- HTTP / HTTPS / FTP / BitTorrent 下载
- 分段下载(split download)
- Metalink 版本 4(RFC 5854)支持(HTTP、FTP、BitTorrent)
- Metalink 版本 3 支持(HTTP、FTP、BitTorrent)
- Metalink/HTTP(RFC 6249)支持(HTTP)
- HTTP/1.1 实现
- HTTP 代理支持
- HTTP BASIC 认证支持
- HTTP 代理认证支持
- 完整的代理环境变量支持:
http_proxy、https_proxy、ftp_proxy、all_proxy、no_proxy - HTTP gzip / deflate 内容编码支持
- HTTPS 下使用受信证书对端进行校验
- HTTPS 下客户端证书认证处理
- Chunked(分块)传输编码支持
- 从 Firefox 3、Chromium/Google Chrome、Mozilla/Firefox/IcedWeasel(1.x/2.x)/Netscape 格式的 Cookie 文件加载 Cookie
- 将 Cookie 保存为 Mozilla 3、Firefox(1.x/2.x)、Chromium、Netscape 格式文件
- 自定义/修改 HTTP 请求头
- 持久连接(Keep-Alive)支持
- 通过 HTTP 代理访问 FTP
- 下载/上传速度控制(带宽管理)
- BitTorrent 扩展:快速连接(Fast Extension)、DHT、PEX、MSE/PSE、多 Tracker
- BitTorrent Web-Seeding:aria2 会对一个分块发起多个范围请求以减少请求重叠,并支持指定大小的流水线(pipeline)请求
- BitTorrent 本地对等发现(LPD)
- 已完成的 BitTorrent 下载目录结构可更新或重命名
- JSON-RPC(基于 HTTP 与 WebSocket)与 XML-RPC 接口
- daemon 模式运行
- 多文件 torrent/Metalink 的选择性下载
- Metalink 分块校验
- Metalink 禁用分段下载
- netrc 支持
- 配置文件支持
- 从文本文件或标准输入读取 URI 下载,并支持可选的输出文件指定
- 参数化 URI(区间等)支持
- IPv6 支持
获取源码
源码托管在版本仓库中,克隆到本地即可获得全部源码:
$ git clone https://gitcode.com/gh_mirrors/ar/aria2克隆完成后,aria2 的源码文件会出现在当前目录中。仓库根目录下包含 configure.ac、Makefile.am(顶层构建脚本)、src(核心 C++ 源码)、test(CppUnit 单元测试)以及 doc(多语言文档)等关键部分。
功能与依赖对照
构建 aria2 前,需要按所需功能准备对应的依赖库,官方手册给出了完整对照表:
| 功能 | 依赖 |
|---|---|
| HTTPS | GnuTLS 或 OpenSSL |
| BitTorrent | libnettle + libgmp 或 libgcrypt 或 OpenSSL |
| Metalink | libxml2 或 Expat |
| Checksum(校验) | libnettle 或 libgcrypt 或 OpenSSL |
| HTTP 的 gzip、deflate | zlib |
| 异步 DNS | C-Ares |
| Firefox3/Chromium Cookie | libsqlite3 |
| XML-RPC | libxml2 或 Expat |
| 基于 WebSocket 的 JSON-RPC | libnettle 或 libgcrypt 或 OpenSSL |
加密/XML 库的优先级与强制指定
- 若 libxml2 与 Expat 同时安装,libxml2 优先;想用 Expat 则执行
./configure --without-libxml2。 - 若 GnuTLS 与 OpenSSL 同时安装,GnuTLS 优先;想用 OpenSSL 则执行
./configure --without-gnutls --with-openssl。 - 若 libnettle 与 libgcrypt 同时安装,libnettle 优先;想用 libgcrypt 则执行
./configure --without-libnettle --with-libgcrypt。注意:若最终选择 OpenSSL 而非 GnuTLS,则 libnettle 与 libgcrypt 均不会被使用。
可选用的 SSL/加密库组合共有五种:
- libgcrypt
- libnettle
- OpenSSL
- GnuTLS + libgcrypt
- GnuTLS + libnettle
这些选项在 configure.ac 中均有对应的ARIA2_ARG_WITHOUT/ARIA2_ARG_DISABLE声明,例如--disable-bittorrent与--disable-metalink可分别关闭 BitTorrent 与 Metalink 支持。启用异步 DNS 需要 c-ares 库。
从源码构建
安装开发依赖包
以 Debian/Ubuntu 系为例,构建前需安装以下开发包(包名因发行版而异):
libgnutls-dev:HTTPS、BitTorrent、Checksum 支持所需nettle-dev:BitTorrent、Checksum 支持所需libgmp-dev:BitTorrent 支持所需libc-ares-dev:异步 DNS 支持所需libxml2-dev:Metalink 支持所需zlib1g-dev:HTTP gzip/deflate 解码支持所需libsqlite3-dev:Firefox3/Chromium Cookie 支持所需
也可以用libgcrypt-dev替代nettle-dev与libgmp-dev:
libgpg-error-dev:BitTorrent、Checksum 支持所需libgcrypt-dev:BitTorrent、Checksum 支持所需
还可以用libssl-dev一揽子替代libgnutls-dev、nettle-dev、libgmp-dev、libgpg-error-dev、libgcrypt-dev:
libssl-dev:HTTPS、BitTorrent、Checksum 支持所需
也可以用libexpat1-dev替代libxml2-dev:
libexpat1-dev:Metalink 支持所需
部分发行版可能需要pkg-config来检测上述库。对于 Fedora 发行版,需要以下软件包:
- gcc、gcc-c++、kernel-devel、libgcrypt-devel、libxml2-devel、openssl-devel
生成 configure 脚本并编译
如果源码来自 git 仓库,需要先执行autoreconf -i生成 configure 脚本及其它构建辅助脚本:
$ autoreconf -i最简单的编译方式是直接执行 configure 脚本(它会自动检测可用库,默认启用全部功能):
$ ./configure需要静态链接时,传入ARIA2_STATIC=yes(该变量在 configure.ac 中通过AC_ARG_VAR声明):
$ ./configure ARIA2_STATIC=yes配置完成后执行make编译:
$ make编译产物为src目录下的aria2c可执行文件。交叉编译 Windows 二进制可参考下文"Windows 交叉编译",Android 二进制参考"Android 交叉编译"。
HTTPS 证书校验与 CA 证书配置
从 1.1.0 版本起,aria2 默认校验 HTTPS 服务器的证书。若编译时使用了 OpenSSL 或包含gnutls_certificate_set_x509_system_trust()函数的新版 GnuTLS,并且库被正确配置为可定位系统 CA 证书存储,aria2 会在启动时自动加载这些证书;否则建议通过--with-ca-bundle显式指定 CA 证书文件路径(该选项定义于 configure.ac):
$ ./configure --with-ca-bundle='/etc/ssl/certs/ca-certificates.crt' $ make以 Debian 为例,CA 证书文件位于/etc/ssl/certs/ca-certificates.crt(由 ca-certificates 包提供),不同发行版路径可能不同。若不指定--with-ca-bundle,访问 HTTPS 服务器时会因无法校验证书而报错。此时可改用 aria2 运行期选项--ca-certificate指定证书文件;若完全没有安装证书,最后的手段是使用--check-certificate=false关闭证书校验。
bash 补全的安装位置
默认情况下,名为aria2c的 bash 补全脚本会安装到$prefix/share/doc/aria2/bash_completion目录。可通过--with-bashcompletiondir修改安装目录(默认值在 configure.ac 中定义为$docdir/bash_completion)。补全脚本本体位于 doc/bash_completion/aria2c,安装规则见 doc/Makefile.am。
运行单元测试
aria2 使用 CppUnit 进行自动化单元测试(测试代码位于 test 目录),执行:
$ make checkWindows 交叉编译
本节描述如何在 Debian Linux 上使用 mingw-w64 交叉编译器为 Windows 构建二进制。
基本思路是:先编译并安装好依赖库,然后通过--host选项并指定CPPFLAGS、LDFLAGS、PKG_CONFIG_LIBDIR等变量进行交叉编译。为降低配置成本,仓库提供了mingw-config包装脚本(见 mingw-config),用于生成官方 Windows 构建。该脚本假定以下依赖库已为交叉编译完成编译/安装:
- c-ares
- openssl
- expat
- sqlite3
- zlib
- cppunit
脚本支持两个环境变量:
HOST:交叉编译目标主机,默认为i686-w64-mingw32;要构建 64 位二进制则指定x86_64-w64-mingw32。PREFIX:依赖库的安装前缀目录,默认为/usr/local/$HOST。脚本会把-I$PREFIX/include加入CPPFLAGS、-L$PREFIX/lib加入LDFLAGS,并把$PREFIX/lib/pkgconfig设为PKG_CONFIG_LIBDIR。
例如构建 64 位 Windows 二进制:
$ HOST=x86_64-w64-mingw32 ./mingw-config脚本内部实际调用的配置选项可见 mingw-config:使用--with-libcares、--with-libexpat、--with-sqlite3、--with-libz、--with-libgmp、--with-libssh2,并关闭 GnuTLS、OpenSSL、libxml2、libgcrypt、libnettle 与 NLS,同时启用ARIA2_STATIC=yes静态链接。configure 也会对 MinGW 目标自动附加-lws2_32、-lgdi32等 Windows 系统库及 ASLR/NX 兼容标志(见 configure.ac)。
Android 交叉编译
本节描述如何在 Debian Linux 上使用 Android NDK 交叉编译 aria2。
android-config脚本(见 android-config)用于配置 Android 构建,假定以下库已为交叉编译构建:
- c-ares
- openssl
- expat
编译这些依赖库时,务必禁用共享库、只启用静态库,因为 aria2 将只使用静态库进行链接。Android NDK 自带 zlib,因此无需另行编译 zlib。
android-config还假定:
- Android NDK 安装在环境变量
$ANDROID_HOME指定的位置,且已按 NDK 的docs/STANDALONE-TOOLCHAIN.html配置好自定义 toolchain; - 依赖库安装在
$ANDROID_HOME/usr/local下。
运行android-config和android-make前,务必确保$ANDROID_HOME指向正确路径。先执行android-config生成构建配置,再执行android-make编译源码。从脚本内容看(android-config),它同时要求$NDK环境变量,使用aarch64-linux-android目标、LLVM 工具链,启用 OpenSSL、Expat、c-ares、zlib、libssh2,并以-fPIE -pie与-static-libstdc++链接,$ANDROID_HOME未设置时脚本会直接报错退出。
aria2 在 Android 设备上的使用
aria2 是一个轻量级、多协议、多来源的命令行下载工具,可在 Android 的终端模拟器中运行,支持 HTTP、HTTPS、FTP、BitTorrent 与 Metalink 下载。注意:aria2不是Android Java 应用,而是用 C++ 编写的原生命令行程序,使用它不需要 root 权限。正因如此,需要先在 Android 上安装一个终端模拟器(可从应用市场安装或自行编译)。
安装步骤
将
aria2c可执行文件复制到设备的/mnt/sdcard。启动 Android 终端模拟器。
创建目录:
mkdir /data/data/jackpal.androidterm/aria2。写入可执行文件:
cat /mnt/sdcard/aria2c > /data/data/jackpal.androidterm/aria2/aria2c。赋予执行权限:
chmod 744 /data/data/jackpal.androidterm/aria2/aria2c。在终端模拟器中添加以下初始化命令(设置 HOME 并进入目录):
export HOME=/data/data/jackpal.androidterm/aria2; cd $HOME退出终端模拟器。
重新启动终端模拟器。
运行
./aria2c -v验证安装。
使用注意事项
官方说明中该可执行文件由 android-ndk-r8d 构建,静态链接了 openssl 1.0.1e、expat 2.1.0 与 c-ares 1.9.1。
由于 Android 没有/etc/resolv.conf,c-ares(异步 DNS 解析器)默认被禁用,而很多场景下名称解析较慢,因此建议启用 c-ares,并用--async-dns-server显式指定 DNS 服务器(该选项在源码中由 src/AsyncNameResolverMan.cc 读取并设置给解析器):
--async-dns --async-dns-server=`getprop meu.dns1`,`getprop meu.dns2`为避免每次使用 aria2c 都重复输入这些参数,可以准备如下 shell 脚本(保存后记得用chmod 744赋予执行权限,并将meu.dns1、meu.dns2替换为真实 DNS 服务器):
#!/system/bin/sh /data/data/jackpal.androidterm/aria2c \ --async-dns \ --async-dns-server=`getprop meu.dns1`,`getprop meu.dns2` \ "$@"已知问题
- 由于 Android 没有
/dev/stdout,-l-(日志输出到标准输出)在 Android 上不可用。 - 某些情况下终端模拟器会停止刷新控制台,看起来像 aria2c 冻结了,实际上 aria2c 仍在正常运行。
生成文档
aria2 的文档使用 Sphinx 构建(构建配置见 doc/manual-src/pt/Makefile.am,其SPHINXBUILD = sphinx-build、BUILDDIR = _build;doc/manual-src/Makefile.am 表明支持 en、ru、pt 三种语言)。构建文档前需要安装 Sphinx。手册页也可用make man重新生成(若已过时)。文档支持多种格式输出,包括 html、latexpdf、epub、devhelp、latex、htmlhelp 等。例如构建 HTML 文档:
$ make html生成结果位于源码目录下的_build子目录。例如将 aria2 源码解压到/home/usuario/aria2/,则生成文档位于:
/home/usuario/aria2/doc/manual-src/pt/_build/pt表示语言目录,目前支持en、pt、ru。生成 PDF 使用make latexpdf,需确保 LaTeX 所需的字体等依赖已就绪。Sphinx 的检测在 configure.ac 中通过AC_PATH_PROGS([SPHINXBUILD], [sphinx-build])完成;若未安装 Sphinx,构建系统会退化为生成占位 man 页并提示安装 sphinx(见 doc/manual-src/pt/Makefile.am)。
BitTorrent 使用详解
文件命名规则
下载文件的命名取决于 torrent 文件的模式:
- 单文件模式:若 .torrent 文件中有
name键,则文件名为该键的值;否则文件名基于 .torrent 文件名加上.file后缀。例如 .torrent 文件名为brasil.torrent,则下载文件名为brasil.torrent.file。存储目录可用-d选项指定。 - 多文件模式:将完整创建 .torrent 中声明的目录/文件结构。基础目录可用
-d选项指定。下载开始前会先创建所需的完整目录结构。默认情况下 aria2 会打开 .torrent 中声明的至少 100 个文件并直接进行读写,同时打开的最大文件数可通过--bt-max-open-files控制。
DHT
aria2 支持 DHT。默认情况下,IPv4 DHT 路由表保存在$HOME/.aria2/dht.dat,IPv6 DHT 路由表保存在$HOME/.aria2/dht6.dat。相关选项(dht-file-path/dht-file-path6)在 src/prefs.cc 与 src/OptionHandlerFactory.cc 中定义,默认值由util::getDHTFile()生成。aria2 使用同一个端口号同时监听 IPv4 与 IPv6 的 DHT。
UDP Tracker
当 IPv4 DHT 启用时,UDP Tracker 也会被启用,其端口号与 DHT 共享,可用--dht-listen-port修改(src/OptionHandlerFactory.cc 中该选项默认值为6881-6999,端口范围 1024 至 65535)。
其它重要信息
-o选项用于修改输出文件名,但它不会改变 .torrent 文件内部声明的文件名;要改变 torrent 内的文件名需使用--index-out。- aria2 用于 TCP 与 UDP 的默认端口范围为6881-6999(
--listen-port默认值同样为6881-6999,见 src/OptionHandlerFactory.cc)。 - aria2不会自动配置端口转发,需要手动配置路由器或防火墙。
- 每个 torrent 的最大对等连接数为55;当下载速率很低时该上限可能被超出,可通过
--bt-request-peer-speed-limit调整触发该上限的下载速率阈值。 - 自 0.10.0 版本起,选择性下载完成后 aria2 不再发送新的请求消息。
Metalink 使用详解
当前实现支持 HTTP、HTTPS、FTP 与 BitTorrent 协议的 Metalink 下载,其它 P2P 协议会被忽略;支持 Metalink4 与 Metalink 3.0 两种文档版本。
- 校验算法:支持 md5、sha-1、sha-224、sha-256、sha-384、sha-512。若提供多种哈希算法,aria2 会选择最稳健的一种。若校验彻底失败,aria2 不会继续下载,并以非零退出码结束。
- 用户偏好:支持 version、language、locale、protocol 与 operating system 等偏好项。
- 分块校验:若 Metalink 文件中提供了分块(chunk)校验值,aria2 会在下载过程中自动校验数据分块,该行为可通过命令行选项关闭。
- 签名文件:若 Metalink 文件中包含签名(证书),aria2 会在下载完成后将签名保存为文件,文件名加
.sig后缀;若同名文件已存在则不会保存。 - metaurl 聚合:在 Metalink4 多文件 torrent 场景中,
metalink:metaurl元素可能出现多个相同 torrent 引用。由于 aria2 不会同时下载两个相同 torrent,它会把引用同一 BitTorrent metaurl 的metalink:file元素归组,从同一个 BitTorrent swarm 下载。这主要出现在多文件 torrent 做文件选择时:与所选文件共享同一分块、但未出现在 Metalink 文档中的相邻文件也会一并下载并创建。 - 相对 URI:若
metalink:url或metalink:metaurl元素中指定了相对 URI,aria2 以 Metalink 文件自身的 URI 作为基准解析;若 Metalink 文件是从本地磁盘读取的,则使用--metalink-base-uri选项的值作为基准(该选项在 src/Context.cc 中被用于解析 Metalink 查询)。若该选项未指定,相对 URI 将被忽略。
Metalink/HTTP
本实现利用rel=duplicate链接。aria2 会解析Digest响应头字段,并校验其摘要值是否与其他来源一致;若有差异则断开连接。aria2 还会在下载结束后用该摘要值执行校验。aria2 能够识别geo值,可通过--metalink-location覆盖你偏好的位置值。
netrc 支持
netrc 支持默认对 HTTP、HTTPS 与 FTP 启用,可通过命令行选项-n禁用。注意.netrc文件必须具有正确的权限(600)。
WebSocket
aria2 内置的 WebSocket 服务器实现了 RFC 6455 规范,所支持的协议版本为 13。
小结
从 doc/manual-src/pt/README.rst 可以看到,aria2 的工程实践围绕"多协议、多来源、最大化带宽利用"展开:Linux 上一条./configure && make即可获得全功能构建,Windows 与 Android 则分别由 mingw-config 与 android-config 两个脚本封装交叉编译细节;BitTorrent 的 DHT/UDP Tracker/端口管理、Metalink 的校验与聚合、netrc 认证以及 WebSocket 远程控制,构成了它作为命令行下载工具的核心价值。对每个功能感兴趣的读者,都可以在 src 下的对应源码与 test 下的测试用例中找到更底层的实现证据。
【免费下载链接】aria2aria2 is a lightweight multi-protocol & multi-source, cross platform download utility operated in command-line. It supports HTTP/HTTPS, FTP, SFTP, BitTorrent and Metalink.项目地址: https://gitcode.com/gh_mirrors/ar/aria2
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考