Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2029732
  • 博文数量: 593
  • 博客积分: 20034
  • 博客等级: 上将
  • 技术积分: 6779
  • 用 户 组: 普通用户
  • 注册时间: 2006-02-06 14:07
文章分类

全部博文(593)

文章存档

2016年(1)

2011年(101)

2010年(80)

2009年(10)

2008年(102)

2007年(16)

2006年(283)

我的朋友

分类: LINUX

2008-11-17 14:37:06

内容:
1. Portage: An Overview
2. Configuring Portage
3. 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=""


要找一个离你近的 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=""
FTP_PROXY=""



PROXY=""


Portage 也可以通过 HTTP 代理来使用 RSYNC。 RSYNC 代理可以在 /etc/make.conf 中设置 RSYNC_PROXY 参数或者把它设置成环境变量。


例如:



Code listing 2.9



RSYNC_PROXY="192.168.1.1:8080"



注意:如果你所在的网络有防火墙,rsync 就好像不能使用 HTTP 代理了。你可以用快照 (译注:更新很快,一般是从 cvs 里抓出来的) 的压缩包来更新你的 Portage 树。比如下面这里就有一个:



杂项


下面是一些用户可能有用的次要参数:

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 设置。
 
Merging 软件包


用 Portage 来编译并安装一个软件包称为 merging. Portage 编译软件包,然后将它装在一个临时的 "image" 目录下,在那里它会记录要安装的文件。这些文件随后从 image (映像) 目录移到真正的系统里,和系统合并(就是merge)。


emerge 命令是 Portage 系统的前端。安装和删除软件包都是用这个命令以及它的各种参数。


要安装某个包最新的 unmasked 版本,只要指定包的名字:



Code listing 3.2



emerge galeon


这个命令将编译和安装任何有依赖关系的包(还要考虑 USE 设置),然后再安装最新的 unmasked 版本 galeon. Galeon 也可以用名字加上类别来指定: net-www/galeon


emerge 命令还可以处理真正的 ebuild 文件,这使用户可以 merge 老一些版本的软件包,或者一些第三方提供的有基于 ebuild 的软件包。例如:



Code listing 3.3



emerge /usr/portage/net-www/galeon/galeon-1.2.0-r3.ebuild


除 了上述的两个用法,emerge 还支持几个很有用处的命令行参数。--pretend 可能用得最多。用了这个参数后,就不会真正的 emerge,而是显示出 emerge 时必须安装和升级的软件包列表。下面的例子列出了在安装最新版的 kdevelop 时,所需要 merge 的软件包:



Code listing 3.4



root@kodiak blocke # emerge --pretend kdevelop

These are the packages that I would merge, in order.

Calculating dependencies ...done!
[ebuild N ] kde-base/kdelibs-2.2.2-r4 to /
[ebuild N ] dev-util/kdbg-1.2.2 to /
[ebuild U ] app-text/psutils-1.17 to /
[ebuild U ] app-text/a2ps-4.13b-r3 to /
[ebuild U ] app-text/jadetex-2.20 to /
[ebuild N ] app-text/sgmltools-lite-3.0.3-r2 to /
[ebuild N ] kde-base/kdoc-2.2.2-r1 to /
[ebuild N ] net-www/htdig-3.1.5-r2 to /
[ebuild N ] app-text/enscript-1.6.3-r1 to /
[ebuild N ] kde-base/kdebase-2.2.2-r2 to /
[ebuild N ] app-doc/qt-docs-2.3.1 to /
[ebuild N ] dev-util/kdevelop-2.0.2 to /


上面的列表中,标记了 N 的软件包是还没有装过的,将在这次 emerge 时安装,而标记了 U 的软件包是已经装过老版本的软件包,这次将升级。


其他参数有:


--fetchonly : 只下载文件,包括要安装的包和解决依赖性的包。



--emptytree : 使 Portage 假装这个包没有依赖包,或者说依赖包都已经装过了。这个参数和 --pretend 相结合,就能显示出一个软件包完整的依赖树。所有的依赖关系(除了 glibc )都显示出来。


--nodeps : Portage 试图只安装指定的软件包,而忽略所有的依赖关系。如果你没有安装过合适的依赖关系包,那么编译可能会失败。


--onlydeps : 只安装某个包的依赖包,而不安装它自身。


