游乐游手机版
首页/系统平台/文章详情

FreeBSD系统常用命令 ports从零开始使用方法详解教程

时间:2026-06-18 07:46
更新 INDEX 对照表 在 FreeBSD 4 x 系统中,INDEX 文件位于 usr ports INDEX,而在 5 x 版本中,路径为 usr ports INDEX-5。该 INDEX 实质上是一份记录所有 ports 依赖关系的对照表。如果长时间不进行更新,ports 的对查操作将

更新 INDEX 对照表

在 FreeBSD 4.x 系统中,INDEX 文件位于 /usr/ports/INDEX,而在 5.x 版本中,路径为 /usr/ports/INDEX-5。该 INDEX 实质上是一份记录所有 ports 依赖关系的对照表。如果长时间不进行更新,ports 的对查操作将会失败。官方会定期发布 INDEX 更新。如果你想手动完成这一过程,只需执行以下命令:

cd /usr/ports/
make fetchindex

更新 INDEX HTML

FreeBSD 提供了通过网页形式浏览 ports collection 的功能,你可以借助 lynx、w3m、links 等浏览器工具来查阅。生成所有 ports 的 HTML 文件同样非常简便:

cd /usr/ports/
make readmes

如果只想生成当前目录下的信息,或者仅更新某个特定分类(例如 /usr/ports/ftp/),可以这样操作:

cd /usr/ports/ftp/
make readme

这样只会更新 /usr/ports/ftp/ 目录下的信息,上级或下级目录均不会受到影响。执行成功后,对应的目录中会生成一个 README.html 文件。

更新 ports Mk

/usr/ports/Mk/ 是编译 ports 时使用的参考配置文件。有时 ports collection 更新速度很快,而 Mk 中的内容可能没有及时跟上。此时就需要手动更新 Mk:

cd /usr/src/
make update
cd /usr/src/share/mk
make install

用关键字在 ports 里搜索软件

如果你想在整个 ports collection 中搜索与关键字 “ldap” 相关的 ports,可以使用以下命令:

cd /usr/ports/
make search key=ldap | grep ^Path

如果只想在 ftp 相关的 ports 范围内搜索关键字 “ldap”,则执行:

cd /usr/ports/ftp/
make search key=ldap | grep ^Path

此外,还可以将 key 替换为 name。如果你已经知道想要搜索的 ports 名称,或者只关注名称中包含 “ldap” 的 ports,可以这样操作:

cd /usr/ports/
make search name=ldap | grep ^Path

同样,如需限定在 ftp 目录下:

cd /usr/ports/ftp/
make search name=ldap | grep ^Path

安装一个新的 port

如果系统上尚未安装某个软件,以 editors/joe 为例,安装方法如下:

cd /usr/ports/editors/joe/
make install

这会安装一个全新的 joe 软件。如果你想在安装完成后顺手清理编译过程中产生的临时目录,可以加上:

cd /usr/ports/editors/joe/
make clean

如何查看某个 port 提供的编译参数

每个 port 的编译参数都记录在其对应的 Makefile 中。例如,sysutils/portupgrade 的 Makefile 位于 /usr/ports/sysutils/portupgrade/Makefile。你可以直接打开该文件浏览可用的编译参数。假设 sysutils/portupgrade 提供了 NOPORTDOCS 参数,那么在安装时这样使用:

cd /usr/ports/sysutils/portupgrade/
make -DNOPORTDOCS install

或者 make NOPORTDOCS=yes install 效果相同。有些设计比较人性化的 port 会在安装前弹出参数选择菜单,但大多数 port 并没有这个功能,因此你需要自行搜索可编译的参数。这里有一个实用的小技巧:

cd /usr/ports/sysutils/portupgrade/
grep defined Makefile

这样几乎能列出所有可用的编译参数,虽然偶尔会夹杂一些不相关的信息,但总体上仍然是一个不错的参考方式。

安装前查询依赖/相关套件

在安装某个 port 之前,可以先了解一下它需要哪些依赖。以 mail/p5-Mail-SpamAssassin 为例:

