LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1350|回复: 1

整理ports[翻译]

[复制链接]
发表于 2007-1-17 19:46:01 | 显示全部楼层 |阅读模式
整理Ports (Clean Up Ports)
——使用portupgrade系列工具
不当之处恳请指正!

FreeBSD ports即便得到所有赞美,也存有局限性。其中之一实际上来自它的强项-upgrade系统。两者互动并不很灵活。

ports安装过程记录一个port所包含的所有文件和所有依赖。比如,许多ports需要PNG图形库。ports记录它使用的PNG版本,如1.0.11。当你安装了一些软件,这通常与在ports树中找到的PNG是相同的版本。FreeBSD upgrade进程可以升级被port tree支持的软件版本。比如,PNG最近升级到1.0.12版本,库版本号没有增加,但是有一些小bug修复。我想升级。但是如果我那样做了,编码了确切PNG版本号的30多个ports将得到错误记录。

我的笔记本有187个包(packages)。我一个星期升级一次。这很快就变得零乱,不久之后就难以忍受。幸好,Akinori MUSHA(按http://akinori.org/) 担负重任,开发了一套可以整理这种零乱状态的工具:portupgrade(1)和他的朋友们。

portupgrade中包含的工具实现了port系统的新特性。首先是pkgdb和portdb,用来对/var/db/pkg索引和ports树创建数据库。这样能加快搜索并操作之。这些工具也可以重写/var/db/pkg里不同的文件来维护一致性。最后是各种pkg_*命令的外壳(wrappers),当添加或删除软件时可以用来重写数据库和纯文本记录。所有这些可以通过安装/usr/ports/sysutilis/portupgrade来得到。

在开始使用portupgrade之前,备份 /var/db/pkg!我从没在这个程序上遇到过麻烦,但是任何可以直接改写系统记录的工具具有更大可能使你的生活一团糟。如果完全破坏了包记录(package records),你需要还原它:
#tar -czvf dbpkg.tgz /var/db/pkg

运行pkgdb -F 来初始化安装,并进行基本的清理工作。如果你有许多ports,并已升级过几次port树。第一次时应留出一定时间。一旦有了一致性的数据库,维护将是又快又easy的;只是第一次会比较耗时。

#pkgdb -F
Checking the origin of Hermes-1.3.2
Checking the origin of Mesa-3.4.1
Checking the origin of Mesa-3.4.2_1
Checking the origin of ORBit-0.5.10_5
Checking the origin of XFree86-aoutlibs-3.3.6.9

当遇到依赖改变的包时,pkgdb会询问是否要修改。

Stale dependency: esound-0.2.22 -> libaudiofile-0.2.2:
libaudiofile-0.2.1_1 ? ([y]es/[n]o/[a]ll) [yes]

esound已经记录libaudiofile版本0.2.2作为依赖,但是安装的是版本0.2.1_1。我也许过去做过pkg_add -f,以强制安装了有微小版本差异的包。问我是否想要更新/var/db/pkg/esound-0.2.22/+CONTENTS的入口来指向实际安装的libaudiofile的版本。如果默认,他将修改入口记录,如果输入“a”,不仅修改libaudiofile对于esound的入口,而且还修改所有用到libaudiofile的其他包。这对于具有很多依赖的包比如PNG,显得格外方便。

在上例中,pkgdb可以对依赖性进行智能推测。但另一方面,它不能推测所有事情。比如,我从xfree86.org的CVS库上编译XFree86。imake是free86的一部分,所以在/var/db/pkg中没有相应记录。好;ports编译过程检查已安装的,并且没有在/var/db/pkg记录的包。当一个port安装后,记录写进/var/db/pkg中,然而,前提是假定有这个port。(这是port有争议的一个缺点,但是还没有简易的修复办法)

这意味着当一个ports列出imake作为依赖时,pkgdb将卡壳:

Stale dependency: Xaw3d-1.5 -> imake-4.1.0:
New dependency? (? to help): ?

这里我有一个选项。我可以指派一个新的依赖,或我可以告知package已经不再有什么依赖了。Xaw3d需要imake,但我知道在这个特殊的系统里,它不会发现imake已经安装了。我想要删除依赖性。如果敲”?”来查看帮助会发现:

[Enter] to skip, [Ctrl]+[D] to delete, [.][Enter] to abort, [Tab] to complete
New dependency? (? to help):  

Control-D it is.
Delete this? ([y]es/[n]o/[a]ll) [yes]
Deleted.

如果我选择“YES”,将清除该依赖。如果我选择“all”将清除所有该依赖,无论它何时出现。许多ports使用imake;我都想清除。稍后你将看到:

Stale dependency: xneko-4.4 -> XFree86-libraries-4.1.0:
Delete this? ([y]es/[n]o/[a]ll) [yes] Deleted.
还有几次,在别处也出现了pkgdb不能推测依赖的情况

Stale dependency: plugger-3.3_1 -> timidity++-esound-2.10.4:
New dependency? (? to help): ?
[Enter] to skip, [Ctrl]+[D] to delete, [.][Enter] to abort, [Tab] to complete
New dependency? (? to help): timidity++-2.10.4

这里可以用Tab补全。我知道timidity++-esound要用到某版本的timedity,但是我不想挖地三尺以求timedity完整的版本号。我可以输入前两个字母然后按Tab键,就得到了剩下的包的名字。

最后,在整个过程的最后,pkgdb将提醒你关于副本:

Duplicated origin: graphics/Mesa3 - Mesa-3.4.1 Mesa-3.4.2_1
Remove any of them? [no]

这里注意。从一个包安装软件而需要另外一个包的情况是很疏松平常的。也许你已安装的包有一点版本出入。如果你正通过package来安装,它会自动安装依赖,即使某个稍有出入的版本已经安装了。这种情况有时会在我的系统中出现。我的本本有两个不同版本的Mesa,但是一个已经覆盖了另一个。这显然不能算最糟糕的,因为我的系统还在工作。(最后我完全删除了mesa并安装了适合的版本)。尽管如此我依然需要清理packge数据库。我手动卸载了老版本。

现在你有了package的数据库信息,/var/db/pkg/pkgdb.db。也有了一个port数据库,/usr/ports/index.db和/usr/ports/index.dbo.各种portuprade工具使用这些数据库来完成魔术般的操作.无论何时升级ports树,都要升级ports数据库和/usr/ports/INDEX。这可以通过portsdb -Uu来轻易完成.

现在我们已经装好了工具,来看看我们可以干些什么.想看哪些是过时的,使用portversion(1).这个命令和pkg_info的工作方式相同,但是速度更快.

# portversion
Hermes =
Mesa =
ORBit <
XFree86-aoutlibs <
Xaw3d =
aalib =

<代表安装的版本比port树中的旧.可以通过运行portversion | grep '<'来查看哪些port过时了.我经常使用它来查看自己的系统.比如,我的Apache过时了.但是在我的本本上我已经不使用apache了,所以我可以删除它.标准的pkg_delete命令仍然适用,但是我用了,我的package数据库将同我的系统失去同步.使用pkg_deinstall来代替.

# pkg_deinstall apache
—< Deinstalling 'apache-1.3.20'
[Updating the pkgdb in /var/db/pkg … - 182 packages found (-1 +0) (…) done]
#

好处是我再也不用给出完整版本号!(对于FreeBSD的pkg_*,这困扰我良久,但是无能为力).portupgrade工具包含全局函数,可以进行模式匹配。

我打算升级特定的ports,而且,我要升级的同时保持数据库同步,更新入口记录到/var/db/pkg。比如portversion告诉我gd过时了。升级工作很简单:

# portupgrade gd
===> Cleaning for gettext-0.10.35
===> Cleaning for gmake-3.79.1
===> Cleaning for libtool-1.3.4_2
===> Cleaning for jpeg-6b
===> Cleaning for png-1.2.0
===> Cleaning for freetype2-2.0.5
===> Cleaning for gd-1.8.4_4
If you want to compile in X support use
‘make -DWITH_X11′ instead
===> Extracting for gd-1.8.4_4
….
将看到熟悉的make输出界面。如果继续观察,会发现转而去卸载已安装的包,更新数据库,然后继续。

… —> Deinstalling ‘gd-1.8.4_3′
pkg_delete: package ‘gd-1.8.4_3′ is required by these other packages and may not be deinstalled (but I’ll delete it anyway):
scr2png-1.1
[Updating the pkgdb in /var/db/pkg … - 180 packages found (-1 +0) (…) done]
===> Installing for gd-1.8.4_4

一旦安装完成,会再一次更新package数据库。所有的都是同步的。
现在让我们看一个难点儿的。我的docproj port过时了。docporj是不包含任何东西的,但是同每个编辑FreeBSD Document Project的工具有依赖。如果经常建立文档树,这个工具需要更新。还有,你不想递归重编译所有,只想做小的更新;docproj有着庞大的依赖。
如果打算节约时间,可以用portupgrade -P来告诉portupgrade使用package安装。我不缺时间所以我用port。我们需要告知portupgrade来递归更新,将更新被docproj用到的包。可以使用-R标志,试试:

# portupgrade -R docproj
This port will try to ensure that the tools used by the FreeBSD
Documentation Project are installed on your system so you can convert documentation from SGML to other formats.
组件其中之一是JadeTex,它依赖于TeTex。TeTex的源代码超过30M,可能需要很长的下载时间。
如果不打算从文档产生PostScript和PDF格式,就不需要JadeTex,你应当将JADETEX变量设为“NO”。如果希望输出PostScript和PDF,则设为“YES”。
比如:

make JADETEX=no
make JADETEX=yes  

*** Error code 1

Stop.
** Command failed: make clean build
** Fix the problem and try again.
** The following packages were not installed or upgraded (-:skipped /
!:failed)
! textproc/docproj (docproj-1.4) (unknown build error)
#

哟~这个port需要定制。你可以修改/usr/ports/textproc/docproj/Makefile添加 JADETEX=no。现在它将完全透明地运行。

完成后,可以用portversion来查看发生了什么。你可能会发现其他的port依赖也已改写。比如,如果port A依赖于Port B,但是port C也依赖于Port B,运行portupgrade A将不会修改Port C的依赖。随时准备用pkgdb -F来发现和修复类似问题。

如果你打算让系统自己来处理这些事情,使用portupgrade -rR;这将升级此依赖的和依赖于此的ports。如果想要自己的系统有最新的软件,这里提供了一种方式。portupgrade包含了使FreeBSD软件管理简单化的多种工具,但这足以使你起步。

你可能会发现不得不从一个相同的distfile重编译一个port很多次。如果port改变了,portversion能发现并标记为过时(outdated)。你想保留安装了的port的distfile,然后删除旧的distfile。portsclean -D将完成这些工作。相同的,你可能打算删除在package数据库中不被引用的共享库。我不使用上面的参数(-D)。别忘了我安装XFree86以抓包的方式而不是port;这个命令(portclean -D)将会删除我的X安装,不爽!但是portsclean -L可以办到,并且可以帮助处理一些问题,比如我的不完全安装的Mesa的垃圾文件。

最后,我必须说这个工具似乎相当鲁棒。文章的结尾,我运行这个程序来证明我的说法。我注意到了一个旧的包,简单的升级了它:

# portupgrade -R portupgrade
是的,没错它可以,我说过的它真是好样的。

original:Michael W. Lucas  http://www.onlamp.com/pub/a/bsd/2001/11/29/Big_Scary_Daemons.html
翻译ed by wonglaye
发表于 2007-1-17 20:22:38 | 显示全部楼层
不错,适合新手学习
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表