--noreplace : 跳过指定的包,如果它们已经安装过的话。


--usepkg : Portage 并不编译指定的包,而是试图从指定地点安装预编译好的 tbz2 包。地点由 PKGDIR shell 环境变量来决定。


--debug : ebuild 环境输出更多的信息。这对开发者查找 ebuild 文件中的语法错误很有用。


--autoclean : 强制 emerge t在开始编译一个包前清除这个包的临时编译目录。Portage 缺省就是这样做的,所以这个参数只有对想禁止这样做的开发者有用处。


--verbose : 让 emerge 输出更多的信息。目前,这只会多输出 GNU info 手册页的错误,而这些错误都是可以安全地忽略的。


Unmerging 软件包


"unmerging" 就是从文件系统中删除某个包的文件。包里的程序被从系统删除,除非再次 emerge,否则不能使用。


执行 emerge 命令,加上 unmerge 参数,后面再跟上包的名字,就能删除这个包。下面的例子将删除所有安装过的 ltrace 包版本:



Code listing 3.5



emerge unmerge ltrace

or

emerge unmerge dev-util/ltrace


Portage 也允许只 unmerge 指定版本的包。可以用 = (确定版本), < (小于), > (大于), <= (小于或等于), 和 >= (大于或等于)。下面的命令将 unmerge 所有小于或等于 0.3.15 的 ltrace 版本:



Code listing 3.6



emerge unmerge \<=dev-utils/ltrace-0.3.15


