Archlinux 的灵魂──PKGBUILD、AUR 和 ABS (2)

这是《Archlinux 的灵魂──PKGBUILD、AUR 和 ABS》一文的第二部分,主要介绍 AUR 和 ABS。上接第一部分:PKGBUILD 和 makepkg

作者 / Ning Bao

第二部分:AUR 和 ABS

我非常高兴看到我关于 PKGBUILD 和 Makepkg 的文章在 LinuxTOY 受到了欢迎。我想先针对一些读者的回复谈一点题外话。我先声明我一点也没有要诋毁 Debian 或 Gentoo 的意思,他们都是非常伟大的发行版,都有自己的特色。其实大多数的发行版都可以自己去定制,从而达到类似的目的。比如说,有的人提到 Gentoo 也有二进制包,比如像 Openoffice 这样的怪物。然而,我个人以为比较不同的发行版关键是要看它最核心的设计思想。比如说,Gentoo 根本就不是为了使用二进制包设计的。你要是都想用二进制包,就别费劲用 Gentoo 了。关于 Debian 阵营的发行版,我也想讲几句。正如一些朋友的回复所讲,DEB/apt-get 是非常好的管理工具,软件库也非常的大。我的笔记本现在还在用 elive,也是 Debian 的分支。我不喜欢 Debian 系列的发行版的原因不是它不能定制,而是他们非常依靠 Maintainer。我们可以自己做 DEB 包,然后呢?你的 DEB 包什么时候才能进入软件库呢?还有,只有你自己知道你的 DEB 是怎么做的,别人不能了解你编译打包的过程。Debian 本身打包的过程没有 Archlinux 的 PKGBUILD 来的简单明了。只要比较 Debian 的 Maintainer 手册和 Archlinux 的 Wiki 就可以看出这一点。

选择什么样的发行版完全是要看个人需要。我选择 Archlinux,是因为它当初设计的时候就是要满足“KISS Rule”,也就是“Keep It Simple, Stupid”。或者说像爱因斯坦讲得:“Everything should be made as simple as possible, but no simpler”。Archlinux 的所有配置基本都是非常相似的脚本,加上简单灵活的 PKGBUILD 和 pacman,其实关于 Archlinux 本身真的没有太多新的东西要学习。大家有兴趣可以看看“Arch Compared To Other Distros”。Archlinux 实际上是强迫用户从零开始自己定制自己的系统,在这个过程中也就真正了解了 Linux 本身。

好了,现在言归正传谈一谈 AUR 和 ABS。

AUR 是指 Archlinux User-community Repository,也就是 Archlinux 用户社区的软件库。我们现在回忆一下在 Archlinux 中我们把源代码变成可以运行的二进制码需要哪些文件。我们需要:PKGBUILD,可能还有 .install 文件,加上一些补丁和必要的配置文件(像 dwm 的 config.h)。这样就足够了!当你成功使用 PKGBUILD 编译安装了一个新软件之后就可以通过 AUR 和其他的人分享你的成果了。具体的步骤是:

  1. tar -zcvf package.tar.gz package-dir 把 package-dir 中所有所需的文件打包(包括 PKGBUILD,.install,patch 和其他的 config 等)
  2. 前往 http://aur.archlinux.org 选择"Submit”(参照下图),并把你的 package.tar.gz 上传

Arch build

AUR 会自动根据你的 PKGBUILD 内容把你的 Package 加到 AUR 里来。就是这么简单!那么有人会问:“别的用户要如何使用 AUR 呢?”

这个就更简单了,我们还是用一张截图来解释:

  1. 首先下载“Tarball”(红色的圈圈),这个 Tarball 和你上传的内容是一样的,无非是 PKGBUILD 什么的;
  2. tar xvzf package.tar.gz 然后解压缩;
  3. 然后的步骤你应该知道了,那就是 makepkg 还有 pacman -U。

不过需要提醒的是,为了对自己负责,你应该在编译之前读一下 PKGBUILD 和 .install 的内容,确定里面没有恶意的代码。另外,我建议你一般不要以 root 的身份进行 makepkg。其实,makepkg 本身也做了这样的限制,你不加— asroot 的选项是不能 makepkg 的。这是因为,makepkg 会执行 PKGBUILD 里 build() 部分的代码。想一想,如果有人在 build() 这部分加了这么一句“rm -r /home”,你就死定了!

