文档章节

FreeBSD 的 Ports 系统

墨梅
 墨梅
发布于 2014/01/16 10:08
字数 3261
阅读 94
收藏 2

目录

什么是 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、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 更新的站点

本文转载自:https://wiki.freebsdchina.org/faq/ports

墨梅
粉丝 16
博文 218
码字总数 43367
作品 0
杭州
后端工程师
私信 提问
DragonFly BSD 4.0.6 发布,BSD 系统

DragonFly BSD 4.0.6 发布,此版本支持 Haswell 图形(i915),3D 加速;支持 256 CPUs;pf 操作并发;支持其他各种设备;提升极高流量网络性能;OpenSSL更新至 1.0.1n。详细改进请看发行说明,...

oschina
2015/06/14
896
0
DragonFly BSD 4.0.2 发布,BSD 系统

DragonFly 4.0.2 发布,DragonFly 4 支持 Haswell 图形和 3D 加速;改进了在极高网络流量的性能。DragonFly 现在支持 256 CPUs,Haswell 图形 (i915),操作兵法和各种其他设备。DragonFly 4...

oschina
2015/01/11
1K
4
BSD 家族,第一部分:FreeBSD 9.1

自从第一次索要FreeBSD 4.4获得4张CD后我就是FreeBSD的粉丝了。那时,我已经在Linux上花了很多时间,但它的不稳定性和不一致性让我离开了它。当我装上FreeBSD后,它感觉就像梦一样。一切都按...

oschina
2013/09/26
1K
1
cvsup配置文件使用详细介绍

下面详细说下cvsup的配置文件的各个选项的含义: 我想以下文件是大家一般都能看到的.注¥¥¥¥¥里的部分为注释 cat -n cvs-supfile 1 # $FreeBSD: src/share/examples/cvsup/cvs-supfile,...

绿悠悠
2010/01/03
350
0
FreeBSD 2018 最新报告:性能提升,更好的硬件支持

FreeBSD 项目的最新状态报告是 2018年1月至 9 月。报告涵盖了今天发布项目的大部分信息,不包括 Q4 季度,本月早写时候发布的 FreeBSD 12.0 也包括在这份报告中。 对于 FreeBSD 来说,今年是...

程六金
2018/12/26
2.4K
10

没有更多内容

加载失败,请刷新页面

加载更多

springboot2.0 maven打包分离lib,resources

springboot将工程打包成jar包后,会出现获取classpath下的文件出现测试环境正常而生产环境文件找不到的问题,这是因为 1、在调试过程中,文件是真实存在于磁盘的某个目录。此时通过获取文件路...

陈俊凯
今天
5
0
BootStrap

一、BootStrap 简洁、直观、强悍的前端开发框架,让web开发更加迅速、简单 中文镜像网站:http://www.bootcss.com 用于开发响应式布局、移动设备优先的WEB项目 1、使用boot 创建文件夹,在文...

wytao1995
今天
9
0
小知识:讲述Linux命令别名与资源文件的区别

别名 别名是命令的快捷方式。为那些需要经常执行,但需要很长时间输入的长命令创建快捷方式很有用。语法是: alias ppp='ping www.baidu.com' 它们并不总是用来缩短长命令。重要的是,你将它...

老孟的Linux私房菜
今天
8
0
《JAVA核心知识》学习笔记(6. Spring 原理)-5

它是一个全面的、企业应用开发一站式的解决方案,贯穿表现层、业务层、持久层。但是 Spring 仍然可以和其他的框架无缝整合。 6.1.1. Spring 特点 6.1.1.1. 轻量级 6.1.1.2. 控制反转 6.1.1....

Shingfi
今天
7
0
Excel导入数据库数据+Excel导入网页数据【实时追踪】

1.Excel导入数据库数据:数据选项卡------>导入数据 2.Excel导入网页数据【实时追踪】:

东方墨天
今天
10
1

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部