Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1351576
  • 博文数量: 334
  • 博客积分: 10302
  • 博客等级: 上将
  • 技术积分: 2986
  • 用 户 组: 普通用户
  • 注册时间: 2006-01-12 10:17
文章分类

全部博文(334)

文章存档

2013年(1)

2012年(9)

2011年(4)

2010年(10)

2009年(24)

2008年(64)

2007年(72)

2006年(150)

我的朋友

分类: LINUX

2008-08-20 08:00:52

Portage和软件内容列表:

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  gnumeric-1.2.2.ebuild :
  New release, requested in #34492
  updated deps

  12 Nov 2003; Jason Wever  gnumeric-1.2.0.ebuild:
  Marked stable on sparc, fixes bug #32405.

  14 Oct 2003; Jason Wever  gnumeric-1.0.8.ebuild:
  Added ~sparc keyword.  Fixes bug #31150.

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设置来将这个软件融合到你的系统中。当然,你可以设置高级别的优化选项(在变量CFLAGSCXXFLAGS)来编译这些软件。

       使用预编译软件包可以减少安装时间(因为不需要编译),但是你会失去使用USE设置和变量CFLAGSCXXFLAGS的优点。

       前面已说过,预编译的软件包存储在文件夹/usr/portage/packages/All里,而软件的源代码存储在/usr/portage/distfiles文件夹里。如果你完成安装一个软件包,你可以从相应的文件夹里删掉这个软件包或者源代码。但是,你可能需要保留软件包/源代码的最新版本,以防你要重新安装这些软件(这样你就不需重新下载)。

从源代码安装软件

       好的,我们已经说的够多了,我们来做做看。安装一个软件包,你需要使用emerge命令。如果你不要使用任何预编译软件包,你只需要使用emerge 或者emerge /。作为一个例子,我们将安装gnumeric

代码 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一起工作时很有用,将会显示任何一个软件包的完整的依赖性树。如果没有选项--pretendemerge将会(重新)编译所有列出的软件包。

代码 24: 显示gnumeric所有的依赖性

# emerge --emptytree --pretend gnumeric

       另外一个参数是--nodeps,这个将会要求Portage安装给定的软件包时不用考虑任何依赖性。显然这个将会导致编译失败。

代码 25: 不考虑依赖性安装gnumeric

# emerge --nodeps gnumeric

       和--nodeps相反的是--onlydeps,这个将让Portage安装给定软件包的所有依赖性软件,但是不包括这个软件包本身:

代码 26: 安装gnumeric的依赖性

# emerge --onlydeps gnumeric

更新你的系统

       Portage有两个表示一系列软件包的标签:systemworld。在前面Gentoo的安装过程中如果你没有使用stage3的话,你应该已经看到前者了。我们再来回忆一下:system是一个可以使用的Gentoo系统所需要的一系列的核心软件包。

       标签world包含了你在你的系统上安装的所有的软件和system信息。换句话说,每次你使用emerge 安装一个软件包时,这个就会在文件world/var/cache/edb/world)里注册。依赖性不是文件world的一部分,这个我们将稍后再讨论。

       如果你要更新系统软件包,使用选项--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”紧随其后你会注意到有一个字母(或者几个字母的组合),它们将告诉你这个软件包更多的信息:

  • B (blocks)左边列出的软件包阻止在右边列出软件包的安装
  • N (new)在你的系统中,这个软件包是新的,将会第一次安装
  • R (reemerge)这个软件包不是新的,但是需要重新安装
  • F (fetch)这个软件包需要你手动下载源代码(比如由于版权问题)
  • U (update)这个软件包在你的系统中已有,但是需要升级
  • UD (downgrade)这个软件包在你的系统中已有,但是需要降级
  • U- (slot warning)在你系统安装的这个软件包被现是为不能和其他版本共存,但是升级后可以。新的版本将会安装,而旧版将会被删除。

       在一些情况下,一次更新可能是一次降级(比如说用一个旧的版本替代一个新的版本)。如果你不想这个发生,使用选项--updateonly(简称-U):

代码 30: 升级你整个系统

# emerge --update --upgradeonly world

       我们前面提过文件world并不包括依赖性。当你运行emerge --update仅仅是文件world里提到的软件包和它的很近的依赖性软件包被检查到,必要时进行升级。如果你要emerge检查所有的依赖性(包含依赖性的依赖性),添加参数--deep

代码 31: 升级整个系统,包括所有的依赖性

# emerge --update --deep world

       当然,我们这里讨论的是systemworld,但是对于单个的软件包,你也可以同样做。

删除软件

       如果你要从你的系统中删除软件,你可以使用选项unmerge(简称-C):

代码 32: 删除软件

# emerge unmerge gnumeric

       如果你要测试一个删除(但并不执行),你可以再次使用--pretend

代码 33: 假装删除软件

# emerge --pretend unmerge gnumeric

警告: Portage不会检查一个软件包是否是另一个软件包的依赖性。它也不会警告你这个软件包是否是system的一部分,比如,你系统正常工作的一个必须的核心程序。

       一旦unmerge开始,你将会看到一个长长的该软件包所有的文件列表。这些文件名中的一些在起名字之前可能有一个参数。这些参数!mtime!emptycfgpro说明了这个软件所删除时这些文件没有被删除的原因。没有给出上述三个参数的任何一个的文件都成功的从系统中删除。这三个参数说明了如下的理由:

  • !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  have been masked.

       一个软件包可以由于两种原因被mask:

  1. 这个软件包目前处于~ARCH,而你使用的是ARCH
  2. 这个软件包明显被强行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-activationlibbonobo的安装冲突。为解决这个问题,删除软件包bonbo-activation后继续:

代码 37: 解决冲突的情况

# emerge unmerge bonobo-activation
阅读(1590) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~