如果你注意到,在每个 AUR Package 的网页上都有投票(绿色的圈圈)和回复的功能(蓝色的圈圈)。这些是帮助用户反馈意見的。

Arch build

有些性急的朋友可能要问这个 AUR 和 pacman 取得的二进制包有什么联系?你应该记住,只要是 Archlinux,所有的东西一定是从 PKGBUILD 开始的。你通过 pacman 得到的二进制包也是从 PKGBUILD 编译而成的。在你的 /etc/pacman.conf 有很多 Repository 的设置,其中的 [core] 和 [extra] 是由 Archlinux 的核心成员维护的,这些软件库里的软件由于特别重要,每个人都要用,所以 Archlinux 的开发人员把二进制包提前做好,你就可以通过 pacman 取得了。然而,和 Debian 的 Maintainer 机制不一样,最终的用户可以很容易的了解这些软件的编译过程。如果需要的话,最终用户可以改变设置,重新编译这些软件。最典型的情形就是自己编译 kernel 的时候。这要通过 ABS 来解释清楚。ABS,也就是 Archlinux Build System。首先我们要安装 ABS:

  1. pacman -S abs
  2. vi /etc/abs/abs.conf 编辑 ABS 的配置文件;
  3. 你会看到这样一行 SUPFILES=(core extra !unstable community !testing),把你需要的 Repo 之前的 ! 去掉;
  4. 然后以 root 身份执行 abs

之后又要如何使用 ABS 呢?ABS 所作的事情无非是把所有 Repo 里的软件的 PKGBUILD 下载到你本地的硬盘中。这些 PKGBUILD 都放在了 /var/abs 中。你能通过 pacman 直接安装的二进制包其实也都是按照 ABS 的内容编译的。下面我还是用 dwm 的例子解释 ABS 的使用:

  1. su
  2. cd /var/abs 你可以看到这个目录里有 core,extra,community 三个子目录,正如 abs.conf 中的设定;
  3. mkdir local 建立一个 local 目录,用来放你自己需要的软件的 PKGBUILD
  4. chown username:usergroup ./local makepkg 要以非 root 身份进行
  5. exit 退出 su
  6. cd local
  7. cp -r ../community/x11/dwm ./ 从 ABS 中拷贝 dwm 的内容
  8. cd dwm

下面不用我说了,你在这个目录里可以看到三个文件 PKGBUILD、dwm.install、config.h。你于是可以用 makepkg 和 pacman -U 来按照自己喜欢的方式安装 dwm。

OK,你实际已经清楚了解了 ABS 和 pacman 的关系,那么 AUR 又和 ABS 还有 pacman 有什么联系呢?说的直白一点,你上传到 AUR 的 PKGBUILD 要足够“有品”才能直接通过 pacman 使用。对于“有品”,我是这样定义的。你的 PKGBUILD 要有很多人用(很多人投票),没有恶意代码,没有太多的 Bug……而判定你的 PKGBUILD 够不够“有品”的人是一些叫作 TU(Trusted User)的人。这些人的工作是检查 AUR,关注那些特别受欢迎的 PKGBUILD。之后,他会仔细检查,确定这些 PKGBUILD 是不是安全。然后,他们会给这些 PKGBUILD 打上安全的标签,并且把这些 PKGBUILD 从 unsupported(我们上传的 PKGBUILD 一开始都是在 unsupported 中)移到 community 的 Repo 中。

在 community repo 里面的 PKGBUILD 会提前编译好,如果你在 /etc/pacman.conf 中开了 community repo,你就可以直接使用这些软件的二进制包了。也许有一天,你当初上传的 PKGBUILD 变得特别重要,这个软件可能被移到 testing,extra 或者 core 的 repo 中。补充一点,testing repo 里面一般是需要测试,又准备放到 core 或者 extra 中的软件。

