原文:
作者:Dru Lavigne
翻译:rainren
本人能力有限, 很多地方自我感觉都翻译的不对, 请大家指出, 我慢慢修改。
在上一篇文章中我们介绍了用一些工具去管理FreeBSD ports collections.在这一篇中, 我们还将继续上面的主题,让我们来看看portupgrade, 一个非常有用的工具。
Installing portupgrade
使用ports安装:
# cd /usr/ports/sysutils/portupgrade
# make install clean
它将安装超过十个有用的工具, 你可以使用我们上一篇中介绍的一个小技巧来查看安装了些什么东西:pkg_info –xL portupgrade
现在我们不去管那些man pages, 在下面的文章中我们将告诉你如何有效的使用它们。
First, 我们来看看安装在你系统上的ports的结构, 及如何去升级它。
在你安装FreeBSD时,选择了安装ports后, /usr/ports和它下面的子目录将会安装。在/usr/ports下,你将会看到很多分类的子目录。如:www, mail, databases. 在这些子目录下包含了可在FreeBSD下使用的程序子目录。如:www下有mozilla, lynx, 在这些应用程序子目录下包含了详细的安装说明。
Ports 要经常升级, 通常每天都有新ports加入, 你将会发现这是一个非常有用的资源。
Syncing Your Ports Tree (同步你的ports tree)
我时常使用cvsup来升级我的ports tree. 如果你没用过它, 你应该去查看一下如何使用cvsup , 在 FreeBSD Handbook里有一个非常详细使用说明。
# cd /usr/ports/net/cvsup-without-gui
# make install clean
cvsup时常用来升级你的系统和系统上的ports tree. 如果你只对升级ports tree感兴趣,下面文件可以做这项工作:
# cat cvsup-supfile
*default host=cvsup.freebsdchina.org
*default base=/usr
*default prefix=/usr
*default release=cvs delete use-rel-suffix compress
ports-all tag=.
这个命令升级ports tree
# cvsup –g –L 2 cvsup-supfile
这个命令将下载服务器上的文件并将它们加入到你的ports tree中,这是一个非常有用的工作,你应该将它加入你的cron job, 让系统每天执行它。
cvsup 同样会升级你的/usr/ports/INDEX, 这个文件是你的ports tree的一个列表。你可以查看它了解你是在什么时间升级过它。
# ls –l /usr/ports/INDEX
Upgrading the Ports Database
现在, 我们使用cvsup 升级了 ports tree后需要使用这个命令来建立一个ports数据库:
# portsdb –uU
当你第一次使用这个命令时, 有一个数据库INDEX.db将在/usr/ports下建立,每次使用完cvsup ports tree后,你都需要使用portsdb来升级你的INDEX.db 。你不能使用file unility来访问INDEX.db, 因为这不是一个ASCII类型的文件。
当然, 有几个portupgrade工具将使用这个数据库, Btree涉及一个数据库算法,它用来在大型数据库进行快速查找。我们将看到一些portupgrade工具将很快速的找出信息,因为它使用的就是Btree.
你将需要一点耐心去等待portsdb运行, 当它运行完成, 你就可以使用portversion来查看你已安装的软件是否需要升级,记住这个命令:
# portversion –l “<”
如果你看到一些输出, 你下一步将是升级这些显示的软件, 别惊讶, 我们将使用portupgrade, 也叫做portinstall.
Upgrading the Ports
最简单的一个命令:portupgrade –a 将升级所有需要升级的软件,但是,很多时候将不能进行升级。这个不是portupgrade出现异常,这是由于软件的依赖性造成的。
一个port有两个类型的依赖, 一种是安装时依赖, 你在安装某个软件时一定要先安装其它的这个软件所依赖的软件包才能进行下一步安装;第二种是其它软件包依赖于你所升级的这个软件包, 你应该记得有时你用pkg_delete删除一个软件包时却删除不了,这就是因为其它程序依赖于这个软件包。
如果你在升级一个软件时却没有查看它依赖的软件包也需要升级,你将同样不能升级这个软件包。发生这种情况时, 你可指定两个递归的参数( tow recursive switches)使用portupgrade:
# portupgrade –arR
-R 将检查安装时依赖性, -r将检查第二种依赖。这将防止你的系统有过时的依赖包或软件不相容。
有时, 你使用portupgrade或它们中的某个工具时, 你会看到一条信息告诉你先执行pkddb –F, 从这个工具名你猜到这个工具应该是用来升级你的软件库的(package database).这个数据库将寻找/var/db/pkg/pkgdb.db. 同样,这个数据库也是使用Btree进行查找。
如果有软件告诉你执行pkgdb –F, 那你就先执行这个命令. 但是, 别中断这个命令, 否则你将有一个残缺的数据库, 如果你遇到了这种非常不幸的情形, 下面这个命令可以帮助你修复它:
# pkgdb –fu
That’s pretty easy switch combo to remember, as similar thoughts will probably be running through your head at the time.
运行pkgdb –F可以交互式的修复数据库, 也就是说pkgdb将一步步按你想的情况去做,它将询问你是否修复某些或不修复哪些。Michael Lucas 写过一个文章告诉你怎么回答:an article explaining how to respond。然而, 如果你想正确的回答pkgdb的问题, 可以使用pkgdb –fu代替,它将按系统所想的最佳回答去修复数据库。If your’re really paranoid, 可以选择-Fa, 它将告诉pkgdb只安全地修复矛盾(错误)。
This all sounds scarier than it really is. It’s very rare that you’ll ever be asked to run pkgdb –F, pkgdb is usually used for other purposes(其它的用途), which is why it’s also called pkg_which。
Using pkg_which
pkg_which( 或pkgdb) 可以用来寻找程序属于哪一个文件。下面的例子将显示出系统命令which和pkg_which 两者的区别:
# which pkgdb
/usr/local/sbin/pkgdb
which用来寻找程序放在哪里, pkg_which将告诉你这个程序是由哪个ports安装的。
# pkg_which pkgdb
portupgrade-20030723
这个命令等同上面的命令:
# pkgdb pkgdb
portupgrade-20030723
我们来看看其它的例子, /usr/local下包含了一些安装了的程序要使用的文件, 你能找到很多文件但却没一点线索,它们是怎么来的或它们属于哪于个程序。 这个工作可用pkg_which完成. 来看看我系统上的一个小片断:
# ls /usr/local/bin | grep yaf
tryaffix*
yaf-cdda*
yaf-mpgplay*
yaf-splay*
yaf-tplay
yaf-vorbis*
yaf-yuv*
如果你像我一样, 可能完全不知道这些文件的意义。让我们来看看它们属于哪个程序:
# pkg_which *yaf
ispell-3.2.06_3
kdemultimedia-3.1.3
kdemultimedia-3.1.3
kdemultimedia-3.1.3
kdemultimedia-3.1.3
kdemultimedia-3.1.3
kdemultimedia-3.1.3
pkg_which还有一些别的有用的选项, 如 –o, 或 origin(起源),如果你不记得是在哪个ports中安装的kdemultimedia-3.1.3, 可以使用这个命令:
# pkg_which -o kdemultimedia-3.1.3
multimedia/kdemultimedia3
输出指出这个程序以前是在/usr/ports/multimedia/kdemultimedia3中安装的。
选项 –v 也是很有用的参数。如果我想知道当前安装了哪些含有kde的程序:
# pkg_which -v kde*
kde-config: kdelibs-3.1.3
kdebugdialog: kdebase-3.1.3
kded: kdelibs-3.1.3
kdeeject: kdebase-3.1.3
kdeinit: kdelibs-3.1.3
kdeinit_shutdown: kdelibs-3.1.3
kdeinit_wrapper: kdelibs-3.1.3
kdepasswd: kdeutils-3.1.3
kdeprintfax: kdebase-3.1.3
kdesktop: kdebase-3.1.3
kdesktop_lock: kdebase-3.1.3
kdessh: kdeutils-3.1.3
kdesu: kdebase-3.1.3
kdesu_stub: kdelibs-3.1.3
kdesud: kdebase-3.1.3
kdevdlg2ui: kdevelop-2.1.5
kdevelop: kdevelop-2.1.5
这给我们提供了非常好的线索, 每一行都显示了程序名。 现在我们可以看出这台机上运行的是kde 3.1.3.
在进行下一节前, 让我们来总结一下升级软件所要做的几步操作:
1. 运行cvsup升级ports tree.
2. 运行portsdb 升级 INDEX.db.
3. 运行portversion查看哪些程序需要升级。
4. 运行portupgrade升级这些程序。
Additional portupgrade Switches(portupgrade 另外的一些选项)
我们已经知道可以使用portupgrade –arR升级所有需要升级的软件包。然而, portupgrade还有几个选项让你升级程序和怎么去做。
一个有用的是 –F, 用于你在没有一个可持续的互联网连接时。当你升级时, portupgrade需要从互联网上取得升级所需的文件,然后再花费一些时间编译程序。当你升级一个非常大的程序时, 如:kde, gnome, XFree86,在这期间它需要连续几个小时连接到互联网上。
这个命令将从互联网上下载升级所需的文件, 但它不会安装任何东西
# portupgrade –aFrR
当升级所需的文件下载完成后, 你就可以断开与互联网的连接, 然后像上面说的那样使用 portupgrade –arR升级了。
下面个选项是-n, 它将详细的告诉你portupgrade 将要做的一些事情。当你非常紧张地想提前知道你在安装软件时发了一些什么事情,这个选项将很有用处(This switch simply tells you what portupgrade would do without actually doing it. This is very useful if you are the nervous or the paranoid type and want to know ahead of time what is going to happen to your installed software)。
下面是输出:
# portupgrade -anrR
---> Session started at: Sun, 17 Aug 2003 22:06:00 -0400
---> Reporting the results (+:done / -:ignored / *:skipped / !:failed)
- lang/ruby16 (ruby-1.6.8.2003.04.19)
- net/cvsup-without-gui (cvsup-without-gui-16.1h)
+ lang/ruby16-shim-ruby18 (ruby-shim-ruby18-1.8.0.p2.2003.04.19)
+ databases/ruby-bdb1 (ruby-bdb1-0.1.9)
- sysutils/portupgrade (portupgrade-20030723)
- www/lynx (lynx-2.8.4.1d)
---> Session ended at: Sun, 17 Aug 2003 22:06:02 -0400 (consumed 00:00:02)
让我们来看看上面的输出。Portupgrade 进入已安装软件的ports目录中, 并将结果写入一个报告(report). 每一行报告显示了ports的目录, 安装的软件版本, 和一个是否需要升级的符号提示。这里有两个软件需要升级。它们的开头是以 + 开始。如果我与使用portversion查看相比较,我看到的是同样的结果, 但以不同的方式表示出来!
# portversion -l "<"
ruby-bdb1
ruby-shim-ruby18
当你非常谨慎的升级你的系统时, 你可以使用参数 –i, 或 interactive. 当你把这个选项加入到portupgrade中, portupgrade在升级某个软件或这个软件的依赖包时将询问你是否这样做, 如下面所显示的这样:
---> Upgrading 'ruby-bdb1-0.1.9' to 'ruby-bdb1-0.2.1'
(databases/ruby/bdb1)
OK? [yes]
这将使用yes作为默认的回答, 也就是说你按Enter时, 你的回答是yes. 如果你觉得不升级这个ports,输入no.
最后一个参数是l, 或 log。 当某个ports不能安装软件而你想把错误信息发送给某人时使用它。如下面所示:
# portupgrade -rR ruby-shim-ruby18 -l logfile
你可能不想使用l , a 选项, 特别是当你有什么软件需要升级的时候。没有谁愿意要那么大的log file.