LinuxSir.cn,穿越时空的Linuxsir!

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

强:Pkgtools:FreeBSD的智慧型應用程式管理工具組(转贴)

[复制链接]
发表于 2003-8-13 23:47:33 | 显示全部楼层 |阅读模式
Pkgtools:FreeBSD的智慧型應用程式管理工具組
● 過去的困惑 – 傳統方法的缺點
僅管FreeBSD提供ports及packages?砉芾響贸淌剑是有很多問題。最常
見的問題在於應用程式的重覆安裝、相依性及升級。
以我的個人電腦為例,雖然裝的應用程式不多,確發生了上述的問題。
我先安裝lynx,以提供文字模式下的網頁瀏覽工具。
# cd /usr/ports
# make update
# make index
# cd /usr/ports/www/lynx
# make install clean
後?戆惭bX window system,?K且使用mozilla瀏覽器,提供X的網頁瀏覽工具。
# cd /usr/ports/www/mozilla
# make install clean
但安裝完成後,我發現兩套應用程式都需要gettext,
# pkg_info | grep gettext
gettext-0.11.1_1 GNU gettext package
gettext-0.11.1_3 GNU gettext package
雖然lynx以及mozilla皆可以正常運作,但總覺得安裝兩套gettext有點浪費硬碟
空間,於是決定把其中一個移除。
先移除舊版的 gettext
# pkg_delete gettext-0.11.1_1
pkg_delete: package 'gettext-0.11.1_1' is required by these other packages
and may not be deinstalled:
lynx-2.8.5d7_1
發現和 lynx 有相依性存在,若要移除舊版的 gettext,必須先移除 lynx。
文字方塊: v 1.2
移除新版的試試看
# pkg_delete gettext-0.11.1_3
pkg_delete: package 'gettext-0.11.1_3' is required by these other packages
and may not be deinstalled:
ORBit-0.5.15_1
gmake-3.79.1_1
gtk-1.2.10_4
mozilla-1.0.rc3,1
windowmaker-0.80.0_1
zh-xcin-2.5.3.p2_1
zh-xmms-1.2.7_1
vim-6.1.48
mod_php4-4.2.1_1
AbiWord-1.0.1
zh-zhcon-0.2_4
真是糟糕,無論舊版或是新版都有相依性存在。看?砟壳爸缓孟葧簳r打消念頭。
三天後,我檢查是否有可以升級的應用程式。
先更新ports tree
# cd /usr/ports
# make update
# make index
root@polo [/usr/ports] # pkg_version -L =
gettext <
png <
顯示目前系統 gettext 及 png 的版本比 ports tree還舊。由於系統中有安裝二個
不同版本的 gettext,表示其中一套是需要升級的,而另一套符合目前最新的版
本。
首先我們先升級gettext。通常我們都會先移除舊版的應用程式,再安裝新版的應
用程式;因為新版的我們已經安裝了,所以只須移除舊版的即可。此時,問題就
發生了,和前述一樣,會發生相依性的關係,只好作罷。

接下?砦覀冊囍塸ng。
# pkg_delete png-1.2.2_4/
pkg_delete: package 'png-1.2.2_4' is required by these other packages
and may not be deinstalled:
mozilla-1.0.rc3,1
windowmaker-0.80.0_1
gd-2.0.1_3
mod_php4-4.2.1_1
AbiWord-1.0.1
和gettext一樣,發生相依性的關係。後?砦覜Q定改試?娭菩陨墸m然這種方
法危險性很大。
root@polo [/var/db/pkg] # pkg_delete -f png-1.2.2_4/
再安裝新版的png
root@polo [/usr/ports/graphics/png] # make install clean
但後?砦野l現原本和舊版png有相依性的應用程式,沒有因為我升級而將相依關
係取代為新版的png。
以上這些常見的問題,真是令人頭痛。
● 新世紀的交替 – 智慧型管理的時代
○ pkgtools的相關程式
lang/ruby - An object-oriented interpreted scripting language
devel/ruby-fnmatch - A Ruby module which provides File::fnmatch and File::FNM_*
devel/ruby-bdb1 - Ruby interface to Berkeley DB revision 1.8x with full feature support
devel/ruby-optparse - Yet another command line option parser for Ruby
sysutils/pkg_tarup - Generates binary package from installed package
(data from: pkgtools announce news)