Archlinux 就是这样,非常灵活。既有 pacman 这样好的二进制包管理工具,又有 ABS 和 AUR 这样方便的源代码服务。通过 ABS,你可以完全控制你自己的系统到底是如何建立的。如果在 pacman -Ss 的时候找不到一个软件,你可以到 AUR 去找,如果还是找不到,为什么不自己试着从源代码开始,写一个 PKGBUILD 然后放到 AUR 中和别人分享呢?

说到这里,我希望我已经把 Archlinux 最核心的东西讲明白了。有些人说我的文章写得比 wiki 里的文章清楚。其实,我写的东西只是在順序上不一样。我是从 PKGBUILD 开始讲到 AUR 和 ABS,再到 pacman。这个順序和 Archlinux 实际的开发过程是一致的,所以逻辑上容易理解很多。如果你从 pacman 入手反过来读,你可能就完全错过了理解 Archlinux 核心概念的机会。

TOY 会很快再写一篇关于 yaourt 的文章,yaourt 是一个把 pacman 和 AUR 结合起来的很好用的工具。有了 yaourt,你不需要去 AUR 网站也能在 shell 下直接取得 AUR 的 package,还方便了投票的过程。

如果大家对某些问题感兴趣,可以留言告诉我,我会尽量把我了解的用这样比较容易理解的文章与大家交流。

Read More:

