3. Portage 之功能特性
3.a. DistCC
何为 DistCC?
distcc 是一个用于在网络上多台无须 (配置) 一样的主机 (not necessarily identical) 间进行分布式编译的程序. distcc 客户端向多台可用的 DistCC 服务器 (运行了 distccd) 发送必要的信息以让它们可以为客户端一份份地编译源码.
您可在我们的 Gentoo DistCC 文档中找到关于 distcc 的详细内容.
安装 DistCC
Distcc 发布时提供了一个图形界面以管理您的机器在编译时所发送的任务. 如果您用的是 Gnome, 请将 'gnome' 标识添加到 USE 设定中. 要是您不使用 Gnome 又想使用这个图形界面的管理器, 请将 'gtk' 标识添加到您的 USE 设定中.
安装 distcc 如同安装 Gentoo Portage 中的其他软件一样容易:
注: 从这里开始, 考虑到您已知道如何安装二进制包, 我们将在 Gentoo 手册余下的内容中忽略掉 --usepkg 这一参数. |
代码清单 1: 安装 DistCC |
# emerge distcc |
下面配置 distcc 以使用 2G 的缓存:
代码清单 2: 设置 distcc |
# ccache -M 2G |
启用 Portage 的支持
既然安装都这么容易, 剩下的 (要做的事) 同样那么简单:) 让我们马上启用 Portage 对 distcc 的支持吧:
首先, 打开 /etc/make.conf 并编辑 FEATURES 变量以加入 distcc 关键字. 然后, 编辑 MAKEOPTS 变量为 -jX 形式, 其中 X 的值为运行了 distccd (包括当前主机) 的 CPU 的个数加一:
代码清单 3: /etc/make.conf 中可设置的 MAKEOPTS |
# 假设您除了本机之外还有两个单 CPU 的 distccd 主机: MAKEOPTS="-j4" |
下面运行 distcc-config 并输入可用的 DistCC 服务器列表. 我们举个简单的例子, 假设可用的 DistCC 服务器分别为 192.168.1.102 (当前的主机), 192.168.1.103 和 192.168.1.104 (另两台 "远程" 主机):
代码清单 4: 配置 distcc 以使用三台可用的 DistCC 服务器 |
# distcc-config --set-hosts "192.168.1.102 192.168.1.103 192.168.1.104" |
当然, 记得启动 distccd 守护进程:
代码清单 5: 启动 distcc 守护进程 |
# /etc/init.d/distccd start |
恭喜, 您的系统现在能使用分布式编译了! 要了解更多 DistCC 与 Gentoo 的内容, 请阅读我们的 Gentoo DistCC 文档.
3.b. ccache
何为 ccache?
ccache 是一个快速的编译器缓存. 在您编译一个程序的时候, 它可以对中间结果 (intermediate results) 进行缓存, 于是, 下一次再编译同一程序时, 编译时间将大大缩短. 普通编译中, 这将让编译速度提高 5 到 10 倍 (In common compilations this can result in 5 to 10 times faster compilation times).
您要对 ccache 的运作原理感兴趣 (ins and outs of ccache), 请参看 ccache 的主页.
安装 ccache
在 Gentoo 上安装 ccache 轻松得有如清风拂面. emerge 一下就搞定 :)
代码清单 6: 安装 ccache |
# emerge ccache |
调节 ccache
Portage 一旦发现安装了 ccache 就会自动地使用它. 不过呢, 您可以通过在 /etc/make.conf 文件中提供一个 CCACHE_SIZE 变量以改变 ccache 默认所使用的缓存大小.
代码清单 7: 编辑 /etc/make.conf 中的 CCACHE_SIZE |
CCACHE_SIZE="2G" |
至此, Portage 将在可能之处都使用 ccache 来为编译提速. 您要是不清楚 ccache 是否运作, 则可通过运行 ccache -s 以查看 ccache 的统计数据:
代码清单 8: 查看 ccache 统计数据 |
# ccache -s |
把 ccache 用于非 Portage 的 C 编译 (Using ccache for non-Portage C compiling)
您要想把 ccache 用于非 Portage 的编译中 (Cure: 也就是用在 Portage 管理之外的, 自己手动编译软件包的情况下), 请将 /usr/lib/ccache/bin 添加到您的 PATH 变量的开头 (在 /usr/bin 之前). 我们通过编辑 /etc/env.d/00basic 来完成这事:
代码清单 9: 编辑 00basic |
# nano -w /etc/env.d/00basic # env-update && source /etc/profile |
3.c. 二进制包
创建二进制包
我们已讨论过如何使用预编译包, 那么, 怎样才能创建自己的预编译包呢?
如果一个软件包已经安装到系统里了, 您可以使用 quickpkg 命令来将它打成一个 tar 压缩包. 这用于备份将非常有趣:
代码清单 10: 使用 quickpkg |
# quickpkg gnumeric |
要是软件包尚未安装, 您可以用 emerge 安装它并创建一个二进制包. emerge 中使用 --buildpkg 参数 (可简化为 -b):
代码清单 11: 安装 gnumeric 并创建其二进制包 |
# emerge --buildpkg gnumeric |
您要想让 Portage 默认就这么做, 就把 buildpkg 关键字添加到 /etc/make.conf 中声明的 FEATURE 变量中:
代码清单 12: 自动创建二进制包 |
FEATURES="buildpkg" |
您要是仅仅想创建一个二进制包而不打算安装它, 则使用 --buildpkgonly 参数 (可简写成 -B):
代码清单 13: 创建 gnumeric 的二进制包 |
# emerge --buildpkgonly gnumeric |
3.d. 安全相关特性
沙箱 (Sandbox)
编译和安装软件包时, Portage 使用一个 沙箱 (sandbox) 来保护您当前的系统. 这意味着, 只要一个软件包还没往系统上安装完毕, 它就不能碰沙箱之外的任何文件. 这保证了 Portage 对一个软件包究竟创建和修改了那些文件了如指掌.
用户权限
Portage 同样支持非 root 用户 (准确而言, 用户 "portage", 或 "portage" 组中的用户) 安装软件包. 这提升了安装过程中的安全性. 您可以选择要/不要沙箱支持的用户权限 (You can opt to use user privileges with or without sandboxing). 自然, 这不是说用户权限和沙箱管理就是最好的方法:) (Of course, it goes without saying that user privileges and sandboxing is the most preferred method)
启用 sandbox 与/或 userpriv
Portage 默认使用 sandbox. 如果您要 userpriv, 就把它添加到 FEATURES 变量中. 请留意, 启用 userpriv 将禁用 sandbox 支持, 除非您也启用了 usersandbox:
代码清单 14: 启用 userpriv 与 usersandbox |
FEATURES="userpriv usersandbox" |
敬告: 切记不要从 FEATURES 变量中移去 sandbox! |
严格检查
Portage 可以对一些可能非常危险的情况 (如缺少 Manifest 文件或这些文件不正确) 作出强力回应 (react strongly). 要启用这一严格的检查, 请将 strict 关键字添加到 FEATURES 变量中:
代码清单 15: 启用严格检查 |
FEATURES="strict" |
聪明的文件系统许可 (Smart File System Permissions)
Portage 可对潜在的会带来安全风险的文件权限进行处理. 它是通过预安装阶段中, 在对文件进行 setuid 时移去 "group (组)" 和 "other (其他)" 用户可读位 (readable bits), 以及在对文件进行 setgid 时移去 "other (其他)" 用户可读位来完成的. 要启用 smart file permissions, 请将 sfperms 关键字添加到 FEATURES 变量中:
代码清单 16: 启用聪明的文件许可 |
FEATURES="sfperms" |
3.e. 其他特性
Portage 之帮助
还有数个关键字可以添加到 FEATURES 变量中. 它们大部分是面向开发人员的, 对于普通用户而言可能没什么兴趣需要知道. 如果您对这些特性很感兴趣并想了解更多 (包括 Portage), 请阅读我们提供的 make.conf 的手册:
代码清单 17: 更多的 Portage 相关信息 |
# man make.conf |