FreeBSD系统常用命令 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 deinstall 或 pkg_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.so。libintl.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/libtool13、devel/libtool14、devel/libtool15),说明这些版本互不兼容,必须保留。如果只有一个 port(如 devel/gettext),则说明三个版本是兼容的,可以只保留一个,修改其他依赖指向该版本并移除旧版。
make deinstall 与 pkg_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
游乐网为非赢利性网站,所展示的游戏/软件/文章内容均来自于互联网或第三方用户上传分享,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系youleyoucom@outlook.com。
同类文章
微软详解Win11时间点还原 默认每24小时创建恢复点
微软今日推送了最新的 6 月可选更新,并发布博客详细解读了 Win11 全新的“时间点还原”(Point-in-time restore)功能——这一功能本质上是对系统恢复体验的一次全面升级,旨在让用户更轻松地应对电脑故障。 微软表示,面向 Windows 11 客户端用户的“时间点还原”功能现已正
Win11 26H1六月可选更新KB5095091 优化放大镜改善装机体验
微软今天推送了Windows 11 26H1设备的6月可选更新KB5095091,安装完成后系统版本号会升级到Build 28000 2340。值得一提的是,这次更新并非面向所有设备,而是专门为搭载高通骁龙X2系列芯片的机型准备的——包括骁龙X2 Plus、X2 Elite和X2 Elite Ext
Win11六月可选更新KB5095093修复回收站弹窗异常
微软已悄然推送Windows 11六月可选更新,编号KB5095093。本次更新覆盖两个版本:24H2用户安装后版本号升级至Build 26100 8737,而25H2用户则更新至Build 26200 8737。 本次更新并非仅是小修小补,而是带来了多项实质性新功能。下面我们就来详细解析这些更新内
苹果macOS 27 Beta2封堵Siri AI跳过候补名单漏洞
科技媒体 Cult of Mac 昨日(6月23日)发布博文指出,苹果在 macOS 27 Beta 2 更新中悄然封堵了一个此前可用的后门——用户曾能通过一条终端命令绕过候补名单,直接启用新版 Siri AI,如今这一方法已失效。 简要回顾一下:在 macOS 27 Beta 1 阶段,只需在 M
微软加速Win11 25H2推送 覆盖所有符合条件家用PC
近日(6月23日),科技媒体 Windows Latest 发布了一则值得关注的动态:微软已进一步扩大 Windows 11 25H2 的推送范围,所有满足硬件要求、且不受 IT 部门管理的家庭版和专业版设备,现在均可顺利接收本次更新。 此次升级有一个显著特点——采用“启用包”(eKB)方式进行推送
- 日榜
- 周榜
- 月榜
相关攻略
2026-06-30 07:39
2026-06-30 07:39
2026-06-30 07:39
2026-06-30 07:38
2026-06-30 07:38
2026-06-30 07:38
2026-06-30 07:38
2026-06-30 07:38
热门教程
- 游戏攻略
- 安卓教程
- 苹果教程
- 电脑教程
热门话题