安裝之前,確定ports tree是最新的,雖然portupgrade目前已經趨於成熟,但不
可避免有小問題發生,還是建議安裝最新版。
# cd /usr/ports/sysutils/portupgrade
# make install clean
○ pkgtools工具簡介
portupgrade
升級已經安裝的ports或packages的工具。提供直接升級,而不須要先移除相依
性套件,甚至可以將相依性套件一起升級。
portinstall
安裝尚未安裝的套件,相當於使用`portupgrade –N`。在安裝新套件之前,會先升
級所有required套件。
portversion
將目前安裝於系統中的套件版本和ports tree的套件版本比較。這個工具是取代
原本的pkg_version,而且因為是利用ports database,所以更有效率。
ports_glob
查詢ports database的檔案。能夠判斷萬用字元,?K且有能力列出特定ports的需
求、相依或主要的ports。
pkg_fetch
提供可以由遠端下載binary packages,?K且會遞迴的下載相依性的packages。
pkg_glob
查詢packages database的檔案。能夠判斷萬用字元,?K且有能力列出特定package
的需求、相依或主要的packages。
pkg_deinstall
這個工具是取代原本的pkg_delete。能夠判斷萬用字元,?K且有能力遞迴相依性
packages,也可以選擇保留共享的函式庫。
pkg_db
pkgdb建立?K升級packages的資料庫。使用了雜?(hash)映射(map)已經安裝的
packages的名稱,這種映射方式也包含packages的?碓矗?K將已安裝的packages

列表(list)。當安裝或移除packages的,建立好的資料庫會自動升級。
pkg_which
pkg_which會查詢packages的資料庫,?K找出package是由那個檔案安裝。如果
你沒有權限升級packages的資料庫,可以找這項工作委託給 pkg_iofo(1)。
portsclean
portsclean是一個可以清理(clean)Ports的工作目錄(working directories),不再參考
distfiles,過期的packages檔案,?K?U棄(obsolete)且單獨(orphan)的分享函式庫。
portcvsweb
portcvsweb可以立即經由CVSweb,瀏覽特定已知的檔案。他的功能可能比你想
像中的?姶螅囍S著src、www、doc、NetBSD pkgsrc和OpenBSD ports?硎
用他。
○ 開始使用 pkgtools
在使用 portupgrade 之前,先備份 /var/db/pkg。到目前為止筆者使用portupgrade
?K沒有發生任何問題,但為了保留重要資料,還是?娏医ㄗh做備份動作。
# tar –zcvf backup_pkg.tgz /var/db/pkg
接下?砀聀orts tree 的INDEX以及建立ports的資料庫INDEX.db。
# portsdb –Uu
Updating the ports index ...
…[略]
done
[Updating the portsdb <format:bdb1_btree> in /usr/ports ... - 5997 port entries
found .........1000.........2000.........3000.........4000.........5000.............. done]
然後開始進要初始設定和做一些ports的清理動作。
# pkgdb –F
[Updating the pkgdb <format:bdb1_btree> in /var/db/pkg ... - 94 packages found
(-2 +0) (...) done]
Checking the origin of AbiWord-1.0.1
Checking the origin of Hermes-1.3.2
Checking the origin of ORBit-0.5.15_1
…[略]

Duplicated origin: converters/libiconv - libiconv-1.7_3 libiconv-1.7_5
Unregister any of them? [no]
Unregister libiconv-1.7_3 keeping the installed files intact? [no]
-> libiconv-1.7_5 is kept.
--> Saving the libiconv-1.7_3's +CONTENTS file as
/var/db/pkg/libiconv-1.7_5/+CONTENTS.libiconv-1.7_3
--> Unregistering libiconv-1.7_3
--> Done.
[Updating the pkgdb <format:bdb1_btree> in /var/db/pkg ... - 93 packages found (-1
+0) (...) done]
Stale dependency: AbiWord-1.0.1 -> png-1.2.2_4:
png-1.2.3 (score:83%) ? ([y]es/[n]o/[a]ll) [yes]
在這一步驟中,portdb發現了失效的相依性關係。原本在資料庫中的 AbiWord
是相依於 png-1.2.2_4,但後?硪驗橹?娭埔瞥f版的png,?K且更新png為
png-1.2.3,這些動作皆可以由portdb?膒ackages的資料庫中偵測出?恚?K且還
提供建議性的相容性程度 83%。
相依性的問題是我所預期的,而且希望能夠將任何和舊版png有相依性的,全部
更正為和新版的png相依。所以我選擇 a [all]。
○ 利用pkgtools升級應用程式
更新完ports tree後,我想和packages資料庫比對一下,是否有可以升級的應用
程式。
FreeBSD的傳統方法是使用pkg_version
# pkg_version -L =
而pkgtools提供的新方法,使用資料庫比對的方式,效率更高。
# portversion –L =
libiconv <
zh-ttfm <
zip <

