FreeBSD 的 Ports 系统

目录php

什么是 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服务器,若是系统默认的地址你的访问速度也很快,能够不修改

#vi /etc/portsnap.conf

设置SERVERNAME=portsnap.cn.freebsd.org ,你能够设置相对你速度快点的服务器的地址

2.执行下面命令

 #portsnap fetch extract    这里直接下载ports而且解压

这样就完成了下载ports系统以及解压到/usr下面了

3.设置最快的ports镜像

用ports安装软件的时候,若是没有设置相对于你来讲最快的ports服务器地址,那就会默认的 <A class=urlextern title=ftp://ftp.freebsd.org/pub/FreeBSD/ports/distfiles/ href="ftp://ftp.freebsd.org/pub/FreeBSD/ports/distfiles/" rel=nofollow>ftp://ftp.freebsd.org/pub/FreeBSD/ports/distfiles/,这个地址对于不少地方来讲是很慢的。

修改 /etc/make.conf 加入如下代码

MASTER_SITE_OVERRIDE=\
ftp://ftp.freebsdchina.org/pub/FreeBSD/ports/distfiles/${DIST_SUBDIR}\
ftp://ftp.tw.freebsd.org/pub/FreeBSD/ports/distfiles/${DIST_SUBDIR}

若是你有最快的地址,能够加到上面去,下载就会块了

3 使用 csup/cvsup 安装/同步 Ports 系统

这种方法已经再也不推荐使用。

无论事先你有没有安装 Ports 系统,你均可以使用 csup/cvsup (推荐使用 csup,这是基本系统中本身带的)来安装/同步最新的 Ports 系统。把 /usr/share/examples/cvsup/ports-supfile 拷贝到一个地方(好比 /home/user/tmp/ports-supfile),而后做适当的修改(好比修改要链接的服务器)。最后使用以下命令来安装/同步:

csup -L 2 /home/user/tmp/ports-supfile

Ports 树的目录结构

假设你的 ports 树安装在默认位置 /usr/ports。

文件:

usrportsCHANGES usrportsCOPYRIGHT usrportsGIDs usrportsINDEX-xxx usrportsKNOBS usrportsLEGAL usrportsMOVED usrportsMakefile usrportsREADMEusrportsUIDs usrportsUPDATING

目录:

usrportsMk usrportsTemplates usrportsTools vardbports vardbpkg

除开以上文件和目录,其余全部的目录都是 ports。一个 port 的目录结构:

/usr/ports/分类/名称

好比 firefox 被分类在 www。所以 firefox 在 ports 树中的位置就是:

/usr/ports/www/firefox

使用 Ports 系统

1 查询

好比,你想知道 ports 中是否有 pidgin 这个软件,那么能够这样:

 usrports search =pidgin

一样也可使用

 usrports search =pidgin

用上面两种方法查询时,显示的信息比较详细,包括维护者、依赖包、主页等内容。若是只想显示所在的路径和软件名称,则能够用

 usrports quicksearch =php

这样可使显示的结果更清晰。

/usr/ports/README 中还有更多的例子能够参考。

2 安装

很是简单。好比你要安装 firefox,那么做为超级用户 root:

#cd /usr/ports/www/firefox#make install clean

3 卸载

要卸载 firefox 的话:

#cd /usr/ports/www/firefox#make deinstall clean

要卸载全部安装的ports:

#cd /var/db/pkg#pkg_delete *#reboot

4 升级

要升级 firefox:

#cd /usr/ports/www/firefox#make deinstall reinstall clean

5 定制 port

有时候,你会发现安装某个 port 的时候会有奇怪的事情发生。好比 editors/vim,安装的时候居然会自动安装 glib1 和 gtk1,而明明本身的系统上已经有了 glib2 和 gtk2。

这是由于有些 port 有不少不是默认的编译选项。这个时候你须要设定一些环境变量让 port 知道该怎么作。对于 editors/vim,你须要设定 WITH_GTK2 来让 vim 依赖 gtk2 而不是 gtk1。

