|
楼主 |
发表于 2003-3-17 01:47:43
|
显示全部楼层
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 的语法。 |
|