由結果中,可以得知在系統上有三個已安裝的應用程式版本比ports tree中的版
本還要舊。我決定先升級zh-ttfm。
和zh-ttfm相依的有
# pkg_info -rR zh-ttfm-0.9.3_1
Information for zh-ttfm-0.9.3_1:
Depends on:
imake-4.2.0_1
freetype2-2.0.9
freetype-1.3.1_2
XFree86-libraries-4.2.0_1
XFree86-clients-4.2.0_2
Required by:
zh-arphicttf-2.11_1
若想把和zh-ttfm相關的所有套件一起更新,可使用以下指令。
# portupgrade -cCrRuv zh-ttfm
若只想單純升級zh-ttfm的話,則僅使用以下指令即可。
# portupgrade -cCuv zh-ttfm
在這種例子中,應該使用後?淼姆绞?砩墸驗橛芍皃ortversion發現僅有
zz-ttfm這個應用程式需要升級,而相依性的套件?K不需要升級,所以不用大費
周章升級所有相依套件。
其他範例:
.. 升級 glib
# portupgrade glib
.. 升級Xfree86和Mesa,?K傳遞 -DWANT_GGI 參數?韒ake Mesa
# portupgrade XFree86 -m '-DWANT_GGI' Mesa
.. 升級sawfish以及所有sawfish依靠(depend on)的應用程式,?K且建立
packages
# portupgrade -Rp sawfish
.. 升級glib,?K使用互動模式(interactive)

# portupgrade -ri glib
.. 升級所有依靠(depend on) glib的應用程式,但是glib本身則不升級
# portupgrade -rfx glib glib
.. 升級所有在2002/07/08日之前安裝的應用程式
# portupgrade -f '<2002-07-08'
.. 升級所有依靠(depend on) png的應用程式,而且該應用程式的安裝時間在
png安裝之前
# portupgrade -fr png -x '>=png'
.. 只取回所有需要升級應用程式的distfiles
# portupgrade –aFR
.. 升級glib,?K且以使用packages升級為優先,ports為次之
# portupgrade -P glib
.. 只使用packages,完全不考慮ports?砩壦袘贸淌剑覂H列出結果,
?K沒有真正執行
# env PKG_PATH=/mnt/cdrom/packages/All portupgrade –anPP
.. 以相依性排序,升級所有套件。
# portupgrade -scC '*'
○ pkgtools.conf
如果使用ports安裝portupgrade,/usr/local/etc下可找到pkgtools.conf.sample,這
是設定pkgtools的設定樣本檔,可以依照自己的需求建立一份。
# cd /usr/loca/etc
# cp pkgtools.conf.sampl pkgtools.conf
例如:以元智server為舉例
ENV['PORTSDIR'] ||= '/usr/ports'
ENV['PACKAGEROOT'] = 'ftp://freebsd.csie.nctu.edu.tw'

SANITY_CHECK = true
IGNORE_CATEGORIES = [
'french',
'german',
'hebrew',
'japanese',
'korean',
'russian',
'ukrainian',
'vietnamese',
'games',
'palm',
'print',
'x11*',
]
EXTRA_CATEGORIES = [
'outta-port',
]
HOLD_PKGS = [
'bsdpan-*',
]
MAKE_ARGS = {
'editors/vim' => '-DLITE CONF_OPT_MULTIBYTE=--enable-multibyte'
}
BEFOREBUILD = {
}
AFTERINSTALL = {
# Re-enable the X wrapper
'x11-servers/XFree86-4-Server' => sprintf(
'cd %s/bin && if [ -x Xwrapper-4 ]; then ln -sf Xwrapper-4 X; fi',
x11base()),
}

