FreeBSD Ports系统深入解析

发布时间:2020-03-24编辑:脚本学堂
本文介绍了Freebsd的ports系统的相关知识,一个 port 就是一个被移植到了 FreeBSD 上的软件,每一个被移植到 FreeBSD 上的软件(就是 Port),都能通过 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服务器,如果系统默认的地址你的访问速度也很快,可以不修改
#vi /etc/portsnap.conf
设置SERVERNAME=portsnap.cn.freebsd.org
可以设置相对你速度快点的服务器的地址

2,执行命令
#portsnap fetch extract    这里直接下载ports并且解压

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

3.设置最快的ports镜像

用ports安装软件的时候,如果没有设置相对于你来说最快的ports服务器地址,那就会默认的 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。

文件:
 

/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 树的更新记录以及建议。

目录:
 

/usr/ports/Mk # 编译 port 需要的 Makefile 集合。
/usr/ports/Templates # 一些模板。
/usr/ports/Tools # 一些工具。

除开以上文件和目录,其他所有的目录都是 ports。一个 port 的目录结构:

/usr/ports/分类/名称

比如 firefox 被分类在 www。因此 firefox 在 ports 树中的位置就是:

/usr/ports/www/firefox

使用 Ports 系统
1 查询
比如,你想知道 ports 中是否有 pidgin 这个软件,那么可以这样:
 

复制代码 代码示例:
$cd /usr/ports
$make search key=pidgin

同样也可以使用
 

复制代码 代码示例:
$cd /usr/ports
$make search name=pidgin

/usr/ports/README 中还有更多的例子可以参考。
2 安装

非常简单。比如你要安装 firefox,那么作为超级用户 root:
 

复制代码 代码示例:
#cd /usr/ports/www/firefox
#make install clean

3 卸载
要卸载 firefox 的话:
 

复制代码 代码示例:
#cd /usr/ports/www/firefox
#make deinstall clean

4 升级
要升级 firefox:
 

复制代码 代码示例:
#cd /usr/ports/www/firefox
#make deinstall reinstall clean

定制 Ports 系统
1 自己设定 Ports 树的位置

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

复制代码 代码示例:
export PORTSDIR=/opt/ports

在 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。你可以根据上面的例子来设定这个环境变量。
常用的 Ports 管理工具
portsnap

这是推荐的升级 Ports 系统树的工具。
portupgrade

相当好用的升级 Ports 中软件的 Ruby 工具。支持从源码/包升级。
pkg 工具

FreeBSD 基本系统中自带的包管理工具。方便实用。都是 pkg_* 类型的系统命令,比如 pkg_add, pkg_delete 之类的。

通过PORTS安装软件的几个常用命令
1.怎样找到我想安装的包路径:
 

复制代码 代码示例:
# cd /usr/ports
# make search name=mysql

2.仅仅下载源码包,而不安装:
 

复制代码 代码示例:
# cd /usr/ports/directory
# make fetch

3.预先知道需要那些包,才能安装这个软件:
 

复制代码 代码示例:
# cd /usr/ports/directory
# make fetch-list

4.把软件装到指定的目录:
 

复制代码 代码示例:
# cd /usr/ports/directory
# make PREFIX=/usr install

5.仅仅下载包,解包,而不安装:
 

复制代码 代码示例:
# cd /usr/ports/directory
# make extract

6.用PORTS制作一个定制二进制包:
 

复制代码 代码示例:
# cd /usr/ports/somewhere/frobble
# make extract
# cd work/frobble-2.8
[Apply your patches]
# cd ../..
# make package

7.强制安装:
 

复制代码 代码示例:
# make install FORCE_PKG_REGISTER=yes clean

8.初始化一个port
 

复制代码 代码示例:
# cd /usr/ports/directory
# make rmconfig
# make config

新手必杀技ports命令
 

复制代码 代码示例:
cd /usr/ports
make deinstall

#删除所有软件,我刚用freebsd三个月的时候老使这个,删了安接着删.....费时费力哦,不推荐
 

复制代码 代码示例:
cvsup -g -L 2 -h cvsup.tw.freebsd.org /usr/share/examples/cvsup/ports-supfile
cd /usr/ports
make fetchindex

#别忘了使用ports安装软件前要升级ports系统啊,我现在天天用上边命令的脚本
#要是你没装cvsup,那就去装:
 

复制代码 代码示例:

cd /usr/ports/net/cvsup-without-gui/ && make install

cd /usr/ports/sysutils/portupgrade
make install
 

#安装这个软件是新手省事而又带来新麻烦的好东西,尽管会带来一些新麻烦,但是还是推荐毕竟麻烦数量少了很多

rm -r /usr/ports
#损招、阴招,现在想不起来当初为什么要用这个命令,不推荐啊不推荐~~
#你要是用了找不到ports了,简单再用cvsup -g -L 2 -h cvsup.tw.freebsd.org /usr/share/examples/cvsup/ports-supfile命令就行了,费时费力

pkgdb -F
portversion | grep "<"
portupgrade -a
#安装了portupgrade套件之后可以使用的命令,好用啊推荐

pkg_info
#看看你都装什么软件了

portsclean -C
#不明原因就是编译不过八成因为这个,平常也请多用,能清理ports内的临时文件
#安装portupgrade套件之后才能使用
新手必杀技ports命令
cd /usr/ports
make deinstall
#删除所有软件,我刚用freebsd三个月的时候老使这个,删了安接着删.....费时费力哦,不推荐

cvsup -g -L 2 -h cvsup.tw.freebsd.org /usr/share/examples/cvsup/ports-supfile
cd /usr/ports
make fetchindex
#别忘了使用ports安装软件前要升级ports系统啊,我现在天天用上边命令的脚本
#要是你没装cvsup,那就去装cd /usr/ports/net/cvsup-without-gui/ && make install

cd /usr/ports/sysutils/portupgrade
make install
#安装这个软件是新手省事而又带来新麻烦的好东西,尽管会带来一些新麻烦,但是还是推荐毕竟麻烦数量少了很多

rm -r /usr/ports
#损招、阴招,现在想不起来当初为什么要用这个命令,不推荐啊不推荐~~
#你要是用了找不到ports了,简单再用cvsup -g -L 2 -h cvsup.tw.freebsd.org /usr/share/examples/cvsup/ports-supfile命令就行了,费时费力

pkgdb -F
portversion | grep "<"
portupgrade -a
#安装了portupgrade套件之后可以使用的命令,好用啊推荐

pkg_info
#看看你都装什么软件了

portsclean -C
#不明原因就是编译不过八成因为这个,平常也请多用,能清理ports内的临时文件
#安装portupgrade套件之后才能使用