cd /usr/ports/mail/p5-Mail-SpamAssassin/
make all-depends-list                # 显示所有相关套件
make pretty-print-build-depends-list # 显示编译期间需要的套件
make pretty-print-run-depends-list   # 显示运行时需要的套件

手动加入编译参数

在 ports collection 提供的前提下,有时并不是所有该软件支持的参数都被收录了,这时就需要手动添加参数。例如,对于 ftp/pu re-ftpd,如果你不希望将 inetd 支持编译进去,但 ports collection 中没有提供这个选项,可以这样操作:

cd /usr/ports/ftp/pu re-ftpd/
make CONFIGURE_ARGS+="--without-inetd" install

指定安装路径

ports 默认的安装路径是 /usr/local/,如果你想调整到其他位置,可以手动指定 PREFIX。以 editors/joe 为例:

cd /usr/ports/editors/joe/
make PREFIX=/usr install

这样 joe 就会安装到 /usr 目录下,而不是默认的 /usr/local

只下载源码包

cd /usr/ports/editors/joe/
make fetch

默认情况下,joe 的源码包会被下载到 /usr/ports/distfiles/ 目录下。

下载一个 port 及其所有依赖的源码包

cd /usr/ports/systuils/portupgrade/
make fetch-recursive

这样会将该 port 本身以及所有依赖的源码包都下载到 /usr/ports/distfiles/ 目录里。

下载所有 ports 的源码包

cd /usr/ports/
make fetch

这条命令会下载全部 ports 的源码包到 /usr/ports/distfiles/ 目录。如果只想下载 ftp 分类下的所有 ports:

cd /usr/ports/ftp/
make fetch

下载并解包

cd /usr/ports/editors/joe/
make extract

这会将源码包解压到 /usr/ports/editors/joe/work/ 目录下。

解包并打上官方补丁

cd /usr/ports/editors/joe/
make patch

这个操作会先进行解包,然后打上官方提供的补丁,处理后的文件同样位于 work/ 目录下。

批量清理所有 ports 的临时文件

只需回到 ports 根目录执行:

cd /usr/ports/
make clean

安装新 port 并打包

将安装好的软件打包成 package 有很多好处:在集群环境中可以分发给其他机器,或者将来软件出现问题时可以快速重新安装。以 editors/joe 为例:

cd /usr/ports/editors/joe/
make package

这样会安装 joe,并在 /usr/ports/editors/joe/ 目录下生成 package。如果想集中管理,建议先建立一个目录:

mkdir -p /usr/ports/packages/All/

之后打包的 package 都会存放在这里,系统还会自动进行分类,方便管理。如果希望在安装完成后清理临时文件,可以使用:

cd /usr/ports/editors/joe/
make package clean

打包一个 port 及其所有依赖

如果某个 port 依赖了其他 ports,打包时最好将这些依赖也一起打包,否则安装时可能会缺少依赖。以 sysutils/portupgrade 为例:

cd /usr/ports/sysutils/portupgrade/
make DEPENDS_TARGET=package package

这样会对 portupgrade 及其所有依赖的 ports 都进行打包。

对已安装的 port 打包

如果安装完某个软件之后才想起要打包,可以使用 pkg_create。以 editors/joe 为例:

cd /var/db/pkg/
pkg_create -b joe-{版本号}

这样会在 /var/db/pkg/ 目录下生成一个 package。

清理编译期间的临时文件

安装完一个 port 后,通常建议清理 work 目录以释放磁盘空间。以 editors/joe 为例:

cd /usr/ports/editors/joe/
make clean

如果想清理所有 ports 的临时文件:

cd /usr/ports/
make clean

或者只清理 ftp 分类下的:

cd /usr/ports/ftp/
make clean

同时清理临时文件和源码包

make clean 只删除 work 目录,但不会删除下载的源码包(默认存放在 /usr/ports/distfiles/)。如果想连源码包一起删掉,可以使用 make distclean。以 editors/joe 为例:

cd /usr/ports/editors/joe/
make distclean

这条命令已经包含了 make clean 的功能。全局清理:

cd /usr/ports/
make distclean

只清理 ftp 分类:

cd /usr/ports/ftp/
make distclean

移除已安装的 port

可以使用 make deinstallpkg_delete。以 editors/joe 为例:

cd /usr/ports/editors/joe/
make deinstall

或者:

cd /var/db/pkg/
pkg_delete joe-{版本号}

有时因为依赖关系导致无法直接删除,可以强制删除:

cd /var/db/pkg/
pkg_delete -f joe-{版本号}

但请注意,强制删除可能导致其他套件运行异常。

一并移除依赖的 ports

sysutils/portupgrade 为例:

cd /usr/ports/sysutils/portupgrade/
make deinstall-depends

执行前请确认不会误删需要保留的套件。或者使用 pkg_delete

cd /var/db/pkg/
pkg_delete -r portupgrade-{版本号}

重新安装已安装过的 port

editors/joe 为例:

cd /usr/ports/editors/joe/
make deinstall
make clean
make install   # 或者 make reinstall

升级已安装的 port

如果要升级,可以先移除旧版本,再安装新版本。以 editors/joe 为例:

cd /var/db/pkg/
pkg_delete joe-{版本号}
cd /usr/ports/editors/joe/
make install

或者使用 make reinstall 一步到位:

cd /usr/ports/editors/joe/
make clean
make reinstall

安装旧版本的 port

有时新版存在问题,或者因为依赖关系需要安装旧版本。可以利用 CVS 回退到某个日期的版本。首先需要知道该 port 的版本对应的日期,可以通过 FreshPorts、FreeBSD 的邮件列表或 cvsweb 查询。查到日期后,修改 /usr/share/examples/cvsup/ports-supfile 中的 default date。例如回退到 2002年10月5日:

vi /usr/share/examples/cvsup/ports-supfile
# 把 date 改为 2002.10.05.00.00.00

然后照常执行 CVSup(make update),此时 ports collection 就会退回到那个日期,继续安装即可。

如果只想回退某个分类下的 ports,比如 lang/perl5.8,需要注释掉 ports-all,只保留 ports-lang

vi /usr/share/examples/cvsup/ports-supfile
# ports-all  # 注释掉
ports-lang   # 加入这行

然后执行 CVSup 并安装。目前单独回退单个 port 的步骤较为繁琐。

安装 ports 时出现 FORCE_PKG_REGISTER 错误

问题描述: 当先前已经通过 ports 安装过某个软件,再次安装同一软件时,可能会遇到如下错误:

===> An older version of PORTS資料夾位置 is already installed (軟體版本)
You may wish to ``make deinstall'' and install this port again
by ``make reinstall'' to upgrade it properly.
If you really wish to overwrite the old port of PORTS資料夾位置
without deleting it first, set the variable "FORCE_PKG_REGISTER"
in your environment or the "make install" command line.

解决方法:make install 时加上 FORCE_PKG_REGISTER="yes" 即可强制覆盖安装:

cd /usr/ports/資料夾位置/
make install FORCE_PKG_REGISTER="yes"

解决安装 ports 时出现 sed -i 的错误

BSD 自带的 sed 与某些 ports 编译时使用的 sed 语法不一致,可能导致错误。此时可以先安装 sed_inplace(位于 textproc/sed_inplace),然后重新安装原先失败的 port:

cd /usr/ports/???/???/
make -DUSE_REINPLACE install

安装 ports 时出现 Shared object libintl.so.X not found 错误

问题描述: 在近期版本的 FreeBSD 中,安装某些软件时可能会提示:

Shared object "libintl.so.4" not found
Shared object "libc.so.4" not found

问题分析: libc.so 是 Linux 相关的共享库,FreeBSD 会优先查找 /compat/linux/lib/libc.so,再查找 /lib/libc.solibintl.so 函数由 /usr/port/devel/gettext/ 提供。当前版本为 libintl.so.5,但一些旧程序(如 gmake)在安装时链接的是旧版本 libintl.so.4。当你更新了 devel/gettext 后,新版本 libintl.so.5 会取代旧版 libintl.so.4,从而导致安装失败。许多程序都依赖于 gettext 函数。

解决方法:

  • 重新建立所有与 gettext 相关的 ports:portupgrade -fr gettext
  • 或者采用“偷吃步”方法——将当前版本的库文件链接过去(例如 ln -s libintl.so.5 libintl.so.4),然后继续安装。

