更新时间:2024-10-30 09:32
PKGSRC在NetBSD系统以及其他UNIX-Like系统中构建第三方软件的框架。
pkgsrc: The NetBSD Packages Collection
The NetBSD Packages Collection (pkgsrc) 是在NetBSD系统以及其他UNIX-Like系统中构建第三方软件的一个框架。现在包含了7300多个软件包。在所支持的平台上,它使得自由的配置软件成为可能,并切极易构建。
首先,pkgsrc 是一个基于源码的软件包管理系统。在 Unix/Linux 社区中,软件包的 source vs binary 争论一直没有停息过,但有一点共识,基于源码的软件包管理系统会给用户更多的控制权力,基于二进制的软件包系统则更容易使用。pkgsrc 也可以提供二进制的软件包,但它的优势不在于此,所以这篇文章只专注在使用源码编译软件包方面。
pkgsrc 使用的是 BSD 许可证,与其他的自由软件许可证相比,较为宽松。而且,pkgsrc 实际上分发的是软件包的 patch,不会与许多软件的授权许可冲突,避免了二进制软件包和直接分发源码包形式下的种种限制。因此,用户可以广泛地使用大量的优秀软件。例如,在许多自由软件包管理系统中无法包含的 java, mplayer, acrobat reader, opera 这些优秀软件,用户必须自己动手下载安装,但在 pkgsrc 仍可以通过软件包管理系统工具进行安装。
如果你是属于喜欢频繁地更新尝试各种软件的用户,并且主要工作在大型的桌面环境下,那么采用 pkgsrc 来管理和更新软件,的确是一件痛苦的事情。比如,当一个 gnome 下的基础组件升级时,经常会牵一发而动全身,需要更新整个 gnome 套件。
如果你是一个系统管理员,需要一个稳定安全的服务器,对 apache 这类软件的安装,既希望能自己设置编译成符合自己要求的系统,又能避免时刻监视安全通报和手动下载源码与打补丁,pkgsrc 正好符合你的要求,它可以帮助你轻松地维护系统,在编译时给你调节系统所需的足够的灵活性,让你定制一套符合自己要求的服务器。
如果你是一个软件开发人员,需要参考借鉴自由软件源码,经常到处搜寻代码范例。由于 pkgsrc 已经按照功能对数千套自由软件进行了分类,可以让你方便地找到和下载自由软件的源码。另外,在软件的编译安装过程中,你可以同时学习到成熟软件所采用的项目管理方法。
pkgsrc 可以广泛地应用到 Unix/Linux 系统上,现在 NetBSD、 DragonFly BSD 和 FreeDarwin 是正式采用它作为自己软件包管理的系统,SUN 也推荐在 Solaris 上面使用 pkgsrc 来安装第三方的软件。对于其他只提供 base 和使用二进制软件包管理系统的 GNU/Linux 发行版,也都可以使用 pkgsrc。
pkgsrc 一共有三个分支,HEAD、pkgsrc-yyyyQqq 季度分支和 pkgsrc-wip,前两个是 pkgsrc 项目组正式维护的分支。在 HEAD 分支,维护者提交软件的最新稳定版,这些软件绝大多数都可以正常使用,但也可能会有一些错误。到每一季度末,pkgsrc 会将 HEAD 的内容放入季度分支,并冻结两周时间,供维护人员测试修正。解冻之后,它们就成为最新的稳定版本,然后通过 bulk build 生成二进制的软件包。pkgsrc-wip 是一个新软件包试验的场所,并不保证它的可用性和稳定性。当一个软件包在 pkgsrc-wip 里面证明成熟稳定,并有人愿意维护,就会被提交到 HEAD 分支里面。
pkgsrc 使用 cvs 进行维护,你可以通过 cvs 方式下载整个 pkgsrc 源码树。但对于首次使用 pkgsrc,下载压缩包,是一种更方便快捷的方式。
从 ftp://ftp netbsd org/pub/NetBSD/packages/pkgsrc.tar.gz 或其他镜像服务器下载压缩包,然后解压到 /usr 目录,默认建立 /usr/pkgsrc。
对于 NetBSD 系统,这时 pkgsrc 已经就绪,直接可以使用了。其他的系统由于还缺少几个 pkgsrc 的维护工具,需要使用 bootstrap 进行初始化:
$ cd pkgsrc/bootstrap
$ ./bootstrap
这个脚本执行以后,在 /usr/pkg/bin 目录下面就有了 bmake 这样的几个工具。接下来就是将 /usr/pkg/bin 加入到 PATH 环境变量里面。
在 /usr/pkgsrc 目录里面,第三方软件按照功能划分归入不同的子目录,从子目录名称,我们就能知道这些类的含义。比如,inputmethod 目录下面存放着输入法软件,而 fonts 目录下面自然是字体相关的软件包了。
pkgsrc 目录里除了按功能分类的子目录,还有一些比较特殊的目录:
mk:
该目录存放的是支撑 pkgsrc 的 Makefile,与 BSD make 工具一起构成 了 pkgsrc 软件包管理系统。
doc:
这里存放着 pkgsrc 的文档,一份 guide 和 pkgsrc 更新记录。
licenses:
这个目录下存放各种软件的许可证。
distfiles:
该目录用来保存从软件发布站点下载下来的软件包。
packages:
存放二进制软件包的目录。
templates:
生成 README.html 时使用的模板。
pkg_tools:
pkgsrc 的一些辅助工具,也是通过 make install 方式安装。
meta-pkgs:
这里是一些大型软件包的套件,方便用户一次安装完成。比如 meta-pkgs/gnome 包含了 gnome 基本的组件,安装后就可以使用 gnome 了。
编译安装 pkgsrc 下的软件包,都是通过 BSD make 完成。
安装时,根据软件属性,选择分类,进入该软件包的目录,然后执行 make 命令。例如,现在需要安装 WindowMaker,它是窗口管理系统软件,在 pkgsrc 归入 wm 子目录:
$ cd /usr/pkgsrc/wm/windowmaker
$ make install
执行 make install 命令后,可以看到 BSD make 根据 Makefile 进行编译的过程。本例没有做任何优化调整,直接使用维护者的设置编译安装。例子中使用 just-in-time su 来执行 make install,而不是 root,pkgsrc 的这种特性可以防止用户操作失误。执行步骤中需要 root 权限时,pkgsrc 会自动使用 su。
pkgsrc 下的软件包,PREFIX 默认使用 /usr/pkg,如果不做修改,文件会安装到 /usr/pkg/bin、/usr/pkg/lib、/usr/pkg/share 这些目录里面。
BSD make 执行过程中,首先会读取 /etc/mk.conf 文件里面的设置,因此这个文件就作为修改全局优化、设置的地方。而 pkgsrc 默认的设置内容,位于 /usr/pkgsrc/ 目录下的 mk/default/mk.conf 文件里面,该文件中的对每一个设置都有说明。比如,对于软件编译时产生的 obj 文件放置的目录,在 /usr/pkgsrc/mk/default/mk.conf 文件里面可以查到:
#WRKOBJDIR= /usr/tmp
# build here instead of in pkgsrc
# Possible: any path
# Default: not defined
现在需要将它改为 /usr/pkg-obj 目录,可以通过在 /etc/mk.conf 添加下面一行实现:
WRKOBJDIR=/usr/pkg-obj
通常使用 x86 二进制软件包,一台 P4 的机器仅能得到 386 兼容模式所提供的功能。而使用源码编译软件包,我们就可以针对当前的系统设置编译选项,从而充分地利用系统的能力。
如果你是一个软件开发人员,知道有多种途径可以设置一个软件包的编译选项:设置环境变量,修改软件包里面的 Makefile 等等。如果要做全局的选项设置,可以将它写到 /etc/mk.conf 里面,例如,给所有的 C 程序软件包加上调试信息,只需加上:
CFLAGS += -g
如果你仅打算在编译时可以自动加上 cpu 的优化选项,pkgsrc 提供了一个软件包可以方便地为每个 C/C++ 程序自动设置。
$ cd /usr/pkgsrc/devel/cpuflags
$ make install
安装完成后,在 /etc/mk.conf 文件里面加上:
基于源码的软件包管理系统最大的一个缺点就是编译需要花费很长的时间,这是无法避免的一个过程。要缩短编译时间最根本的途径就是升级编译机器的硬件。但在不升级硬件的情况下,我们仍然可以通过一些方法提高编译效率。
在 pkgsrc/devel 子目录下面有 ccache 和 distcc 两个工具。ccache 使用缓存技术,减少重复编译次数,优化编译过程来缩短编译时间;distcc 是采用多台机器进行分布式编译,并且 pkgsrc 所使用的 BSD make 本身就支持并行编译。使用 distcc 除了要求局域网内有多台计算机外,还要求它们具有相同的编译环境,比如所使用的 gcc 版本必须一样。
我们通过 make install 安装 ccache 和 distcc 两个工具,然后在 /etc/mk.conf 文件里面添加:
PKGSRC_COMPILER=distcc ccache gcc
DISTCC_HOSTS=localhost distcc_server1 distcc_server2
BUILD_MAKE_FLAGS=-j 3
上面的 BUILD_MAKE_FLAGS 参数 -j 必须大于 2 才能使 distcc 正常工作。编译开始之前,其他的编译机器必须执行 distccd,它可以在命令行上运行:
$ distccd --daemon --allow 192.168.0/24 --listen 192.168.0.10
也可以放到系统启动脚本里面,详细步骤请参考 distcc 文档。
有一点要注意,pkgsrc 里面的软件包,并不是每一个都能很好地支持并行编译,如果你在编译时碰到了奇怪的错误,禁止 distcc 后再重新编译一次。
如果局域网内有多台机器需要使用 pkgsrc,可以通过 NFS 方式共享 /usr/pkgsrc 目录,这样只需在 NFS 服务器一台机器上定时更新,其他机器都能使用到最新的 pkgsrc,而且对于 distfiles 目录下的文件,也只需要一个用户下载一次。
当你需要安装或更新软件的时候,一般先更新一下 pkgsrc。在 pkgsrc 压缩包里面本身就含有 cvs 相关信息,更新的时候,只需要进入该软件包目录,然后使用 cvs up -dP 命令更新软件包。
因为自由软件的软件包通常都相互关联,有着严格的依赖关系,为了减少因版本依赖造成的错误,整个 pkgsrc 树最好能定期进行更新。
下载的 pkgsrc 压缩包里面含有的 cvs 仓库信息,它指向的是 pkgsrc 主站,如果你要替换为连接较快的镜像站点,可以使用下面方法进行替换。
cvs 仓库的信息是保存在 CVS/Root 文件里面,压缩包里面的 CVS/Root 文件内容是:
anoncvs@anoncvs.NetBSD org:/cvsroot
现在打算将 cvs 服务器更换到局域网内的一台镜像服务器上,可以创建一个临时文件 /tmp/Root,假设内容为:
:ext:yourname@192.168.0.10:/NetBSD/cvsroot
接下来替换 pkgsrc 目录中的 CVS/Root,执行:
$ cd /usr/pkgsrc
执行 make 命令后,pkgsrc 会根据需要自动下载软件发布包,如果从默认的主站下载很慢,可以修改到其他的镜像站点:
MASTER_SITE_OVERRIDE=ftp://ftp2.us.NetBSD org/pub/NetBSD/packages/distfiles/
将上面这一行写入 /etc/mk.conf,pkgsrc 就会从 ftp2.us.NetBSD org 站点下载软件包。另外,sourceforge net 也有大量的镜像,可以用下面的设置选择合适的服务器:
MASTER_SITE_SOURCEFORGE=http://easynews.dl.sourceforge net/sourceforge/
软件难免会有各种各样的安全漏洞,及时地了解安全警告并打补丁,对于系统的安全至关重要。pkgsrc 有一个负责安全的团队,专门跟踪第三方软件的安全状况,及时返回信息到 pkgsrc 社区。
pkgsrc 提供了一种机制可以让用户掌握系统中软件的安全情况,它是通过 security/audit-packages 实现的,里面提供了两个工具:
download-vulnerability-list:
用来更新安全简报
audit-packages:
根据简报检测系统中所安装的软件的安全状况
这两个程序可以在需要的时候手动执行,也可以使用 cron 工具定期执行。
下载的简报文件是 pkg-vulnerabilities,从 NetBSD 主站获取,然后保存到 /usr/pkgsrc/distfiles/ 目录。这个文件在镜像站点上也有,如果让 download-vulnerability-list 从镜像站点下载,需要在 /usr/pkg/etc 目录下面创建一个 audit-packages.conf 文件,然后添加这样一行信息:
VUL_SOURCE=ftp://(mirror)/pub/NetBSD/packages/distfiles/pkg-vulnerabilities
make install
在执行 make install 的过程中,实际上是执行了一系列目标: fetch, checksum, extract, configure, build 等等,后一个目标依赖于前一个目标。 你也可以单独执行其中的一个目标,或者不选择任何目标,只执行 make,默认 为 build 目标,根据依赖关系,它先检查 configure 目标是否完成,如果没 有,则先执行 configure 目标,以此类推。
make clean && make clean-depends
编译安装之后,可以清除编译生成的文件,节约磁盘空间。clean 是清除当前 软件包的编译文件,clean-depends 是清除依赖包的编译文件。
make replace
更新已有的软件包。使用此目标需要先安装 pkg_tools/pkg_tarup 工具。
make deinstall
卸载软件包
make fetch-list
使用上面命令可以查看编译此软件包,都有哪些软件包需要下载。
make readme
生成当前软件的 README.html 文件。
make show-var VARNAME=VAR
显示当前编译环境下的某个变量内容,比如 VARNAME=CFLAGS 可以查看 C 编译 选项。
make show-depends-dirs
显示本软件所依赖的软件包目录。
make show-all-depends-dirs
显示本软件和所依赖软件全部的依赖软件包目录。
make show-options
显示本软件所支持的选项。然后可以使用 PKG_OPTIONS 添加和删除选项。例 如,对于 chat/gaim,要添加 tcl 选项可以在 /etc/mk.conf 里面增加一行:
PKG_OPTIONS.gaim+=tcl
pkgsrc rc.d
从 pkgsrc 安装的软件包,默认系统设置目录是 /usr/pkg/etc, daemon 类的软件包,启动脚本位置是 /usr/pkg/etc/rc.d。软件包安装完以后,并没有直接在 rc.d 目录下面安装脚本,而是放在 /usr/pkg/share/examples/rc.d 目录下面。使用时,需要将其复制到 /usr/pkg/etc/rc.d 目录下面,让管理员在修改符合自己的要求启动脚本后,还可以保留一份最初的备份。
在 NetBSD 系统下使用,还要修改 /etc/rc.conf。例如,对于 apache,需要加上
apache=YES
然后在 /etc/rc.local 里面加入
if [ -f /usr/pkg/etc/rc.d/apache ]; then
/usr/pkg/etc/rc.d/apache start
fi
pkg_* tools 基本用法
pkg_info
不加参数时,列出当前系统中使用 pkgsrc 安装的软件包。
pkg_info -F /path/to/file 查找 file 所属的软件包。
pkg_info -R pkg 列出依赖 pkg 的软件包。
pkg_delete
删除已经安装的 pkgsrc 软件包。
pkg_delete -f pkg 强制删除 pkg 软件包,不考虑破坏 pkg 与其他软件包之间的依赖关系。
pkgtools/pkgfind
根据关键字搜索 pkgsrc 中可用的软件包。
pkgtools/pkg_chk
更新 pkgsrc 后,可以使用 pkg_chk -i 检验当前安装的软件包哪些可以升 级。
pkgtools/pkgclean
如果你在 make install 之后没有使用 make clean 清除编译文件,可以借助 这个工具进行清理,它比从 /usr/pkgsrc 目录下执行 make clean 要快。
pkgviews
pkgviews 是 pkgsrc 新提供的一个实验特性,它允许在系统里面安装一个软件包的不同版本。pkgsrc 默认使用 overwrite 模式安装软件,要改成 pkgviews 需要在 /etc/mk.conf 里面注明
PKG_INSTALLATION_PREFS= pkgviews overwrite
使用之前要确保系统里面没有装任何 pkgsrc 软件包,然后就可以按照一般方式 make install 编译安装软件包了。在安装另一个版本时,可以使用
$ make install PKGVIEWS=devel
命令安装,而不与已经安装的版本相冲突。
删除 pkgviews 软件包,需要借助 pkg_view 工具,例如:
$ pkg_view -w devel delete pkg-devel
有时,一个软件包有多个流行的版本,你可以选定一个版本作为系统采用的版本,其他相关软件包则根据该版本判断依赖关系。版本的设置也放在 /etc/mk.conf 里面,下面是几个常见的例子。
python:
PYTHON_VERSION_DEFAULT=24
teTeX:
TEX_DEFAULT=teTeX3
java:
JAVA_HOME=/usr/pkg/java/sun-1.5
PKG_JVM=sun-jdk