当 指明了软件包的版本范围后,很重要的一点就是要用跳脱符号(也就是"\")来标注 > 和 < ,这样你的 shell 才能把它们看作是你表达式里的符号,而不是解释为 shell 里的符号。你还需要像上面例子里那样指明软件包的类别和名称。执行 emerge --help 命令,可以找到另一个软件包范围指定的例子。



警告: Unmerging 一个软件包可能很危险。如果你删除了某个核心包,你的系统可能就不能正常工作了,删除有的库文件会使程序不能运行。在你删除核心包或其他包对它有依赖关系的包时,Portage 不会提醒你。



如果你要删除的包现在的确是装在系统中的,emerge 程序将详细显示将删除的是什么版本的哪个包,并会等待指定的时间,以便用户取消这次 unmerge. 在这段时间内,用户可以按下组合键 Control-C 来取消操作。


一 旦 unmerge 开始,你将看到一长列文件名,它们都是属于这个包的文件。有些文件名左边会显示一个标记, !mtime, !empty, 和 cfgpro 说明了是由于什么原因,这个文件没有删掉。文件名左边没有上面三个标记中的任何一个,这样的文件就已经成功的从系统中删除了。


!mtime 标记表示这个文件在软件包安装后改动过。这意味着在软件包安装后,有人编辑过它,或者其他的包又安装了同样的文件,从而把老的文件覆盖掉了。这个标记使我们能升级软件包,同时又不会害怕删除老版本的过程中会删掉重要的文件。


!empty 标记表示 Portage 不会删除这个目录,因为它不是空的(不同的包可能会把文件装在同一个目录里)。配置文件保护会带给你 cfgpro 标记。它的意思是一个新安装的软件包声称自己对这个配置文件有所有权,因此 Portage 也不会删除它。



警告: 文件被认为是由最后安装它的那个软件包所有,这依赖于安装时的顺序,与真实的版本号无关。删除新安装的软件包,会同时删掉它所有的文件,即使有某个老的软件包也安装了这个文件(假设用户没有手动修改过它)。



System(系统)升级


Portage 支持用一个命令自动升级安装过的软件包,这一 system升级特性允许用户升级"核心"包,用 Gentoo 开发组推荐的版本来代替老的版本。一次系统升级不会升级不重要的包,只有在 Portage profile 中写明了是对操作和维护系统 essential (必不可少)的包才会升级。


要进行系统升级,用下面的命令:



Code listing 3.7



emerge --update system


Portage 将根据你已经安装的版本和软件包名称,以及当前的 Portage profile 推荐的版本和包名,来编译和安装升级版本。用户可以在上面例子中加上 --pretend 参数,来得到一个将要安装和升级的包的列表。



注意: 在安装指导中,你可能已经注意到,最早的几步之一就是用 emerge system 来安装基本(或"核心")包。 emerge --update system 将这些基本包升级到最新的一个推荐版本。



World 升级


Portage 也支持用一个命令来升级选定的非核心包。portage 系统有一定的内建智能,可以安全的升级一个系统,即使这个系统里同时存在多种相冲突的版本的软件包。


Portage 的 world 升级特性会检查系统的 profile ,禁止安装的软件包 (package.mask), world profile 和 world profile 中列出的软件包的依赖关系(包括版本范围),并在这个基础上,决定哪个包需要升级。如果一个软件包存在新的版本,并且这个软件包列在 world profile 中或是 world profile 中某个包的依赖关系,这个软件包才会升级。另外,这个包或者说要安装的这个版本必须不在 system(系统) profile 或 package.mask 中被禁止。


当考虑要升级哪个包时,Portage 试图尽可能多的升级在 world profile 中提到的包。Portage 还会考虑它们的依赖关系包,只要存在新的版本,符合指定的版本范围,并且没有在 system profile 或 package.mask 中禁止,就会升级这个依赖关系包。它还会考虑 SLOTS(插槽),上一节已经说过了。


对其他发行版和软件包管理比较熟悉的 用户可能会有些疑惑,为什么 Portage 不简单的按照版本号来升级所有新的包 (Gentoo 1.0 中就是这样做的)。Gentoo 的 Portage 树中有许多包都存在多个版本。老版本和新版本的包对于依赖于它们的软件可能并不兼容。如果盲目的升级了库文件和工具,而没有考虑到其他包的需要,可能会马 上引起麻烦。为了避免这种情况,Portage 尽量小心的升级,根据每个包 ebuild 文件中的要求,考虑所有包的需要。


Portage 的 world 升级,最重要的就是 world profile. system profile 通常是由开发者来定义的,用户不应该改动它,而 world profile 就不同了,它是由用户的日常操作来间接产生的。world profile 有点像"收藏夹(有最爱的意思)"。用户通过 emerge 命令来手动安装的单个软件包,会被记录在 world 文件中,它位于 /var/cache/edb/world. Portage 假设你费力告诉它要安装这个包,你就有兴趣让这个包与时俱进。


world 文件由软件包的类别和包名称组成,每行一个,有点像下面这样:



Code listing 3.8



net-im/gaim
net-www/skipstone
net-www/galeon
app-editors/vim
app-text/ispell
net-mail/evolution
dev-util/ltrace
sys-apps/xfsprogs
=net-www/mozilla-0.9.8-r3
sys-apps/attr
sys-apps/dmapi
sys-kernel/linux-sources
sys-apps/acl
app-office/gnucash
app-cdr/xcdroast


上面例子中几乎所有的条目,都是由 Portage 在用户手动 merge 特定包时,自动添加进去的。如果有新的版本,这些包就会升级。



注 意: 为了节约时间,并保证你喜爱的软件包保持最新,你可以手动编辑 world 文件,为那些包增加条目。从老版本的 Portage 中升级过来的用户,可能需要修改这个文件,使它符合要求。使用较新的 Gentoo 和 Portage 的用户,在安装过程中应该已经创建了一个比较好用的 world profile.



一个有趣的条目是 mozilla(=net-www/mozilla-0.9.8-r3). 这个包被用户加上了版本号和等号。软件包范围指定(在本手册的 Unmerge 软件包 部份说过) 可以用来强制 Portage 在升级软件包时只在某个版本范围中考虑。上面的那一个条目实际上让 Portage 认为,mozilla-0.9.8-r3 是唯一的版本,所以就永远不会在 world 升级时来升级 mozilla.


World 升级用下面的命令:



Code listing 3.9



emerge --update world


Portage 将试图升级 world 文件中列出的软件包,并在需要时升级任何依赖关系包。在能满足要升级的软件包需要的情况下,依赖关系包升级到最高的一个版本。没有在 world 文件中列出的包,如果同时又不是那些包的依赖关系包,就不会升级。



警 告: Portage 不会覆盖"配置文件保护"所控制目录中的文件。你需要手动 merge 现有配置文件和 Portage 为你保存下来的新版本。如果你没有升级你的配置文件,安装的软件可能不能运行。请看 配置 Portage 一节中的 配置文件保护 ,或使用命令 emerge --help config 来得到更多信息。



world 升级前要先看一下升级和安装的软件包列表,可以用本节前面提到的 --pretend 参数。



注意:一个 world 升级同时会自动执行一个 system 升级。核心包不能用 world 文件来固定版本号(就是前面说过的 mozilla 那种方法),因为当前的 Portage profile 会覆盖它。



world 升级有一个有趣的副作用,可以在一个安装好的系统上重新编译所有软件包。由于 world 升级会试图升级所有 world 文件里提到的包和它们的依赖关系,使用参数 --emptytree 可以强制编译所有这些包和依赖关系,除了 glibc. 如果用户想改变优化参数,或 USE 关键字的值,并且希望系统中所有软件都能用到这些改变,又懒得重新 merge 每一个包,就可以用这种用法。在 world 文件中填上所有你常用的程序,然后用下面的命令:



Code listing 3.10



emerge --update world --emptytree


你可以加上 --pretend 参数来看一看将被重新编译的包。


清理系统


Portage 支持同时安装同一软件包的不同版本。在 Gentoo 的 Portage 树中有不少包都会用到这个功能(是为了向前兼容,因为老的程序可能不和新版本的依赖包兼容)。


在多数情况下,当安装了新版本的包时,老版本包的多数文件会被覆盖,留下的只是一些文档和不重要的文件。时间长了,这些碎片会白白浪费宝贵的磁盘空间。


为了解决这个问题,Portage 提供了一个简单的方法来从系统中抹去老版本的痕迹。这个功能称作 emerge clean 参数,用下面的命令调用:



Code listing 3.11



emerge clean


emerge 将显示一个列表,里面有软件包的版本变更和要删除的版本,要留下的版本,并留给用户一定时间来用 Control-C 取消操作。在一般的系统中,会乱一阵子,因为它显示了很长的列表,包含要删除的和要保留的文件。


除非指明,Portage 会假设 clean 动作是针对 world (所有安装过的软件包) 来执行的。你可以限制 clean 动作的范围,如加上 world, system, 一组包的名字以及包的版本范围这些参数,像本节的 unmerge 部份说的那样。


在 考虑应该删除哪个版本的包时,Portage 系统综合多种因素,如各种 profiles, 其他软件包的需要,以及一个软件包的插槽(SLOT)。假设所有软件包的依赖关系都是正确定义的,clean 动作将安全地删除老的软件包,并且不会影响系统的任何功能或使系统不正常。


Pruning (剪除)软件包


Portage 也支持 prune 动作。prune 动作就是 clean 动作的不安全版本。它删除每个软件包除了最后一个安装的版本外的所有版本。它不会进行 clean 要做的那些检查,因此可能会删除系统中必不可少的依赖关系包。用户用这个参数很容易搞坏系统,一般不推荐使用,除非是极其特殊的环境下才用它。


prune 动作可以接受与 clean 动作相同的参数列表,像下面这样用:



Code listing 3.12



emerge prune


在 Portage 树中查找


构成 Gentoo Linux 心脏的 Portage 树可以很大。emerge 命令提供了一个查找的特性,可以接受引号中的正则表达式作为查找字符串。正则表达式非常复杂,如果你想用好它,建议你找一本相关的好书。


大多数的简单查找并不需要了解正则表达式。下面的例子就是一个简单的查找,找的是名为"gcc"或名字里有"gcc"的软件包:



Code listing 3.13



emerge search gcc


每一个符合要求的软件包都会列出来,列出的内容有包名,最新版本,最近安装过的版本,它的主页以及对软件包里含有的程序的简短描述。


得到帮助


关于 emerge 所支持的参数个动作的更多信息可以用下面的命令来获得:



Code listing 3.14



emerge --help


有用的工具


Gentoo 的用户做了一些好用的工具,它们在 Gentoo Portage 树的 app-admin/gentoolkit 里面。


etc-update : 是一个 shell 脚本,利用 vim 来合并 /etc 中的配置文件(如果不正确的使用,可能很危险)
qpkg : 软件包数据库查询工具
epm : 另一个软件包数据库查询工具,使用类似于 RPM 的语法。
阅读(653) | 评论(0) | 转发(0) |
0

上一篇:gentoo portage手册

下一篇:IT生活

给主人留下些什么吧!~~