FreeBSD应用系统的组成
FreeBSD应用系统,简单来说,是由FreeBSD操作系统内核及其基本系统,再加上移植到FreeBSD上的大量应用软件共同构成的。操作系统部分进一步分为内核和基本系统——基本系统包含了系统工具、系统库函数以及配套文档。如果选择最小化安装,系统会安装内核、系统工具和系统库,这些组件足以完成日常系统管理与基础编译任务。而文档、源代码和ports系统则作为可选安装项。如果执行完整安装,则内核、系统管理工具、系统库、编译程序、系统源代码、ports,以及man、info、FreeBSD手册等文档,都会完整提供。
FreeBSD的扩展目标远不止于此。为了拓宽应用边界,它移植了大量自由软件与开源软件,并专门设计了ports系统来统一管理这些移植过来的软件。这些移植工作,本质上大多是基于源代码进行修改和适配,确保它们能在FreeBSD环境下稳定运行。因此,ports中存放的并非完整的软件包,而是代码补丁、编译控制脚本以及FreeBSD特有的程序管理策略。
ports的组成
一个软件的ports,通常由以下几个核心部分组成:
- pkg-descr — 提供软件简介与基本说明
- pkg-plist — 安装时生成的文件列表清单
- distinfo — 源代码的名称、版本以及校验信息
- Makefile — 控制软件编译过程的makefile文件
- files目录 — 存放对源代码进行修改的各种补丁文件
利用port安装软件异常简便,这得益于ports系统的精心架构。大量繁琐的操作定义被统一放置在 /usr/ports/mk 目录下的文件中,例如变量定义、编译选项、文件下载地址、编译工具以及操作流程的声明。具体某个软件port里的Makefile会继承这些系统级定义,并可根据实际需要进行调整。此外,每个port的Makefile还会声明软件运行时的依赖关系、编译时的依赖关系,以及对源代码编译过程的详细细节定义。
利用ports进行软件安装的过程
简单来说,一条命令即可完成全部安装:
make install clean
但背后实际上是一整套严谨的自动化流程,下面我们逐步展开:
- 首先,根据
distinfo中的信息,检查/usr/ports/distfiles目录下是否存在对应的源代码包。如果没有,则调用make fetch,从Makefile指定的地址下载。 - 下载完成后,调用
make checksum,利用distinfo中的校验信息验证源代码包的完整性。 - 如果校验无误,调用
make extract,将源代码解压到当前port目录下的work子目录中,具体路径为软件port当前路径/work/源代码文件名去掉.gz.bz2/。 - 解压之后,调用
make patch,搜索files目录中的补丁文件,对源代码应用补丁。 - 补丁应用完成后,根据Makefile中定义的运行时依赖关系,检查系统中是否已安装对应的软件。若缺少依赖,ports系统会自动跳转到该依赖软件的port目录,执行
make install clean。假设所有依赖均已就绪,ports系统会进入源代码目录,运行其中的configure脚本,生成makefile,然后进行编译与链接。 - 编译结束后,执行
make install进行安装。 - 安装完成后,利用
pkg-descr和pkg-plist中的内容,在/var/db/pkg目录下对软件进行注册——标记该软件已安装,并详细记录安装的文件列表。 - 注册成功后,ports系统调用
make clean清理当前port目录下的work子目录。如果在编译安装过程中同时处理了其他依赖软件,也会进行回溯清理。
packages软件安装和管理
packages,即预编译并封装好的应用软件二进制包,是FreeBSD基于ports系统预先生成的二进制软件包。实际上,它们是通过FreeBSD的硬件资源,使用 make package 命令打包而成的。这些package存放在 ftp.freebsd.org 服务器上,既可以直接远程下载安装,也可以下载到本地后再进行安装。
以FreeBSD 7.0 release为例,其二进制包的网络地址为:
ftp://ftp.freebsd.org/pub/FreeBS ... ckages-7.0-release/
该目录下有两个关键文件夹:All 和 Latest(注意首字母大写)。All 目录中存放的是真正编译好的二进制包,例如 mysql51-server-5.1.22.tbz,包名源自其ports名称,版本号也由ports根据源代码版本定义。Latest 目录中的文件实际上是All目录下二进制包的软链接,去掉了版本号,比如对 mysql51-server-5.1.22.tbz 的软链接是 mysql51-server.tbz。这样,远程安装时无需关心版本号。这两个目录的创建与维护也由ports系统自动完成,无需人工干预。
FreeBSD的系统管理工具提供了对packages的维护功能:
软件安装
远程软件安装: pkg_add -r 软件包名称。例如 pkg_add -r mysql51-server,pkg_add -r xorg,pkg_add -r kde。系统会自动到上述ftp服务器的 Latest 目录中查找 mysql51-server.tbz、xorg.tbz、kde.tbz。不过需要注意的是:FreeBSD的ftp服务器并不保证所有移植过来的软件都有二进制包——尤其是stable分支,有些是因为ports本身存在问题无法打包,有些正在修订中,还有一些受协议限制只允许源代码发布,禁止打包。
本地软件安装: pkg_add 软件包文件名。这种方式需要事先从All目录下载好二进制包,这样可以避免安装时因版本号缺失而找不到依赖。
一个实用的建议: 推荐使用 pkg_add -r -K 命令。它的作用是远程下载、安装,并将下载的二进制包保存在 PKGDIR 定义的目录中。PKGDIR 的默认值为 /usr/ports/packages/。这样一来,日后重装或离线安装时,可以直接使用本地缓存,省时省力。