47 Comments

  1. 1 佚之狐L Commented @ 2008-02-29 9:42Reply to this comment

    按照“打造完美的 Linux 桌面 — Arch Linux 2007.08-2 (1)”在VM里试用了一下,结果系统安好后发现没有加载网卡模块,又按ArchWiki官网的方法,结果是死活加载不上,不明白 还有有人知道Ubuntu下一些网站有时去不了的原因吗?Google说是和路由器的MUT值有关,是吗?

  2. 2 佚之狐L Commented @ 2008-02-29 9:45Reply to this comment

    忘说了,网卡模块是Pcnet32吗?在VM里?还有怎么加载它,用了官网的命令系统返回无××命令。学习Linux中……

  3. 3 latteye Commented @ 2008-02-29 9:59Reply to this comment

    modprobe pcnet32

    如果你访问个别网站总是处于等待状态,那么很可能是 MTU 没有协商好的问题。

  4. 4 esperisto Commented @ 2008-02-29 10:07Reply to this comment

    看来Archlinux很有点 Web 2.0 的风格哦

  5. 5 佚之狐L Commented @ 2008-02-29 10:12Reply to this comment

    @latteye 谢谢,去一些外国的.org的Wiki的网站总是时好时坏,头都大了。那MTU改谁的好呢,路由器和机器的?1480和1500有什么差别? P.S.和有台XP的机器,非常正常,能去的总是能去,不能去的用代理也大都能去

  6. 6 Tom Commented @ 2008-02-29 10:17Reply to this comment

    非常多謝Ning Bao和TOY的分享,使我認識到Archlinux,也是現時我覺得最適合我的發行版. 我用過的發行版:RedHat->Mandrake->Ubuntu/Gentoo->Archlinux. 最後我揀選了Archlinux. 不過一個發行版是否受大眾歡迎,不單講技術或管理機制,更重要的是推廣手法. Ubuntu能在Distrowatch成為最受歡迎的發行版,迅速超越RedHat, 這和它的商業和社區混合經營模式,還要免費派發和郵寄安裝CD有很大的關係. 希望透過Linuxtoy的介紹,以後有更多人使用Arch,使它不斷壯大成長.

  7. 7 sendney Commented @ 2008-02-29 10:20Reply to this comment

    正想买电脑,新机器一定跑arch!!!

  8. 8 yanzilme Commented @ 2008-02-29 10:48Reply to this comment

    @Ning Bao

    下一篇可以實際把一文件做成PKGBUILD,並且可以安裝於arch上嗎? 我一直研究安裝swiftfox可是卻一直失敗 http://getswiftfox.com/br18.htm

  9. 9 yu Commented @ 2008-02-29 10:50Reply to this comment

    与主题无关的话太多,没有toy写得简洁明了。

  10. 10 sunmix Commented @ 2008-02-29 11:25Reply to this comment

    @ yanzilme AUR里可以找到很多Firefox的PKGBUILD,不妨先参考一下。

  11. 11 pig345 Commented @ 2008-02-29 11:49Reply to this comment

    感谢。

  12. 12 rhfcaesar Commented @ 2008-02-29 13:02Reply to this comment

    很好,非常感谢!

  13. 13 sphinux Commented @ 2008-02-29 13:58Reply to this comment

    除去内容不谈,仅就表达方式来说,不夸张的说一句,这是我看过的最好的技术文章之一。逻辑清晰,表达流畅,没有生硬的定义概念,口语化的引导叙述方法层层推进,对前后知识点之间的关联照顾得很到位,完全无痛式的入手教程,非常适合于初学者,也能让各个水平层次的人快速接受。之前看过的技术书籍,似乎只有《编码的奥秘》在风格和水平上与之类似。 相信大家都经历过初学计算机和LINUX时的痛苦,就我们这些一般的使用者来说,能够为社区所做的主要贡献,就是影响我们周围的人来学习、使用和推广自由软件,而好的引导和教育方式是其中最重要的一环。希望能看到更多这样的好文章。 @ Ning Bao 希望能和你交个朋友。sphinux@gmail.com

  14. 14 zhuqin Commented @ 2008-02-29 14:01Reply to this comment

    补充一下,makepkg时尽量用makepkg -s可以自动安装依赖,而不是fail之后再来,另外-r -c -i参数也挺好,如果仅仅想下载source,那么就用-o,毕竟有些包打的并不好,pkgbuild也需要修改,有些你想要的编译参数没有加上或被屏蔽,那么你就需要./configure -h来看一下了。 还有,abs并不算很方便,因为具体你想编译的包的位置都不知道,还得find,希望以后能有相应的检测功能,比如abs xxx,就会自动cp和编译。还有不知大家有没有用过abs的另一个命令叫makeworld,也就是将某大目录下的所有软件全部编译和打包。

  15. 15 tayhe Commented @ 2008-02-29 14:39Reply to this comment

    arch 的包管理命令参数过分简洁了,不看wiki绝不晓得意思,还是debian系的apt和dpkg看起来清楚明白。

  16. 16 nolava Commented @ 2008-02-29 14:42Reply to this comment

    回 佚之狐L 一些网站去不了可以试试opendns

  17. 17 NingBao Commented @ 2008-02-29 15:09Reply to this comment

    @yanzilme 关于swiftfox我建议你把AUR中的PKGBUILD抓下来看一看。要安装swiftfox,就要依靠swiftfox提供的二进制包。 这是因为,Arch和Gentoo不一样。Arch不能像Gentoo那样方便的设置cflags等make优化参数(其实也可以,就是改变/etc/makepkg.conf,不过Arch提供的二进制包也就没有意义了)。 Swiftfox只不过是firefox在编译的时候用了不同的优化参数罢了。

  18. 18 Eric Commented @ 2008-02-29 15:45Reply to this comment

    不能再看了,再看我也想装Arch了。

    不过从这几天看过的所有Arch的文章来看,Arch更适合给程序员、有Linux经验的人来用。之前我用CentOS的时候,所有的软件基本上都是自己build的,只不过CentOS没有建立这样一套机制和软件,来让我把这些编译的东西和他人分享而已。

  19. 19 yuanjiayj Commented @ 2008-02-29 16:17Reply to this comment

    打造完美桌面? arch是绝对达不到这个要求的。 也许您认为arch Linux的配置更符合您的品味,也许您认为arch的包管理系统简洁明快,也许您认为arch够快。 但我还是要泼一泼冷水。 archLinux的整体性是比较差的,也就是说各种软件的配合度是比较差的。当您安装好它之后,您会发现这个初始系统的不方便会让您花上几个星期来进行各方面的配置。尤其是底层系统的配置,也许您需要改好多东西,看好多的资料。 以我使用arch的经验来看,如果您想要将它作为桌面的话,最好还是以root作为用户。否则引起的不便与莫名其妙的情况常常会出现(常常发生在应用它做事的时候)。 我离开debian,使用arch已经半年了。在半年的时间里,我常常会皱着眉头地去处理关于配置和驱动程序相关的事情。它的软件包更新也不像传说中的那么快,创新方面也一般。 值得称道的也就是aur和makepkg吧。但又有多少人是在自己打包呢。 普通用户们,建议尝试一下archlinux。但也建议您最好还是去用Debian。 如果说Linux发行版中有一个相对完美的发行版的话,我投Debian一票。它的严谨和自然,易用与易改,安全与方便,都值得称道。而且就创新而言,近年来它做的很多了。

  20. 20 Mingwei Liu Commented @ 2008-02-29 18:08Reply to this comment

    粗略看了一下介绍,感觉这种打包共享的方式确实很方便,但是没有经过审核,也就不能保证质量。要想接触linux系统,折腾系统,我觉得debian已经很不错了。自己打包,不多是为了自我的成就感觉,但是真正的高手,还是那些会写程序和写脚本的。debian的打包没有很复杂。

  21. 21 yanzilme Commented @ 2008-02-29 19:27Reply to this comment

    @NingBao

    謝謝! 這裡我有一個問題要請教!在swiftfox裡的md5效驗這邊 為什麼有三組md5?一組是我們下載的包,那另外兩組md5是哪裡來的?

  22. 22 yanzilme Commented @ 2008-02-29 19:28Reply to this comment

    補上PKGBUILD http://aur.archlinux.org/packages/swiftfox-pentium3/swiftfox-pentium3/PKGBUILD

  23. 23 leafduo Commented @ 2008-02-29 20:32Reply to this comment

    这世界上只有 23 个 TU ,7244 个注册用户,实在太少了……

  24. 24 GunsNRose Commented @ 2008-02-29 23:22Reply to this comment

    非常棒的文章,支持一把 偶用gentoo和archlinux多一些 希望toy多出好文章

  25. 25 rainy Commented @ 2008-02-29 23:24Reply to this comment

    @yanzilme

    看这里,除了PKGBUILD,还有另外两个文件。

    http://aur.archlinux.org/packages/swiftfox-pentium3/swiftfox-pentium3/

  26. 26 lh Commented @ 2008-02-29 23:53Reply to this comment

    TO: yuanjiayj

    看来你是根本没有怎么用过linux,还说自己用过用过,即使用过也没有怎么觉得linux方便或者精华所在,

    不是配置系统就是精华,但是这个是自定义所必须经过的,

    并不需要你从底层开始配置,只是需要你设置一下locale,配置一下网络和源,然后安装软件就可以了,不晓得你说麻烦在什么地方,

    而且你说需要root用户,这是天大的笑话,谁都知道用root用户是非常不明智的做法。

  27. 27 tuzi737 Commented @ 2008-03-01 0:02Reply to this comment

    debian自己打包不复杂,用checkinstall就行了

  28. 28 lh Commented @ 2008-03-01 0:08Reply to this comment

    debian不复杂,但是不明了,而且好像是无法解决依赖问题?还有arch符合kiss,arch哲学是保持系统总是最新,所有软件以及系统针对i686优化,配置系统需要任何软件,只需要文本编辑器,和debian有自己特殊一套东西还是非常不一样的。这个看喜好了。

  29. 29 lrf Commented @ 2008-03-01 1:12Reply to this comment

    从Toy的第一篇文章开始就喜欢上了这个简约的系统,也感谢Ning Bao带来这么好的文章:)

  30. 30 NingBao Commented @ 2008-03-01 8:53Reply to this comment

    @yanzilme source里面有几个文件 md5就有几个呀.其他的几个是图标什么的吧.

  31. 31 aaron Commented @ 2008-03-01 12:59Reply to this comment

    如果没有一个真正强大的linux桌面发行版,linux桌面没有市场份额,那么所有其他的linux桌面发行版就只能是玩具,而不可能成为得心应手的工具。

  32. 32 aaron Commented @ 2008-03-01 13:03Reply to this comment

    如果你只玩玩具,那么你的一生就被玩了! :)

  33. 33 aaron Commented @ 2008-03-01 13:12Reply to this comment

    如果你不玩玩具,那么你的一生也被玩儿了! 适当的玩玩具有益于身心。 最关键的是,我们由衷希望linux桌面发行版真正的强大,真正的被商家重视,真正有市场。 最具潜力和最具策略的目前是ubuntu linux,我为她加油!

  34. 34 yuanjiayj Commented @ 2008-03-01 15:32Reply to this comment

    To lh: 对你的话,我无语。 看法不一样,反正我想说的东西已经说了。 为了易用,世界上不智的人多的是。 另外,debian打包时的依赖关系是通过一个脚本检查后得出的。

  35. 35 rainy Commented @ 2008-03-01 20:38Reply to this comment

    @aaron

    见不得其它发行版好,你可以不看这篇文章。

  36. 36 z.wy Commented @ 2008-03-02 0:08Reply to this comment

    每个发行版都有自己的哲学,arch的哲学决定了他是一个小众的东西,只能在一部分人中流行。 而ubuntu、PCLinuxOS等的哲学就是大众,他们才有可能成为linux中的windows。 所以--为ubuntu、PCLinuxOS等加油,让他们去占领市场,打败MS;让我们享受Arch吧

  37. 37 yanzilme Commented @ 2008-03-02 13:03Reply to this comment

    我把自己打包好的package.tar.gz上傳過去 為什麼說"You are not allowed overwrite the swiftfox-amd package."? 可以請高手解釋一下嗎?

  38. 38 zhuqin Commented @ 2008-03-02 19:07Reply to this comment

    因为人家早有这个同样的包了,你自然没有权限覆盖人家的,不然还了得。 最起码名字要不一样,不过我是建议你在人家那里留言要他更新,而不是自己弄一个去覆盖掉。如果他不更新,自己弄一个不就可以了,用arch的都不是笨蛋。

  39. 39 pig345 Commented @ 2008-03-02 21:50Reply to this comment

    to leafduo 这世界上只有 23 个 TU ,7244 个注册用户,实在太少了…… -------------------------------- 同感阿,有点少的可怕!

  40. 40 yanzilme Commented @ 2008-03-02 23:19Reply to this comment

    @zhuqin

    只要壓縮包檔名不同就可以了嗎? 我自己打包的版本比較新耶,那邊最高的才到2.0.0.11 我自己打包了2.0.0.13pre1

  41. 41 NingBao Commented @ 2008-03-03 2:31Reply to this comment

    @yanzilme 好像不止要这样,关键是你的PKGBUILD当中的pkgname要不一样。我没有上传过别人已经有的包。你自己试试看,看看是不是pkgname的问题。

  42. 42 yanzilme Commented @ 2008-03-03 3:40Reply to this comment

    @NingBao

    謝謝,給您點通了 真的是pkgname關係,改了一下就行了 http://aur.archlinux.org/packages.php?ID=15470

    晚一點我再來打包swiftfox for intel的版本

  43. 43 yanzilme Commented @ 2008-03-03 3:57Reply to this comment

    intel的打包出來的 http://aur.archlinux.org/packages.php?ID=15471

  44. 44 zhuqin Commented @ 2008-03-03 6:25Reply to this comment

    @yanzilme 人家提意见了,说包有人维护。 确实aur标准上就有这么一条: When submitting a package, observe the following rules: Check [extra], [core], [unstable], UNSUPPORTED, and [community] for the package. If it is inside any of those repositories in ANY form, DO NOT submit the package (if the current package is broken or is lacking an included feature then please file a bug report in FlySpray). 所以最好不要这么做,一是对人家不尊重,二也没有必要,不就是一个版本更新么,自己做就可以了。如果觉得他的pkgbuild不够好,可以提意见或者提交一个bug,再不行直接上mailing list。 另外,那个amd版本已经是orphan的了,你adopt即可,不必新开一个。

  45. 45 yanzilme Commented @ 2008-03-03 7:52Reply to this comment

    @zhuqin

    謝謝!我只想著要學習打包沒有顧慮到那麼多,實在是很抱歉 我馬上把我的打包移除! 謝謝提醒!

  46. 46 beanya Commented @ 2008-04-02 11:15Reply to this comment

    怎么执行abs后那么久? abs后 ==> Updating core... Connected to 66.211.213.17 这是哪里的ip,怎么这么慢? 能不能换一个地址? 几天都没下完

  47. 47 Cyker Way Commented @ 2010-03-02 21:29Reply to this comment

    太精华了,道理讲得很明白,赞一个~