红联Linux门户
Linux帮助

FreeBSD软件包的更新管理

发布时间:2007-11-18 00:00:26来源:红联作者:itchinax
portupgrade 可能出现的问题和解决方法
第一个问题是:当执行 portupgrade 时出现 /var/db/pkg/pkgdb.db: unexpected file type or format -- Invalid argument 的讯息时,该怎么办?
这个问题常常出现,通常是发生在你很久没执行 portupgrade,而 port tree 当中可能有其中一项软件需要某个版本的相依组件,但是这个组件 portupgrade 却把它摆在升级清单的后头,还没轮到它。这时候如果该软件的 make file 没写好时,portupgrade 可能会被中断,此时 /var/db/pkg/pkgdb.db 会不正常关闭,因此档案会毁损。
因此,如果你此时下达 portupgrade 指令时,就会出现:/var/db/pkg/pkgdb.db: unexpected file type or format -- Invalid argument 的讯息,而且好像 portupgrade 从此就无法正常工作。情况并没有如此糟糕,这时你只需先把 /var/db/pkg/pkgdb.db 砍掉,然后重新建立一个让 portupgrade 使用即可:
home/your-id> rm /var/db/pkg/pkgdb.db
home/your-id> pkgdb -fu
千万要记得,这件工作和执行 portupgrade 一样,需要有 root 的权限才能执行。这时候你可以开始重新执行一次 portupgrade -a (使用-a 参数,就是把所有的软件全部升级一次),虽然一开始会出现一些错误讯息,但是它立刻会将你的 /var/db/pkg/pkgdb.db 修正成新而正确的版本,然后就一切 ok。
第二个问题是:有时你执行 portupgrade -a 时,会遇到程序自动 skip 掉一些软件这时候该怎么办?这时候你不用太过担心,当你看到升级结果有些程序的升级被 skip 掉,那么只要记得重新再执行 portupgrade -a 一次,如果还是有软件被跳过,再执行一次,如此一直到所有软件全部被升级完成为止。会碰到这种状况和前面的情况其实是类似的,也是因为相依组件尚未执行升级而跳过,只是 make file 有写好,暂时跳过。
再补充一件事。portupgrade 有一个 -l 的参数,请你一定要善用它。使用的方法是在 -l 参数后加上一个档名,比如说你下达这个指令时:
home/your-id> portupgrade -a -l ~/aaa
这时候,portupgrade 会将你的所有已安装的套件有新版本的全部升级,然后把结果列一个清单存在你的家目录中的 aaa 这个档案中。这个档案里会有你所有已安装套件的清单,清单会列出目前升级后的版本,此外还会在清单中每项套件前列有 +/-/! 这三种符号之一。「+」号代表该套件在这次升级中被升级了;「-」号代表此次保持原版本,并没有新版本可供升级;「!」则是代表该套件在这次执行 portupgrade 时跳过了,这时你最好如我上一段所说的,再次执行 portupgrade -a 一次。
最后,也是最重要的。虽然 Unix 高手们喜欢用 cron 和 at 来把工作自动化,但是执行 portupgrade 最好还是手动。原因就是因为 portupgrade 常因 make file 没写好而出现一些例外状况,如果你放心地交给 cron 去完成,很有可能很长一段时间你的套件都不会更新,直到你惊觉为止。
查看当前包的壮态。
安装 ports-mgmt/portaudit,它能够自动地检查已经安装的应用程序的漏洞; 此外,在您安装程序之前它也会首先检查是否存在已知的漏洞。 另外, 您也可以使用 portaudit -F -a 这个命令在安装了某个软件包之后作出检查。
要删除先前安装的软件package,只要使用pkg_delete(1) 工具。
# pkg_delete xchat-1.7.1
需要注意的是, pkg_delete(1) 需要提供完整的包名; 如果您只是指定了类似 xchat 而不是 xchat-1.7.1 这样的名字, 则它将拒绝执行操作。不过, 您可以使用 pkg_version(1) 来了解安装的 package 的版本。 除此之外, 也可以使用通配符:
# pkg_delete xchat\*
这时, 所有名字以 xchat 开头的 package 都会被删掉。
软件包的管理
pkg_info(1) 是用于列出已安装的所有软件包列表和描述的程序。
# pkg_info
cvsup-16.1 A general network file distribution system optimized for CV
docbook-1.2 Meta-port for the different versions of the DocBook DTD
...
pkg_version(1)是一个用来统计所有安装的软件包版本的工具。它可以用来比较本地 package 的版本与 ports 目录中的当前版本是否一致。
# pkg_version
cvsup =
docbook =
...
在第二列的符号指出了安装版本的相关时间和本地ports目录树中可用的版本。
符号 含义
= 在本地ports树中与已安装的软件包版本相匹配。
< 已安装的版本要比在ports树中的版本旧。
> 已安装的版本要比在ports树中的版本新 (本地的port树可能没有更新)。
? 已安装的软件包无法在ports索引中找到。 (可能发生这种事情,举个例子, 您早先安装的一个 port 从 port 树中移出或改名了)
* 软件包有很多版本。
所有已安装的 package 信息都保存在 /var/db/pkg 目录下。安装文件的列表和每个 package 的内容和描述都能在这个目录的相关文件中找到。
文章评论

共有 0 条评论