Chinaunix首页 | 论坛 | 博客
  • 博客访问: 513198
  • 博文数量: 158
  • 博客积分: 4015
  • 博客等级: 上校
  • 技术积分: 1711
  • 用 户 组: 普通用户
  • 注册时间: 2009-01-27 14:00
文章分类

全部博文(158)

文章存档

2010年(71)

2009年(87)

我的朋友

分类: BSD

2009-09-02 12:50:53


* 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 -V IS_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'
更新/重安装所有在 2001/09/20 前安装的 packages

o. portupgrade -fr png -x '>=png'
更新/重安装所有在 png 前安装且需要 png 的 packages

o. portupgrade -aFR
去 fetch 更新所有 packages 需要用的 distfiles

o. portupgrade -o print/ghost-afpl ghost-gnu
用 print/ghost-afpl 换掉 ghost-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) 更新用的 。

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。

环境变数

这边列出来 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 问题就可以解决。
阅读(902) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~