分页: 1 / 1

《NetBSD pkgsrc指南》中文版-Chapter 7. 全在pkgsrc里创建二进制packages(bulk builds)

发表于 : 2010-05-19 10:10
leo
Chapter 7. 在pkgsrc里创建所有的二进制packages(bulk builds)
目录

7.1. 先思后行
7.2. bulk build的需求
7.3. 执行老式bulk build
7.3.1. 配置
7.3.2. 其它环境因素
7.3.3. 操作
7.3.4. 它的工作
7.3.5. 磁盘空间需求
7.3.6. 将构建chroot在一个沙盒里
7.3.7. 部分构建packages
7.3.8. 上传一个bulk build的结果
7.4. 运行一个pbulk模式的bulk build
7.4.1. 准备
7.4.2. 配置
7.5. 创建多张CD-ROM的packages集合
7.5.1. cdpack使用实例
当你有数台机器需要运行同样的packages, 在每台机器上从原代码构建自己的packages就浪费时间了。有两个途径可以获得一组二进制packages: 原来的bulk build系统, 或者是新的(应该是2007) parallel bulk build (pbulk) 系统。 本章讲述怎样设置它们以便让packages可在以后应用。

7.1. 先思后行
因为一个bulk build会花上几天甚至几周的时间才能完成, 你应该在开始每件事之前先筹划好步骤。至少要先仔细斟酌以下几点:

如果你想上传这些二进制packages到ftp.NetBSD.org, 请先确认遵循了二进制packages的规范要求:

要最终提交到ftp.NetBSD.org, 这个packages必须是由一个开发人员在一台可信的机器上制作的 (也就是, 只有你有这台机器的root访问权限)。

ftp.NetBSD.org上的packages必须只能是从稳定分支(像2009Q1)创建的, 这样用户浏览可用的 集合时可以知道这些packages是构建了多少时间了。

这些packages必须由root构建, 因为一些packages在运行时需要set-uid binaries, 所以用没有 特权的用户构建出的这些packages在这种时候工作不正常。

确保bulk build不会损坏系统内的重要资料。多数bulk build必须由root运行, 所以它们至少应该 运行在一个chroot的甚至更为严格的环境内, 这依赖于操作系统可以提供什么样的环境。 一些特定的packages尝试将文件安装在 LOCALBASE 以外的地方或者要编辑 /etc里面的一些文件。 此外, bulk builds操作时会将 /usr/pkg作为packages的安装或卸载目录进行操作 (或者 LOCALBASE 指定的那个目录), 所以请确认你在构建期间不需要里面任 何的package了。

7.2. bulk build的需求
一个完整的bulk build需要大量的磁盘空间。一些空间可只读, 而其余的则要求可写。有些空间可以在远程的文件系统(像NFS)上,而有些则应该在本地。有些空间可以时临时文件系统,其余的则必须能适应系统突然重新启动。

10 GB 保留给distfiles (可读写, 远程, 临时)

10 GB 保留给二进制packages (可读写, 远程, 永久)

400 MB 保留给pkgsrc树 (只读, 远程, 永久)

5 GB 保留给 LOCALBASE (可读写, 本地, pbulk可用临时空间, 旧版bulk必须使用永久的空间)

5 GB 保留给log文件 (可读写, 远程, 永久)

5 GB 保留给临时文件 (可读写, 本地, 临时)

7.3. 执行旧版bulk build
说明
进行bulk build有两种方案。旧版方案和新版的 “pbulk”. 我们推荐后者。

7.3.1. 配置
7.3.1.1. build.conf
build.conf文件是bulk build的主配置文件。你可以用它指定如何更新你的pkgsrc, 如何下载distfiles, 如何构建packages以及如何生成报告等。有一个带注释的范例在文件pkgsrc/mk/bulk/build.conf-example。使用的方法是, 拷贝 build.conf-example 为 build.conf ,然后根据注释编辑它。

7.3.1.2. mk.conf
你也许想设置 mk.conf里的变量。 参 pkgsrc/mk/defaults/mk.conf 以获取默认配置的细节。你要确保 ACCEPTABLE_LICENSES 符合你的本地策略。 就像example的用法一样, 设置 SKIP_LICENSE_CHECK=yes 完全忽略许可证检查。

代码: 全选