针对某些 ports 不做 CVSup

如果 ports 下的某些分类完全用不上,可以在 CVSup 时跳过它们,以节省带宽和时间。编辑 /usr/sup/refuse 文件,加入要跳过的目录:

vi /usr/sup/refuse
ports/french
ports/german
ports/hebrew
ports/hungarian
ports/japanese

这样上述目录下的内容就不会更新。如果只想跳过某个单一的 ports(例如 ports/lang/perl5.8 保留旧版),同样在 refuse 文件中指定:

ports/lang/perl5.8

支持通配符:

ports/lang/perl*
ports/po*

安装 ports 时出现 port is outdated 错误

例如安装 imap-uw 时提示:

Your installation of the cclient port is outdated. Please delete it before continuing.

这说明依赖的 cclient 版本过旧,需要先升级它。执行:

cd /usr/ports/mail/cclient/
make reinstall   # 或者 make deinstall && make install
cd /usr/ports/mail/imap-uw/
make install

安装 ports 时出现 OpenSSL vulnerabilities 错误

当安装的套件依赖 OpenSSL,而系统使用的 OpenSSL 版本存在已知漏洞时,会出现类似警告。有两种解决方法:

  • 升级系统(包括内建 OpenSSL):先确认当前版本 openssl version -v,然后参照系统升级指南进行升级,完成后重新安装该套件。
  • 让套件依赖 ports tree 中的 OpenSSL:安装时加上 WITH_OPENSSL_PORT 参数,这样会使用 ports tree 中较新的 OpenSSL 版本,而不是系统内建的版本。
make -DWITH_OPENSSL_PORT install

不推荐使用 WITH_OPENSSL_BASE,因为那样会继续依赖可能存在漏洞的系统 OpenSSL。

安装 ports 时清单选项不见了

系统会记录之前安装时选择的选项,有时重装时就不会再弹出菜单。如果需要重新显示菜单,可以:

make clean
make showconfig   # 显示当前设定
make rmconfig     # 清除设定
make config       # 重新进入配置界面

之前设定的选项会保存在 /var/db/ports/{ports_name}/options 中,例如查看 python 的选项:

cat /var/db/ports/python/options

检查是否安装了重复的 ports/packages

随着时间推移,不同版本的同名软件可能会被多次安装。虽然有些情况是正常的(例如新旧版本不兼容,同时存在是必须的),但多数情况下应清理旧版本。检查是否存在重复安装的方法:

pkg_info | sort | sed -e 's/-[0-9].*$//' | uniq -c | grep -v '^[[]]*1'

如果出现类似 3 libtool 的输出,表示系统中有三个不同版本的 libtool。接下来需要检查它们是否兼容:

cd /usr/ports/
make search name=libtool

如果找到多个对应的 ports(如 devel/libtool13devel/libtool14devel/libtool15),说明这些版本互不兼容,必须保留。如果只有一个 port(如 devel/gettext),则说明三个版本是兼容的,可以只保留一个,修改其他依赖指向该版本并移除旧版。

make deinstallpkg_delete 有什么区别

简单来说,make deinstall 直接移除该 port,不检查依赖关系。而 pkg_delete 在移除前会检查依赖,并且支持通配符,例如删除所有以 p 开头的 ports:

cd /var/db/pkg/
pkg_delete p*

使用 make deinstall 时,最好确保系统当前安装的版本与 ports collection 中的版本一致,否则可能出错。pkg_delete 直接操作已安装的版本,因此没有这个问题。换句话说,当版本匹配时两者都可以使用,不匹配时最好选用 pkg_delete

安装 ports 时出现 local modification time does not match remote 错误

这说明 /usr/ports/distfiles 中已经存在一个同名文件,但该文件不是当前 ports collection 所期望的版本。解决方法:删除该文件,重新下载。以 joe 为例:

cd /usr/ports/editors/joe/
make distclean   # 这会删除对应的源码包和临时文件
# 然后重新安装即可

如何将已安装的软件及其依赖做成 packages

如果你已经安装了某个软件(例如 xorg),想把它和所有依赖打包成 package,可以使用:

make package-recursive

