2008年4月25日 星期五

portupgrade

注意注意
* always pkgdb -F before upgrade
* always backup /var/db/pkg
(好吧,我承認我每次都沒做)



  • 選項
    pkgname_glob pkg_glob(1)
  • a 全部安裝的 packages
  • A 每次 install 後要跑的指令
  • b 把舊的 package 備份到 PKG_TMPDIR or TMPDIR (default /var/tmp)
  • B build 前要跑的指令 (如果 fail 的話,那這個 port/package 會被略過)
    要更新 gnome* 前先 cvs update
    portupgrade -B 'cvs update' 'gnome*'
    不知道
    portupgrade -B 'ports_glob -M $(pwd) (cd../..; xargs cvs up)' slave/port
    通通都更新,除了 interactive 的 ports portupgrade -aB 'test ! `make -VIS_INTERACTIVE`'
  • c 在 build 之前 clean (default)
  • C 在 install 之後 clean (default)
  • D 在 fetch/build 之前 distclean
  • f 強迫更新一個要被 downgrade 或相同版本或在 pkgtools.conf 標記為 HOLD_PKGS的 package
  • F 只會把 distfiles 抓下來(如果加 -P 則是抓 packages)
  • g 強迫更新 require 的 package 更新失敗的 package
  • i interactive 就是會問你要不要的 (implies -v)
  • I 把結果丟到 FILE 去
  • L 把每一個 port build & install 結果丟到 PREFIX 去存成 ::
  • m 要 append 給 make(1) 的參數
  • M 要 prepend 給 make(1) 的參數
  • n 看看會幹些什麼事情 (implies -v, negates -i, -y)
  • N 安裝新的 port/package 而且會先更新所有 require 的 packages 可以指定 portorigin glob
  • o 指定 ORIGIN
  • O 別做完整的 denendency check(如果跑之前有 pkgdb -F 那可以放心的用)
  • p 在 install/upgrade 後生出 package,如果有指定到 dependent package的話(like -r),那些也會生 package
  • P 用 package,會去掃 PKG_PATH,找不到就 pkg_fetch 再不然就用 ports
  • PP 堅持只用 package,不用 ports
  • q 不要讀 $PREFIX/etc/pkgtools.conf
  • r 把 depends on given ports 的 packages 也一起更新
    比如說 -r png-* 的話,會把需要 png 的 packages 一起更新
  • R 把 given ports 需要的 packages 也一起更新
    比如說 -R kde3 的話,會把其他 kde3-* 的一起更新
  • s 在需要 root 權限的時候執行 sudo
  • S 取代 sudo(8) 的指令,例如 su root -c %s ''
  • u 不要保留舊的 shared libraries
  • v verbose output
  • w 不要在 build 之前 clean
  • W 不要在 install 之後 clean
  • -x 排除 match GLOB 的 packages
    例如 portupgrade -rx XFree86 XFree86 會更新所有 depends on XFree86 的 packages,卻不更新 XFree86 本身
  • y 所有問題通通回答 yes (implies -v, negates -n)

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'>=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

小技巧

  • 在進行 binary uprage 後,請用 pkgdb -F 修一下 dependencies。
  • 透過網路進行大量更新 portupgrade -aPPR
  • 如果懷疑 portupgrade 倒底會幹哪些事情的時候,請用 -n 和 -i, 也可以用 pkg_glob(1) 來看 glob patterns 到底會展開成什麼。
  • 為了讓更新更正確、更有效率,請愛有事沒事跑一跑 pkgdb -F,每次 CVSup 更新完 ports tree 之後,portsdb -Uu,以確保 INDEX 跟 ports
    tree 同步。
  • 可以用 portversion(1) 取代 pkg_version(1) 來檢查可以 upgrade 的 packages。portversion(1) 用法跟他一樣,而且比較快。
    portversion -c 可以輸出給 portupgrade(1) 更新用的 script。
  • 可以用 pkg_deinstall(1) 取代 pkg_delete(1) 來移除 packages。
    這其實是 pkg_delete(1) 的 wrapper,不過有些更好的特性,
    比如說 recursive deinstall 或者保留 shared library。
  • 可以用 portsclean(1) 清理不需要的 distfiles、working、舊的 shared libraries。
  • 可以用 portcvsweb(1) 來看看一個 port 的 change。

    環境變數
    這邊列出來 default 的值,不多做解釋。
    PKG_DBDIR /var/db/pkg
    PORTSDIR /usr/ports
    PORTS_INDEX $PORTSDIR/INDEX
    PORTS_DBDIR $PORTSDIR
    PKG_TMPDIR
    TMPDIR /var/tmp
    PACKAGES $PORTSDIR/packages
    PKG_PATH $PACKAGES/All
    PKG_SUFX 定義在 bsd.port.mk 或 /etc/make.conf
    PKGTOOLS_CONF $PREFIX/etc/pkgtools.conf
    PORTUPGRADE 預設 portupgrade 的選項

    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 問題就可以解決。

==延伸閱讀==

FreeBSD 5.X、6.X 常見問答集

1 則留言:

nIce 提到...

執行後的結果(有點久...)
greenjade# portsdb -Uu
Updating the ports index ... Generating INDEX.tmp - please wait..Warning: Duplicate INDEX entry: mod_rpaf-ap2-0.6
Done.
done
[Updating the portsdb < format:bdb_btree> in /usr/ports ... - 18417 port entries found .........1000.........2000.........3000.........4000.........5000.........6000.........7000.........8000.........9000.........10000.........11000.........12000.........13000.........14000.........15000.........16000.........17000.........18000.... ..... done]
greenjade#

熱門文章