Portupgrade被用來作為經由port或packages升級/安裝的工具。而portinstall相當於portupgrade -N。
安装路径 /usr/ports/sysutils/portupgrade#make install clean
语法:portupgrade [
-habcCDfFginNOpPPqrRsuvwWy] [
-A command] [
-B command] [
-l file] [
-L prefix] [
-S command] [
-x pkgname_glob] [[
-o origin] [
-m make_args] [
-M make_env] pkgname_glob ...]
注意
* 请不要忘记在升级前总是执行 pkgdb -F
* 请记得 Portupgrade 不会自己寻找程序相关性,必要时别忘了使用 -f -r 或 -R 参数
* 当 Portupgrade 在執行中,请勿中断。否则您将会有一个不完全的资料库。(虽然即使这样做是100%的安全)
* 请务必备份先前的资料和设定档 /var/db/pkg
选项pkgname_glob 定义一个pkgname,可以包含万用符号详情参考 pkg_glob(1)。
-h (--help)
顯示求助選單。
-a (--all)
表示所有已經安裝的軟體。
相當於pkgname_glob中的 '*' 。
-A CMD (--afterinstall CMD)
在每一個安裝完成後,以root身分執行某一命令。
-b (--backup-packages)
保留舊有版本的備份。
這些資料會暫時存放在PKG_TMPDIR 及 TMPDIR所定義的位置。
-B CMD (--beforebuild CMD)
與-A CMD 相反,在安裝每一個程式前,先執行該命令。
若該命令執行失敗,則安裝會停止。
-c (--clean)
在每一次安裝前,先執行make clean。(預設值)
-C (--cleanup)
在每一次安裝後執行make clean。(預設值)
-D (--distclean)
在每次fetch或是build之前執行 make distclean。
-f (--force)
強制執行,即使是降級或是同一版本也強制安裝。
-F (--fetch-only)
只取得檔案或是packages但不做升級動作。
這個參數對於一次取得多數檔案很有用。
-g (--go-on)
繼續執行動作,即使某些相關的packages升級失敗。
預設的狀態中,若某package或是port升級失敗,其相關連性會被skipped。
-i (--interactive)
打開互動模式,portupgrade在進行重要步驟前會徵得您的同意?
-l FILE (--log-results FILE)
將更新升級結果以FILE為檔名儲存?
-L PREFIX (--log-prefix PREFIX)
將每一個port的建立、安裝記錄存為一個檔案,而PREFIX則是存放的位置?
-m (--make-args)
在每次make前加上額外的參數(arguments)
-M (--make-env)
在每次make後加上額外的參數(arguments)?
-n (--noexecute)
不實際執行安裝或升級動作?
只是顯示會有何改變?
-N (--new)
當指定的package是尚未安裝的情況下,安裝該程式?且其所需求的關連程式也會一併被安裝升級?
-o ORIGIN (--origin ORIGIN)
定義某port再某package之後升級?
-O (--omit-check)
忽略依存性的檢查?預設的狀況下,會自動檢查程式間的依存性,當然地,這個動作會花去額外的時間?但,若您先前已經執行過pkgdb -F 命令,您可以採用此參數忽略之?
-p (--package)
為該安裝/升級的port,建立package?
-P (--use-packages)
再採用port方式升級前,先採用packages的方式?
-PP (--use-packages-only)
不管任何情況,只採用packages方式升級?
-q (--no-config)
使portupgrade不去讀取設定檔$PREFIX/etc/pkgtools.conf?
-r (--recursive)
依據指定的程式(packages)來升級與其相依存的程式?
-R (--upward-recursive)
依據指定的程式(packages)來升級其所依存的程式?
-s (--sudo)
在必要的情況下,以sudo狀態執行命令?
-S CMD (--sudo-command CMD)
加上sudo的命令
-u (--uninstall-shlibs)
不保留舊有的共享函式庫?在預設的情況下是保留以策安全?
-v (--verbose)
開啟 verbose 輸出?
-w (--noclean)
在每一次編譯前,不要執行make clean?
-W (--nocleanup)
在每一次的編譯後不要執行make clean?
-x GLOB (--exclude GLOB)
將符合樣式的packages排除在昇級更新之外? ex:昇級所有與XFree86相依存的程式,除了XFree86之外?
portupgrade -rx XFree86 XFree86
-y (--yes)
任何回答都回應yes?
环境变数及相关文件
PKG_DBDIR 指定安裝packages資料庫的變數。
預設是/var/db/pkg。
PORTSDIR 指定ports tree位置的變數。
預設是/usr/ports。
PORTS_INDEX 指定ports INDEX 位置的變數。
預設是$PORTSDIR/INDEX。
PORTS_DBDIR 指定ports資料庫檔案位置的變數。
預設是$PORTSDIR。
PKG_TMPDIR 指定portupgrade在備份檔案暫存資料夾的變數。
若沒有特別指定,則使用/var/tmp。
注意:此資料夾需要有足夠的空間。
PACKAGES 指定portupgrade建立packages位置的變數。
預設是$PORTSDIR/packages。
PKG_PATH 指定portupgrade搜尋packages位置的變數。
預設是$PACKAGES/All 。
PKGTOOLS_CONF 指定pkgtools 設定檔位置的變數。
預設是$PREFIX/etc/pkgtools.conf 。
PORTUPGRADE 指定portupgrade預設執行參數的變數。
/var/tmp 預設的暫存檔位置。
/var/db/pkg 預設的程式資料庫的安裝位置。
/usr/ports 預設的ports tree及ports的資料庫檔案位置。
$PREFIX/etc/pkgtools.conf 預設的pkgtool的設定黨位置。
portuprade 流程
1. 没给 -P 的话,跳到 4。否则 search PKG_PATH 看看有没有新的 packages,
有找到的话,跳到 5。
2. 用 pkg_fetch(1) 去抓新的 packages 下来,如果是最新的话跳到 5。
如果给 -PP 但抓下来的 packages 比安装的新(不一定是最新)的话,
也跳到 5。
3. 如果给 -PP 的话,停止作业。
4. build given package 相对应的 port。
5. 修 depends on given package 那些 packages 的 dependency。
6. save given package 的 +REQUIRED_BY。
7. 把 given package 用 pkg_create(1) 备份下来。
8. 把 given package 的 registration 档案备份下来。
9. 强迫 uninstall given package,并保留 share libraries,
除非有指定 -u。
10. 安装新的 port or package(看是 cond. 1 or 2 or 3)。
11. 如果安装失败,
11.1. 把 7. 备份的档案还原。
11.2. 把 8. 备份的 registration 档案还原。
11.3. 把 5. 修过的 dependency 还原。
12. 把 obsoleted 的 dependencies 移除。
13. 把 6. 备份的 +REQUIRED_BY 复原。.
14. 执行 portsclean -L 把重复的 share libraries 砍掉,
并且保留旧的 share libraries,详情请见 portsclean(1)。
一些例子
o. portupgrade glib
更新 glib
o. portupgrade XFree86 -m '-DWANT_GGI' Mesa
传 -DWANT_CGI 给 Mesa。
当 portupgrade 用在很多 packages 上面时,他会依照 dependency order 处理。
o. portupgrade -L /var/tmp/log. '*gnome*'
更新所有 GNOME packages,并 log 在 /var/tmp/log.::
o. portupgrade -Rpv sawfish
更新 sawfish 和所有 sawfish 需要的 packages
o. portupgrade -ri glib
更新 glib 和所有需要 glib 的 packages
o. portupgrade -rfx sdl sdl
更新/重安装所有需要 sdl 的 packages 但不包含 sdl
o. portupgrade -f '<2001-09-20'
更新/重安装所有在 2001/09/20 前安装的 packages
o. portupgrade -fr png -x '>=png'
更新/重安装所有在 png 前安装且需要 png 的 packages
o. portupgrade -aFR
去 fetch 更新所有 packages 需要用的 distfiles
o. portupgrade -o print/ghostscript-afpl ghostscript-gnu
用 print/ghostscript-afpl 换掉 ghostscript-gnu
o. portupgrade -P glib
用 package 更新 glib
o. env PKG_PATH=/mnt/cdrom/packages/All portupgrade -anPP
用 CDROM 里面的 packages 来进行大量更新
如果不想让 portupgrade 去 fetch 不在 CDROM 的 packages 的话,
把 PKG_FETCH 设定为 /bin/false
小技巧
o. 在进行 binary uprage 後,请用 pkgdb -F 修一下 dependencies。
o. 透过网路进行大量更新 portupgrade -aPPR。
o. 如果怀疑 portupgrade 倒底会干哪些事情的时候,请用 -n 和 -i,
也可以用 pkg_glob(1) 来看 glob patterns 到底会展开成什麽。
o. 为了让更新更正确、更有效率,请爱有事没事跑一跑 pkgdb -F,
每次 CVSup 更新完 ports tree 之後,portsdb -Uu,以确保 INDEX 跟 ports
tree 同步。
o. 可以用 portversion(1) 取代 pkg_version(1) 来检查可以 upgrade 的
packages。portversion(1) 用法跟他一样,而且比较快。
portversion -c 可以输出给 portupgrade(1) 更新用的 script。
o. 可以用 pkg_deinstall(1) 取代 pkg_delete(1) 来移除 packages。
这其实是 pkg_delete(1) 的 wrapper,不过有些更好的特性,
比如说 recursive deinstall 或者保留 shared library。
o. 可以用 portsclean(1) 清理不需要的 distfiles、working、
旧的 shared libraries。
o. 可以用 portcvsweb(1) 来看看一个 port 的 change。
SEE ALSO
pkg_add(1), pkg_deinstall(1), pkg_delete(1), pkg_glob(1), pkg_info(1),
pkg_sort(1), pkg_update(1), pkgdb(1), portcvsweb(1), ports_glob(1),
portsclean(1), portsdb(1), portversion(1), pkgtools.conf(5), ports(7)
BUGS
SUSP (^Z) 在 build/install 过程中没有用。
有时候 database 会烂掉导致 pkgtools segmentation fault,这样子的话,
用 pkgdb -fu 重新 build database 问题就可以解决。
阅读(1218) | 评论(0) | 转发(0) |