目录
4.1. 使用二进制packages
4.1.1. 寻找二进制packages
4.1.2. 安装二进制packages
4.1.3. 卸载packages
4.1.4. 获取已安装packages的相关信息
4.1.5. 检查已安装packages的安全弱点
4.1.6. 在pkgsrc里寻找已安装packages的新版本
4.1.7. 其它的管理功能
4.1.8. 警示
4.2. 从源代码构建packages
4.2.1. 需求
4.2.2. 获取distfiles
4.2.3. 如何构建和安装
有两种使用pkgsrc的方式。第一种方式是仅安装package工具,使用别人准备好的二进制packages。 这就是pkgsrc中的 pkg 的含义 。第二种方式是还安装pkgsrc的src ,然后你就可以构建自己的packages了, 但你仍然可以使用别人构建的二进制packages。
4.1. 使用二进制packages
在 ftp://ftp.netbsd.org/ 服务器及其镜像上, 保存有二进制packages的集合, 可用于直接安装。这些二进制packages的构建使用的是目录内的默认设置, 它是:
/usr/pkg 对应 LOCALBASE, 大部分文件安装在这里,
/usr/pkg/etc 存放配置文件,
/var 对应 VARBASE, 存放在这里的文件在安装过程结束后可能会发生变化。
不管您因为什么原因无法使用这些目录 (例如可能你没有root权限), 你就不能使用这些二进制packages, 但是如果你还需要自己构建这些packages, 相关的解释在这里 Section 3.2, Bootstrapping pkgsrc.
4.1.1. 查找二进制packages
要安装二进制packages, 你首先需要知道在哪里可以找到它们。第一个你应该查找的地方就是主力ftp服务器里面的 /pub/pkgsrc/packages目录。
这个目录内包含了很多平台的二进制packages。 首先, 选择你的操作系统(忽略附带有版本号的目录, 它们在那里仅仅是因为历史遗留问题)。 然后, 选择你的硬件构架, 而第三步, OS版本号和pkgsrc的版本。
在这个目录内, 你会注意到有一个bootstrap.tar.gz文件 ,它包含了package管理工具。如果这个文件不在, 就可能是你的操作系统已经提供了这些工具。下载这个文件并释放在 / 目录。它将创建一个目录 /usr/pkg (包含了管理二进制packages所需的工具)以及 /var/db/pkg (已安装packages的数据库)。
4.1.2. 安装二进制packages
在上一小节提到的目录内, 有一个名为 All的子目录, 它包含了该平台所有的二进制 packages, 除了那些不能通过FTP或CDROM分发的 (要根据您使用的介质), 或者那些存在缺陷而被认为在认真考虑前就直接安装是不安全的软件。
要直接从ftp或http服务器直接安装packages, 在兼容Bourne的shell下运行下列命令 (请先确认 su 到了root):
代码: 全选
# PATH="/usr/pkg/sbin:$PATH"
# PKG_PATH="ftp://ftp.NetBSD.org/pub/pkgsrc/packages/OPSYS/ARCH/VERSIONS/All"
# export PATH PKG_PATH
除了URLs, 你还可以使用本地路径, 例如如果你正在从一组CDROMs, DVDs或者一个挂载的NFS仓库上安装。 如果你想从多个源代码路径安装packages, 你可以在PKG_PATH里用分号分隔它们。
一旦这些准备工作完成后, 安装一个package是很简单的:
代码: 全选
# pkg_add openoffice2
# pkg_add kde-3.5.7
# pkg_add ap2-php5-*
这里注意任何运行该package所需的依赖包也将会一并安装, 这里假定你的安装源上存在这些依赖包。
如上所述, 已知安全漏洞的packages将不会保存在All子目录内。之所以没有删除它们是因为很多packages依赖它们. 所以它们被移至 vulnerable 子目录. 所以你也许想将这个子目录添加到 PKG_PATH 变量里。 然而, 你应该正常地运行 pkg_admin audit, 特别是安装了新的packages后, 然后校验这些有缺陷的packages是否可以被你的配置接受。
当你完成packages安装后, 请确保将 /usr/pkg/bin 和 /usr/pkg/sbin 加入到你的 PATH 里,以便你可以开始运行刚刚安装好的程序。
4.1.3. 卸载packages
要卸载一个package, 无论它是从源代码安装的或二进制package安装的都不关紧要。pkg_delete 命令对此一无所知。要删除一个package, 你只需运行 pkg_delete package-name. 这里提供的package名称可以不带版本号。 也可以使用通配符删除一系列packages, 例如 *emacs*。请确保将它们包含在引号内, 这样可以让pkg_delete 命令执行之前shell不会对这些通配符进行扩展操作。
-r 选项很强大: 它可以删除所有需要此package的packages,然后再删除此package本身. 例如:
代码: 全选
# pkg_delete -r jpeg
将删除jpeg以及所有使用它的packages; 它允许升级jpeg这个package。
4.1.4. 获取已安装packages的相关信息
pkg_info 显示已安装的packages或者二进制package文件的信息。
4.1.5. 检查已安装packages的安全弱点
NetBSD的安全官员和Packages小组维护着一个已知有缺陷的程序的packages清单,这些程序正在或 (已经被) 包含在 pkgsrc里。这个清单可以在NetBSD的FTP站点上的 ftp://ftp.NetBSD.org/pub/pkgsrc/distfil ... rabilities 里找到。
通过 pkg_admin fetch-pkg-vulnerabilities, 可以自动下载这份清单, 然后可以对所有已安装的packages执行安全审计。
审计分两个步骤。第一步, pkg_admin fetch-pkg-vulnerabilities, 从NetBSD的FTP站点下载有缺陷程序清单;第二步, pkg_admin audit, 检查所有已安装的 packages是否有缺陷。 如果一个package是有缺陷的, 你将看到类似这样的输出:
代码: 全选
Package samba-2.0.9 has a local-root-shell vulnerability, see
[URL]http://www.samba.org/samba/whatsnew/macroexploit.html[/URL]
你可能希望每天更新这个有 缺陷 的文件以便让其保持最新。这可以通过为root用户在crontab(5)里添加一个合适的选项完成。例如这个选项
代码: 全选
# download vulnerabilities file
0 3 * * * /usr/sbin/pkg_admin fetch-pkg-vulnerabilities >/dev/null 2>&1
将在每天3AM升级有缺陷的程序名单. 也许你想一天检查数次。 此外, 你也许想每天运行packages审计安全脚本。这可以通过将下行添加到 /etc/security.local 里实现:
代码: 全选
/usr/sbin/pkg_admin audit
4.1.6. 在pkgsrc里寻找已安装packages的新版本
安装 pkgtools/lintpkgsrc 并带-i参数运行 lintpkgsrc 以检查你的packages是否已经更新到最新, 例如
代码: 全选
% lintpkgsrc -i
...
Version mismatch: 'tcsh' 6.09.00 vs 6.10.00
然后你可以使用 make update to 命令在你的系统上更新这个package并重新建立所有依赖包。
4.1.7. 其它的管理功能
pkg_admin 命令可以在package系统上执行各种管理功能。
4.1.8. 警示
如果一个packages并非你自己编译的,你必须务必十分的小心那些在pkg_add(1)用户手册里已经明确声明存在固有漏洞的二进制package,不分青红皂白地安装这些有安全隐患的程序将给你的系统留下灾难性的安全隐患。
当你在没有完全阅读并理解一个package的源代码就盲目安装一个package时,也同样存在这种安全隐患, 编译器仅负责构建这个package及包含的其它工具。
4.2. 从源代码构建packages
当你获得了pkgsrc, pkgsrc 目录包含了一系列按种类划分的packages。你可以浏览网上的packages索引, 或者在 pkgsrc 目录内运行make readme以便为所有的packages生成本地的README.html文件, 这些文件可用任何web浏览器查阅,例如 www/lynx 或者 www/firefox。
对于安装的packages来说,默认的 prefix 是 /usr/pkg,如果你想改变它, 你可以通过在mk.conf 里设置 LOCALBASE 实现。你不应该在同一个系统上定义多个不同的LOCALBASE。(chroot环境例外)。
本章的其余部分假设你所要的package已经在pkgsrc内了。如果并非如此, 请参阅 Part II, pkgsrc开发者指南 以了解怎样制作你自己的packages。
4.2.1. 需求
要从源代码构建packages, 你需要使用C编译器。在NetBSD中, 你需要安装comp和text分发组件。如果你想构建有关X11的packages, 你还需要xbase和xcomp分发组件。
4.2.2. 获取distfiles
构建一个package的首要步骤是下载distfiles (也就是未修改的源代码)。如果它们还未被下载, pkgsrc将自动获取它们。
如果在distfiles目录内已经有了你所需的所有文件, 你不必连网。如果这些distfiles在CD-ROM上, 将CD-ROM挂载到/cdrom目录上,然后在mk.conf文件中添加:
DISTDIR=/cdrom/pkgsrc/distfiles
默认情况下分发站点的名单将随机排列以防止受欢迎的packages给承载它的服务器带来过大的负荷 (例如, SourceForge.net镜像)。因此, 每次当你还需要获取另一个distfile时,会以一个新的排序方式(随机)列出所有的镜像。你可以通过设定 MASTER_SORT_RANDOM=NO来关闭这个特性(对开发者来说 PKG_DEVELOPER已经关闭了这个特性)。
你可以自行修改一些主要的分发站点以便获得最快的速度。通过设置一个或两个变量,你可以修改访问主机站点的顺序。 MASTER_SORT 包含一个空格分隔的域名后缀的名单。 MASTER_SORT_REGEX 要灵活得多, 它包含一个正则表达式的空格分隔的名单。它的优先级要高于MASTER_SORT。 请参阅 pkgsrc/mk/defaults/mk.conf 里的一些范例。这可能节省你的带宽和时间。
你可以在shell环境中进行设置, 或者, 如果你想保留这个设置, 可以通过编辑 mk.conf 文件, 并在那里增加定义来实现。
如果一个package依赖很多其它的packages (例如 meta-pkgs/kde3), 构建过程可在下载源代码和编译期间交替进行。 要确保已经下载了所有的源代码,你可以运行命令:
代码: 全选
% make fetch-list | sh
4.2.3. 如何构建和安装
一旦软件下载完成, 所有的补丁将被应用, 然后它将被编译。这可能需要花费一些时间,长短根据你计算机的性能和需要多少其它的packages以及编译它们的时间。
说明
如果在一个非NetBSD系统上使用bootstrap或者pkgsrc, 请使用pkgsrc的 bmake 命令取代本指南范例中的 make 命令。
例如, 键入
代码: 全选
% cd misc/figlet
% make
就可以在shell提示符下构建该package的各个部分。
接下来的步骤是将新编译的程序实际安装到你的系统上。当你还在你正在安装的package的目录内时输入命令:
代码: 全选
% make install
将package安装在你的系统上可能需要你有root权限。 但是, pkgsrc 具备一个 just-in-time-su 特性, 它可以允许你只在真正的安装步骤中成为root。
好了, 现在这个软件应该已经被安装并可使用了。你现在可以输入:
代码: 全选
% make clean
这将删除工作目录内的编译的中间文件, 因为你已经不再需要它们了。如果为了完成对该package的编译,其它的packages也被添加到你的系统内(依赖包), 你也可以通过下面的命令清理它们:
代码: 全选
% make clean-depends
我们用figlet工具做一个实例, 构建和安装过程请参 Appendix B, Build logs.
这个程序被安装在默认的packages树的根目录下 - /usr/pkg。 如果这并非你的习惯, 在你的环境中设置变量 LOCALBASE , 这个值就是packages树所在的根目录。所以如果要用 /usr/local, 设定LOCALBASE=/usr/local。 请注意你应该设置一个package的专用目录, pkgsrc不能与其它程序共享此目录(例如,不要尝试使用 LOCALBASE=/usr)。 此外, 你不应该尝试将任何自己的文件或目录 (例如 src/, obj/, or pkgsrc/)添加到 LOCALBASE 树下。 这是为了防止程序和其它这个package安装的文件间可能的冲突。
一些packages请参阅 mk.conf 以在构建时更改一些配置选项。请参看pkgsrc/mk/defaults/mk.conf以便了解默认有哪些设置。环境变量,诸如LOCALBASE 可以在 mk.conf 里设定,这样就不必每次用pkgsrc时都要设置它们。
偶尔,人们想了解一个package构建和安装时的幕后进程。这可能是为了调试的目的, 或者仅是出于好奇。一些不错的工具可以完成这项工作。
如果你用make(1) 命令时调用了 PKG_DEBUG_LEVEL=2, 那将显示海量的信息。 例如,
代码: 全选
make patch PKG_DEBUG_LEVEL=2
如果你想知道具体 make(1) 定义的作用, 可以使用 VARNAME 定义, 以及show-var目标。 例如,make(1) 的扩展变量 LOCALBASE:
代码: 全选
% make show-var VARNAME=LOCALBASE
/usr/pkg
%
如果你想安装一个自己构建好的二进制package(参下小节), 那么要么将它手动放进pkgsrc/packages,或者放置在一个远程的FTP服务器上, 你可以使用"bin-install"目标。这个目标将安装一个二进制package - 如果可能- 通过 pkg_add(1), 要么 执行 make package。远程FTP站点搜索名单保存在变量 BINPKG_SITES 里面, 默认设置为ftp.NetBSD.org. 任何其它附加给 pkg_add(1) 的参数可以放置在 BIN_INSTALL_FLAGS内。请参阅pkgsrc/mk/defaults/mk.conf 以获取更多细节。
最后的一些警示: 如果你建立了一个非标准设定的LOCALBASE值系统, 请确认在安装任何package前做好这个设定, 因为你不能使用几个目录完成同一个目的。如果你这样做将导致pkgsrc不能正确地检测出已安装的packages, 并出现致命错误。还有一点就是预编译的二进制packages通常使用默认的/usr/pkg作为 LOCALBASE, 所以如果你使用非标准的LOCALBASE你 不能 安装任何预编译的package。