你能够在 csh 下:

setenv WITH_GTK2

或者在 bash 下:

 =

也能够把这个选项写到 /etc/make.conf 里面:

=

或者你也能够指定在更新/安装某个 port 的时候使用特定的环境变量。添加以下代码(注:csh 的语法,不是 sh/bash)到 /etc/make.conf 里面:

.if 
  =.endif

这样下次升级 editors/vim 的时候就会自动依赖到 gtk2 而不是 gtk1 了。

相似的例子还包括 WITH_GECKO 环境变量。请阅读 ports/Mk/bsd.gecko.mk 来得到详细资料。

定制 Ports 系统

1 设定 Ports 树的位置

当你把 Ports 树放在非默认位置(/usr/ports)的时候,就须要修改一些环境变量让 Ports 中的工具知道你的修改。这个变量就是 PORTSDIR。好比,你把 Ports 树放在了 /opt/ports,那么 在 sh/bash 中,执行以下命令:

 =optports

在 csh 中,你须要执行以下命令:

setenv PORTSDIR /opt/ports

妥贴的办法是把这个环境变量放到超级用户 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,好比

export WRKDIRPREFIX=/opt/obj/portbld

这个时候 ports 系统就会到 /opt/obj/portbld/usr/ports/www/firefox/work 下编译 firefox。

Ports 管理工具

1 系统自带的工具

同步 ports

portsnap 是同步 ports 用的,前文已经做了介绍。
详细用法参照<A class=urlextern title=http://www.freebsd.org/doc/zh_CN.GB2312/books/handbook/ports-using.html href="http://www.freebsd.org/doc/zh_CN.GB2312/books/handbook/ports-using.html" rel=nofollow>这里(搜索“Portsnap 方式”)
为了方便,我在 csh 的配置文件里写入了以下 alias :

alias update-ports 'portsnap fetch update'

你们不妨参考一下。

维护 ports

  1. pkg_add

  2. pkg_create

  3. pkg_delete

  4. pkg_info

  5. pkg_updating

  6. pkg_version

注:
1.具体的用法请参考<A class=urlextern title=http://www.freebsd.org/doc/zh_CN.GB2312/books/handbook/ports.html href="http://www.freebsd.org/doc/zh_CN.GB2312/books/handbook/ports.html" rel=nofollow>手册中的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


这个工具能够用来删除用不着的软件,其做用至关于Gentoo的emerge –depclean,或者Debian的orphaner(deborphan这个包)
它首先列出全部不被其余软件所依赖的“叶子节点”,或者说“孤立的软件包”(这意味着删除它们不会影响依赖关系)。
而后你能够手动指定哪些软件是你不须要的,
选中执行[OK]后,它会进一步筛选“叶子节点”。
如此递归以后,它能够保证该软件及其(不被其余软件依赖的)依赖被完全清除。

  • pkg_cleanup


这个工具的做用和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 的规范。

相关连接

<A class=urlextern title=http://cnsnap.cn.freebsd.org/doc/zh_CN.GB2312/books/faq/applications.html href="http://cnsnap.cn.freebsd.org/doc/zh_CN.GB2312/books/faq/applications.html" rel=nofollow>中文 FAQ

<A class=urlextern title=http://cnsnap.cn.freebsd.org/doc/zh_CN.GB2312/books/handbook/ports.html href="http://cnsnap.cn.freebsd.org/doc/zh_CN.GB2312/books/handbook/ports.html" rel=nofollow>中文手册

<A class=urlextern title=http://cnsnap.cn.freebsd.org/doc/zh_CN.GB2312/books/porters-handbook/ href="http://cnsnap.cn.freebsd.org/doc/zh_CN.GB2312/books/porters-handbook/" rel=nofollow>中文 Porter 手册

<A class=urlextern title=http://www.freshports.org href="http://www.freshports.org/" rel=nofollow>FreshPorts 查看全部 ports 更新的站点

相关文章
相关标签/搜索