颜林林的个人网站

Linlin Yan's Personal Website

Gentoo初识

2013-09-22 09:58

世上有这样一类东西,当你越了解,就会越喜欢,Gentoo便是其中之一。

对于Gentoo Linux,我其实从三年前便开始使用了,主要原因是实验室服务器上大多安装的是这个发行版,而我有幸参与了其中一部分服务器的维护工作。虽然也经常使用emerge命令来安装软件或进行系统升级,但却因为各种原因一直没有深入探究过Gentoo底层是如何工作的,没能体会到其精妙,却反而总是叫苦于各种具体软件包自身的不兼容问题,以为是Gentoo本身带来了沉重的学习负担。直到最近,在仔细学习了一番Gentoo ebuild之后,才逐渐对其有了“初识”。

生物信息学中,许多分析工具产生和更新很快,绝大多数Linux发行版都不能及时更新和收录,于是对这些软件的安装,通常只能通过手工下载源码进行编译的方式进行维护。但为了避免“污染”发行版自身维护的“系统软件”,我通常会建立一个独立的目录(比如/opt/build/)将解开的源码放入其中,并在configure时将prefix指到特定的目录。然而,这么做的代价是,一旦所依赖的系统库出现问题,我必须用ldd命令手工检查所有这些目录中的可执行文件,看是否存在动态链接库失效的软件包,若有,则需要用与之前完全一样的命令,重新编译和安装该软件。这是个非常费劲和容易出错的工作。

其实,Gentoo的portage和emerge这套机制正是为解决这个问题而被创造出来的。举个例子,对于jellyfish这个软件,在Gentoo中可以编写如下一个ebuild文件(sci-biology/jellyfish/jellyfish-1.1.11.ebuild):

# Copyright 1999-2013 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2
# $Header: $

EAPI=5

DESCRIPTION="Fast, Parallel k-mer Counting for DNA"
HOMEPAGE="http://www.cbcb.umd.edu/software/jellyfish/"
SRC_URI="http://www.cbcb.umd.edu/software/jellyfish/${P}.tar.gz"

LICENSE="GPL-3"
SLOT="0"
KEYWORDS="~amd64 ~x86"
IUSE=""

DEPEND=""
RDEPEND="${DEPEND}"

它仅仅指定了这个源码从哪里下载。把这个ebuild放到一个本地的overlay中,用ebuild生成其digest信息,之后简单地使用emerge -av jellyfish进行安装即可。

下面详细说明一下emerge进行安装的这个过程的背后细节:

  1. 首先,emerge会根据ebuild中的SRC_URI去下载源码包(这里${P}变量来自ebuild文件名,将被自动替换成“jellyfish-1.1.11”),放到/usr/portage/distfiles/目录中;

  2. 然后,emerge会解压缩该源码包到/var/tmp/portage/sci-biology/jellyfish-1.1.11/work/目录;

  3. 解压缩完成后,emerge会转到/var/tmp/portage/sci-biology/jellyfish-1.1.11/work/jellyfish-1.1.11/目录,并执行./configure进行配置;

  4. 之后,自然是make、make test和make install,不过不同的是,emerge在这个过程中会自动把prefix换掉,使编译生成的可执行文件和帮助文档安装到/var/tmp/portage/sci-biology/jellyfish-1.1.11/image/目录;

  5. 编译、测试和安装都顺利完成后,才真正执行合并(merge)动作,把/var/tmp/portage/sci-biology/jellyfish-1.1.11/image/中的目录和文件,保持目录结构地拷贝到/下,使成为系统的一部分。这个过程中,它会自动检查是否有文件冲突,若有则给出错误提示并宣告失败,以防错误的文件覆盖操作。同时在其数据库中记录下本软件包都写了哪些系统文件,以便在未来软件包升级或卸载时,将这些文件都正确清理掉。

在上面的ebuild文件中,由于使用了${P}这样的变量,因此在该软件有新版本发布出来时,只需要拷贝一份该ebuild文件,将文件名重命名成新的版本号,即可用emerge命令自动对其完成升级。这么做,对于快速加入新的软件支持是非常有利的。

Gentoo ebuild系统中还有大量针对不同编译系统的支持(如CMake、Ant、CPAN等),也使得其相比其它发行版更容易维护和快速更新。同时因为从源码出发,可以很方便地定制各种特性,并根据目标机器进行编译优化,这些特性在其它Linux发行版中几乎是无法实现的。

总之,在真正“初识”以后,我的切身体会是:Gentoo真利器也!