PACKAGES?= ${_PKGSRCDIR}/packages/${MACHINE_ARCH}
WRKOBJDIR?= /usr/tmp/pkgsrc # build here instead of in pkgsrc
BSDSRCDIR= /usr/src
BSDXSRCDIR= /usr/xsrc # for x11/xservers
OBJHOSTNAME?= yes # use work.`hostname`
FAILOVER_FETCH= yes # insist on the correct checksum
PKG_DEVELOPER?= yes
SKIP_LICENSE_CHECK= yes

一些对bulk build特别有用的选项可以在文件mk/bulk/bsd.bulk-pkg.mk 的前几行看见。我们在这里将一些最有用的选项简要描述如下。

如果你在使用一台很慢的机器, 你应该将 USE_BULK_BROKEN_CHECK 设置为 no

如果你从一份pkgsrc只读拷贝bulk build, 你必须将 BULKFILESDIR 设置为生成log文件的目录,否则log文件将建立在pkgsrc目录内。(译者注:但是这个目录不可写。)

另一个重要的变量是 BULK_PREREQ, 它是一个在构建其它packages时 必须的用到的packages列表。

pkgsrc里还有一些其它的选项要注意:

ALLOW_VULNERABLE_PACKAGES 应该设置为 yes。这个选项的含义是无论这些packages有没有安全缺陷, bulk builds都为它们生成二进制packages。将这些packages上传到公众服务器时, 这些有缺陷的packages将被归档到它们自己的目录内。如果不设置这个选项则 bulk build系统根本不会构建它们, 所以有可能也不会显示构建错误信息。

如果将CHECK_FILES (pkgsrc/mk/check/check-files.mk) 设置为 yes,将检查安装的文件是否与 PLIST匹配。

CHECK_INTERPRETER (pkgsrc/mk/check/check-interpreter.mk) 设置为 “yes” 将检查安装的 #!”-scripts 可否找到其解释器。

PKGSRC_RUN_TEST 设置为 “yes” 则每个package在被安装前, 将先进行自我测试。注意一些packages会大量使用 “good” 随机数, 所以你需要确保做bulk buikd的那台机器 并非完全空闲。否则一些测试程序在其等待新的可用随机数时看起来像终止了。

7.3.1.3. pre-build.local
有可能在与编译阶段的最后将bulk build配置为特定的任务。如果/usr/pkgsrc/mk/bulk里有pre-build.local文件, 后者通常(像一个 sh(1) 脚本) 在预编译的最后阶段运行。这里有一个使用 pre-build.local 例子,如果有下面这行:

代码: 全选

echo "I do not have enough disk space to build this pig." \
> misc/openoffice/$BROKENF
将会防止构建一个接近3Gb空间需求的package。

7.3.2. 其它环境因素
因为 /usr/pkg 将在bulk build开始运行时被完全删除, 请确认你的login shell位于其它的位置。要么将其放在 /usr/local/bin (然后在你的passwd文件里调整你的shell), 要么从/etc/rc.local通过pkg_add(1)重新安装它。这样你才可能在重新启动后login。(别忘了,即使删除了这个package,你的当前进程也不会终止, 只不过再也不能开启这个shell的新实例了)。 还有, 如果你使用的NetBSD版本早于1.5, 或者你因为某些原因还想使用这个pkgsrc版本的ssh, 别忘了在将其加入rc.local前先安装ssh :

代码: 全选

(cd /usr/pkgsrc/security/ssh && make bulk-install)
if [ -f /usr/pkg/etc/rc.d/sshd ]; then
/usr/pkg/etc/rc.d/sshd
fi

如果你不这样做,将导致在bulk build结束时或者机器重新启动或崩溃后你不能通过ssh来login,别说我没有警告过你哦 :)

7.3.3. 操作
确认你不需要已经安装的任何packages。

警告
bulk build时, 所有的packages, 它们的配置文件和 /var, /home 也许还有其它位置的一些文件将被删除! 所以不要用特权身份执行一个bulk build,它可能会破坏系统。

务必删除其它所有可能与构建有冲突的文件, 像一些安装在 /usr/local里的库文件等。然后,切换到root并输入 :

代码: 全选

# cd /usr/pkgsrc
# sh mk/bulk/build

如果因为某些原因最后的构建不能完成 (断电, 系统崩溃, ...), 你可以继续执行它,输入:

代码: 全选

