免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1765 | 回复: 0
打印 上一主题 下一主题

gentoo portage手册 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-11-17 14:37 |只看该作者 |倒序浏览
内容:
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="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 树。比如下面这里就有一个:
[color="#000000"]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 设置。

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 \ 和
               
               
               

本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u/2984/showart_1420335.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP