自己一边看一边翻的,有错误还请见谅,嘿嘿。
Portage 手册
内容:1. Portage: An Overview2. Configuring Portage3. Package Management
1.Portage: 概要
概要
Portage 是一个非常强大的高级软件包管理系统。它的灵活性,它具有既能作为简单的编译引擎,又能构建一个 cutting edge (领先、大胆创新)的 Linux 发行版的能力,给它赢得了 Meta-distribution Engine(超发行版引擎) 的美誉。Gentoo Linux 就是围绕着 Portage 来构建的。
Gentoo Linux 自身就经常被称为超发行版。它由 Portage 和大概 1,500 套软件包编译指导脚本(称为 ebuilds)组成。这些 ebuilds 告诉 Portage 引擎如何编译和安装一个软件包。通过使用 profiles 和命令行工具 emerge ,用户和开发者能用 Portage 安装和维护软件包,这些软件包组成了底层的操作系统平台以及在平台上使用的程序。
一个 Gentoo Linux 系统是 "在线即时编译" 的。安装 Gentoo Linux 包括建立一个够用的编译器和编译环境,Portage能在这个环境中从 Internet 上下载源码并编译余下的核心系统及任何你想要的程序。尽管 Portage 的确支持安装编译好的二进制软件包,但这对整个系统是一个危害,除非是在很慢的计算机上,或是开发者系统快速恢复某个软件包,又或者你是在一个速度快的检索上编译,拿到速度慢的计算机上使用时,才应该使用。
由于这一点,再加上 Portage 编译安装软件包的方法是高度可配置的,所以只有很少的 Gentoo Linux 安装是完全一样的。从本质上说,当用户安装 Gentoo Linux 时,Portage 系统根据配置文件和 ebuilds 中指定的参数,编译出的实际上是自定义的系统。
咋看上去,Portage 的思想好像和传统的 BSD ports 系统很相似。它们都可以从源码开始编译软件包,并允许用户安全的在系统中安装和卸载软件,还都能自动处理依赖关系。Portage 的许多思想是从 BSD ports 系统那里借来的,但 Portage 绝不仅仅是又一个"ports 抄袭"。
Portage 系统由 Python 核心和基于 Bash 脚本的 Ebuilds 组成。它并不是处理 Makefiles 和 make 命令,而是将 Python 语言的强大功能和 具备一些面向对象特征的 shell 脚本的易用性相结合,组成了一个唯一的强大系统,我们敢说,Portage 比目前所有 ports 系统都好。
Portage 还提供了一些高级特征:能同时安装同一软件包的不同版本,升级树中的软件包,根据条件来解决依赖性,精炼的包管理,sandboxed(沙漏之意,这里指与原系统隔开)安全安装,配置文件检测,profiles 等等。这些特征中的多数都将在下面来详细讨论。
根据条件来解决依赖性和特性支持
Portage 系统提供个用户的灵活性是最大的。传统的 BSD ports 系统倾向于只支持 ports 树中单个软件包的一次升级。Portage 没有这样的限制,可以多次升级同一个软件包。软件包的依赖性,那些编译其他包需要同时又需要别的包的,可以用名字或名字加上版本范围来指定。这就使在树中可以同时提供多个版本。
依赖性系统还支持条件依赖。Portage 有一个功能强大的概念叫 USE 设置 系统。通过改变 Portage 配置文件中的一个变量,你可以禁止某个特性或库的条件支持(有必要的话),对每个包都可以。这是一个非常灵活和强大的系统, 下一节将详述。
Portage 还支持 SLOT (插槽) 的概念。开发 Gentoo Linux 的过程中,开发者经常感到必须同时装上一个包的不同版本(比如库文件) 来满足其他包的需要。传统的做法是,将这些版本看成是不同的包,名字有一点区别。
我们的开发者不这样做,而是教会 Portage 如何使用 SLOT (插槽) 来处理和维护同一个包的不同版本。一个例子是 freetype,1.x 系列的 freetype 和 2.x 系列不兼容,但两个包都要装,才能满足其他包的依赖性。多数发行版和 ports 系统用 "freetype" 来表示 1.x 系列,用"freetype2" 来表示 2.x 系列。我们认为这是包管理系统的缺陷。我们把 SLOT 1 分配给前一个,把 2 分配给后一个。有了这个信息,Portage 就能同时跟踪两个系统,如果相应的系列有升级,它也能正确的升级它们。
Profiles
Portage 支持 profiles (配置文件)的概念。一个 profile 包含一组软件包和相应版本的列表,并含有指导性的配置参数,供 Portage 使用。profile 告诉 Portage 哪些包的哪个版本的可以安装、禁止安装或视为必需的。用户可以通过改变一个符号链接 (/etc/make.profile) 来切换 profile. 这看起来很简单,但它使 Portage 有能力组成一个发行版的核心,并成为职业级的编译系统。
开发 Gentoo Linux 的所有努力得到的结果是大量的 ebuild 文件和一个 profile. 这个 profile 定义了哪个包是对系统很重要的核心包,还允许开发者对某个包或某个版本注释和取消注释,就能防止有缺陷的包。ebuild 文件只是告诉 Portage 如何具体的编译和安装 profile 要求或允许的包。
2.配置 Portage
概要
下面一节讲了对用户和开发者都很重要的 Portage 配置。Portage 非常灵活,为了对你的系统负责并按你的需要来优化,你需要掌握如何配置 Portage.
请注意,这个文档里说到的"用户",指的是有管理员权限来使用 Portage 和改变系统配置的人。你必须有 root 权限,才能改变 Portage 的配置,merge 和 unmere 软件包。
Portage 配置文件
下面讨论的几乎所有参数都能在 /etc/make.conf, /etc/make.profile/make.defaults 和 /etc/make.global 文件中找到。/etc/make.conf 包含 Portage 使用的多种变量。对于所有设置。Portage 将先检查当前定义的环境变量,如果没有,则检查 /etc/make.conf. 如果还是没有,Portage 就到 /etc/make.profile/make.defaults 中去找。又没有的话,最后就使用 /etc/make.globals 中的缺省设置。请注意,用户的设置应该在环境变量或 /etc/make.conf 中。还有一点,/etc/make.conf 中的设置立刻就会覆盖 /etc/make.global 中的。/etc/make.conf 和 /etc/make.global 中的设置可以看成是整个系统的全局设置,只要使用 Portage.
当检查某个参数是否已经设置时,建议你先查 /etc/make.conf 再查 /etc/make.globals. 除非特别声明,/etc/make.conf 中的设置将覆盖 /etc/make.globals 中的。
USE 设置
USE 设置系统是在编译时改变全部或单个软件包特性的灵活方式。它允许管理员控制如何根据可选的特性来编译软件包,把哪些特性编译到包里面去。比如某个包有可以选择的 GNOME 支持,如果在编译时,禁止 gnome USE 设置,就能禁止这个特性。反之,打开 gnome USE 设置,就打开了这个包的 GNOME 支持特性。
USE 设置对包的影响取决于是否软件包本身和它的 ebuild 支持 USE 选择。如果上面的那个软件包没有 GNOME 支持,相应的 USE 设置很明显就没有作用。同样,很多包的依赖性不被视为可选特性,所以 USE 变量对依赖关系也没有作用。某个包 USE 的关键字列表可以在它 ebuild 文件中的 DEPEND 和 RDEPEND 行找到。
Gentoo Linux 使用的 USE 设置列表可以在 /usr/portage/profiles/use.desc 文件中找到。每行列出一个关键字,后面跟着它作用的简单描述。
Portage 决定某个 USE 设置是打开还是禁止的,要搜索四个不同位置。这些位置以"栈"(译注:后进先出的一个数据结构) 的方式来改变 USE 设置。Portage 搜索过每个位置,并记住是否前一个位置打开或禁止了一个 USE 设置。在这个过程中,USE 设置是可以累加的。
Porage 查看 USE 设置的位置以及查看这几个位置的顺序是由 /etc/make.global 中的 USE_ORDER 来决定。要去掉一个位置,你只要从 USE_ORDER 中把它去掉就行了。
下面是 Portage 中 USE_ORDER i的缺省值,按搜索顺序排列。
Defaults(缺省)
Portage profiles 能定义一组缺省的 USE 关键字。这是在任何一个 Portage 的 profile 中 make.defaults 文件里定义的。由于 /etc/make.profile 是一个到当前使用的 Portage profile 的符号链接,/etc/make.profile/make.defaults 就是起作用的缺省 USE 设置。建议你别改这个文件,因为以后 profile 的变化可能会覆盖你的改动。
Auto(自动)
这是在 Portage profile 的 use.defaults 文件中定义的(/etc/make.profile/use.defaults)。每个条目含有一个 USE 设置和相应的软件包。如果目前系统里有这个软件包,就会使用它的 USE 设置。例如,你安装过 x11-base/xfree,并且没有指明要禁止 X USE 设置,这个 X 关键字就会在以后都管用,只要软件包还没删掉。建议你别改这个文件,因为以后 profile 的变化可能会覆盖你的改动。
Conf(配置)
如果在 /etc/make.conf 文件中定义了一个 USE 设置,就会加上它。如果在 make.conf 里没有定义 USE 变量,就会在 /etc/make.globals 文件里查找。这个条目类似于下面这样:
Code listing 2.1
USE="slang readline gpm berkdb gdbm tcpd pam libwww ssl gb tk
lm_sensors lvm ldap tex bonobo sdl gtk xfs evo pda ldap
mmx mitshm perl python guile ruby postgres dvd 3dnow tcl
lcms gif sdl vorbis ogg oss libg++ directfb decss snmp
gnome X opengl mozilla pdflib gpg -nls gd xface jpilot
-kde -qt -esd -motif -alsa oggvorbis"
打开 USE 设置只要列出它的名字,禁止时要在名字前加上一个"-"符号。比如, gnome 打开 GNOME 关键字而-motif 禁止了 motif 关键字。
建议在 /etc/make.conf 里设置 USE 来打开或禁止某个关键字,这个文件不会被 Portage 自动覆盖。如果你在前面两个位置有不想要的 USE 设置,或是想打开某个 USE 关键字,就在这里设置好。
Env(环境变量)
USE 关键字可以用 shell 环境变量来覆盖。
Code listing 2.2
export USE="-gnome"
emerge net-im/gaim
这就更加灵活了,允许你用某个 USE 的组合来编译某一个或几个软件包。只要 emerge 是在这个 shell 里运行,并且 USE 环境变量还设置着,就会对 emerge 的软件包发生作用。
注意: 尽管 Portage 现在记录了 USE 的组合,并用这个组合来 merge 软件包,但这个 USE 组合并不是持久的。如果重新 merge 一个软件包,或者升级某个软件包,那么使用的是当时的 USE 设置,而不是它第一次 merge 时用的。
编译器参数
Portage 用来编译软件包的编译器参数可以在 /etc/make.conf 文件中的 CHOST, CFLAGS, 和 CXXFLAGS 里设置。CHOST 指明你为之而编译的平台,CFLAGS 和 CXXFLAGS 分别指明编译器编译 C 和C++ 代码时使用的参数。
在这个文件里给出了几组加了注释了使用平台的优化参数,它们是很稳定的,经过了很多测试。改变它们可能会引起编译错误和编译器与所编译软件的 bug. 如果你决定要改变缺省的设置,要小心一点,因为你可能会得到一个不稳定的系统。
使用多处理器(CPU)系统的用户,可以修改 /etc/make.glocals 中的 MAKEOPTS 参数,能得到很大的好处。这个参数在编译软件包时传递给 make 命令,打开多个 gcc 进程。
目录位置
Portage 允许你改变它用来编译软件包和存放各种文件的目录位置。多数用户没必要改。可以设置下列参数:
PORTDIR - Portage 树位置
DISTDIR - 下载压缩包的本地缓存
PKGDIR - 本地产生的 tbz2 包位置
RPMDIR - 本地产生的 RPM 包位置
CURRENTFILE - ???
PORTAGE_TMPDIR - 软件包编译时使用的临时空间
BUILD_PREFIX - 与 PORTAGE_TMPDIR 有关
PKG_TMPDIR - 与 PKG_TMPDIR 有关
配置文件保护
Portage 允许保护指定目录中的所有配置文件。Portage 将不覆盖保护目录中的文件。如果某个包试图安装一个已经有了的文件,新的文件将被改名成 ._cfg0000_name. 这样做,用户就能以后再看一下新的文件,并根据两个文件的差异把它们合并。
/etc/make.conf 或 /etc/make.globals 文件中的 CONFIG_PROTECT 是用来设置保护目录的。保护目录下的文件和子目录可以用 CONFIG_PROTECT_MASK 参数来使之失去保护。
下面是一个例子,不能盲目地拷贝:
Code listing 2.3
CONFIG_PROTECT="/etc /usr/share/config /usr/kde/2/share/config"
CONFIG_PROTECT_MASK="/etc/gconf /etc/init.d /etc/pam.d"
用户可能还想知道更多的信息,用下列命令:
Code listing 2.4
emerge --help config
特性
Portage 提供了一些参数,供开发者控制 Portage 的行为并在 merge 一个软件包的不同阶段来清空。这些参数只适合于开发者,对用户可能会引起麻烦。
/etc/make.conf 或 /etc/make.globals 文件中的 FEATURES 可以控制下列参数:
digest : 为新的 ebuild 文件自动创建摘要.
cvs : 自动把摘要提交到 cvs.
sandbox : 打开 "sandbox" 来进行路径前缀保护。
noclean : Portage 永远不自动清空.
noauto : 不要自动运行 ebuild 前面的步骤。
Portage SYNC 设置
Portage 通过 rsync 来更新 Portage 树。如果你找到了其他更新方法,可以在 /etc/make.conf 文件中的 SYNC 那里定义。
RSYNC
rsync 是最常见的更新 Portage 树的方法。rsync 方法在 /etc/make.conf 中设置:
Code listing 2.5
SYNC="rsync://cvs.gentoo.org/gentoo-x86-portage"
注意:rsync 方法会盲目的覆盖掉你对本地 Portage 树作的任何改动。如果你需要保留本地的改动,使用PORTDIR_OVERLAY="/some/dir/where/you/keep-your-tree" 来保皇派你自己的劳动成果。
开发者 CVS
对 CVS 树有完全访问权限的开发者可以 emerge sync 本地的树和 CVS 仓库,不过要用 RSH 或 SSH 连接。
用你的帐号 check out(CVS 术语,意为检出) 一个 CVS tree,并把它移到 /usr/portage,用下列 SYNC 参数:
Code listing 2.6
SYNC="cvs://youraccount@cvs.gentoo.org:/home/cvsroot"
镜像
Gentoo 项目在本地保留了一个 Portage 树中 ebuild 文件引用到的压缩包的完整镜像。upstream(经常上传)的源码包等,放在可能已经关了的老服务器上。upstream 的源码包,一般更新很快,开发者可能会在出新版本的时候把老版本从服务器上删除。为了方便 Gentoo 的用户(并且减少 upstream 源码站点的带宽占用),我们也镜像这些文件。你可以用离你近的服务器上下载,这样更快,也更可靠。
你 mereg 一个软件包的时候,Portage会首先搜索我们的镜像站点,如果镜像站点没有,那么 Portage 会按照 ebuild 文件中给出的 HTTP 或 FTP 服务器去下载。
Portage 使用的镜像站点在 /etc/make.conf 中的 GENTOO_MIRRORS i设置,下面是缺省的设置:
Code listing 2.7
GENTOO_MIRRORS="http://www.ibiblio.org/gentoo"
要找一个离你近的 Gentoo 镜像,到 Gentoo 的网站上查一下,或者在你本地的邮件列表里问。
下载程序
Porgate 用来下载压缩包的程序可以用 FETCHCOMMAND 和 RESUMECOMMAND 来设置。在 /etc/make.conf 和 /etc/make.globals 中给出了几个例子。Portage 缺省使用 wget 应该能满足多数用户的需要。
注意:Portage 用 HTTP_PROXY 和 FTP_PROXY 这两个环境变量来把 HTTP 和 FTP 代理的信息传递给下载程序。
代理
Portage 在下载文件的时候,既能用 HTTP 代理也能用 FTP 代理。把 HTTP_PROXY 和 FTP_PROXY 在 /etc/make.conf 或 /etc/make.globals 文件中设置好就行了。如果一个代理服务器既提供 HTTP 也提供 FTP 代理,你可以用 PROXY 变量来替换前面的两个变量。
例如:
Code listing 2.8
HTTP_PROXY="http://192.168.1.1:8080"
FTP_PROXY="http://192.168.1.1:8080"
或
PROXY="http://192.168.1.1:8080"
Portage 也可以通过 HTTP 代理来使用 RSYNC。 RSYNC 代理可以在 /etc/make.conf 中设置 RSYNC_PROXY 参数或者把它设置成环境变量。
例如:
Code listing 2.9
RSYNC_PROXY="192.168.1.1:8080"
注意:如果你所在的网络有防火墙,rsync 就好像不能使用 HTTP 代理了。你可以用快照 (译注:更新很快,一般是从 cvs 里抓出来的) 的压缩包来更新你的 Portage 树。比如下面这里就有一个:
http://www.ibiblio.org/gentoo/snapshots/.
杂项
下面是一些用户可能有用的次要参数:
NOCOLOR : 禁止 emerge 工具输出中的彩色。
CLEAN_DELAY : Portage 在删除一个包前,给用户一定的时间(以秒计算)来取消这个行为。如果设置成"0",就不等待,直接 unmerge.
3.软件包管理
升级 Portage 树
Portage tree 存放在 /usr/portage,包含各种软件包的编译指导文件(称为 ebuilds). 这个树还包含 profile 和 package.mask 信息,对保持你的系统最新很重要。所以需要经常更新这个树,与官方的 Portage 树保持一致,以便安装最新版本的软件包,修正 bug. 使用下面的命令:
Code listing 3.1
emerge rsync
emerge 用来更新本地 Portage 树的方法可以改变。看一下 Configuring Portage 中的 Portage SYNC 设置。