# sh mk/bulk/build restart
在bulk build的最后阶段, 你会收到一份有关概要的信件, 而且可以在build.conf文件内指定的FTP目录内找到构建logs。

7.3.4. 它的工作
bulk builds包含三个步骤:

1. pre-build
这个脚本通过(anon)cvs更新你的pkgsrc树, 然后清除所有损坏的distfiles, 删除所有已经安装的packages。(leo注:这里应该指的是删除生成的packages文件。)

2. the bulk build
这是基本的 “make bulk-package” ,采用一个最优化的步骤 构建packages。那些不需要依赖其它packages的packages将先被构建, 而有大量依赖包的 packages将稍后构建。

3. post-build
生成一个报告,报告的位置在 build.conf 文件中指定,默认命名为 broken.html, 构建主机的管理员会收到一份简要报告。

在构建时, 所有损坏packages的清单将被编译进 /usr/pkgsrc/.broken 里(或者如果 OBJMACHINE 设定了 .../.broken.${MACHINE} ), 中断构建的日志将保存在每个package自己的目录内。这些文件被bulk-targets用来为中断的构建做标记,以便无需浪费时间尝试再次构建它们, 而且它们可用于以后调试这些中断的构建。

7.3.5. 磁盘空间需求
目前来说, NetBSD 2.0/i386大致的需求如下(译者注:多老的文档了? ...............):

10 GB - distfiles (NFS ok)

8 GB - full set of all binaries (NFS ok)

5 GB - temp space for compiling (local disk recommended)

说明一旦所有的pkgs提交为二进制packages,则它们将被卸载, 且源代码也会被删除, 以便不占用过大的空间。此后, 如果还需要, 则会通过pkg_add(1)来安装,无需再编译一次。

7.3.6. 将构建chroot在一个沙盒里
如果你不希望所有的packages在你的计算机上来一次核爆(这里是描述除了pkg的编译,其它的东西对你丝毫无用), 有可能在一个chroot的环境里进行bulk build。

第一个步骤是设置一个chroot的沙盒, 例如 /usr/sandbox. 这可以通过使用null mounts完成, 或者手动。

这里有一个shell脚本,名为 pkgsrc/mk/bulk/mksandbox ,它可以通过null mounts设置沙盒环境。它也会在沙盒环境的根目录里生成一个名为 sandbox的脚本, 它可以使用sandbox mount 命令启用null mounts,或者 sandbox umount 命令禁用null mounts。

如果要手动设置一个沙盒环境, 在NetBSD安装时释放完所有的组件后,或者在/usr/src/etc里设置一下 make distribution DESTDIR=/usr/sandbox , 请确保有下列选项并正确地配置了:

1. Kernel

代码: 全选

# cp /netbsd /usr/sandbox

