用户工具

站点工具


faq:ports

差别

这里会显示出您选择的修订版和当前版本之间的差别。

到此差别页面的链接

两侧同时换到之前的修订记录 前一修订版
faq:ports [2013/03/07 13:18]
alphachi pkg_cleanup bug fixed
faq:ports [2013/05/17 14:11] (当前版本)
syh + recommand pkg-rmleaf
行 1: 行 1:
 +======FreeBSD 的 Ports 系统======
  
 +=====什么是 Ports 系统=====
 +简单的讲,一个 port 就是一个被移植到了 FreeBSD 上的软件。所有这些软件的集合,加上 FreeBSD 处理这些软件的各种工具,就是 Ports 系统。
 +
 +=====Ports 系统有什么用=====
 +每一个被移植到 FreeBSD 上的软件(就是 Port),都能通过 Ports 系统中的工具方便有序的安装,升级,卸载。而且符合 FreeBSD 系统对应用软件施加的各种规范。免去了你到处寻找软件,自己编译,安装,升级的麻烦。借助这些 ports 维护者的努力,你也不用担心这些软件与系统不兼容导致无法安装升级等等。
 +
 +=====怎么安装 Ports 系统=====
 +有三种方法来安装 Ports 系统:
 +
 +====1 安装系统时选择安装 Ports 系统====
 +这是最简单的方法,但是也有缺点。因为 Ports 系统总是随时更新的。因此你从安装光盘上安装的 Ports 系统肯定不是最新的了。
 +
 +
 +====2 使用 portsnap 安装/​同步 ports 系统====
 +这是推荐的方法。使用portsnap不需要事先安装 ports tree,并且能够在任何时候恢复到已知的最新状态(即使手工对ports tree进行了修改)。
 +
 +使用 portsnap 分成两个步骤:下载压缩的 portsnap 快照,和更新现有系统。下载或更新 portsnap 快照的方法是 portsnap fetch;首次安装,或希望将 ports tree 恢复到快照的样子,应使用 portsnap extract;之后更新系统中的 ports tree,则可以通过 portsnap update 来完成。对于服务器而言,推荐在 crontab 中增加在每天3点执行 portsnap cron,以减少使用时所需要的下载时间。
 +
 +首次下载 portsnap 快照时,需要下载一个大约50MB的快照基础文件。在中国大陆,由于网络状况的原因,这可能需要较长时间。可以考虑用 portsnap fetch -s portsnap.cn.freebsd.org 做首次下载;之后的下载,还是推荐使用正常的 portsnap fetch。
 +
 +可以使用下面步骤完成上述情况
 +
 +1.首先设置一个比较快的portsnap服务器,如果系统默认的地址你的访问速度也很快,可以不修改
 +
 +<​code>​
 +#vi /​etc/​portsnap.conf
 +</​code>​
 +设置SERVERNAME=portsnap.cn.freebsd.org ,​你可以设置相对你速度快点的服务器的地址
 +
 +2.执行下面命令
 +<​code> ​
 +#portsnap fetch extract ​   这里直接下载ports并且解压
 +</​code>​
 +这样就完成了下载ports系统以及解压到/​usr下面了
 +
 +3.设置最快的ports镜像
 +
 +用ports安装软件的时候,如果没有设置相对于你来说最快的ports服务器地址,那就会默认的 ftp://​ftp.freebsd.org/​pub/​FreeBSD/​ports/​distfiles/​,这个地址对于很多地方来说是很慢的。
 +
 +修改 /​etc/​make.conf 加入以下代码
 +<​code>​
 +MASTER_SITE_OVERRIDE=\
 +ftp://​ftp.freebsdchina.org/​pub/​FreeBSD/​ports/​distfiles/​${DIST_SUBDIR}\
 +ftp://​ftp.tw.freebsd.org/​pub/​FreeBSD/​ports/​distfiles/​${DIST_SUBDIR}
 +</​code>​
 +如果你有最快的地址,可以加到上面去,下载就会块了
 +
 +====3 使用 csup/cvsup 安装/​同步 Ports 系统====
 +
 +这种方法已经不再推荐使用。
 +
 +不管事先你有没有安装 Ports 系统,你都可以使用 csup/cvsup (推荐使用 csup,这是基本系统中自己带的)来安装/​同步最新的 Ports 系统。把 /​usr/​share/​examples/​cvsup/​ports-supfile 拷贝到一个地方(比如 /​home/​user/​tmp/​ports-supfile),然后作适当的修改(比如修改要连接的服务器)。最后使用如下命令来安装/​同步:
 +<​code>​csup -L 2 /​home/​user/​tmp/​ports-supfile</​code>​
 +
 +=====Ports 树的目录结构=====
 +假设你的 ports 树安装在默认位置 /​usr/​ports。
 +
 +文件:
 +<code bash>
 +/​usr/​ports/​CHANGES # ports 开发者、维护者等的记录文档。
 +/​usr/​ports/​COPYRIGHT # ports 树的版权。
 +/​usr/​ports/​GIDs # 一些 port 可能用到的组名称。
 +/​usr/​ports/​INDEX-xxx # 每个 port 的摘要
 +/​usr/​ports/​KNOBS # 编译 port 时需要的一些环境变量与解释。
 +/​usr/​ports/​LEGAL # 某些 port 的协议限制。
 +/​usr/​ports/​MOVED # 被移动/​删除了的 port 列表。
 +/​usr/​ports/​Makefile # ports 树总的 BSD Makefile。
 +/​usr/​ports/​README
 +/​usr/​ports/​UIDs # 一些 port 可能用到的用户名称。
 +/​usr/​ports/​UPDATING # ports 树的更新记录以及建议。
 +</​code>​
 +
 +目录:
 +<code bash>
 +/​usr/​ports/​Mk # 编译 port 需要的 Makefile 集合。
 +/​usr/​ports/​Templates # 一些模板。
 +/​usr/​ports/​Tools # 一些工具。
 +/​var/​db/​ports # 包含所有进行过配置的可定制 port 的可选变量。每一个 port 占用一个目录。
 +/var/db/pkg # 包含所有已经安装的 port 的记录。用 pkg_add 安装的预编译好的包也会在此留下记录。
 +</​code>​
 +
 +除开以上文件和目录,其他所有的目录都是 ports。一个 port 的目录结构:
 +<​code>​
 +/​usr/​ports/​分类/​名称
 +</​code>​
 +
 +比如 firefox 被分类在 www。因此 firefox 在 ports 树中的位置就是:
 +<​code>​
 +/​usr/​ports/​www/​firefox
 +</​code>​
 +
 +=====使用 Ports 系统=====
 +
 +
 +====1 查询====
 +比如,你想知道 ports 中是否有 pidgin 这个软件,那么可以这样:
 +
 +<code bash>
 +$cd /usr/ports
 +$make search key=pidgin
 +</​code>​
 +
 +同样也可以使用
 +<code bash>
 +$cd /usr/ports
 +$make search name=pidgin
 +</​code>​
 +
 +用上面两种方法查询时,显示的信息比较详细,包括维护者、依赖包、主页等内容。如果只想显示所在的路径和软件名称,则可以用
 +<code bash>
 +$cd /usr/ports
 +$make quicksearch name=php
 +</​code>​
 +这样可以使显示的结果更清晰。
 +
 +/​usr/​ports/​README 中还有更多的例子可以参考。
 +
 +====2 安装====
 +非常简单。比如你要安装 firefox,那么作为超级用户 root:
 +
 +<code bash>
 +#cd /​usr/​ports/​www/​firefox
 +#make install clean
 +</​code>​
 +
 +====3 卸载====
 +要卸载 firefox 的话:
 +
 +<code bash>
 +#cd /​usr/​ports/​www/​firefox
 +#make deinstall clean
 +</​code>​
 +
 +要卸载所有安装的ports:
 +
 +<code bash>
 +#cd /var/db/pkg
 +#pkg_delete *
 +#reboot
 +</​code>​
 +====4 升级====
 +要升级 firefox:
 +
 +<code bash>
 +#cd /​usr/​ports/​www/​firefox
 +#make deinstall reinstall clean
 +</​code>​
 +
 +====5 定制 port===
 +有时候,你会发现安装某个 port 的时候会有奇怪的事情发生。比如 editors/​vim,安装的时候竟然会自动安装 glib1 和 gtk1,而明明自己的系统上已经有了 glib2 和 gtk2。
 +
 +这是因为有些 port 有很多不是默认的编译选项。这个时候你需要设定一些环境变量让 port 知道该怎么做。对于 editors/​vim,你需要设定 WITH_GTK2 来让 vim 依赖 gtk2 而不是 gtk1。
 +
 +你可以在 csh 下:
 +<code bash>
 +setenv WITH_GTK2
 +</​code>​
 +
 +或者在 bash 下:
 +<code bash>
 +export WITH_GTK2=yes
 +</​code>​
 +
 +也可以把这个选项写到 /​etc/​make.conf 里面:
 +<code bash>
 +WITH_GTK2=yes
 +</​code>​
 +
 +或者你也可以指定在更新/​安装某个 port 的时候使用特定的环境变量。添加如下代码(注:csh 的语法,不是 sh/​bash)到 /​etc/​make.conf 里面:
 +
 +<code bash>
 +.if ${.CURDIR:​M*/​ports/​editors/​vim}
 +  WITH_GTK2=yes
 +.endif
 +</​code>​
 +
 +这样下次升级 editors/vim 的时候就会自动依赖到 gtk2 而不是 gtk1 了。
 +
 +类似的例子还包括 WITH_GECKO 环境变量。请阅读 ports/​Mk/​bsd.gecko.mk 来获得详细资料。
 +
 +=====定制 Ports 系统=====
 +
 +====1 设定 Ports 树的位置====
 +当你把 Ports 树放在非默认位置(/​usr/​ports)的时候,就需要修改一些环境变量让 Ports 中的工具知道你的修改。这个变量就是 PORTSDIR。
 +比如,你把 Ports 树放在了 /​opt/​ports,那么 在 sh/bash 中,执行如下命令:
 +
 +<code bash>
 +export PORTSDIR=/​opt/​ports
 +</​code>​
 +
 +在 csh 中,你需要执行如下命令:
 +<​code>​
 +setenv PORTSDIR /opt/ports
 +</​code>​
 +
 +妥贴的办法是把这个环境变量放到超级用户 root 的 dot.cshrc 文件(/​root/​.cshrc)里面。又或者你想让普通用户也能用到这个环境变量,可以考虑放到 /​etc/​profile 或者 /​etc/​csh.cshrc 里面。
 +
 +注意!如果你使用 portsnap 命令来同步 Ports 树,而你的 Ports 树不在默认位置,请在 /​etc/​portsnap.conf 中也设定你的 Ports 树的位置。
 +
 +注意!如果你使用 csup/cvsup 同步 Ports 树,而你的 Ports 树不在默认位置,请在你的 ports-supfile 中也设定你的 Ports 树的位置。
 +
 +====2 设定 dist 文件的位置====
 +所谓 dist 文件,就是 port 的源码。一般情况下,这些源码都是用 tar 打包然后用 bzip2 压缩的。默认的位置是在 $PORTSDIR/​distfiles。
 +但是,你也可以把这些 dist 文件放到另外的地方。需要设定的环境变量就是 DISTDIR。你可以根据上面的例子来设定这个环境变量。
 +
 +====3 设定工作目录====
 +如果没有设定工作目录,ports 系统默认在 port 的目录进行编译。比如你的 firefox 在 /​usr/​ports/​www/​firefox,那么默认将在 /​usr/​ports/​www/​firefox/​work 下编译 firefox。这样有一个缺点,如果你的 /usr 目录不是很大的话,在编译某些大软件的时候,比如 gnome,kde 桌面系统时,你的 /usr 空间可能会不足。
 +
 +解决的办法之一就是设定环境变量 WRKDIRPREFIX,比如
 +<​code>​
 +export WRKDIRPREFIX=/​opt/​obj/​portbld
 +</​code>​
 +这个时候 ports 系统就会到 /​opt/​obj/​portbld/​usr/​ports/​www/​firefox/​work 下编译 firefox。
 +
 +===== Ports 管理工具 =====
 +
 +==== 1 系统自带的工具 ====
 +=== 同步 ports ===
 +portsnap 是同步 ports 用的,前文已经作了介绍。\\ ​
 +详细用法参照[[http://​www.freebsd.org/​doc/​zh_CN.GB2312/​books/​handbook/​ports-using.html|这里]](搜索“Portsnap 方式”)\\
 +为了方便,我在 csh 的配置文件里写入了如下 alias :\\
 +  alias update-ports '​portsnap fetch update'​
 +大家不妨参考一下。
 +
 +=== 维护 ports ===
 +  - pkg_add
 +  - pkg_create
 +  - pkg_delete
 +  - pkg_info
 +  - pkg_updating
 +  - pkg_version
 +注:\\
 +1.具体的用法请参考[[http://​www.freebsd.org/​doc/​zh_CN.GB2312/​books/​handbook/​ports.html|手册]]中的4.4、4.5节。\\
 +2.严格来说,pkg_add,pkg_updating并不是用于 ports 的工具,它们只能用于 package 。这里只是为了让大家全面了解,哪些是官方的东西。\\
 +
 +====2 推荐的第三方工具====
 +===主要工具===
 +  *portupgrade
 +portupgrade是一个强大全面的工具,但是依赖于ruby。\\
 +个人没有用过,所以不多作评论,大家可以试一下。\\
 +  *portmaster
 +portmaster是一套仅使用系统软件,而不依赖其他ports的工具。\\
 +因为它没有依赖,很“纯”,功能也够用,所以个人比较推崇这个。\\
 +我在csh的配置文件里写了关于portmaster的如下alias:\\
 +  alias update-apps '​portmaster -a --force-config'​
 +  alias show-dep '​portmaster --show-work ./ | sort'
 +前者用来更新所有ports,并强制make config。\\
 +后者用来显示该软件的依赖,按已装和未装排序,需要事先进入那个软件的目录才能执行。\\
 +因为 portmaster 不会读取 /​etc/​make.conf 里的 BATCH=yes 设置,如果你讨厌烦人的 make config,可以:\\
 +  portmaster -aG  #​更新所有ports,并防止 make config
 +portmaster的配置文件位于/​usr/​local/​etc/​portmaster.rc,需要手工创建。\\
 +可以参考同目录下的portmaster.rc.sample。\\
 +我使用的设置是:\\
 +  ALWAYS_SCRUB_DISTFILES=dopt ​    #​更新完一个ports后自动删除旧版本的源码压缩包
 +  PM_LOG=/​var/​log/​portmaster.log ​ #日志
 +===辅助工具===
 +  * pkg_rmleaves
 +  {{:​faq:​pkg_rmleaves.png|}}\\
 +这个工具可以用来删除用不着的软件,其作用相当于Gentoo的emerge --depclean,或者Debian的orphaner(deborphan这个包)\\
 +它首先列出所有不被其他软件所依赖的“叶子节点”,或者说“孤立的软件包”(这意味着删除它们不会影响依赖关系)。\\
 +然后你可以手动指定哪些软件是你不需要的,\\
 +选中执行[OK]后,它会进一步筛选“叶子节点”。\\
 +如此递归之后,它可以保证该软件及其(不被其他软件依赖的)依赖被彻底清除。\\
 +  * pkg_cleanup
 +  {{:​faq:​pkg_cleanup.png|}}\\
 +这个工具的作用和pkg_rmleaves完全一样,其工作原理也一致,不用担心两者冲突或者哪个剔除起来更彻底。\\
 +唯一的区别在于,这个软件能充分利用你的显示屏=),另外能在上方显示出每个软件的描述,\\
 +比如上图中,光标停在了amarok这一行,它的上面就显示出amarok的介绍:“Media Player for KDE4”。\\
 +  * pkg_cutleaves
 +这个工具也是用来清理孤立软件包的,它没有图形界面,\\
 +但是它支持配置文件,可以预先设定你需要保留的软件包,以后就直接cut,不必每次都做选择。\\
 +  * pkg-rmleaf
 +这个是基于 pkgng 的卸载工具,\\
 +如果你已经切换到下一代 pkg 系统,那么 pkg_cleanup 将无法工作,\\
 +此时可以考虑 pkg-rmleaf,和 pkg_cleanup 有着类似界面,而且速度更快。\\
 +  * pkg_search
 +可能有的同学要问,怎样才能快速找到某个ports的位置呢,locate?find?\\
 +这个时候,我要向你推荐pkg_search。\\
 +pkg_search <​name>​可以让你快速找到该软件包的版本和描述,而加上参数-r,就可以知道它的位置。\\
 +  * pkgsearch
 +这个工具的作用和上述相同,但是它需要建立一个数据库,而且每次更新ports之后也要更新数据库。\\
 +看起来它的工作方式接近于Gentoo的eix。\\
 +  * portconf
 +它是用来设置全局的编译标记的,类似于Gentoo中设置的USE标记。
 +(详细内容待撰,哪位对它比较熟悉的帮个忙吧)
 +=====Ports 开发工具=====
 +
 +====portlint====
 +当你写了一个新的 port 之后,可以使用 portlint 来检查自己的 port 是否符合 FreeBSD ports 的规范。
 +
 +=====相关链接=====
 +
 +[[http://​cnsnap.cn.freebsd.org/​doc/​zh_CN.GB2312/​books/​faq/​applications.html|中文 FAQ]]
 +
 +[[http://​cnsnap.cn.freebsd.org/​doc/​zh_CN.GB2312/​books/​handbook/​ports.html|中文手册]]
 +
 +[[http://​cnsnap.cn.freebsd.org/​doc/​zh_CN.GB2312/​books/​porters-handbook/​|中文 Porter 手册]]
 +
 +[[http://​www.freshports.org| FreshPorts]] 查看所有 ports 更新的站点
/data/vhosts/wiki-data/pages/faq/ports.txt · 最后更改: 2013/05/17 14:11 由 syh