但前提是之前没有单独安装过其中的某个包,否则可能出现问题(这算是一个小 bug,暂时没有完美解决方案)。

在 FreeBSD 上模拟 Linux 环境

完整资料请参考官方 Handbook。简单来说,需要:FreeBSD 内核支持、安装 Linux Runtime Libraries,然后进行一些配置。

要执行 Linux ELF 二进制文件,先检查当前 FreeBSD 是否已支持 Linux ELF:

brandelf -l

查看输出中是否包含 “Linux” 字样。如果没有,请回头检查前面的步骤。然后检查具体文件是否为 Linux ELF 格式:

brandelf execution-binary-filename

如果结果是 Linux ELF,直接执行即可。如果不是,但你确定它应该是,可以手动修正 ELF 格式:

brandelf -t Linux execution-binary-filename

再次确认即可。

在 FreeBSD 上安装 Linux rpm

前提是已经成功模拟 Linux 环境。安装 rpm 的命令:

rpm --ignoreos --root /compat/linux --dbpath /var/lib/rpm/ -Uvh xxx.rpm
来源:https://www.jb51.net/os/Unix/1479.html
上一篇OpenBSD 4.1 Apache+MySQL+PHP环境配置 下一篇Linux和FreeBSD系统下U盘使用完整步骤详解与常见问题解决
本站内容用于信息整理与展示,如有侵权或内容问题请及时联系处理。

相关推荐

补充同频道和同主题内容,方便继续浏览更多相关内容。

同类最新

继续查看同栏目最近更新的文章。

更多
微软详解Win11时间点还原 默认每24小时创建恢复点
系统平台 · 2026-06-30

微软详解Win11时间点还原 默认每24小时创建恢复点

微软今日推送了最新的 6 月可选更新,并发布博客详细解读了 Win11 全新的“时间点还原”(Point-in-time restore)功能——这一功能本质上是对系统恢复体验的一次全面升级,旨在让用户更轻松地应对电脑故障。 微软表示,面向 Windows 11 客户端用户的“时间点还原”功能现已正

Win11 26H1六月可选更新KB5095091 优化放大镜改善装机体验
系统平台 · 2026-06-30

Win11 26H1六月可选更新KB5095091 优化放大镜改善装机体验

微软今天推送了Windows 11 26H1设备的6月可选更新KB5095091,安装完成后系统版本号会升级到Build 28000 2340。值得一提的是,这次更新并非面向所有设备,而是专门为搭载高通骁龙X2系列芯片的机型准备的——包括骁龙X2 Plus、X2 Elite和X2 Elite Ext

Win11六月可选更新KB5095093修复回收站弹窗异常
系统平台 · 2026-06-30

Win11六月可选更新KB5095093修复回收站弹窗异常

微软已悄然推送Windows 11六月可选更新,编号KB5095093。本次更新覆盖两个版本:24H2用户安装后版本号升级至Build 26100 8737,而25H2用户则更新至Build 26200 8737。 本次更新并非仅是小修小补,而是带来了多项实质性新功能。下面我们就来详细解析这些更新内

苹果macOS 27 Beta2封堵Siri AI跳过候补名单漏洞
系统平台 · 2026-06-30

苹果macOS 27 Beta2封堵Siri AI跳过候补名单漏洞

科技媒体 Cult of Mac 昨日(6月23日)发布博文指出,苹果在 macOS 27 Beta 2 更新中悄然封堵了一个此前可用的后门——用户曾能通过一条终端命令绕过候补名单,直接启用新版 Siri AI,如今这一方法已失效。 简要回顾一下:在 macOS 27 Beta 1 阶段,只需在 M

微软加速Win11 25H2推送 覆盖所有符合条件家用PC
系统平台 · 2026-06-30

微软加速Win11 25H2推送 覆盖所有符合条件家用PC

近日(6月23日),科技媒体 Windows Latest 发布了一则值得关注的动态:微软已进一步扩大 Windows 11 25H2 的推送范围,所有满足硬件要求、且不受 IT 部门管理的家庭版和专业版设备,现在均可顺利接收本次更新。 此次升级有一个显著特点——采用“启用包”(eKB)方式进行推送