2. /dev/*

代码: 全选

# cd /usr/sandbox/dev ; sh MAKEDEV all

3. /etc/resolv.conf (为 security/smtpd 和 mail):

代码: 全选

# cp /etc/resolv.conf /usr/sandbox/etc

4. Working(!) mail config (hostname, sendmail.cf):

代码: 全选

# cp /etc/mail/sendmail.cf /usr/sandbox/etc/mail

5. /etc/localtime (为 security/smtpd):

代码: 全选

# ln -sf /usr/share/zoneinfo/UTC /usr/sandbox/etc/localtime

6. /usr/src (系统资源, 例如为 sysutils/aperture):

代码: 全选

# ln -s ../disk1/cvs .
# ln -s cvs/src-2.0 src

7. 创建 /var/db/pkg (非默认安装部分):

代码: 全选

# mkdir /usr/sandbox/var/db/pkg

8. 创建 /usr/pkg (非默认安装部分):

代码: 全选

# mkdir /usr/sandbox/usr/pkg

9. 通过cvs将 pkgsrc 获取到 /usr/sandbox/usr/pkgsrc:

代码: 全选

# cd /usr/sandbox/usr
# cvs -d [EMAIL="[email protected]:/cvsroot"][email protected]:/cvsroot[/EMAIL] checkout -d -P pkgsrc[
不要将其 mount/link 到你的pkgsrc树的拷贝上, 因为这可能导致问题!

10. 将 /usr/sandbox/usr/pkgsrc/packages 和 .../distfiles 指向其他合适的地方。NFS- 和/或 nullfs-mounts 可能更方便!

编辑 mk.conf, 请参阅 7.3.1.2 小节, “"mk.conf"。

12. 根据自己的要求调整 mk/bulk/build.conf 。

当设置好chroot沙盒, 你就可以用下列步开始构建了:

代码: 全选

# cd /usr/sandbox/usr/pkgsrc
# sh mk/bulk/do-sandbox-build

这将会让构建仅在沙盒内进行。在构建的最后阶段, 构建结果将通过mail发送出去。产生的二进制pkgs将保存在 /usr/sandbox/usr/pkgsrc/packages (或者任何你points/mounts to/from)。

7.3.7. 部分构建packages
除了构建一套完整的所有pkgsrc内的packages, pkgsrc/mk/bulk/build 脚本才可以用于构建一个包含在pkgsrc里面的packages的子集。通过在mk.conf里设置SPECIFIC_PKGS , 这些变量
  • SITE_SPECIFIC_PKGS
  • HOST_SPECIFIC_PKGS
  • GROUP_SPECIFIC_PKGS
  • USER_SPECIFIC_PKGS

将定义构建这套packages中哪些。bulk build代码也会包含那些构建packages列出的依赖包。

这样做的一个好处是让bulk build带有 SPECIFIC_PKGS 定期地运行在一个chroot沙盒里以便构建一整套你所需要的二进制packages而不必花费大量的时间和资源去构建你不需要的额外packages。

7.3.8. 上传一个bulk build的结果
这一小节描述pkgsrc开发者怎样将bulk build构建的二进制pkgs上传至ftp.NetBSD.org

如果你想为自己的上传的二进制packages自动创建checksum文件, 记住在 mk/bulk/build.conf 文件中设定 MKSUMS=yes 。

如果你希望对checksum文件做PGP sign (强烈推荐!), 记住在文件mk/bulk/build.conf里设定 [email protected]。 这将在上传任何文件前提示你输入你的GPG密码以便sign这些文件。

然后, 确认你已在 mk/bulk/build.conf 文件中对 RSYNC_DST 进行了正确的设置 , 也就是将其调整为类似下面的样子:

代码: 全选

RSYNC_DST=ftp.NetBSD.org:/pub/NetBSD/packages/packages-20xxQy/NetBSD-a.b.c/arch/upload 
请使用合适的值替换这里的"packages-20xxQy", "NetBSD-a.b.c" 和 "arch"。 如果你login到ftp.NetBSD.org后发现与你本地的login不同, 直接将你的login写入变量中, 例如,我的本地账号是"feyrer", 但是我login "hubertf", 我用:

代码: 全选

[email protected]:/pub/NetBSD/packages/packages-20xxQy/NetBSD-a.b.c/arch/upload

这里使用一个单独的 upload 目录时为了在上传期间"关闭"这个目录。要这样, 接下来在ftp.NetBSD.org上运行下列命令:

代码: 全选

nbftp% mkdir -p -m 750 /pub/NetBSD/packages/packages-20xxQy/NetBSD-a.b.c/arch/upload
请注意 /pub/NetBSD/packages 是唯一的存放NetBSD操作系统packages的地方。其它操作系统的二进制packages应该放在 /pub/pkgsrc。

在上传二进制pkgs前, 需要先建立ssh认证。这个例子显示了在沙盒里如何为root帐号设置临时的keys (假设通常没有设置keys):

代码: 全选

# chroot /usr/sandbox
chroot-# rm $HOME/.ssh/id-dsa*
chroot-# ssh-keygen -t dsa
chroot-# cat $HOME/.ssh/id-dsa.pub

现在将输出的 id-dsa.pub 附加到ftp.NetBSD.org上你的 ~/.ssh/authorized_keys 文件里。一旦上传结束,你可以删除这个key!

接下来, 测试一下是否你的ssh可以正常工作:

代码: 全选

chroot-# ssh [url=ftp://ftp.NetBSD.org]ftp.NetBSD.org[/URL] date 
视情况而定,可以在这里使用 "-l yourNetBSDlogin" !

下载如果一切正常, 你就可以退出沙盒并开始上传了:

代码: 全选

chroot-# exit
# cd /usr/sandbox/usr/pkgsrc
# sh mk/bulk/do-sandbox-upload

上传过程可能需要很长一段时间。在ftp服务器上使用 ls(1) 或 du(1) 来监视上传进程。上传脚本将处理没有上传限制的packages,并且将有安全隐患的packages放进 vulnerable 子目录内。

上传结束后, 第一件事就是撤销ssh链接:

代码: 全选

nbftp% vi ~/.ssh/authorized_keys
Gdd:x!
用一切可用的方法删除原来生成的key! 最后, 将上传的packages移出 upload 目录以便任何人可以访问它们:

代码: 全选

nbftp% cd /pub/NetBSD/packages/packages-20xxQy/NetBSD-a.b.c/arch
nbftp% mv upload/* .
nbftp% rmdir upload
nbftp% chmod 755

7.4. 运行一个pbulk模式的bulk build
运行一个pbulk-style bulk build 大致分如下步骤:
  • 首先, 在一个全新的pkgsrc位置构建pbulk基础构架。
  • 然后, 用这个基础构架从一个干净的安装目录构建每个package。

7.4.1. 准备
首先, 你需要为pbulk基础构架创建一个pkgsrc安装。 无论你在什么平台上 (即使NetBSD也一样), 你应该bootstrap进它自己的目录。我们选择目录 /usr/pbulk 或在 $HOME/pbulk。这个安装将被bootstrapped,且所有bulk build所需的工具将安装在那里。

代码: 全选

$ cd /usr/pkgsrc
$ ./bootstrap/bootstrap --prefix=/usr/pbulk --varbase=/usr/pbulk/var --workdir=/tmp/pbulk-bootstrap
$ rm -rf /tmp/pbulk-bootstrap

现在pbulk基础构架的基本环境已经搭建完毕。还缺少一些特殊工具。现在正是编辑pkgsrc的配置文件 /usr/pbulk/etc/mk.conf的时候了,要让满足你的需要。一般你需要设置的是:
  • PKG_DEVELOPER=yes, 这样会启用很多一致性检查,
  • WRKOBJDIR=/tmp/pbulk-outer, 保持 /usr/pkgsrc 可以自由修改,
  • DISTDIR=/distfiles, 将所有下载的distfiles放到一个统一的目录里 (为基础构架和实际的 packages),
  • ACCEPTABLE_LICENSES+=..., 选择其它适合自己的可用的自由/开源的许可,
  • SKIP_LICENSE_CHECK=yes, 忽略许可证检查。

现在你准备搭建pbulk基础构架的其余部分了。

代码: 全选

$ cd pkgtools/pbulk
$ /usr/pbulk/bin/bmake install
$ rm -rf /tmp/pbulk-outer

现在pbulk基础构架已经搭建和安装完毕。 它还需要配置一下, 经过一些准备, 我们就可以真正开始bulk build了。

7.4.2. 配置
TODO; see pkgsrc/doc/HOWTO-pbulk for more information.

TODO: continue writing

7.5. 创建多张CD-ROM的packages集合
当你完成pkgsrc的bulk-build后, 可能你想将得到的二进制packages刻录进一组CD-ROM以便在其它的机器上安装。pkgtools/cdpack package是一个生成ISO 9660镜像的简单的工具。cdpack 可以将相互有依赖关系的packages放到同一张CD里。

7.5.1. cdpack使用实例
完整的cdpack文档请参阅其主页。下面的简单例子假设二进制packages在 /usr/pkgsrc/packages/All ,而磁盘空间的全部内容在 /u2,它承载着ISO 9660镜像。

代码: 全选

# mkdir /u2/images
# pkg_add /usr/pkgsrc/packages/All/cdpack
# cdpack /usr/pkgsrc/packages/All /u2/images

如果你想在所有的CD集合上包含通用信息 (COPYRIGHT, README等。), 那么你需要你需要创建一个包含这些文件的目录。例如:

代码: 全选

# mkdir /tmp/common
# echo "This is a README" > /tmp/common/README
# echo "Another file" > /tmp/common/COPYING
# mkdir /tmp/common/bin
# echo "#!/bin/sh" > /tmp/common/bin/myscript
# echo "echo Hello world" >> /tmp/common/bin/myscript
# chmod 755 /tmp/common/bin/myscript

现在创建这个镜像:

代码: 全选

# cdpack -x /tmp/common /usr/pkgsrc/packages/All /u2/images
每个镜像的根目录将包含 README, COPYING, 和 bin/myscript。