PKG_SITES = [
sprintf('ftp://freebsd.csie.nctu.edu.tw/pub/FreeBSD/ports/i386/packages-stable/'),
]
PORTUPGRADE_ARGS = ENV['PORTUPGRADE']
○ 使用pkgtools自動化升級應用程式
如果於pkgtools.conf中有設定在執行portupgrade之前,先更新ports tree,則以
有權限安裝應用程式的使用者,編寫crontab:
0 6 * * 1 /usr/loca/sbin/portsdb –Uu && /usr/local/sbin/portupgrade –a
若沒有於pkgtools.conf中有設定在執行portupgrade之前,先更新ports tree,則
以有權限安裝應用程式的使用者,編寫crontab:
0 6 * * 1 /usr/local/bin/cvsup –g –L 2 /usr/share/examples/cvsup/ports-supfile &&
/usr/local/sbin/portsdb –Uu && /usr/local/sbin/portupgrade –a
另外,在傳統自動化升級的方式,可使用pkg_version –c的方式,而在portupgrade
則以portversion –c方式取代。
0 6 * * 1 /usr/local/bin/cvsup –g –L 2 /usr/share/examples/cvsup/ports-supfile &&
/usr/local/sbin/portsdb –Uu && /usr/local/sbin/portversion –c >! /tmp/update_apps
&& sh /tmp/update_apps
注意:
在相同應用程式安裝兩套版本時,欲將其中舊版本?娭苿h除,而以新版本取代其
作用時,務必先確定其?碓唇?碇镣籶orts。
例如:發現在系統中安裝了兩個版本的gettext
gettext-0.10.35_2 GNU gettext package
gettext-0.11.2 GNU gettext package
先檢查是否?碜酝籶orts。
Port: gettext-0.11.1_3
Path: /usr/ports/devel/gettext
Info: GNU gettext package
Maint: portmgr@FreeBSD.org
Index: devel

B-deps: bison-1.35_1 expat-1.95.2 libiconv-1.7_5 libtool-1.3.4_3
R-deps: expat-1.95.2 libiconv-1.7_5
Port: gettext-0.10.35_2
Path: /usr/ports/devel/gettext-old
Info: GNU gettext package
Maint: portmgr@FreeBSD.org
Index: devel
B-deps: libtool-1.3.4_3
R-deps:
由結果可知,這兩個版本皆有不同的相依性軟體,且?碜圆煌膒orts,因此不
可將其中一個取代另一個的功能,否則相依的應用程式可能會發生錯誤。
參考文件
pkgtools manual
freebsd diary article – clean ports
勘誤
2002-07-04 v0.1 beta
2002-07-18 v1.0
2002-08-16 bug-fixs – v1.1
2002-09-18 pkgtools updated, changelog – v1.2
編者
元智大學資?管理學系 曾義峰 ( s882617@mail.yzu.edu.tw )
 楼主| 发表于 2003-8-13 23:53:59 | 显示全部楼层
  
发表于 2003-8-14 13:31:35 | 显示全部楼层
太好了,其实我早就知道有这个东西,但是后来怎么也找不到了,搜索也找不到,这回终于被我抓到了,嘿嘿,收藏之。。
发表于 2003-8-14 13:34:06 | 显示全部楼层
哦,刚刚发现原来自己给记成了portupdate,我说怎么怎么搜也搜不到呢 。。。
发表于 2005-1-13 16:30:47 | 显示全部楼层
Post by 木各
不得不发的感叹:
通读了一遍,还有内容不理解,原以为记几个portupgrade和pkg命令,读几个makefile文件,就算是知道了freebsd的软件是怎么安装地,现在才知道自已是多么浮浅,真是井底的小蝌蚪。羞愧。

4242
发表于 2005-1-24 21:57:47 | 显示全部楼层
精品文章!  正在为应用程序相互依赖的问题头疼呢,这下有了指南。。
回复 支持 反对

使用道具 举报

发表于 2005-1-29 15:13:33 | 显示全部楼层
顶..顶顶.
回复 支持 反对

使用道具 举报

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

本版积分规则

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