分类: LINUX
2008-08-20 08:00:52
2.a. 获取软件包的信息
所有软件的鼻祖:emerge
绝大部分用户将使用的主要的Portage工具是emerge。在Gentoo的安装以及前一章节里我们已经使用过它,但是只是简单的解释了怎样使用而已。这一章将集中于emerge和教会你怎样使用emerge来满足你在软件方面的需求。
emerge是用来安装、删除、查询和维护软件包的命令。它是ebuild的一个前端;希望成为Gentoo专家的用户将会在后面继续学习怎样使用ebuild。而现在,我们将集中于ebuild缺少的功能(比如解决依赖性、搜索Portage树等等)来讨论emerge。
既然emerge是给Gentoo用户的最重要的工具,输入man emerge可以得到它的一个详细的使用手册。你也可以运行emerge --help来查看它自带的帮助。
代码 1: 获得emerge的帮助信息 |
# man emerge # emerge --help |
Portage树
在我们继续描述emerge之前,我们先来看看Portage树。进入/usr/portage,查看一下里面已有文件夹的列表。我们使用ls --claasify来显示一个文件夹的内容,它会在显示文件夹时带上一个尾巴“/”。
代码 2: 查看Portage树 |
# cd /usr/portage; ls --classify
app-admin/ dev-ml/ gnome-libs/ net-print/
app-arch/ dev-perl/ gnome-office/ net-wireless/
app-benchmarks/ dev-php/ header.txt net-www/
app-cdr/ dev-python/ incoming/ net-zope/
app-crypt/ dev-ruby/ jython/ packages/
app-dicts/ dev-tcltk/ kde-apps/ profiles/
app-doc/ dev-tex/ kde-base/ releases/
app-editors/ dev-util/ kde-i18n/ scripts/
app-emacs/ distfiles/ kde-libs/ sec-policy/
app-emulation/ eclass/ licenses/ skel.ChangeLog
app-games/ experimental/ media-fonts/ skel.ebuild
app-gnustep/ files/ media-gfx/ skel.metadata.xml
app-i18n/ fresco-base/ media-libs/ snapshots/
app-misc/ games-action/ media-plugins/ sys-apps/
app-office/ games-arcade/ media-radio/ sys-build/
app-pda/ games-board/ media-sound/ sys-cluster/
app-portage/ games-emulation/ media-tv/ sys-devel/
app-sci/ games-engines/ media-video/ sys-fs/
app-shells/ games-fps/ metadata/ sys-kernel/
app-text/ games-kids/ net-analyzer/ sys-kmods/
app-vim/ games-misc/ net-apache/ sys-libs/
app-xemacs/ games-mud/ net-dialup/ unix2tcp/
berlin-base/ games-puzzle/ net-dns/ x11-base/
dev-ada/ games-roguelike/ net-firewall/ x11-libs/
dev-cpp/ games-rpg/ net-fs/ x11-misc/
dev-db/ games-server/ net-ftp/ x11-plugins/
dev-dotnet/ games-simulation/ net-im/ x11-terms/
dev-embedded/ games-sports/ net-irc/ x11-themes/
dev-games/ games-strategy/ net-libs/ x11-wm/
dev-haskell/ games-util/ net-mail/ xfce-base/
dev-java/ glep/ net-misc/ xfce-extra/
dev-lang/ gnome-apps/ net-nds/
dev-libs/ gnome-base/ net-news/
dev-lisp/ gnome-extra/ net-p2p/
|
就同你看到的,Portage树有一些子文件夹。它们中的大部分是称为ebuilds的Gentoo软件包所属的分类。让我们来看看,比如说app-office:
代码 3: 查看一个分类 |
# cd app-office; ls --classify
abiword/ gnotime/ kmymoney2/ ooodi/ plan/ timestamp.x
dia/ gnucash/ koffice/ oooqs/ qhacc/
dia2code/ gnumeric/ lxbank/ openoffice/ sc/
facturalux/ ical/ lyx/ openoffice-bin/ scribus/
gaby/ kbudget/ mdbtools/ openoffice-ximian/ siag/
gnofin/ khacc/ mrproject/ phprojekt/ texmacs/
|
在一个分类中,你会找到属于这个分类的软件包,每个软件包都有一个单独的文件夹。让我们看看openoffice软件包:
代码 4: 查看一个软件包 |
# cd openoffice; ls --classify
ChangeLog files/ openoffice-1.0.3-r1.ebuild openoffice-1.1.0-r2.ebuild
Manifest metadata.xml openoffice-1.1.0-r1.ebuild openoffice-1.1.0.ebuild
|
记得前面我们说的成为一个ebuild的Gentoo软件包?在这个样例中,有四个这样的ebuilds存储在这里。它们的名字是很典型的,仅仅在版本名上不同而已。你可以随意查看这样一个软件包的内容:它们都是普通的脚本。我们现在暂时不来讨论这些,因为如果你打算只是使用Gentoo而已,这些内容不是很必要学习。
其他的文件分别是ChangLog(包含了ebuilds的更新列表),Manifest(包含这个文件夹的所有文件的checksun和文件大小)和metadata.xml(包含了这个软件包更多的信息,如开发负责小组,被称为herd,和更详细的描述信息)。
在文件夹files里,你会找到一些Portage需要的额外的文件:digests(该软件包某一版本需要的文件的checksum和许可),补丁和一些配置文件样例等等。
代码 5: 查看额外的文件 |
# cd files; ls --classify 1.0.3/ digest-openoffice-1.0.3-r1 digest-openoffice-1.1.0-r1 1.1.0/ digest-openoffice-1.1.0 digest-openoffice-1.1.0-r2 # cd 1.1.0; ls --classify fixed-gcc.patch ooffice-wrapper-1.3 newstlportfix.patch openoffice-1.1.0-linux-2.6-fix.patch no-mozab.patch openoffice-1.1.0-sparc64-fix.patch nptl.patch |
如果你回到Portage树的根目录(/usr/portage),你会注意到那里还有其他一些非分类的文件夹。我们在这一章的后面将会讨论到这些。
搜索一个软件包
如果你是Linux或者Gentoo的新用户,你可能想知道什么工具适合你的工作。为方便搜索,emerge给你提供了一个搜索你系统已有软件包的方法。这里有两种方法你可以用来搜索软件包:使用软件名称或者使用软件名称和软件描述。
使用emerge search来通过软件名称来搜索Portage树。举例说,要找到更多关于mozilla的信息:
代码 6: 显示有关mozilla的信息 |
# emerge search mozilla Searching... [ Results for search key : mozilla ] [ Applications found : 5 ] (为方便阅读,一些输出被删减) * net-www/mozilla Latest version available: 1.5-r1 Latest version installed: 1.4-r3 Size of downloaded files: 29,153 kB Homepage: Description: The Mozilla Web Browser * net-www/mozilla-firebird Latest version available: 0.7 Latest version installed: [ Not Installed ] Size of downloaded files: 37,850 kB Homepage: /projects/firebird/ Description: The Mozilla Firebird Web Browser (...) |
如果你搜索时也在软件描述中搜索,使用参数--searchdesc:
代码 7: 在软件名称和描述中搜索 |
# emerge --searchdesc mozilla Searching... [ Results for search key : mozilla ] [ Applications found : 10 ] (Some output removed to improve readability) * dev-libs/nss-3.8 Latest version available: 3.8 Latest version installed: 3.8 Size of downloaded files: 2,782 kB Homepage: /projects/security/pki/nss/ Description: Mozilla's Netscape Security Services Library that implements PKI support |
就同你能看到的,emerge的输出告诉你这个软件包的分类和名称、已有的版本、目前安装的版本、下载文件的大小、主页和一些简短的描述。
你是不是已经看到什么新的内容?对,就是下载的文件。你告诉Portage去安装一个软件包时,它当然需要有一些源代码(或者预编译软件包)。因此,它会检查/usr/portage/distfiles(用于存储源代码)或者/usr/portage/packages/All(用于存储预编译软件包)的内容,看是否需要的文件都在。如果不是,它将会下载需要的文件,并把他们放在这些文件夹里。
查看ChangeLog
在查看Portage树的内容时,你会发现每一个软件包都有一个ChangeLog。你也可以使用emerge来查看安装的版本与已有版本之间的ChangeLog记录。只需要使用--pretend --changelog(可缩写为-pl)选项即可。做为一个例子,我们来看看gnumeric的ChangeLog记录:
代码 8: 查看gnumeric的ChangeLog记录 |
# emerge --pretend --changelog gnumeric (为方便阅读,一些输出被删减) *gnumeric-1.2.2 27 Nov 2003; foser |
2.b. 更新Portage
简介
在Portage搜索是很好的,但是如果你不有规律的更新你的Portage树,你将会停滞在你系统的软件包已有的版本中。这就意味着,你的系统很快就落伍了,你还会错失一些bug修正和可能的安全问题的补救。
这里有几种方法来更新你的Portage树。最常用的方法是使用我们的。另外一种方法是使用一个Portage快照(在一个防火墙或者网络不同禁止了rsync服务器的使用的情况下)。
选择给rsync使用的一个镜像
我们建议你首先选择离你近的一个快速。你可以手动(设置/etc/make.conf里的SYNC变量)或者使用mirrorselect来自动完成这个。因为在后面我们还要讨论到变量SYNC,这里我们先集中讨论mirrorselect的使用。首先通过emerge这个软件包来安装mirrorselect:
代码 9: 安装mirrorselect |
# emerge --usepkg mirrorselect
|
现在运行mirrorselect来自动给你选择镜像(它也会使用给源代码使用的镜像来安装Portage):
代码 10: 运行mirrorselect |
# mirrorselect -a -s3
|
更新Portage
使用rsync来更新Portage,只需要简单的运行emerge sync:
代码 11: 使用emerge sync来更新Portage |
# emerge sync
|
如果这个失败了(由于网络问题或者防火墙),你可以尝试使用emerge-webrsync,这个将会使用wget来下载一个Portage树的快照。这也意味着如果需要你可以使用代理。我们在Gentoo安装中已经讲过怎样设置系统来使用防火墙。
代码 12: 使用emerge-webrsync来更新Portage |
# emerge-webrsync
|
2.c. 维护软件包
编译还是预编译?
Gentoo提供了可以供你使用的Gentoo软件包ebuilds。但是当你要安装这样的一个ebuild时,你可以选择编译这个软件包和使用一个预编译的软件包。但是,这两种方法有什么有点和缺点呢?它们是否可以依次使用呢?
就同你可能已经猜到的,编译软件包需要很长的时间(特别是你的硬件资源较小或者要编译一个大的软件包,如、等等)。编译软件包时,你可以使用USE设置来将这个软件融合到你的系统中。当然,你可以设置高级别的优化选项(在变量CFLAGS和CXXFLAGS)来编译这些软件。
使用预编译软件包可以减少安装时间(因为不需要编译),但是你会失去使用USE设置和变量CFLAGS和CXXFLAGS的优点。
前面已说过,预编译的软件包存储在文件夹/usr/portage/packages/All里,而软件的源代码存储在/usr/portage/distfiles文件夹里。如果你完成安装一个软件包,你可以从相应的文件夹里删掉这个软件包或者源代码。但是,你可能需要保留软件包/源代码的最新版本,以防你要重新安装这些软件(这样你就不需重新下载)。
从源代码安装软件
好的,我们已经说的够多了,我们来做做看。安装一个软件包,你需要使用emerge命令。如果你不要使用任何预编译软件包,你只需要使用emerge
代码 13: 编译gnumeric |
# emerge gnumeric
|
这会为你下载所需的源代码并且解压缩,编译和安装这个软件包到你的系统中。它也会对所有的依赖性软件包作同样的事情。如果你要查看这个软件包将安装的依赖性软件,使用选项--pretend(简称-p):
代码 14: 假装要编译gnumeric |
# emerge --pretend gnumeric
|
如果你要下载这个软件的源代码和它的依赖性软件,但是不去编译这个软件包,使用选项--fetchonly(简称-f):
代码 15: 获得gnumeric的源代码 |
# emerge --fetchonly gnumeric
|
如果你要查看emerge要从哪里下这这些源代码,组合使用选项--fectchonly和--pretend:
代码 16: 查看gnumuric所需源代码的网址 |
# emerge --fetchonly --pretend gnumeric
|
你也可以安装一个软件的特定版本。比如说,由于某个缘由,你要安装一个版本低于1.2的gnumeric,你可以输入:
代码 17: 安装特定版本的gnumeric |
# emerge " |
当然还可能是“>”(更新版本)和“=”(准确的版本)。
安装预编译的软件包
当你要安装一个预编译的软件包时,你应该使用--usepkg选项(简称-k)。如果在/usr/portage/packages/All有符合版本的该软件的二进制包时,它将会使用这些二进制包。
代码 18: 安装gnumeric的预编译软件包 |
# emerge --usepkg gnumeric
|
如果你只使用二进制包,甚至这个版本不符合也如此,使用选项--usepkgonly(简称-K)。
代码 19: 安装gnumerick的预编译软件包 |
# emerge --usepkgonly gnumeric
|
如果你的系统还没有这些预编译软件包,你可以让emerge从一个镜像中下载。这个镜像地址是在/etc/make.conf里的变量PORTAGE_BINHOST声明的。
使用--getbinpkg(简称-g)来下载二进制包,以防这个软件的二进制包并不在你的系统里存在:
代码 20: 下载和安装gnumeric的预编译软件包 |
# emerge --getbinpkg gnumeric
|
这将会为你下载这个软件包和软件相关的信息,并将这个软件和它的依赖性安装在你的系统里。如果你要查看这个软件包安装时将会安装的依赖性软件包,使用选项--pretend(简称-p):
代码 21: 假装下载gnumeric余姚的预编译包 |
# emerge --getbinpkg --pretend gnumeric
|
你也可以下载预编译包(以及软件包相关的信息)时,不检查你的本地系统的信息,不使用你系统上已有的预编译包(如果适合),那么你需要使用选项--getbinpkgonly(简称-G):
代码 22: 不使用本地信息来安装一个预编译软件包 |
# emerge --getbinpkgonly gnumeric
|
你也可以安装一个软件包的特定版本。比如说,由于某个原因,你要安装一个版本低于1.2的gnumeric,你可以输入:
代码 23: 安装特定版本的gnumeric |
# emerge --usepkg " |
当然还可能是“>”(更新版本)和“=”(准确的版本)。
与依赖性打交道
Portage对于依赖性处理上有一个扩展的支持。虽然你通常甚至并不需要考虑这个(因为Portage可以自动处理依赖性),一些用户还是想知道怎样和emerge以及依赖性一起工作。
比如说,如果你要Portage假装一个软件包的依赖性都没有安装,你可以使用--emptytree(简称-e)。这个和--pretend一起工作时很有用,将会显示任何一个软件包的完整的依赖性树。如果没有选项--pretend,emerge将会(重新)编译所有列出的软件包。
代码 24: 显示gnumeric所有的依赖性 |
# emerge --emptytree --pretend gnumeric
|
另外一个参数是--nodeps,这个将会要求Portage安装给定的软件包时不用考虑任何依赖性。显然这个将会导致编译失败。
代码 25: 不考虑依赖性安装gnumeric |
# emerge --nodeps gnumeric
|
和--nodeps相反的是--onlydeps,这个将让Portage安装给定软件包的所有依赖性软件,但是不包括这个软件包本身:
代码 26: 安装gnumeric的依赖性 |
# emerge --onlydeps gnumeric
|
更新你的系统
Portage有两个表示一系列软件包的标签:system和world。在前面Gentoo的安装过程中如果你没有使用stage3的话,你应该已经看到前者了。我们再来回忆一下:system是一个可以使用的Gentoo系统所需要的一系列的核心软件包。
标签world包含了你在你的系统上安装的所有的软件和system信息。换句话说,每次你使用emerge
如果你要更新系统软件包,使用选项--update(简称-u):
代码 27: 更新系统软件包 |
# emerge --update system
|
world软件包的更新可以使用一种典型的方法:
代码 28: 更新整个系统 |
# emerge --update world
|
同样,如果你想知道emerge要更新什么,组合使用选项--pretend和--update:
代码 29: 假装要更新整个系统 |
# emerge --pretend --update world (为方便阅读,一些输出被删减) [ebuild U ] net-misc/wget-1.9-r1 [1.9] [ebuild UD] media-video/dvdauthor-0.5.0 [0.5.3] [ebuild U ] net-analyzer/ethereal-0.9.16 [0.9.14] |
在单词“world”紧随其后你会注意到有一个字母(或者几个字母的组合),它们将告诉你这个软件包更多的信息:
在一些情况下,一次更新可能是一次降级(比如说用一个旧的版本替代一个新的版本)。如果你不想这个发生,使用选项--updateonly(简称-U):
代码 30: 升级你整个系统 |
# emerge --update --upgradeonly world
|
我们前面提过文件world并不包括依赖性。当你运行emerge --update仅仅是文件world里提到的软件包和它的很近的依赖性软件包被检查到,必要时进行升级。如果你要emerge检查所有的依赖性(包含依赖性的依赖性),添加参数--deep:
代码 31: 升级整个系统,包括所有的依赖性 |
# emerge --update --deep world
|
当然,我们这里讨论的是system和world,但是对于单个的软件包,你也可以同样做。
删除软件
如果你要从你的系统中删除软件,你可以使用选项unmerge(简称-C):
代码 32: 删除软件 |
# emerge unmerge gnumeric
|
如果你要测试一个删除(但并不执行),你可以再次使用--pretend:
代码 33: 假装删除软件 |
# emerge --pretend unmerge gnumeric
|
警告: Portage不会检查一个软件包是否是另一个软件包的依赖性。它也不会警告你这个软件包是否是system的一部分,比如,你系统正常工作的一个必须的核心程序。 |
一旦unmerge开始,你将会看到一个长长的该软件包所有的文件列表。这些文件名中的一些在起名字之前可能有一个参数。这些参数!mtime、!empty和cfgpro说明了这个软件所删除时这些文件没有被删除的原因。没有给出上述三个参数的任何一个的文件都成功的从系统中删除。这三个参数说明了如下的理由:
2.d. 已有的软件?
ARCH或者没有?
Gentoo将其软件包主要分为两大类:ARCH和~ARCH。不要顾名思义:类别是基于你使用的架构。换句话说,对于基于x86的系统来说,你的分为x86和~x86;而对于ppc系统来说,你的分为ppc和~ppc等等。
~ARCH这一类表明这个软件包在开发者那可以工作,但并没有在社区里彻底的测试通过而放到ARCH里。~ARCH软件包通常情况下会在一段充足的时间测试无bug之后进入ARCH。
默认情况下你的系统将会使用ARCH软件包。如果你喜欢走极端,并不介意某个时候装上一个损坏的软件包,也知道怎么处理出现问题的系统,并且喜欢提交bug报告到,那你可能偏向于使用~ARCH软件包。让你的系统成为使用~ARCH的系统,编辑/etc/make.conf里的ACCEPT_KEYWORDS变量为~ARCH(同样对于x86系统来说:~x86等等)。
注意到是很难(或者说不可能)从ARCH转到~ARCH的。
如果你现在要更新你的系统,你将会注意到很多软件包将需要升级!
被mask的软件包
当你要安装一个软件包时,你可能遇到下面类似的信息:
代码 34: 被mask的软件包的信息 |
Calculating dependencies !!! all ebuilds that could satisfy |
一个软件包可以由于两种原因被mask:
如果软件包是由于第一个原因被mask了,而你真的很想安装它(也知道它没有出现在ARCH是有原因的),你可以接受任何软件的~ARCH版本,只需要添加其到你的/etc/portage/package.keywords文件里:
代码 35: 接受一个软件的~ARCH版本 |
# echo "app-office/gnumeric ~x86" >> /etc/portage/package.keywords # emerge gnumeric |
一个软件被强行mask是由于它出现在文件/usr/portage/profiles/package.mask里。如果你阅读了此文件,你也将会知道他被强行mask的原因(通常会以注释方式出现)。如果你还是要安装这个软件(尽管有我们已经告诉你有的各种可能的警告,如“毁坏系统”、“毁坏其他软件包”、“非常需要测试”等),创建文件/etc/portage/package.unmask,并将这个软件包列在其中(使用/usr/portage/profiles/package.mask里同样的格式)。
千万不要修改文件/usr/portage/profiles/package.mask,因为在下一次更新你的Portage树时任何修改都会被取消。如果你要强行mask一个软件包,只需要创建文件/etc/portage/package.mask,并将起列于其中(使用上面提到的相同的格式)。
相冲突的软件包
你可能碰到在你显示屏收到如下错误的情况:
代码 36: 想冲突的软件包 |
[blocks B ] gnome-base/bonobo-activation (from pkg gnome-base/libbonobo-2.4.0) |
在上面这个例子中,软件包bonobo-activation和libbonobo的安装冲突。为解决这个问题,删除软件包bonbo-activation后继续:
代码 37: 解决冲突的情况 |
# emerge unmerge bonobo-activation
|