Arch 最迷人的地方莫过于完善的 Wiki 和强大的 AUR(Arch User Repository)。然而由于某些{不可说}的人为原因,在 Arch 里安装 AUR 包时不时就会遇到连接失败导致无法安装的问题。比如之前我试图安装 Atom,但屡试屡败,其中的苦你一定懂。
这种问题当然不会难到我,解决的办法就是让安装 AUR 的程序能通过一把梯子翻过高墙,毕竟梯子是掌握正确上网姿势的必备条件。
就以上面提到的 atom-editor 的安装为例,通常 AUR 维护的包都会包含一个记录安装信息和安装命令的脚本文件 PKGBUILD,比如 atom-editor 包的 PKGBUILD 文件内容为
# Maintainer: Sebastian Jug <seb@stianj.ug>
# Contributor: John Reese <jreese@noswap.com>
# Upstream URL: https://github.com/atom/atom
#
# For improvements/fixes to this package, please send a pull request:
# https://github.com/sjug/atom-editor
pkgname=atom-editor
pkgver=1.7.3
pkgrel=1
pkgdesc='Chrome-based text editor from Github'
arch=('x86_64' 'i686')
url='https://github.com/atom/atom'
license=('MIT')
depends=('alsa-lib' 'desktop-file-utils' 'gconf' 'gtk2' 'libgnome-keyring' 'libnotify' 'libxtst' 'nodejs' 'nss' 'python2')
optdepends=('gvfs: file deletion support')
makedepends=('git' 'npm')
conflicts=('atom-editor-bin' 'atom-editor-git')
install=atom.install
source=("https://github.com/atom/atom/archive/v${pkgver}.tar.gz"
'package.patch')
sha256sums=('5074b59ddaca5525eb48098dee6fe63013799cbc77749add314b9e1bc894b8f4'
'ab27ab817f67043e98298d525efb6a417dea07f4012b6dfb7cf6a538f9b50bab')
prepare() {
cd "atom-$pkgver"
patch -Np0 -i "$srcdir/package.patch"
sed -i -e "/exception-reporting/d" \
-e "/metrics/d" package.json
sed -e "s/<%= description %>/$pkgdesc/" \
-e "s|<%= appName %>|Atom|"\
-e "s|<%= installDir %>/share/<%= appFileName %>|/usr/bin|"\
-e "s|<%= iconPath %>|atom|"\
resources/linux/atom.desktop.in > resources/linux/Atom.desktop
}
build() {
cd "$srcdir/atom-$pkgver"
export PYTHON=python2
script/build --build-dir "$srcdir/atom-build"
}
package() {
cd "$srcdir/atom-$pkgver"
script/grunt install --build-dir "$srcdir/atom-build" --install-dir "$pkgdir/usr"
install -Dm644 resources/linux/Atom.desktop "$pkgdir/usr/share/applications/atom.desktop"
install -Dm644 resources/app-icons/stable/png/1024.png "$pkgdir/usr/share/pixmaps/atom.png"
install -Dm644 LICENSE.md "$pkgdir/usr/share/licenses/$pkgname/LICENSE.md"
}
脚本内容很清晰,注明了软件包的说明,下载路径,依赖/冲突关系和安装命令。很显然,安装失败的原因就是因为国内网络无法连接上 atom 的安装包下载地址 https://github.com/atom/atom/archive/v1.7.3.tar.gz。 AUR 包的安装需要在包目录下执行
makepkg -sri
因此得修改 makepkg 的配置,使得 makepkg 在调用下载程序时能通过 Proxy 翻过防火墙的阻碍。makepkg 的配置文件位于 /etc/makepkg.conf
,找到 DLAGENT 字段
#-- The download utilities that makepkg should use to acquire sources
# Format: 'protocol::agent'
DLAGENTS=('ftp::/usr/bin/curl -fC - --ftp-pasv --retry 3 --retry-delay 3 -o %o %u'
'http::/usr/bin/curl -fLC - --retry 3 --retry-delay 3 -o %o %u'
'https::/usr/bin/curl -fLC - --retry 3 --retry-delay 3 -o %o %u'
'rsync::/usr/bin/rsync --no-motd -z %u %o'
'scp::/usr/bin/scp -C %u %o')
DLAGENT 顾名思义就是 Download Agent 的意思,这个字段指定了不同网络协议的下载工具和下载参数,默认是调用 curl 下载。现在只需要让 curl 通过 Proxy 而非直连的方式去下载 PKGBUILD 里设置的软件包即可。查看 curl 命令的参数用法
curl -h | grep socks
--socks4 HOST[:PORT] SOCKS4 proxy on given host + port
--socks4a HOST[:PORT] SOCKS4a proxy on given host + port
--socks5 HOST[:PORT] SOCKS5 proxy on given host + port
--socks5-hostname HOST[:PORT] SOCKS5 proxy, pass host name to proxy
--socks5-gssapi-service NAME SOCKS5 proxy service name for GSS-API
--socks5-gssapi-nec Compatibility with NEC SOCKS5 server
因为我搭的 Proxy 是通过 socks5,所以在 makepkg.conf 配置文件里的 DLAGENT 字段中加上 --socks5 127.0.0.1:1080
参数就行了。最后测试一把:
大功告成,喜大普奔!
另外,也可以自定义下载工具,比如 axel 就是很好的替代选择,可以设置多线程下载,速度非常快。
没有自由,何谈快乐!