openMosix HOWTO

Live free() or die()

Kris Buytaert

and Others

修订历史
修订版 v1.0.32004 年 6 月 18 日
小修复
修订版 v1.0.22003 年 7 月 29 日
RPM 构建
修订版 v1.0.12003 年 7 月 19 日
重大更新
修订版 v1.02003 年 7 月 9 日
小更新
修订版 v1.02003 年 5 月 11 日
终于
修订版 v1.0 RC 12003 年 5 月 7 日
重大清理
修订版 v0.952003 年 4 月 4 日
用 PlumpOS 替换 ClumpOS
修订版 v0.942003 年 2 月 25 日
Mirko Caserta 的补丁
修订版 v0.932003 年 2 月 16 日
额外功能和修复
修订版 v0.922003 年 1 月 21 日
修订版 v0.912002 年 9 月 27 日
修订版 v0.902002 年 9 月 3 日
修订版 v0.712002 年 8 月 26 日
Spleling Fexis
修订版 v0.702002 年 8 月 22 日
删除空部分,用 openMosixView 替换 Mosixview
修订版 v0.502002 年 7 月 6 日
第一个 openMosix HOWTO
修订版 v0.202002 年 7 月 5 日
最新的 Mosix HOWTO(目前为止)
修订版 v0.172002 年 6 月 28 日
修订版 v0.152002 年 3 月 13 日
修订版 v0.132002 年 2 月 18 日
修订版 ALPHA 0.032001 年 10 月 9 日

“熟悉一个主题的最佳方式是写一本关于它的书。” (本杰明·迪斯雷利)


目录
I. 引言
1. 引言
2. 那么 openMosix 到底是什么呢?
II. 安装 openMosix
3. 需求和规划
4. 特定于发行版的安装
5. 自动发现
6. PlumpOS
7. 集群安装
III. 管理 openMosix
8. 管理 openMosix
9. 调整 Mosix
10. openMosixview
11. 其他与 openMosix 相关的程序
12. 常见问题
13. 提示和技巧
14. (压力)测试您的 openMosix 安装
IV. 在 openMosix 上运行应用程序
15. 提高编译性能
16. 使用 openMosix 进行映像处理
17. 生物信息学和 openMosix
V. openMosix 开发
18. openMosix 内部原理入门
VI. FAQ
19. openMosix FAQ
20. PlumpOS FAQ
A. 如何生成 openMosix 的内核 RPM 文件
A.1. 如何生成 openMosix 的内核 RPM 文件
B. 更多信息
B.1. irc
B.2. 延伸阅读
B.3. 翻译
B.4. 链接
B.5. 邮件列表
C. 鸣谢
D. GNU 自由文档许可证
0. 序言
1. 适用性和定义
2. 逐字复制
3. 批量复制
4. 修改
5. 合并文档
6. 文档集合
7. 与独立作品的聚合
8. 翻译
9. 终止
10. 本许可证的未来修订
如何将本许可证用于您的文档
索引
表格列表
表 2-1. openMosix 的优点
表 2-2. openMosix 的缺点
表 4-1. 其他目录
表 8-1. 更改 /proc/hpc 参数
表 8-2. /proc/hpc/admin/
表 8-3. 将 1 写入以下文件 /proc/hpc/decay/
表 8-4. 关于其他节点的信息
表 8-5. 关于本地进程的附加信息
表 8-6. 更详细
表 8-7. mosrun 的额外选项
表 10-1. 如何启动

第 1 章 引言

1.1. openMosix HOWTO

起初有 Mosix,然后出现了 openMosix,在我看来这是一个更有趣的项目。不仅从技术角度来看,而且还因为更正确的许可证。我决定将本 HOWTO 的重点放在 openMosix 而不是 Mosix 上,这主要是基于 openMosix 拥有更大的用户群这一事实。(Moshe Bar 表示,大约 97% 的旧 Mosix 社区已切换到 openMosix。)(20020705) 鉴于上述情况,许多信息可能对 Mosix 和 openMosix 的用户都有价值。我决定拆分 HOWTO。Mosix HOWTO 的最新版本,包含关于 Mosix 和 OpenMosix 的信息将是 0.20 我打算专注于 openMosix HOWTO,但不会忽略 Mosix 用户。更多信息请访问 http://howto.ipng.be/Mosix-HOWTO/


1.2. 引言

本文档简要描述了 openMosix,这是一种将 GNU/Linux 计算机网络变成计算机集群的软件包。在此过程中,给出了一些并行处理的背景知识,以及对专门利用 openMosix 功能的程序的简要介绍。HOWTO 扩展了文档,因为它提供了更多的背景信息,并讨论了各种发行版本的怪癖。

自从创建本 HOWTO 以来,Mosix 团队的一些人创建了 openMosix(稍后会详细介绍),最初本 HOWTO 讨论了 openMosix 和 Mosix。尽管许多信息可能对 Mosix 和 openMosix 的用户都有价值。我决定拆分 HOWTO。Mosix HOWTO 的最新版本,包含关于 Mosix 和 OpenMosix 的信息将是 0.20,可以在 http://howto.ipng.be/Mosix-HOWTO/Mosix-HOWTO/ 上找到。

当 Scot Stevenson 正在寻找人接手这项工作时,Kris Buytaert 参与了这项工作:那是 2002 年 2 月。虽然最初我们讨论了 Mosix 和 openMosix,但现在这个版本的 HOWTO 主要关注 openMosix。请注意,文档经常仍然提到 Mosix,但应该理解为 openMosix。

您会注意到,一些标题不如它们应该的那样严肃。Scot 计划以稍微轻松的风格编写 HOWTO,因为世界(甚至是以打嗝的企鹅作为吉祥物的那部分世界)充满了致命的技术文献。因此,某些部分仍然有这些评论。


1.3. 免责声明

使用本文档中的信息,风险自负。我对本文档的内容不承担潜在责任。使用本文档的概念、示例和/或其他内容完全由您自行承担风险。

所有版权归其各自所有者所有,除非另有说明。在本文档中使用术语不应被视为影响任何商标或服务标志的有效性。openMosix 的版权归 Moshe Bar 所有。(c) Mosix 的版权归 Amnon Barak 所有。(c) Linux 是 Linus Torvalds 的注册商标。openMosix 已根据自由软件基金会发布的 GNU 通用公共许可证第 2 版获得许可。

特定产品或品牌的命名不应被视为认可。

强烈建议您在进行重大安装之前备份您的系统,并定期备份。


1.4. 分发政策

版权所有 (c) 2002 Kris Buytaert 和 Scot W. Stevenson。本文档可以根据自由软件基金会发布的 GNU 自由文档许可证 1.1 版或任何更高版本的条款分发;没有不变章节,没有封面文本,也没有封底文本。许可证的副本包含在题为“GNU 自由文档许可证”的附录中。


1.5. 本文档的新版本

本文档的官方新版本可以在 Linux 文档项目 的网页上找到。草稿和 Beta 版本将在 howto.ipng.be 的相应子文件夹中提供。本文档的更改通常将在 openMosix 邮件列表中讨论。有关详细信息,请参阅 openMosix


1.6. 反馈

目前,本 HOWTO 由 Kris Buytaert 维护。请将关于 howto 的评论和更新发送给他。

如果您有关于 openMosix/Mosix 本身的技术问题,请将它们发布到更合适的邮件列表中。


第 2 章 那么 openMosix 到底是什么呢?

2.1. 集群的非常非常简短的介绍

大多数时候,您的计算机都很无聊。启动一个像 xload 或 top 这样的程序来监控您的系统使用情况,您可能会发现您的处理器负载甚至没有达到 1.0 标记。如果您有两台或多台计算机,则在任何给定时间,很可能至少其中一台计算机什么也不做。不幸的是,当您真正需要 CPU 功率时——在 C++ 编译期间,或编码 Ogg Vorbis 音乐文件时——您需要大量的 CPU 功率一次。集群背后的想法是将这些负载分散到所有可用的计算机上,利用其他机器上的空闲资源。

集群的基本单元是单台计算机,也称为“节点”。集群可以通过添加更多机器来扩展规模——它们可以“扩展”。整个集群的功能将随着单个计算机的速度和它们的连接速度的提高而变得更加强大。此外,集群的操作系统必须根据不断变化的条件,最好地利用可用的硬件。如果集群由不同的硬件类型(“异构”集群)组成,如果集群的配置不可预测地变化(机器加入和离开集群),并且负载无法提前预测,这将变得更具挑战性。


2.1.1. 集群的非常非常简短的介绍

2.1.1.1. HPC 与故障转移与负载均衡

基本上有 3 种类型的集群,故障转移、负载均衡和高性能计算,最常用的可能是故障转移集群和负载均衡集群。

  • 故障转移集群 由 2 台或多台网络连接的计算机组成,2 台主机之间具有单独的心跳连接。2 台机器之间的心跳连接用于监控所有服务是否仍在运行:一旦一台机器上的服务崩溃,其他机器将尝试接管。

  • 对于负载均衡集群,概念是当收到例如 Web 服务器的请求时,集群会检查哪台机器最不繁忙,然后将请求发送到该机器。实际上,大多数时候负载均衡集群也是故障转移集群,但具有额外的负载均衡功能,并且通常具有更多节点。

  • 集群的最后一种变体是高性能计算集群:机器经过特殊配置,可以为需要极致性能的数据中心提供他们所需的功能。Beowulfs 的开发专门为研究机构提供他们所需的计算速度。这类集群也具有一些负载均衡功能;他们尝试将不同的进程分散到更多的机器上,以提高性能。但在这种情况下,主要归结为进程被并行化,并且可以单独运行的例程将被分散在不同的机器上,而不是必须等到它们一个接一个地完成。

负载均衡和故障转移集群最常见的已知示例是 Web 场、数据库或防火墙。人们希望他们的服务具有 99.99999% 的正常运行时间,互联网 24/24 7/7/ 365/365 全天候开放,不像过去办公室关门时您可以关闭服务器。

需要 CPU 周期的人通常可以负担得起安排其环境的停机时间,只要他们可以在需要时使用机器的最大功率。


2.1.1.2. 超级计算机与集群

传统上,超级计算机仅由少数精选的供应商构建:需要此类机器性能的公司或组织必须拥有巨额预算才能购买超级计算机。许多大学自己负担不起超级计算机的成本,因此他们正在研究其他替代方案。当人们第一次尝试将不同的作业分散到更多计算机上,然后收集回这些作业产生的数据时,集群的概念就诞生了。随着更便宜和更常见的硬件可供所有人使用,在最初几年,只有梦想才能获得与真正的超级计算机相似的结果,但随着 PC 平台的进一步发展,超级计算机与多台个人计算机集群之间的性能差距变得越来越小。


2.1.1.3. 集群模型 [(N)UMA, PVM/MPI]

有不同的并行处理方法:(N)UMA、DSM、PVM 和 MPI 都是不同类型的并行处理方案。其中一些在硬件中实现,另一些在软件中实现,另一些则两者兼而有之。

(N)UMA((非)统一内存访问),例如,机器可以共享访问内存,它们可以在其中执行代码。在 Linux 内核中,有一个 NUMA 实现,它改变了不同内存区域的内存访问时间。然后,内核的任务是使用最接近其正在使用的 CPU 的内存。

DSM 又名分布式共享内存,已在软件和硬件中实现,其概念是为物理分布式内存提供一个抽象层。

当人们谈论基于 GNU/Linux 的 Beowulfs 时,PVM 和 MPI 是最常用的工具。

MPI 代表消息传递接口。它是消息传递库的开放标准规范。MPICH 是 MPI 最常用的实现之一。除了 MPICH 之外,您还可以找到 LAM,它是 MPI 的另一个实现,基于库的免费参考实现。

PVM 或并行虚拟机是 MPI 的另一个同类产品,它也经常被用作创建 Beowulf 的工具。PVM 存在于用户空间中,因此不需要特殊的内核修改:基本上,每个具有足够权限的用户都可以运行 PVM。


2.1.1.4. openMosix 的作用

openMosix 软件包将运行 GNU/Linux 的联网计算机变成一个集群。它可以自动平衡集群不同节点之间的负载,并且节点可以加入或离开正在运行的集群,而不会中断服务。负载根据节点的连接和 CPU 速度在节点之间分散。

由于 openMosix 是内核的一部分,并且与 Linux 保持完全兼容性,因此用户的程序、文件和其他资源都将像以前一样工作,而无需进行任何进一步的更改。普通用户不会注意到 Linux 系统和 openMosix 系统之间的区别。对她来说,整个集群将像一个(快速的)GNU/Linux 系统一样运行。

openMosix 是一个 Linux 内核补丁,它为 IA32 兼容平台提供与标准 Linux 的完全兼容性。内部负载均衡算法透明地将进程迁移到其他集群成员。优点是节点之间更好的负载共享。集群本身会尝试随时优化利用率(当然,系统管理员可以在运行时通过手动配置来影响自动负载均衡)。

这种透明的进程迁移功能使整个集群看起来像一个大型 SMP 系统,其处理器数量与可用的集群节点一样多(当然,对于双/四核系统等 X 处理器系统,数量乘以 X)。openMosix 还为 HPC 应用程序提供了一个强大的优化文件系统 (oMFS),与 NFS 不同,它提供了缓存、时间戳和链接一致性。


2.2. 故事到目前为止

2.2.1. 历史发展

传闻说 Mosix 来自 Moshe Unix。最初,Mosix 是作为在 BSD/OS 3.0 上运行的应用程序开始的。

Announcing MO6 for BSD/OS 3.0
Oren Laadan (orenl@cs.huji.ac.il)
Tue, 9 Sep 1997 19:50:12 +0300 (IDT)

Hi:

We are pleased to announce the availability of MO6 Version 3.0
Release 1.04 (beta-4) - compatible with BSD/OS 3.0, patch level
K300-001 through M300-029.

MO6 is a 6 processor version of the MOSIX multicomputer enhancements
of BSD/OS for a PC Cluster. If you have 2 to 6 PC's connected by a
LAN, you can experience truly multi-computing environment by using
the MO6 enhancements.

The MO6 Distribution
--------------------
MO6 is available either in "source" or "binary" distribution. It is
installed as a patch to BSD/OS, using an interactive installation
script.

MO6 is available at http://www.cnds.jhu.edu/mirrors/mosix/
or at our site: http://www.cs.huji.ac.il/mosix/

Main highlights of the current release:
--------------------------------------
- Memory ushering (depletion prevention) by process migration.
- Improved installation procedure.
- Enhanced migration control.
- Improved administration tools.
- More user utilities.
- More documentation and new man pages.
- Dynamic configurations.

Please send feedback and comments to mosix@cs.huji.ac.il.
-------------------
GNU/Linux 被选为 1999 年第 7 次迭代的开发平台。1999 年初,Mosix M06 Beta 发布用于 Linux 2.2.1。在 2001 年底和 2002 年初,openMosix,Mosix 的开放版本诞生了(更多内容见下一段)。


2.2.2. openMosix

openMosix 是对您在 mosix.org 上找到的任何内容的补充,并且充分赞赏和尊重 Barak 教授在杰出的 Mosix 项目中的领导地位。

Moshe Bar 多年来一直参与 Mosix 项目 (www.mosix.com),并且是 Mosix 项目的联合项目经理和商业 Mosix 公司的总经理。

在对 Mosix 的商业未来持有不同意见之后,他创立了一家新的集群公司 - Qlusters, Inc. - Barak 教授决定暂时不参与这项风险投资(尽管他确实认真考虑过加入),并与投资者进行了长期谈判。看来 Mosix 不再作为 GPL 项目公开支持。由于那里存在大量用户群(全球约 1000 个安装),Moshe Bar 决定以新名称 openMosix 并在完整的 GPL2 许可下继续 Mosix 项目的开发和支持。openMosix 中来自旧 Mosix 项目的任何代码的版权归 Amnon Barak 所有,2002 年所有新代码的版权归 Moshe Bar 所有,2002 年。

未来的 openMosix 版本的架构可能会(并且将会)发生重大变化。关于自动配置、节点发现和新的用户空间工具的新概念正在 openMosix 邮件列表中讨论。大多数新功能已经实现,而其中一些功能(例如 DSM(分布式共享内存))在我撰写本文时(2003 年 3 月)仍在开发中。

为了实现标准化和未来的兼容性,proc 接口已从 /proc/mosix 更改为 /proc/hpc,/etc/mosix.map 已更改为 /etc/hpc.map。最近,配置文件的标准已设置为位于 /etc/openmosix.map 中(实际上这是 /etc/init.d/openmosix 脚本将查找的第一个配置文件)。适用于 openMosix 的改编的命令行用户空间工具已在项目的网页上提供。

openmosix.map 配置文件可以替换为节点自动发现系统,该系统称为 omdiscd(openMosix 自动发现守护程序),我们稍后将对此进行讨论。

openMosix 得到了世界各地各种有能力的人员(参见 openmosix.sourceforge.net)的共同支持。该项目的主要目标是为各种 HPC 应用程序创建一个标准化的集群环境。

openMosix 在 http://openMosix.sourceforge.net 还有一个项目网页,其中包含 CVS 树和面向开发人员和用户的邮件列表。


2.2.3. 当前状态

像大多数活跃的开源程序一样,openMosix 的变化速度往往超过追随者保持文档更新的能力。

当我在 2003 年 2 月撰写本文时,openMosix 2.4.20 和 openMosix Userland Tools v0.2.4 已发布,包括新的自动发现工具。

有关最新的开发状态,请查看 openMosix 网站


2.2.4. 哪些应用程序有效

几乎不可能列出所有与 openMosix 配合使用的应用程序。但是,社区会尝试跟踪 迁移 的应用程序和 不迁移 的应用程序。


2.3. openMosix 运行示例:一个例子

openMosix 集群可以采用各种形式。为了演示这一点,让我们假设您是一名学生,与一位富有的计算机科学专业的家伙合租一间宿舍,您们已将计算机连接起来形成一个 openMosix 集群。让我们还假设您目前正在将 CD 中的音乐文件转换为 Ogg Vorbis 以供个人使用,这在您的国家/地区是合法的。您的室友正在做一个 C++ 项目,他说这将带来世界和平。然而,就在此时此刻,他正在浴室里做一些不可描述的事情,他的电脑处于空闲状态。

因此,当您启动像 bladeenc 这样的程序将巴赫的 .... 从 .wav 转换为 .ogg 格式时,您机器上的 openMosix 例程会比较两个节点上的负载,并决定如果将该进程从您的 Pentium-233 发送到他的 Athlon XP,事情会更快。这种情况会自动发生:您只需像在独立机器上一样键入或单击命令。您注意到的只是,当您启动另外两个编码运行时,事情会快得多,并且响应时间不会下降。

现在当您仍在输入 .... 时,您的室友回来了,嘟囔着一些关于自助餐厅食物中的红辣椒的事情。他继续他的测试,使用一个名为“pmake”的程序,这是一个针对并行执行优化的“make”版本。无论他在做什么,它都会占用如此多的 CPU 时间,以至于 openMosix 甚至开始将子进程发送到您的机器以平衡负载。

这种设置称为 *单池*:所有计算机都用作单个集群。这样做的好处/坏处是您的计算机是池的一部分:您的东西将在其他计算机上运行,但他们的东西也将在您的计算机上运行。


2.4. 组件

2.4.1. 进程迁移

使用 openMosix,您可以在一台机器上启动一个进程,并发现它实际上在集群中的另一台机器上运行。每个进程都有自己的唯一宿主节点 (UHN),它在其中创建。

迁移意味着进程被拆分为 2 个部分,用户部分和系统部分。用户部分将被移动到远程节点,而系统部分将保留在 UHN 上。这个系统部分有时被称为代理进程:这个进程负责解析大多数系统调用。

openMosix 负责这两个进程之间的通信。


2.4.2. openMosix 文件系统 (oMFS)

oMFS 是 openMosix 的一个功能,它允许您访问集群中的远程文件系统,就像它们是本地挂载的一样。您的其他节点的文件系统可以挂载在 /mfs 上,例如,您将在每台机器的 /mfs/3/home 中找到节点 3 上 /home 中的文件。


2.4.3. 直接文件系统访问 (DFSA)

Mosix 和 openMosix 都提供了一个集群范围的文件系统 (MFS),带有 DFSA 选项(直接文件系统访问)。它提供对 Mosix 或 openMosix 集群中节点的所有本地和远程文件系统的访问。


2.5. openMosix 试驾

为了支持 openMosix,Major Chai Mee Joon 正在为 OM 用户提供免费试用帐户,以访问他的在线 openMosix 集群服务,用户可以使用该服务来测试和实验 openMosix。

这种在线 openMosix 集群服务的可用性将帮助新用户克服最初的 openMosix 配置问题,并为正在开发或移植其应用程序的 openMosix 用户提供更高的计算能力。

请发送电子邮件至以获取试用帐户。


2.6. openMosix 的优点

表 2-1. openMosix 的优点

无需额外的软件包。
无需对您的应用程序进行代码更改。
安装/配置简单。
在基于 Red-Hat 的系统/发行版上,安装 openMosix 就像键入以下内容一样简单:# rpm -Uvh openMosix*.rpm
DSM 即将发布(2003 年 3 月下旬)。
与 openAFS 良好集成。
正在进行向 IA-64 以及 AMD-64 的移植。
自普通 MFS 以来,oMFS 已得到很大改进。
它是一个集群平台,其上有超过 10 种产品:openMosixView、openMosixWebView、openMosixApplet、RxLinux、PlumpOS、K12LTSP、LTSP 和许多其他产品。
openMosix 是用户自己开发的产品,因此从定义上来说更贴近用户。
节点自动发现/故障转移守护程序已通过多播消息传递在用户空间工具中实现。
具有多个接口的主机的别名。
基本路由可用(在不需要真正多播路由的罕见情况下)。
集群掩码允许指定给定进程可以迁移到哪些节点。


2.7. openMosix 的缺点

表 2-2. openMosix 的缺点

依赖于内核。
共享内存问题(DSM 的 alpha 版本应在 2003 年 3 月下旬发布)。
多线程未获得性能的问题。
当在 openMosix 集群上运行单个进程(例如您的 Web 浏览器)时,您不会获得性能提升:该进程不会自行分散到集群中。当然,除非您的进程将迁移到性能更高的机器。


第 3 章 需求和规划

3.1. 硬件要求

安装基本集群至少需要 2 台网络连接的机器,可以使用两张网卡之间的交叉电缆,也可以使用交换机或集线器(交换机比集线器好得多,而且只贵几美元)。当然,您的网卡速度越快,您的集群就越容易获得更好的性能。

如今,快速以太网 (100 Mbps) 已成为标准;在一台机器中安装多个端口并不困难,但请确保通过其他物理网络连接它们,以便获得您想要的速度。千兆以太网现在每天都在变得更便宜,但我建议您在实际使用多张 100Mbit 网卡测试您的设置并注意到您确实需要额外的网络容量之前,不要急于去商店花钱。除了安装千兆网卡外,您可能还想尝试将不同的 100Mbit 网卡绑定在一起。在 本文 中讨论了 Firewire,它可以找到更便宜的替代方案。


3.2. 硬件设置指南

设置大型集群需要进行一些思考:您打算将机器放在哪里?我希望不是放在桌子下的某个地方或办公室的中间!如果您只是想进行一些小型测试,那还可以,但如果您计划部署 N 节点集群,则必须确保容纳这些机器的环境能够做到这一点。

我指的是准备一个或多个 19 英寸机架来容纳机器,配置适当的网络拓扑,可以是直连、单连接,甚至是所有节点之间 1 对 1 的交叉连接网络。您还需要确保有足够的电力来支持如此多的机器,您的空调系统支持负载,并且在电源故障的情况下,您的 UPS 可以干净地关闭所有必需的系统。您可能需要投资 KVM(键盘、视频、鼠标)切换器,以便于访问机器的控制台。

但即使您没有足够数量的节点来证明这种投资是合理的,也要确保您可以随时轻松访问不同的节点,您永远不知道什么时候必须更换 CPU 风扇或出现故障的机器的硬盘。如果这意味着您必须卸下一堆机器才能到达最底层的机器,从而关闭您的集群,那么您就麻烦了。


3.3. 软件要求

我们计划使用的系统将需要您选择的基本 Linux 安装:Red Hat、SuSe、Debian、Gentoo 或任何其他发行版:具体是哪个发行版并不重要。重要的是内核至少达到 2.4 级别,并且您的网卡配置正确;除此之外,您还需要健康的交换空间。


3.4. 规划您的集群

当涉及到使用服务器池和一组(个人)工作站配置 openMosix 集群时,您有不同的选择,这些选择各有优缺点。

  • 单池配置中,所有服务器和工作站都用作单个集群:每台机器都是集群的一部分,并且可以将进程迁移到彼此现有的节点。这当然使您的工作站成为池的一部分。

  • 在称为服务器池的环境中,服务器是集群的一部分,而工作站不是集群的一部分,它们甚至没有 openMosix 内核。如果您想在集群上运行应用程序,您需要专门登录到这些服务器。但是,您的工作站也将保持干净,并且不会有远程进程迁移到它。

  • 第三种替代方案称为自适应池配置:这里服务器是共享的,而工作站加入或离开集群。想象一下您的工作站白天供您自己使用,但是,一旦您在晚上注销,脚本会告诉工作站加入集群并开始处理数字。这样,您的机器在您不需要时就会被使用。如果您再次需要机器的资源,只需运行 openmosix stop 脚本,您的进程将远离集群,反之亦然。

    实际上,这意味着您将通过使用 mosctl 更改机器的角色。


3.5. 教室

虽然晚上将您的教室转换为 openMosix 集群似乎是个好主意,但您必须考虑培训您的最终用户不要在他们想再次使用这些机器时拔掉这些机器的电源开关。较新的机器支持在按下电源按钮时自动关机,但对于较旧的机器,当实际发生这种情况时,您可能会丢失一些数据。


第 4 章 特定于发行版的安装

4.1. 安装 openMosix

本章介绍如何在不同的发行版上安装 openMosix。这不会是所有可能组合的详尽列表。但是,在整章中,您应该找到足够的信息来在您的环境中安装 openMosix。

关于使用 openMosix 安装多台机器的技术将在接下来的章节中讨论。


4.2. 获取 openMosix 之前

首先,您必须了解 openMosix 由内核补丁和一些用户空间工具组成。内核补丁是使内核能够与网络上其他启用 openMosix 的机器通信所必需的。如果您以二进制包(例如 rpm 文件)的形式下载 openMosix,您甚至不需要关心内核补丁,因为内核已经过修补和编译,并为您提供了最常见的默认选项和模块。

为了有效使用启用 openMosix 的内核,需要用户空间工具。它们用于启动/停止迁移守护进程、openMosix 文件系统、将作业迁移到特定节点以及其他通常借助我们老朋友:命令行界面完成的任务。关于二进制包:与内核补丁的情况相同,用户空间工具也是如此:如果您安装 rpm,则无需担心编译或配置任何内容;只需让它们安装并运行。就是这样。真的 :)

一旦您进入下载页面(我们将在稍后讨论),您需要获取两个不同的部分:内核和用户空间工具。您可以下载两个二进制包,也可以获取内核补丁和用户空间工具的源代码。内核补丁通常以以下方案命名:openMosix-x.y.z-w,其中 x.y.z 是应该应用补丁的 vanilla Linux 内核的版本,w 是该特定内核版本的补丁修订号。对于预编译的内核二进制文件,请参阅您在下载页面中找到的 README-openMosix-kernel.txt 文件。该文件还包含有关手动编译内核的最新信息。

关于用户空间工具:您将在名为 openmosix-tools 的软件包中找到它们。我们互换使用术语用户空间工具、userspace-tools 和 openmosix-tools。有关预编译二进制文件和手动编译工具的最新信息也包含在 README-openmosix-tools.txt 文件中。请注意,自 openmosix-tools 的 0.3 版本以来,openmosix.map 文件已被弃用,强烈建议使用自动发现守护进程,因为它往往会让您的生活更轻松。


4.3. 获取 openMosix

您可以从 http://sourceforge.net/project/showfiles.php?group_id=46729 下载最新版本的 openMosix。您可以选择为 UP 或 SMP 编译的二进制文件(甚至是 rpm),也可以下载源代码。您将需要内核补丁或二进制文件以及用户空间工具。或者,您可以获取 CVS 版本

cvs -d:pserver:anonymous@cvs.openmosix.sourceforge.net:/cvsroot/openmosix login
cvs -z3 -d:pserver:anonymous@cvs.openmosix.sourceforge.net:/cvsroot/openmosix co linux-openmosix
cvs -z3 -d:pserver:anonymous@cvs.openmosix.sourceforge.net:/cvsroot/openmosix co userspace-tools
在密码提示符下,只需键入回车,因为您正在进行匿名登录。请注意,CVS 树有时会崩溃,这可能不是安装 openMosix 的最简单方法 ;-)


4.4. openMosix 通用说明

4.4.1. 内核编译

始终使用来自 https://linuxkernel.org.cn/ 的纯 vanilla 内核源代码来编译 openMosix 内核!请尽量使用离您较近的镜像下载内核,并始终尝试下载您已拥有的最新内核源代码的补丁,而不是下载整个源代码。Linux 社区将非常感谢这样做,并且会大大增加您的极客声誉 ;-) 请务必使用正确的 openMosix 补丁,具体取决于内核版本。在我写这篇文章时,最新的 2.4 内核是 2.4.20,因此您应该下载 openMosix-2.4.20-x.gz 补丁,其中“x”代表补丁修订号(即:修订号越大,它就越新)。不要使用任何 Linux 发行版附带的内核:它行不通。这些内核源代码被发行版制作者大量修补,因此,将 openMosix 补丁应用于这样的内核肯定会失败!我经历过,相信我 ;-)

下载实际版本的 openMosix 补丁,并将其移动到您的内核源代码目录中(例如 /usr/src/linux-2.4.20)。如果您的内核源代码目录不是“/usr/src/linux-[version_number]”,则至少需要创建到“/usr/src/linux-[version_number]”的符号链接。假设您是 root 用户,并且已将 gzipped 补丁文件下载到您的主目录中,请使用(猜猜是什么?)patch 实用程序应用补丁

mv /root/openMosix-2.4.20-2.gz /usr/src/linux-2.4.20
cd /usr/src/linux-2.4.20
zcat openMosix-2.4.20-2.gz | patch -Np1
在极少数情况下,您的系统上没有“zcat”,请执行
mv /root/openMosix-2.4.20-2.gz /usr/src/linux-2.4.20
cd /usr/src/linux-2.4.20
gunzip openMosix-2.4.20-2.gz
cat openMosix-2.4.20-2 | patch -Np1
如果您更奇怪的情况是您的系统上没有“cat”(!),请执行
mv /root/openMosix-2.4.20-2.gz /usr/src/linux-2.4.20
cd /usr/src/linux-2.4.20
gunzip openMosix-2.4.20-2.gz
patch -Np1 < openMosix-2.4.20-2
“patch”命令现在应该显示内核源代码中已修补文件的列表。如果您感觉足够冒险,请在内核配置文件中启用与 openMosix 相关的选项,例如
...
CONFIG_MOSIX=y
# CONFIG_MOSIX_TOPOLOGY is not set
CONFIG_MOSIX_UDB=y
# CONFIG_MOSIX_DEBUG is not set
# CONFIG_MOSIX_CHEAT_MIGSELF is not set
CONFIG_MOSIX_WEEEEEEEEE=y
CONFIG_MOSIX_DIAG=y
CONFIG_MOSIX_SECUREPORTS=y
CONFIG_MOSIX_DISCLOSURE=3
CONFIG_QKERNEL_EXT=y
CONFIG_MOSIX_DFSA=y
CONFIG_MOSIX_FS=y
CONFIG_MOSIX_PIPE_EXCEPTIONS=y
CONFIG_QOS_JID=y
...
但是,如果您使用 Linux 内核配置工具之一配置上述选项,将会容易得多
make config | menuconfig | xconfig
以上意味着您必须选择“config”、“menuconfig”和“xconfig”之一。这只是个人喜好问题。“config”将在任何系统上运行;“menuconfig”需要安装 curses 库,而“xconfig”需要安装 X-window 环境以及 TCL/TK 库和解释器。

现在使用以下命令编译它

make dep bzImage modules modules_install
编译后,在您的引导加载程序中安装带有 openMosix 选项的新内核;例如,在 /etc/lilo.conf 中为新内核插入一个条目,然后运行 lilo。

重新启动后,您的 openMosix 集群节点就启动了!


4.4.2. /etc/openmosix.map 文件的语法

在启动 openMosix 之前,必须有一个 /etc/openmosix.map 配置文件,该文件在每个节点上必须相同。

现在的标准是 /etc/openmosix.map,/etc/mosix.map 和 /etc/hpc.map 是旧标准,但工具的 CVS 版本是向后兼容的,并按顺序查找 /etc/openmosix.map、/etc/mosix.map 和 /etc/hpc.map。

openmosix.map 文件包含三个空格分隔的字段

openMosix-Node_ID               IP-Address(or hostname)          Range-size
一个 openmosix.map 文件示例可能如下所示
1       node1   1
2       node2   1
3       node3   1
4       node4   1
1       192.168.1.1     1
2       192.168.1.2     1
3       192.168.1.3     1
4       192.168.1.4     1
或借助 range-size,以上两个示例都等于
1       192.168.1.1     4
openMosix 根据其 openMosix-Node_ID “向上计数”节点 IP 地址的最后一个字节。当然,如果您使用的 range-size 大于 1,则必须使用 IP 地址而不是主机名。

如果一个节点有多个网络接口,可以使用 range-size 字段中的 ALIAS 选项进行配置(相当于将 range-size 设置为 0),例如

1       192.168.1.1     1
2       192.168.1.2     1
3       192.168.1.3     1
4       192.168.1.4     1
4       192.168.10.10   ALIAS
这里,openMosix-Node_ID 为 4 的节点有两个网络接口(192.168.1.4 + 192.168.10.10),这两个接口对 openMosix 都是可见的。

始终确保在集群的每个节点上运行相同的 openMosix 版本和配置!

在每个节点上使用 “setpe” 实用程序启动 openMosix

setpe -w -f /etc/openmosix.map
在您的 openMosix 集群中的每个节点上执行此命令(将在本 HOWTO 的后面部分描述)。

或者,您可以获取 “openmosix” 脚本,该脚本可以在 userspace-tools 的 scripts 目录中找到,将其复制到 /etc/init.d 目录,chmod 0755 它,然后以 root 身份使用以下命令

/etc/init.d/openmosix stop
/etc/init.d/openmosix start
/etc/init.d/openmosix restart

安装现已完成:集群已启动并运行 :)


4.4.3. oMFS

首先,必须在内核配置中启用 CONFIG_MOSIX_FS 选项。如果当前内核在编译时未启用此选项,则需要重新编译并启用此选项。

此外,集群节点文件系统上的 UID(用户 ID)和 GID(组 ID)必须相同。您可能希望使用 openldap 来完成此操作。内核中的 CONFIG_MOSIX_DFSA 选项是可选的,但如果应使用 DFSA,则当然是必需的。要在集群上挂载 oMFS,每个节点的 /etc/fstab 中都必须有一个额外的 fstab 条目。

为了启用 DFSA

mfs_mnt         /mfs            mfs     dfsa=1          0 0
为了禁用 DFSA
mfs_mnt          /mfs           mfs     dfsa=0          0 0
此 fstab 条目的语法为
[device_name]           [mount_point]   mfs     defaults        0 0
在每个节点上挂载 /mfs 挂载点后,每个节点的文件系统都将通过 /mfs/[openMosix-Node_ID]/ 目录访问。

借助一些符号链接,所有集群节点都可以访问相同的数据,例如 node1 上的 /work

on node2 :      ln -s /mfs/1/work /work
on node3 :      ln -s /mfs/1/work /work
on node3 :      ln -s /mfs/1/work /work
...
现在,每个节点都可以从 /work 读取和写入!

以下特殊文件从 oMFS 中排除

  • /proc 目录

  • 不是常规文件、目录或符号链接的特殊文件(例如 /dev/hda1)

创建像这样的链接

ln -s /mfs/1/mfs/1/usr         
ln -s /mfs/1/mfs/3/usr
是无效的。

以下系统调用在未将迁移进程(在其主(远程)节点上执行此调用)返回其主节点的情况下得到支持

read, readv, write, writev, readahead, lseek, llseek, open, creat, close, dup, dup2, fcntl/fcntl64, getdents, getdents64, old_readdir, fsync, fdatasync, chdir, fchdir, getcwd, stat, stat64, newstat, lstat, lstat64, newlstat, fstat, fstat64, newfstat, access, truncate, truncate64, ftruncate, ftruncate64, chmod, chown, chown16, lchown, lchown16, fchmod, fchown, fchown16, utime, utimes, symlink, readlink, mkdir, rmdir, link, unlink, rename

以下是在 DFSA 挂载的文件系统上系统调用可能无法工作的情况

  • 集群节点上不同的 mfs/dfsa 配置

  • 如果第二个文件指针是非 DFSA,则 dup2

  • 如果父目录是非 DFSA,则 chdir/fchdir

  • 离开 DFSA 文件系统的路径名

  • 当执行系统调用的进程正在被跟踪时

  • 如果执行系统调用的进程有待处理的请求

除了 /mfs/1/ /mfs/2/ 等文件外,您还将找到一些其他目录。

表 4-1. 其他目录

/mfs/here您的进程当前运行的节点
/mfs/home您的主节点
/mfs/magic“creat” 系统调用(或带有 “O_CREAT” 选项的 “open”)使用的当前节点 - 否则,上次成功创建 oMFS 魔术文件的节点(这对于创建临时文件,然后立即取消链接它们非常有用)
/mfs/lastexec进程上次发出成功的 “execve” 系统调用的节点。
/mfs/selected您通过进程本身或其祖先之一(在 fork 此进程之前)选择的节点,将数字写入 “/proc/self/selected”。

请注意,这些魔术文件都是“每个进程”的。也就是说,它们的内容取决于哪个进程打开它们。

关于 openMFS 的最后一点说明是,有些版本在您在这些文件系统上运行 “df” 时会返回错误的结果。如果您突然在这些系统上拥有大约 1.3 TB 的可用空间,请不要感到惊讶。


4.5. Red Hat 和 openMosix

如果您运行的是 RedHat 7.2、7.3 或 8.0 版本,这可能是您有史以来最简单的 *Mosix 安装。从 sourceforge 中选择合适的 openMosix RPM。它们有预编译的内核(在我写这篇文章时是 2.4.20),可以无缝工作:我已经在多台机器上测试过它们,包括带有 PCMCIA 卡的笔记本电脑和带有 SCSI 磁盘的服务器。如果您是 grub 用户,内核 rpm 甚至会修改您的 grub.conf。因此,您所要做的就是安装 2 个 RPM

rpm -Uvh openmosix-kernel-2.4.20-openmosix2.i686.rpm openmosix-tools-0.2.4-1.i386.rpm
如果您不想使用自动发现守护进程 (omdiscd),请编辑您的 /etc/openmosix.map。由于这似乎是许多人的问题,让我们再举一个例子。假设您有 3 台机器:192.168.10.220、192.168.10.78 和 192.168.10.84。您的 openmosix.map 将如下所示。
[root@oscar0 root]# more /etc/openmosix.map 
# openMosix CONFIGURATION
# ===================
#
# Each line should contain 3 fields, mapping IP addresses to openMosix node-numbers:
# 1) first openMosix node-number in range.
# 2) IP address of the above node (or node-name from /etc/hosts).
# 3) number of nodes in this range.
#
# Example: 10 machines with IP 192.168.1.50 - 192.168.1.59
# 1	   192.168.1.50	    10
#
# openMosix-#  IP  number-of-nodes
# ============================
1 192.168.10.220 1
2 192.168.10.78  1
3 192.168.10.84  1
现在,通过使用新安装的内核重新启动不同的机器,您将离拥有一个正常工作的集群更近一步。

大多数 RedHat 安装都需要额外修复一件事。您经常会收到以下错误

[root@inspon root]# /etc/init.d/openmosix start 
Initializing openMosix...
setpe: the supplied table is well-formatted,
but my IP address (127.0.0.1) is not there!
这意味着您的主机名未在 /etc/hosts 中列出,并且 IP 与您的 openmosix.map 中的 IP 相同。您的主机文件中可能有一个名为 omosix1.localhost.org 的机器,列为
127.0.0.1	omosix1.localhost.org localhost 
如果您修改您的 /etc/hosts 以使其如下所示,openMosix 将在启动时遇到更少的问题。
192.168.10.78   omosix1.localhost.org
127.0.0.1       localhost 
[root@inspon root]# /etc/init.d/openmosix start 
Initializing openMosix...
[root@inspon root]# /etc/init.d/openmosix status
This is openMosix node #2
Network protocol: 2 (AF_INET)
openMosix range     1-1     begins at 192.168.10.220
openMosix range     2-2     begins at inspon.localhost.be
openMosix range     3-3     begins at 192.168.10.84
Total configured: 3

如果您想使用更前沿的补丁,您可以随时选择 src rpm 并在其上运行 rpmbuild --rebuild。这将为您安装源代码并创建一个初始配置文件。从那里,您可以进一步将补丁应用于 openMosix

有关如何构建您自己的 openMosix RPM 的教程可以在附录中找到。

随着新的 RedHat 版本的发布,它们可能会开箱即用得到支持,因此,请随时给作者留言,并帮助他保持此信息的更新。


4.6. Suse 和 openMosix

虽然 RPM 是在基于 RedHat 的环境中构建的,但您可以在其他基于 RPM 的系统上使用它们中的大多数。

但是,Suse 将 /sbin/mk_initrd 作为指向 /sbin/mkinitrd 的链接,这使得 release 20-2 之前的 rpms 失败。较新版本应该对此进行了修复。


4.7. Debian 和 openMosix

可以按照以下描述轻松地以 “Debian 方式” 安装 openMosix。

第一步是从网络下载软件包。由于 openMosix 补丁软件包在我写这篇文章时尚未提供 2.4.20 版本,因此我不得不使用 2.4.19 内核。由于我们正在使用 Debian 设置,因此我们需要:http://packages.debian.org/unstable/net/openmosix.html, http://packages.debian.org/unstable/net/kernel-patch-openmosix.html, http://packages.debian.org/unstable/misc/kernel-package.html, http://packages.debian.org/unstable/devel/kernel-source-2.4.19.html。您也可以使用 apt-get install 它们 ;)。

下一步是使内核支持 openMosix。

基本上,要遵循的步骤是

cd /usr/src
apt-get install kernel-source-2.4.19 kernel-package \
        openmosix kernel-patch-openmosix
tar vxjf kernel-source-2.4.19.tar.bz2
ln -s /usr/src/kernel-source-2.4.19 /usr/src/linux
cd /usr/src/linux
../kernel-patches/i386/apply/openmosix
make menuconfig
make-kpkg kernel_image modules_image
cd ..
dpkg -i kernel-image-*-openmosix-*.deb
您现在需要编辑您的 /etc/openmosix.map。请按照本 HOWTO 的 “/etc/openmosix.map 的语法” 部分中给出的说明进行操作。

在使用此内核和配置的 /etc/openmosix.map 重新启动后,您应该拥有一个 openMosix 机器集群,这些机器相互通信并执行进程迁移。

您可以通过运行以下小脚本来测试

awk 'BEGIN {for(i=0;i<10000;i++)for(j=0;j<10000;j++);}'
几次,并使用 “mosmon” 监视其行为,您将看到它在不同节点之间分散负载。

我们还在 Debian 机器上设置了 openMosixView

apt-get install openmosixview
为了能够实际使用 openMosixView,您需要从可以以 root 身份登录到不同用户的用户运行它。我们建议您使用 ssh 设置此功能。请注意,ssh 和 ssh2 实现之间存在差异。如果您有 identity.pub 文件,ssh 将检查 authorized_keys,而如果您有 id_dsa.pub,您将需要 authorized_keys2!

openMosixView 为您提供了一个友好的界面,显示不同机器的负载,并让您能够手动迁移进程。

有关 openMosixView 的详细讨论可以在本文档的其他地方找到。


4.8. openMosix 和 Gentoo

首先安装 Gentoo Linux

然后,安装 openMosix:键入 “emerge sys-apps/openmosix-user”,这将安装 openMosix 内核源代码树到 /usr/src/linux 以及 openMosix 用户空间工具。

Michael Imhof,又名 tantive,使 Gentoo 保持最新的 openMosix 版本。

Gentoo Technologies, Inc. 的总裁/CEO 和 Gentoo Linux 的创建者 Daniel Robbins 撰写了我们用作 openMosix 集群简介的文章。


4.9. 其他发行版

根据以上说明,您应该能够在大多数其他 Linux 平台上安装 openMosix。


第五章. 自动发现

5.1. 简易配置

自动发现守护进程 (omdiscd) 提供了一种自动配置 openMosix 集群的方法,从而消除了对 /etc/mosix.map 或类似手动配置的需求。自动发现使用多播数据包通知其他节点它是一个 openMosix 节点。这样,向您的 mosix 集群添加额外的节点意味着您只需在您的机器上启动 omdiscd,它就会加入集群。

但是,有一些小的要求,与任何 openMosix 集群一样,您需要正确配置网络。主要是路由。如果没有默认路由,您必须使用 -i 选项为 omdiscd 指定一个接口。否则,omdiscd 将退出并显示类似如下的错误。

Aug 31 20:41:49 localhost omdiscd[1290]: Unable to determine address of 
default interface.  This may happen because there is no default route 
configured.  Without a default route, an interface must be: Network is 
unreachable 
Aug 31 20:41:49 localhost omdiscd[1290]: Unable to initialize network.  
Exiting. 
以下是正确路由的示例
[root@localhost log]# route -n 
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
10.0.0.0        0.0.0.0         255.0.0.0       U     0      0        0 eth0
127.0.0.0       0.0.0.0         255.0.0.0       U     0      0        0 lo
0.0.0.0         10.0.0.99       0.0.0.0         UG    0      0        0 eth0
基本上从现在开始一切都会变得更容易。只需启动
omdiscd
并查看您的日志文件,您应该看到类似以下内容
Sep  2 10:00:49 oscar0 kernel: openMosix configuration changed: This is openMosix #2780 (of 6 configured)
Sep  2 10:00:49 oscar0 kernel: openMosix #2780 is at IP address 192.168.10.220
Sep  2 10:00:49 oscar0 kernel: openMosix #2638 is at IP address 192.168.10.78
Sep  2 10:00:49 oscar0 kernel: openMosix #2646 is at IP address 192.168.10.86
Sep  2 10:00:49 oscar0 kernel: openMosix #2627 is at IP address 192.168.10.67
Sep  2 10:00:49 oscar0 kernel: openMosix #2634 is at IP address 192.168.10.74
恭喜,您的 openMosix 集群现在正在工作。

omdiscd 还有一些其他选项可以使用。您可以将 omdiscd 作为守护进程(默认)运行,也可以在前台运行,其中输出转到屏幕(标准输出)omdiscd -n。可以使用 -i 选项指定接口。

现在让我们简要了解一下另一个工具,它是 showmap。此工具将向您显示新自动生成的 openMosix 地图。

[root@oscar0 root]# showmap
My Node-Id: 0x0adc

Base Node-Id Address          Count
------------ ---------------- -----
0x0adc       192.168.10.220   1
0x0a4e       192.168.10.78    1
0x0a56       192.168.10.86    1
0x0a43       192.168.10.67    1
0x0a4a       192.168.10.74    1

自动发现还有一些此处未列出的其他功能,例如用于具有多个网络的集群的路由机制。更多详细信息可以在用户空间工具源代码树中的 README 和 DESIGN 文件中找到。

较新版本的 openMosix rc 脚本将首先验证是否存在 /etc/openmosix.map 文件或类似文件,然后再尝试使用自动配置。


5.2. 编译自动发现

如果您从源代码编译自动发现,您需要对 openmosix.c 进行小的修改。第一行之一将是

#define ALPHA
您需要将其注释掉。如果您想要获得更多日志记录,您应该编辑 main.c 以显示 log_set_debug(DEBUG_TRACE_ALL);(大约在第 84 行)现在运行
% make clean
% make


5.3. 自动发现故障排除

但是,有时自动发现无法按您期望的方式工作,例如,节点可能看不到来自其他节点的多播流量。这种情况发生在某些 PCMCIA 以太网驱动程序上。一种解决方案是将接口置于混杂模式和/或多播模式,如下详述

Aug 31 20:45:58 localhost kernel: openMosix configuration changed: This is openMosix #98 (of 1 configured)
Aug 31 20:45:58 localhost kernel: openMosix #98 is at IP address 10.0.0.98Aug 31 20:45:58 localhost omdiscd[1627]: Notified kernel to activate 
openMosix  Aug 31 20:45:58 localhost kernel: Received an unauthorized information request from 10.0.0.99
然后您应该尝试手动强制您的 NIC 进入混杂模式和/或多播模式。
ifconfig ethx promisc
or
ifconfig ethx multicast 
您可能还想运行
tcpdump -i eth0 ether multicast 
这将具有相同的效果,但您现在也可以自己看到数据包。

在某些 Layer 3 交换机上,可能需要其他配置。一位 openMosix 用户发现,在他的 Switch Summit48Si (Extreme Networks) 上,他必须运行

disable ipmcforwarding (to deactivate the routing of multicast paquets)
disable igmp snooping
才能使不同的 omdiscd 能够相互看到,其他交换机可能需要类似的配置。

Aug 31 22:14:43 inspon omdiscd[1422]: Simulated notification to activate openMosix
[root@inspon root]# showmap
My Node-Id: 0x0063

Base Node-Id Address          Count
------------ ---------------- -----
0x0063       10.0.0.99        1
[root@inspon root]# /etc/init.d/openmosix status
OpenMosix is currently disabled
[root@inspon root]# 
如果您看到模拟,您可能忘记将
#define ALPHA
注释掉。

我还注意到自动发现不适用于基于 FireWire 的网卡。


第六章. PlumpOS

6.1. 什么是 Plump/OS

PlumpOS 是一个基于 CD 的 GNU/Linux/openMosix 迷你发行版,旨在允许用户快速或临时地向 openMosix 集群添加节点;在我 2003 年 3 月写这篇文章时,版本(release 6.9 RC1)是一个 16.7M ISO 下载。

本章是 Peter Willis 对 Jean-David Marrow(他是 Clump/OS 的作者和 PlumpOS 的灵感来源 - 向 Jean-David 致敬,感谢他在已消失的 Clump/OS 上的出色工作)贡献的非常相似的章节的快速修改。


6.2. 它如何工作?

首先,设置您机器的 BIOS 以使其从 CD 启动。查看您主板的手册,了解如何设置此项。启动后,您将收到一个提示,使用特定内核启动 PlumpOS;已为您提供多个内核,但您也可以选择提供您自己的内核 + 模块。这将在后面的 “入门” 部分中解释。启动菜单应告诉您所有可用的内核供您使用;只需键入其中一个的名称(以及可选的一些内核参数)并按回车/Enter 键。

在启动时,PlumpOS 将自动探测网卡,如果检测到任何网卡,它将尝试通过 DHCP 配置它们。如果成功,它将在收到 DHCP 租约的每个接口上启动 omdiscd。目前,这仅在具有 1 个网卡的 PC 中进行了测试,因此 YMMV。

它对我自己有效,但可能对您无效;如果您遇到困难,请在您调查问题后,尽可能多地通过电子邮件发送有关您系统的信息给我。(查看 sourceforge 主页上的 PlumpOS 邮件列表,注册并发布您的问题,并尽可能提供详细信息。openMosix-general 和 openMosix-devel 列表不是用于 PlumpOS 问题,它们用于 openMosix 特定问题,如果您无法区分,只需将其发送到 PlumpOS 列表或我的联系电子邮件)。


6.3. 要求

由于 PlumpOS 的目的是向集群添加节点,因此假定您已经有一个正在运行的 openMosix 集群 - 或者可能只有一个 openMosix 节点 - 您将从中启动作业。集群中的所有机器都必须符合以下要求

  • PlumpOS 机器 (586+ CPU)

  • 可启动的 CD-ROM 驱动器

  • 网卡

  • 介于 32M 和 128M 的 RAM。由于在编写本文时 openMosix 内核中的一些怪异之处,简单地传递 ramdisk 的大小不起作用,因此必须实际使用为特定大小预先制作的 ramdisk。在 PlumpOS 镜像中应该有几个可用的 ramdisk,它们可以放置在实际 cdrom ISO 的 disks 根目录中(如果您的目录在 PlumpOS 软件包目录中,则为 rootdisk/disks/)。

  • 主机器 (GNU/Linux/openMosix 内核(与您在子/从 PlumpOS 机器上启动的所有 PlumpOS 内核的版本相同))

  • 网络环境(运行 DHCP 服务器(如果您不运行或不想运行 DHCP,您仍然可以手动配置您的系统:只需转到每台 PlumpOS 机器,并使用提供的网络工具输入您想要的配置信息。强烈建议使用 DHCP,并且从长远来看,它将大大简化您的生活。)

以下网络模块存在于大多数(如果不是全部)提供的内核模块 tarball 中(在 /kernels/KERNELNAME/modules.tgz 中),尽管并非所有模块都支持自动探测;如果您在此列表中看不到对您的网卡的支持,则 PlumpOS 将不适用于您。

3c501.o, 3c503.o, 3c505.o, 3c507.o, 3c509.o, 3c515.o, 3c59x.o, 8139cp.o, 8139too.o, 82596.o, ac3200.o, acenic.o, aironet4500_card.o, aironet4500_core.o, aironet4500_proc.o, arlan-proc.o, arlan.o, at1700.o, bsd_comp.o, cs89x0.o, de4x5.o, depca.o, dgrs.o, dl2k.o, dmfe.o, dummy.o, e100/e100.o, e1000/e1000.o, e2100.o, eepro.o, eepro100.o, eexpress.o, epic100.o, eth16i.o, ewrk3.o, fealnx.o, hamachi.o, hp-plus.o, hp.o, hp100.o, lance.o, lp486e.o, mii.o, natsemi.o, ne.o, ne2k-pci.o, ni5010.o, ni52.o, ni65.o, ns83820.o, pcmcia, pcnet32.o, ppp_async.o, ppp_deflate.o, ppp_generic.o, ppp_synctty.o, pppoe.o, pppox.o, sis900.o, sk98lin/sk98lin.o, slhc.o, smc-ultra.o, smc9194.o, starfire.o, strip.o, sundance.o, sungem.o, sunhme.o, tc35815.o, tg3.o, tlan.o, tokenring/{3c359.o abyss.o ibmtr.o lanstreamer.o olympic.o smctr.o tms380tr.o tmsisa.o tmspci.o}, tulip/tulip.o, via-rhine.o, wavelan.o, wd.o, winbond-840.o, wireless/{airo.o airo_cs.o hermes.o orinoco.o orinoco_cs.o orinoco_pci.o orinoco_plx.o}, yellowfin.o

另请注意,PlumpOS 可能无法在笔记本电脑上运行:它肯定不支持 PCMCIA 卡(尚未),并且如果您的机器包含多个连接的以太网适配器,则可能无法正确配置 openMosix。这是配置脚本的临时限制,应在未来的版本中解决。


6.4. 入门

您可以根据 GPL 条款,从任何 PlumpOS 镜像下载最新的 PlumpOS 软件包,不提供任何形式的保证。下载后,解压缩存档

$ tar -xvzf plumpos-6.9-rc1.tar.gz
并进入新目录 “plumpos-6.9-rc1/”。现在,您可以选择几种方式来设置 PlumpOS。

首先,让我们熟悉这里的目录结构。应该有 3 个目录

  • rootdisk,其中包含要创建的 iso 的布局;

  • scripts,其中包含用于帮助创建 iso 的小程序;

  • final,其中将包含由整个过程生成的 ISO。

还应该有一个名为 install 的文件,您将在配置完系统后运行它。

如果您打算将自己的内核与 PlumpOS 一起使用,则必须遵循几个步骤才能使其正确启动。首先,您必须在 rootdisk/kernels/ 目录中创建一个新目录,该目录将采用旧的且经常被指责的 DoS 8.3 字符格式,并且仅包含字母和数字(以及单个 '.')。在该目录中,您应该放置一个名为 bzImage 的文件,这是您的内核,以及一个名为 modules.tgz 的文件,这是您的内核模块的 gzipped tarball(具有 lib/modules/ 的相对路径,以便可以从根目录中提取)。(可选)您还可以为您的内核提供 System.map 和 config 文件。完成此操作后,您可以简单地运行 install 程序,它将检测并安装您的内核,以便与生成的 ISO 一起使用。

现在,假设您要包含第三方附加软件包。这非常简单:创建一个 gzipped tarball,其中包含您要包含在软件包中的所有文件(相对于 “/”),并将这些软件包放入 rootdisk/packages/ 目录中。然后编辑文件 rootdisk/packages/list,并添加软件包可以位于的 ramdisk 上相对于 / 的路径(换句话说,对于名为 “openssl.tar.gz” 的软件包,将行 “/cdrom/packages/openssl.tar.gz” 添加到文件 rootdisk/packages/list)。(可选)您可以使用诸如 “cdrom:openssl.tar.gz” 之类的行,它将自动在 cdrom 的 packages 目录中搜索软件包 “openssl.tar.gz”。在未来的版本中,这将对 nfs 和启动软盘等功能有用,所以现在不用担心它 ;)


第七章. 集群安装

7.1. 集群安装

本章不涉及 openMosix 的安装本身,但它确实涉及使用 openMosix 安装多台机器。自动化或半自动化的批量安装。


7.2. DSH,分布式 Shell

在撰写本文时(2003 年 5 月),DSH 的最新版本可从 http://www.netfort.gr.jp/~dancer/software/downloads/ 获得。有关该软件包的更多信息,请访问 http://www.netfort.gr.jp/~dancer/software/dsh.html。可供下载的最新版本是 0.23.6。您将需要 libdshconfig-0.20.8.tar.gz 和 dsh-0.23.5.tar.gz。首先安装 libdshconfig

./configure
make
make install 
对 dsh 软件包重复此过程。

假设我们有一个包含几个节点的小型集群。为了简化操作,我们希望只键入一次命令,但使其在每个节点上执行。然后,您必须在 $HOME/.dsh/group/clusterwname 中创建一个文件,其中列出您的集群的 IP。例如。

[root@inspon root]# cat .dsh/group/mosix 
192.168.10.220
192.168.10.84
例如,我们在每台机器上运行 ls。我们使用 -g 来使用 mosix 组(这样您可以使用不同的配置创建组的子集)
[root@inspon root]# dsh -r ssh -g mosix ls
192.168.10.84: anaconda-ks.cfg
192.168.10.84: id_rsa.pub
192.168.10.84: install.log
192.168.10.84: install.log.syslog
192.168.10.84: openmosix-kernel-2.4.17-openmosix1.i686.rpm
192.168.10.84: openmosix-tools-0.2.0-1.i386.rpm
192.168.10.220: anaconda-ks.cfg
192.168.10.220: id_dsa.pub
192.168.10.220: id_rsa.pub
192.168.10.220: openmosix-kernel-2.4.17-openmosix1.i686.rpm
192.168.10.220: openmosix-tools-0.2.0-1.i386.rpm
192.168.10.220: oscar-1.2.1rh72
192.168.10.220: oscar-1.2.1rh72.tar.gz
请注意,这些机器都没有要求输入密码。这是因为我们在不同的帐户之间设置了 RSA 身份验证。如果您想使用多个参数运行命令,您要么必须将命令放在引号之间。
[root@inspon root]# dsh -r ssh -g mosix "uname -a"
192.168.10.84: Linux omosix2.office.be.stone-it.com 2.4.17-openmosix1 #1 
Wed May 29 14:32:28 CEST 2002 i686 unknown
192.168.10.220: Linux oscar0 2.4.17-openmosix1 #1 Wed May 29 14:32:28 CEST 
2002 i686 unknown
要么使用 -c -- 选项。两者基本上都给出相同的输出。
[root@inspon root]# dsh -r ssh -g mosix -c -- uname -a 
192.168.10.220: Linux oscar0 2.4.17-openmosix1 #1 Wed May 29 14:32:28 CEST 
2002 i686 unknown
192.168.10.84: Linux omosix2.office.be.stone-it.com 2.4.17-openmosix1 #1 
Wed May 29 14:32:28 CEST 2002 i686 unknown


第八章. 管理 openMosix

8.1. 基本管理

openMosix 为 HPC 应用程序提供了进程迁移的优势。管理员可以使用 openMosix-user-space-tools 或 /proc/hpc 接口配置和调整 openMosix 集群,现在将详细描述 /proc/hpc 接口。

在 openMosix 2.4.16 版本之前,/proc 接口名为 /proc/mosix!在 openMosix 2.4.17 版本之前,它名为 /proc/hpc。


8.2. 配置

/proc/hpc/admin 目录中的平面文件中的值表示集群的当前配置。管理员也可以将自己的值写入这些文件,以在运行时更改配置,例如

表 8-1. 更改 /proc/hpc 参数

echo 1 > /proc/hpc/admin/block阻止远程进程的到达
echo 1 > /proc/hpc/admin/bring将所有迁移的进程带回家

...

表 8-2. /proc/hpc/admin/

(二进制文件)config主配置文件(由 setpe 实用程序写入)
(平面文件)block允许/禁止远程进程的到达
 bring将所有迁移的进程带回家
 dfsalinks当前符号 dfsa 链接的列表
 expel将访客进程送回家
 gateways网关的最大数量
 lstay本地进程应保留
 mospe包含 openMosix 节点 ID
 nomfs禁用/启用 MFS
 overheads用于调优
 quiet停止收集负载均衡信息
 decay-interval收集有关负载均衡的信息的间隔
 slow-decay默认 975
 fast-decay默认 926
 speed相对于 PIII/1GHz 的速度)
 stay启用/禁用自动进程迁移

表 8-3. 将 1 写入以下文件 /proc/hpc/decay/

clear清除衰减统计信息
cpujob告诉 openMosix 该进程是 CPU 密集型的
iojob告诉 openMosix 该进程是 IO 密集型的
slow告诉 openMosix 缓慢衰减其统计信息
fast告诉 openMosix 快速衰减其统计信息

表 8-4. 有关其他节点的信息

/proc/hpc/nodes/[openMosix_ID]/CPUs节点有多少个 CPU
/proc/hpc/nodes/[openMosix_ID]/load此节点的 openMosix 负载
/proc/hpc/nodes/[openMosix_ID]/memopenMosix 认为的可用内存
/proc/hpc/nodes/[openMosix_ID]/rmemLinux 认为的可用内存
/proc/hpc/nodes/[openMosix_ID]/speed节点相对于 PIII/1GHz 的速度
/proc/hpc/nodes/[openMosix_ID]/status节点的状态
/proc/hpc/nodes/[openMosix_ID]/tmem可用内存
/proc/hpc/nodes/[openMosix_ID]/util节点的利用率

表 8-5. 有关本地进程的其他信息

/proc/[PID]/cantmove进程无法迁移的原因
/proc/[PID]/goto进程应迁移到哪个节点
/proc/[PID]/lock进程是否锁定到其主节点
/proc/[PID]/nmigs进程迁移了多少次
/proc/[PID]/where进程当前正在哪个节点上计算
/proc/[PID]/migrate与 goto 远程进程相同
/proc/hpc/remote/from进程的主节点
/proc/hpc/remote/identity有关进程的其他信息
/proc/hpc/remote/statm进程的内存统计信息
/proc/hpc/remote/stats进程的 CPU 统计信息

8.3. userspace-tools

以下工具为 openMosix 集群提供简单的管理。

migrate -send a migrate request to a process
                syntax: 
                        migrate [PID] [openMosix_ID]
mon             -is a ncurses-based terminal monitor
                 several informations about the current status are displayed in bar-charts
mosctl          -is the openMosix main configuration utility
                syntax:
                        mosctl  [stay|nostay]
                                [lstay|nolstay]
                                [block|noblock]
                                [quiet|noquiet]
                                [nomfs|mfs]
                                [expel|bring]
                                [gettune|getyard|getdecay]

                        mosctl  whois   [openMosix_ID|IP-address|hostname]

                        mosctl  [getload|getspeed|status|isup|getmem|getfree|getutil]   [openMosix_ID]

                        mosctl  setyard [Processor-Type|openMosix_ID||this]

                        mosctl  setspeed        interger-value

                        mosctl  setdecay interval       [slow fast]

表 8-6. 更详细的

stayno automatic process migration
nostayautomatic process migration (default)
lstay本地进程应保留
nolstay本地进程可以迁移
block阻止访客进程到达
noblock允许访客进程到达
quiet禁用负载均衡信息的收集
noquiet启用负载均衡信息的收集
nomfs禁用 MFS
mfs启用 MFS
expel发送走访客进程
bring将所有迁移的进程带回家
gettune显示当前的开销参数
getyard显示当前使用的 Yardstick 值
getdecay显示当前的衰减参数
whois解析集群的 openMosix-ID、IP 地址和主机名
getload显示 (openMosix-) 负载
getspeed显示 (openMosix-) 速度
status显示当前状态和配置
isup节点是否启动 (openMosix 类型的 ping)
getmem显示逻辑空闲内存
getfree显示物理空闲内存
getutil显示利用率
setyard设置新的 Yardstick 值
setspeed设置新的 (openMosix-) 速度值
setdecay设置新的衰减间隔
mosrun          -run a special configured command on a chosen node
                syntax:
                        mosrun  [-h|openMosix_ID| list_of_openMosix_IDs] command [arguments]

mosrun 命令可以使用更多命令行选项执行。为了简化操作,有几个预配置的运行脚本,用于使用特殊的 (openMosix) 配置执行作业。

表 8-7. mosrun 的额外选项

nomig运行一个命令,其进程不会迁移
runhome执行锁定到其宿主节点的命令
runon运行一个命令,该命令将被直接迁移并锁定到一个节点
cpujob告知 openMosix 集群这是一个 CPU 密集型进程
iojob告知 openMosix 集群这是一个 IO 密集型进程
nodecay执行一个命令,并告知集群不要刷新负载均衡统计信息
slowdecay执行一个命令,并使用慢衰减间隔收集负载均衡统计信息
fastdecay执行一个命令,并使用快衰减间隔收集负载均衡统计信息
setpe           -manual node configuration utility
                syntax:
                        setpe   -w -f   [hpc_map]
                        setpe   -r [-f  [hpc_map]]
                        setpe   -off

-w reads the openMosix configuration from a file (typically /etc/hpc.map)
-r writes the current openMosix configuration to a file (typically /etc/hpc.map)
-off turns the current openMosix configuration off
tune            openMosix calibration and optimizations utility.
                (for further informations review the tune-man page)

除了 /proc 接口和命令行 openMosix 实用程序(它们使用 /proc 接口)之外,还有一个修补过的 "ps" 和 "top" 可用(它们被称为 "mps" 和 "mtop"),它们还在列中显示 openMosix 节点 ID。这对于找出特定进程当前正在哪个节点上计算非常有用。

这实际上总结了命令行工具,但请查看 openMosixview,它是一个用于最常见管理任务的 GUI,将在以后的章节中讨论。


8.4. 集群掩码

(作者:Moshe Bar)

一些人要求在 openMosix 中添加一个功能,该功能允许指定给定的进程及其子进程可以迁移到哪些节点,以及不能迁移到哪些节点。

Simone Ettore 刚刚向 CVS 提交了一个新的补丁,它允许你做到这一点。

以下是其工作原理

  • /proc/[pid]/migfilter 启用/禁用迁移过滤功能。

  • /proc/[pid]/mignodes 是节点的位列表。节点的位位置计算为 2^(PE-1)。PE 是节点号。

  • /proc/[pid]/migpolicy 是过滤策略:0=DENY:进程可以在所有节点中迁移,除非 mignodes 上的相对位为 1;1=ALLOW:进程可以在 mignodes 上的相对位为 1 的所有节点中迁移。

我们很快将发布一个简单的用户态工具来设置节点掩码,但我希望你们能在我们将其作为 openMosix 2.4.20-3 发布之前尽快试用它。


第 9 章. Mosix 调优

9.1. 简介

以下部分内容仍然来自旧的 Mosix Howto,随着时间的推移,这些部分将被相关的 openMosix 部分替换,但是有些东西仍然相同,但您的结果可能会有所不同。


9.2. 创建 “主” 节点

尽管 openMosix 架构本身不需要主节点,但您可能希望拥有一个头节点,您可以在其中启动进程,这可能是一个多宿主节点,用户可以从中登录到您的集群。您希望配置您的机器以使进程迁移出去

您必须欺骗节点,使其认为它是周围最慢的节点,最好将其所有进程迁移到更快的节点。

您必须使用以下命令使其 “变慢”:

mosctl setspeed [n]
其中 n 应远低于其他节点的速度。进程将快速移动/迁移出去。您可以使用以下命令获取节点的速度:
mosctl getspeed


9.3. 优化 Mosix

编者评论:需要使用 openMosix 版本进行检查

以 root 身份登录到普通终端。输入

       setpe -r 
如果一切顺利,这将为您提供 /etc/mosix.map 的列表。如果事情没有顺利进行,请尝试
        setpe -w -f /etc/mosix.map 
来设置您的节点。然后,输入
       cat /proc/$$/lock
查看您的子进程是否锁定在您的模式 (1) 中,还是可以迁移 (0)。如果由于某种原因您发现您的进程被锁定,您可以使用以下命令更改它:
        echo 0 > /proc/$$/lock
直到您解决问题。为第二台计算机重复整个配置方案。Mosix 用于校准各个节点的程序 tune_kernel 和 prep_tune 不适用于 SuSE 发行版。但是,您可以伪造它。首先,通过键入以下命令,将您要调优的计算机和另一台安装了 Mosix 的计算机都置于单用户模式:
        init 1
以 root 身份。如果可能,网络上的所有其他计算机都应关闭。在两台机器上,运行以下命令
        /etc/init.d/network start
        /etc/init.d/mosix start
        echo 1 > /proc/mosix/admin/quiet
这会伪造 prep_tune 和 tune_kernel 的第一部分。请注意,如果您有一台带有 pcmcia 网卡的笔记本电脑,您将必须运行
        /etc/init.d/pcmcia start
而不是 “/etc/init.d/network start”。在您要调优的计算机上,运行 tune_kernel 并按照说明进行操作。根据您的机器,这可能需要一段时间 - 如果您养了狗,这可能是带它去您一直答应它的漫长散步的时候了。tune_kernel 将在 /root 中创建一个名为 “pg” 的程序,用于测试目的。忽略它。调优结束后,将 /tmp/overheads 的内容复制到文件 /etc/overheads(和/或重新编译内核)。为每台计算机重复调优过程。重新启动,享受 Mosix,别忘了向您的朋友吹嘘您的新集群。


9.4. 轻松实现通道绑定

贡献者:Evan Hisey

通道绑定实际上非常容易。这可能解释了为什么关于这个主题的文档很少。绑定网络对于应用程序来说就像一个普通网络。子网上的所有机器都必须以相同的方式绑定。绑定和非绑定机器彼此之间不能很好地通信。

通道绑定至少需要两个物理子网,但可以更多(目前我有一个三绑定集群)。要启用绑定,您需要将通道绑定内核代码编译到内核中或作为模块 (bonding.o) 编译,从 2.4.x 开始,它是内核的标准选项。网卡的设置与正常情况相同,但您仅使用 'ifconfig' 初始化绑定的第一张卡。“ifenslave” 用于初始化绑定连接中的其余卡。“ifenslave” 可以位于 linux/Documentation/network/ 目录中。它需要编译,因为它是一个 .c 文件。使用的基本格式是

ifenslave <master> <slave1> <slave2> ...
通道绑定网络可以通过支持通道绑定的路由器或网桥连接到标准网络(我只是在头节点中使用额外的网卡和端口转发)。


9.5. Updatedb

Updatedb 与 mfs 结合使用可能会导致一些问题,您可能希望将 /mfs 添加到 /etc/updatedb.conf 中的 PRUNEPATHS 或将 mfs 添加到 PRUNEFS 中,以禁用 updatedb 索引此挂载点。


9.6. openMosix 和 FireWire

openMosix 通过使用另一种类型的网络设备来提高性能,如关于 openMosix 和 FireWire 的论文中所述


第 10 章. openMosixview

10.1. 简介

openMosixview 是 Mosixview 的下一个版本和完全重写版本。它是一个用于 openMosix 集群的集群管理 GUI,欢迎所有人下载和使用它(风险和责任自负)。openMosixview 套件包含 5 个有用的应用程序,用于监视和管理 openMosix 集群。

openMosixview 主要的监视+管理应用程序
openMosixprocs 用于管理进程的进程框
openMosixcollector 收集守护程序,记录集群+节点信息
openMosixanalyzer 用于分析 openMosixcollector 收集的数据
openMosixhistory 集群的进程历史记录

所有部分都可以从主应用程序窗口访问。只需单击几下鼠标即可执行最常用的 openMosix 命令。高级执行对话框有助于在集群上启动应用程序。“优先级滑块” 简化了每个节点的手动和自动负载均衡。openMosixview 现在已适应 openMosix 自动发现,并从 openMosix /proc 接口获取所有配置值。


10.2. openMosixview 与 Mosixview

openMosixview 完全专为 openMosix 集群设计。Mosixview 网站(和所有镜像站点)将保持不变,但所有进一步的开发将继续在位于新域名 www.openmosixview.com 的 openMosixview 上进行

如果您有:问题、想要的功能、安装过程中遇到的问题、意见、经验交流等,请随时给我、Matt Rechenburg 发送邮件,或订阅 openMosix/Mosixview 邮件列表并发送邮件至 openMosix/Mosixview 邮件列表

更改:(与 Mosixview 1.1 相比) openMosixview 是 Mosixview 的完全重写版本,从头开始编写!它具有相同的功能,但 openMosixview 源代码的所有部分都发生了根本性的变化。它已在不断变化的集群拓扑结构(openMosix 自动发现的要求)下进行了测试。所有 “错误” 部分都已删除或重写,现在它(应该;)运行得更加稳定。

适应了 openMosix 自动发现
不再使用 /etc/mosix.map 或任何集群映射文件
移除了(有错误的)映射文件解析器
将所有部分/函数/方法重写为更清晰的 c++ 接口
修复了显示中的一些较小错误
用 openMosixanalyzer 替换了 MosixMem+Load
... 更多更改


10.3. 安装

要求

QT 库
root 权限!
到所有集群节点的 rlogin 和 rsh(或 ssh)无需密码。openMosix 用户态工具 mosctl、migrate、runon、iojob、cpujob ...(从 www.openmosix.org 网站下载它们)

在 RH 8.0 上,您至少需要以下 rpm:qt-3.0.5-17、libmng-1.0.4、XFree86-Mesa-libGLU-4.2.0、glut-3.7 等 ...

关于 openMosixview 的文档 每个软件包中都包含关于 openMosixview 的完整 HTML 文档。您可以在 openMosixview 安装目录中找到文档的起始页:openmosixview/openmosixview/docs/en/index.html

RPM 软件包的安装目录位于:/usr/local/openmosixview


10.3.1. RPM 发行版的安装

下载最新版本的 openMosixview rpm 软件包。然后只需执行,例如

rpm -i openmosixview-1.4.rpm 
这会将所有二进制文件安装到 /usr/bin 中。要卸载
rpm -e openmosixview 


10.3.2. 源代码发行版的安装

下载最新版本的 openMosixview,解压缩并解 tar 源代码,并将 tarball 复制到例如 /usr/local/。

gunzip openmosixview-1.4.tar.gz 
tar -xvf openmosixview-1.4.tar 


10.3.3. 自动安装脚本

只需 cd 到 openmosixview 目录并执行

./setup [your_qt_2.3.x_installation_directory] 


10.3.4. 手动编译

将 QTDIR 变量设置为您的实际 QT 发行版,例如

export QTDIR=/usr/lib/qt-2.3.0 (for bash) 
or 
setenv QTDIR /usr/lib/qt-2.3.0 (for csh) 


10.3.5. 提示

(来自在不同 linux 发行版上编译 openMosixview/Mosixview 的测试人员,再次感谢)创建指向您的 QT-2.3.x 安装的链接 /usr/lib/qt,例如,如果 QT-2.3.x 安装在 /usr/local/qt-2.3.0 中

ln -s /usr/local/qt-2.3.0 /usr/lib/qt 
然后您必须将 QTDIR 环境变量设置为
export QTDIR=/usr/lib/qt (for bash) 
or 
setenv QTDIR /usr/lib/qt (for csh) 
之后,其余部分应该可以正常工作
./configure 
make 
然后在子目录 openmosixcollector、openmosixanalyzer、openmosixhistory 和 openmosixviewprocs 中执行相同的操作。将所有二进制文件复制到 /usr/bin
cp openmosixview/openmosixview /usr/bin 
cp openmosixviewproc/openmosixviewprocs/mosixviewprocs /usr/bin 
cp openmosixcollector/openmosixcollector/openmosixcollector /usr/bin 
cp openmosixanalyzer/openmosixanalyzer/openmosixanalyzer /usr/bin 
cp openmosixhistory/openmosixhistory/openmosixhistory /usr/bin 
并将 openmosixcollector init 脚本复制到您的 init 目录,例如
cp openmosixcollector/openmosixcollector.init /etc/init.d/openmosixcollector 
or 
cp openmosixcollector/openmosixcollector.init /etc/rc.d/init.d/openmosixcollector 
现在将 openmosixprocs 二进制文件复制到您的每个集群节点的 /usr/bin/openmosixprocs
rcp openmosixprocs/openmosixprocs your_node:/usr/bin/openmosixprocs 
您现在可以执行 mosixview
openmosixview 


10.4. 使用 openMosixview

10.4.1. 主应用程序

这是主应用程序窗口的图片。功能将在下面解释。

openMosixview 为每个集群成员显示一行,其中包含一个指示灯、一个按钮、一个滑块、一个 lcd 数字、两个进度条和一些标签。左侧的指示灯显示 openMosix-Id 和集群节点的状态。红色表示关闭,绿色表示可用。

如果您单击显示一个节点 IP 地址的按钮,将弹出一个配置对话框。它显示用于执行最常用的 “mosctl” 命令的按钮。(稍后在本 HOWTO 中描述) 使用 “速度滑块”,您可以为每个主机设置 openMosix 速度。当前速度由 lcd 数字显示。

您可以通过更改这些值来影响整个集群的负载均衡。openMosix 集群中的进程更容易迁移到 openMosix 速度更高的节点,而不是速度较低的节点。当然,您可以设置的速度不是物理速度,而是 openMosix “认为” 节点具有的速度。例如,集群节点上一个 CPU 密集型作业,其速度设置为整个集群的最低值,将寻找更好的处理器来运行并轻松迁移出去。

中间的进度条提供了每个集群成员负载的概览。它以百分比显示,因此它并不完全代表写入文件 /proc/hpc/nodes/x/load(由 openMosix)的负载,但它应该提供一个概览。

下一个进度条用于节点的已用内存。它显示主机上可用内存的百分比形式的当前已用内存(右侧的标签显示可用内存)。您的集群拥有多少个 CPU 写在右侧的框中。主窗口的第一行包含一个用于 “所有节点” 的配置按钮。您可以通过此选项类似地配置集群中的所有节点。

负载均衡效果如何由左上角的进度条显示。100% 非常好,表示所有节点的负载几乎相同。

使用收集器和分析器菜单来管理 openMosixcollector 并打开 openMosixanalyzer。openMosixview 应用程序套件的这两个部分对于长期了解集群的概览非常有用。


10.4.2. 配置窗口

如果单击 “集群节点” 按钮,将弹出此对话框。

现在可以轻松更改每个主机的 openMosix 配置。所有命令都将通过 “rsh” 或 “ssh” 在远程主机上执行(即使在本地节点上也是如此),因此 “root” 必须 “rsh”(或 “ssh”)到集群中的每个主机,而无需提示输入密码(在 Beowulf 文档或本页的 HOWTO 中很好地描述了如何配置它)。

命令是

automigration on/off 
quiet yes/no 
bring/lstay yes/no 
exspel yes/no 
openMosix start/stop 
如果在远程集群节点上正确安装了 openMosixprocs,请单击 “远程进程框” 按钮以从远程打开 openMosixprocs(进程框)。将设置 xhost +hostname,并且显示将指向您的 localhost。客户端也在远程通过 “rsh” 或 “ssh” 执行。(二进制文件 openmosixprocs 必须复制到例如集群中每个主机的 /usr/bin) openMosixprocs 是一个用于管理您的程序的进程框。它对于管理在远程节点上本地启动和运行的程序非常有用,并在本 HOWTO 的后面部分中描述。

如果您从远程工作站登录到您的集群,请在 “远程进程框” 下面的编辑框中插入您的本地主机名。然后 openMosixprocs 将显示在您的工作站上,而不是您登录的集群成员上。(您可能需要在您的工作站上设置 “xhost +clusternode”)。组合框中有一个历史记录,因此您只需编写一次主机名。


10.4.3. 高级执行

如果您想在集群上启动作业,“高级执行” 对话框可能会对您有所帮助。

使用 “运行程序” 按钮(文件打开图标)选择要启动的程序,您可以通过此执行对话框指定作业的启动方式和位置。有几个选项需要解释。


10.4.4. 命令行

您可以在窗口顶部的行编辑小部件中指定其他命令行参数。

表 10-1. 如何启动

-no migration启动一个不会迁移的本地作业
-run home启动一个本地作业
-run on在您可以使用 “主机选择器” 选择的节点上启动作业
-cpu job在节点(主机选择器)上启动计算密集型作业
-io job在节点(主机选择器)上启动 IO 密集型作业
-no decay启动一个没有衰减的作业(主机选择器)
-slow decay启动一个具有慢衰减的作业(主机选择器)
-fast decay启动一个具有快衰减的作业(主机选择器)
-parallel在某些或所有节点上并行启动一个作业(特殊主机选择器)

10.4.5. 主机选择器

对于您启动的所有非本地作业,只需使用拨号小部件选择一个主机。节点的 openMosix-id 也由 lcd 数字显示。然后单击执行以启动作业。


10.4.6. 并行主机选择器

您可以使用 2 个微调框设置第一个和最后一个节点。然后,该命令将在从第一个节点到最后一个节点的所有节点上执行。您也可以反转此选项。


10.5. openMosixprocs

10.5.1. 简介

此进程框对于管理在集群上运行的进程非常有用。

您应该将其安装在每个集群节点上!

进程列表概述了正在运行的位置。第二列显示每个进程的 openMosix 节点 ID。0 表示本地,所有其他值都是远程节点。迁移的进程标记为绿色图标,不可移动的进程有一个锁。

通过双击列表中的进程,将弹出迁移器窗口,用于管理例如迁移进程。还有一些选项可以迁移远程进程、向其发送 SIGSTOP 和 SIGCONT 或 “renice”。

如果您单击 “从远程管理进程” 按钮,将弹出一个新窗口(远程进程窗口),显示当前迁移到此主机的进程。


10.5.2. 迁移器窗口

如果单击进程框中的进程,将弹出此对话框。

openMosixview 迁移器窗口显示您的 openMosix 集群中的所有节点。此窗口用于管理一个进程(带有附加状态信息)。通过双击列表中的主机,进程将迁移到此主机。片刻之后,托管进程的进程图标将变为绿色,这意味着它正在远程运行。

“宿主” 按钮将进程发送到其宿主节点。“最佳” 按钮将进程发送到集群中最佳可用节点。此迁移受负载、速度、CPU 以及 openMosix 对每个节点的 “想法” 的影响。它可能会迁移到具有最多 CPU 和/或最佳速度的主机。使用 “杀死” 按钮,您可以立即杀死该进程。

要暂停程序,只需单击 “SIGSTOP” 按钮,要继续,请单击 “SIGCONT” 按钮。使用下面的 renice 滑块,您可以重新调整当前托管进程的优先级(-20 表示非常快,0 表示正常,20 表示非常慢)


10.5.3. 从远程管理进程

如果单击进程框下方的 “从远程管理进程” 按钮,将弹出此对话框

TabView 显示迁移到本地主机的进程。这些进程来自集群中的其他节点,目前在 openMosixview 启动的主机上计算。与迁移器窗口中的两个按钮类似,“转到宿主节点” 按钮将进程发送回宿主节点,“转到最佳节点” 按钮将进程发送到最佳可用节点。


10.6. openMosixcollector

openMosixcollector 是一个守护程序,应该/可以启动在一个集群成员上。它将每个节点的 openMosix 负载记录到目录 /tmp/openmosixcollector/*。这些历史记录日志文件由 openMosixanalyzer(如下所述)分析,可以提供集群中负载、内存和进程的持续概览。有一个主日志文件名为 /tmp/openmosixcollector/cluster。除此之外,此目录中还有其他文件,数据将写入其中。

在启动时,openMosixcollector 将其 PID(进程 ID)写入 /var/run/openMosixcollector.pid

openMosixcollector 守护程序每 12 小时重启一次,并将当前历史记录保存到 /tmp/openmosixcollector[date]/*。这些备份是自动完成的,但您也可以手动触发此操作。

有一个选项可以将检查点写入历史记录。如果您使用 openMosixanalyzer 分析历史记录日志文件,这些检查点将以蓝色垂直线图形化标记。例如,您可以在集群上启动作业时设置一个检查点,并在结束时设置另一个检查点。

以下是可能的命令行参数的说明

openmosixcollector -d      //starts the collector as a daemon 
openmosixcollector -k      //stops the collector 
openmosixcollector -n      //writes a checkpoint to the history 
openmosixcollector -r      //saves the current history and starts a new one 
openmosixcollector         //print out a short help 

您可以使用 /etc/init.d 或 /etc/rc.d/init.d 中的 init 脚本启动此守护程序。您只需创建一个指向其中一个运行级别的符号链接即可实现自动启动。

如何分析创建的日志文件在 openMosixanalyzer 部分中描述。


10.7. openMosixanalyzer

10.7.1. 负载概览

此图片显示了 openMosixanalyzer 中的图形化负载概览(单击放大)

使用 openMosixanalyzer,您可以获得集群的持续 openMosix 历史记录。openMosixcollector 创建的历史记录日志文件以图形方式显示,以便您可以长期了解集群上发生的事情和正在发生的事情。openMosixanalyzer 可以分析当前的 “在线” 日志文件,但您也可以通过文件菜单打开 openMosixcollector 历史记录日志的旧备份。日志文件位于 /tmp/openmosixcollector/*(备份位于 /tmp/openmosixcollector[date]/*),您只需打开主历史记录文件 “cluster” 即可查看旧的负载信息。(备份目录中日志文件的 [date] 是历史记录保存的日期) 开始时间显示在顶部,您可以在 openMosixanalyzer 中获得全天视图 (12 小时)。

如果您使用 openMosixanalyzer 查看 “在线” 日志文件(当前历史记录),您可以启用 “刷新” 复选框,视图将自动刷新。

负载线通常是黑色的。如果负载增加到 >75,则线条将绘制为红色。这些值是 openMosix 信息。openMosixanalyzer 从文件 /proc/hpc/nodes/[openMosix ID]/* 获取这些信息

每个节点的 “查找” 按钮都会计算几个有用的统计值。单击它将打开一个小的新窗口,您可以在其中获得平均负载和内存值,以及有关特定节点或整个集群的更多静态和动态信息。


10.7.2. 关于集群节点的统计信息

如果 openMosixcollector 将检查点写入负载历史记录,它们将显示为蓝色垂直线。现在您可以更轻松地比较特定时刻的负载值。


10.7.3. 内存概览

此图片显示了 openMosixanalyzer 中的图形化内存概览

使用 openMosixanalyzer 中的内存概览,您可以获得类似于负载概览的持续内存历史记录。openMosixcollector 创建的历史记录日志文件以图形方式显示,以便您可以长期了解集群上发生的事情和正在发生的事情。它可以分析当前的 “在线” 日志文件,但您也可以通过文件菜单打开 openMosixcollector 历史记录日志的旧备份。

显示的值是 openMosix 信息。openMosixanalyzer 从文件获取这些信息

/proc/hpc/nodes/[openMosix-ID]/mem. 
/proc/hpc/nodes/[openMosix-ID]/rmem. 
/proc/hpc/nodes/[openMosix-ID]/tmem. 

如果 openMosixcollector 将检查点写入内存历史记录,它们将显示为蓝色垂直线。


10.7.4. openMosixhistory

显示过去的进程列表

openMosixhistory 详细概述了哪个进程在哪个节点上运行。openMosixcollector 保存启动收集器的主机上的进程列表,您可以使用 openMosixhistory 浏览此日志数据。您可以通过 openMosixhistory 中的时间滑块轻松更改浏览时间。

openMosixhistory 可以分析当前的 “在线” 日志文件,但您也可以通过文件菜单打开 openMosixcollector 历史记录日志的旧备份。

日志文件位于 /tmp/openmosixcollector/*(备份位于 /tmp/openmosixcollector[date]/*),您只需打开主历史记录文件 “cluster” 即可查看旧的负载信息。(备份目录中日志文件的 [date] 是历史记录保存的日期) 开始时间显示在左上角,您可以在 openMosixhistory 中获得 12 小时的视图。


10.8. openMosixmigmon

10.8.1. 概述

openMosixmigmon 是一个用于监视 openMosix 集群中迁移的监视器。它将您的所有节点显示为围成一圈的小企鹅。

-> 节点圈。

主企鹅是运行 openMosixmigmon 的节点,并且围绕此节点,它还以小黑方块的圆圈显示其进程。

-> 主进程圈

如果进程迁移到其中一个节点,则该节点将获得自己的进程圈,并且该进程从主进程圈移动到远程进程圈。然后,该进程被标记为绿色,并从其原点到其远程位置绘制一条线,以可视化迁移。


10.8.2. 工具提示

如果您将鼠标悬停在进程上方,它将在一个小工具提示窗口中显示其 PID 和命令行。


10.8.3. 拖放!

openMosixmigmon 完全启用拖放功能。您可以抓取(拖动)任何进程并将其拖放到您的任何节点(那些企鹅),进程将移动到那里。如果您双击远程节点上的进程,它将立即被发送回家。


10.9. openmosixview FAQ

10.9.1. 我无法在我的系统上编译 openMosixview?
10.9.2. 我可以使用 SSH 与 openMosixview 吗?
10.9.3. 我启动了 openMosixview,但只显示了启动画面。怎么回事?
10.9.4. openMosixviewprocs/mosixview_client 对我不起作用!
10.9.5. 为什么 openMosixview 配置对话框中的按钮未预先选择?

10.9.1. 我无法在我的系统上编译 openMosixview?

首先,需要 QT >= 2.3.x。必须将 QTDIR 环境变量设置为您的 QT 安装目录,就像 INSTALL 文件中很好地描述的那样。在版本 < 0.6 中,您可以执行 “make clean” 并删除两个文件:/openmosixview/Makefile /openmosixview/config.cache 并尝试再次编译,因为我总是将二进制文件和目标文件留在旧版本中。如果您有任何其他问题,请将其发布到 openMosixview 邮件列表(或直接发送给我)。

10.9.2. 我可以使用 SSH 与 openMosixview 吗?

是的,在 0.7 版本之前,有内置的 SSH 支持。您必须能够 ssh 到集群中的每个节点而无需密码(就像使用 RSH 一样,这是必需的)

10.9.3. 我启动了 openMosixview,但只显示了启动画面。怎么回事?

不要使用 & 在后台派生 openMosixview(例如 openMosixview &)。也许您无法以 root 用户身份 rsh/ssh(取决于您要使用的内容)到每个节点而无需密码?以 root 身份尝试 “rsh hostname”。您不应被提示输入密码,但很快就会获得登录 shell。(如果您使用 SSH,请以 root 身份尝试 “ssh hostname”。) 您必须是集群上的 root 用户,因为这是 openMosixview 执行的管理命令需要 root 权限的唯一方法。openMosixview 默认使用 “rsh”!如果您只在集群上安装了 “ssh”,请编辑(或创建)文件 /root/.openMosixview 并在其中放入 “1111”。这是 openMosixview 的主配置文件,最后一个 “1” 代表 “使用 ssh 而不是 rsh”。这将导致 openMosixview 即使在首次启动时也使用 “ssh”。

10.9.4. openMosixviewprocs/mosixview_client 对我不起作用!

openMosixview 客户端通过 rsh(或 ssh,您可以使用复选框配置)在远程主机上执行。它必须安装在每个节点的 /usr/bin/ 中。如果您使用 RSH,请尝试:“xhost +hostname” “rsh hostname /usr/bin/openMosixview_client -display your_local_host_name:0.0” 或者如果您使用 SSH,请尝试:“xhost +hostname” “ssh hostname /usr/bin/openMosixview_client -display your_local_host_name:0.0” 如果这有效,它也将在 openMosixview 中工作。openMosixview 崩溃并出现 “段错误”!也许您仍然使用旧版本的 openMosixview/Mosixview?在 mosix.map 解析器中(在 openMosixview 中已完全删除!!)(openMosixview 1.2 和 Mosixview > 1.0 版本是稳定的)

10.9.5. 为什么 openMosixview 配置对话框中的按钮未预先选择?

(自动迁移开/关、阻止开/关......)我也希望它们被预先选择。问题是获取节点的信息。您必须登录到每个集群节点,因为这些信息不是集群范围的(在我看来)。每个节点的状态都存储在每个节点的 /proc/hpc/admin 目录中。欢迎任何知道轻松获取这些信息的好方法的人给我发邮件。


10.10. openMosixview + ssh

(本 HowTo 适用于 SSH2) 您每天都可以在报纸上看到您应该使用 SSH 而不是 RSH 的原因,因为另一个脚本小子黑客攻击了一个不安全的系统/网络。因此,SSH 始终是一个不错的选择。

freedom x security = constant    (from a security newsgroup) 
这就是为什么配置 SSH 有点棘手的原因。即使您使用它登录而无需提示输入密码,SSH 也是安全的。这是一种(一种)配置方法。

首先,远程站点需要运行安全的 shell 守护程序。如果尚未安装,请安装它!(rpm -i [来自您的 linux 发行版 CD 的 sshd_rpm_packeage_from_your_linux_distribution_cd])如果它尚未运行,请使用以下命令启动它

/etc/init.d/ssh start 
现在,您必须在本地计算机上使用 ssh-keygen 为 SSH 生成密钥对。
ssh-keygen 
您将被提示输入该密钥对的密码。该密码通常比普通密码更长,甚至可以是一个完整的句子。密钥对会用该密码加密并保存在
/root/.ssh/identity    //your private key 
and 
/root/.ssh/identity.pub     //your public key 
切勿将您的私钥交给任何人!!! 现在将 /root/.ssh/identity.pub 的全部内容(您的公钥,应该是一长行)复制到远程主机上的 /root/.ssh/authorized_keys 中。(同时将 /root/.ssh/identity.pub 的内容复制到您本地的 /root/.ssh/authorized_keys 中,就像您对远程节点所做的那样,因为 openMosixview 也需要免密码登录到本地节点!)

如果您现在 ssh 到此远程主机,您将被提示输入您的公钥密码。输入正确的密码应该会让您登录。

现在有什么优势呢???密码通常比普通密码长得多!

您可以使用 ssh-agent 获得的优势。它在 ssh 登录期间管理密码。

ssh-agent 
ssh-agent 现在已启动,并为您提供了两个您应该设置的环境变量(如果尚未设置)。输入
echo $SSH_AUTH_SOCK 
and 
echo $SSH_AGENT_PID 
查看它们现在是否已导出到您的 shell。 如果没有,只需从您的终端剪切并粘贴。例如,对于 bash-shell
SSH_AUTH_SOCK=/tmp/ssh-XXYqbMRe/agent.1065 
export SSH_AUTH_SOCK 
SSH_AGENT_PID=1066 
export SSH_AGENT_PID 
csh-shell 的示例
setenv SSH_AUTH_SOCK /tmp/ssh-XXYqbMRe/agent.1065 
setenv SSH_AGENT_PID 1066 
有了这些变量,远程 sshd 守护程序可以通过使用 /tmp 中的套接字文件(在本例中为 /tmp/ssh-XXYqbMRe/agent.1065)连接到您的本地 ssh-agent。现在 ssh-agent 可以通过使用此套接字将密码提供给远程主机(当然这是一个加密传输)!

您只需使用 ssh-add 命令将您的公钥添加到 ssh-agent。

ssh-add 
现在您应该能够使用 ssh 登录到远程主机,而无需提示输入密码!

您可以(应该)在您的登录配置文件中添加 ssh-agent 和 ssh-add 命令,例如

eval `ssh-agent` 
 ssh-add 
现在它会在您登录本地工作站时启动。您已完成!祝您登录安全。

openMosixview 有一个菜单项可以切换 openMosixview 使用 rsh/ssh。只需启用此项,您甚至可以在不安全的网络环境中使用 openMosixview。您还应该保存此配置(在 0.7 版本中添加了在 openMosixview 中保存当前配置的可能性),因为它会使用 rsh 或 ssh 从 slave 获取初始数据(就像您配置的那样)。

如果您选择的服务未正确安装,openMosixview 将无法工作!(例如,如果您无法在不提示输入密码的情况下 rsh 到 slave,则您无法将 openMosixview 与 RSH 一起使用;如果您无法在不提示输入密码的情况下 ssh 到 slave,则您无法将 openMosixview 与 SSH 一起使用)


第 11 章。其他与 openMosix 相关的程序

11.1. 简介

有几个不同的应用程序可用于监控和管理 openMosix,在本章中我们将简要概述它们,我们不会真正深入细节。


11.2. openMosixView

openMosixview 是最常用且最著名的 openMosix 管理小程序,您可以在 openMosix 管理章节中阅读更多相关信息。


11.3. openMosixapplet

openMosixApplet 让您可以观看 openMosix 集群的实时负载。它由一个本地守护程序组成,该守护程序侦听来自 applet 的连接。该 applet 使用 chart2D 提供良好的外观感觉。


11.4. wmonload

wmomload 是一个简单、方便且小巧的 dockapp,用于概览小型基于 openMosix 的集群中集群节点的负载。


11.5. openMosixWebView

openMosixWebView - 生成用于监控 openMosix 集群的 Web 图表。 openMosixWebView 是一个 PHP 脚本,用于通过 WEB 监控 openMosix 集群。它使用 openMosixview 的 openMosixCollector 日志。立即下载最新版本 openmosixwebview-0.2.12.tar.gz (2003 年 2 月 16 日)

查看 openMosixWebView 屏幕截图和运行 :-) 在 GNU General Public License (GPL) 下发布。请参阅 README 和 FAQ 文件。


第 12 章。常见问题

12.1. 简介

尽管本章中的大多数问题都可以成为 FAQ 的一部分。FAQ 将给出简短的 “如何解决” 答案,但我们已经仔细研究了它们,并解释了它们为什么是问题以及如何解决它们。


12.2. 我的进程不会迁移

帮助 进程 XYZ 不会迁移。 Moshe Bar 在下面解释了为什么某些进程会迁移,而某些进程不会。但在此之前,您可以随时查看 /proc/$pid/,那里通常有一个 cantmove 文件,它会告诉您为什么某个进程无法迁移。

进程也可能被锁定。您可以使用以下命令检查进程是否被锁定

cat /proc/$PID/lock
其中 $PID 是相关进程的进程 ID。

现在听听 Moshe 本人对此主题的看法。

通常人们使用相同的内核,但在不同的发行版上,例如 RedHat 和 Debian 的混合环境,来自不同发行版的 rc 脚本倾向于以不同的方式启动 openmosix。一些实现完全修改 /etc/inittab 以使用以下命令启动所有守护程序(及其子进程)

mosrun -h
。这样它们就不会迁移。因此,当您启动时,所有这些进程在 /proc/pid/lock 中都有一个 1。您可以通过向此文件写入 0 来强制它们迁移。

好的,如果启动次数多于本地 CPU 的数量,这个简单的程序应该始终迁移。因此,对于一个 2 路 SMP 系统,如果集群中的其他节点至少具有与本地节点相同的速度,则启动此程序 3 次将开始迁移

int main() {
    unsigned int i;
    while (1) {
        i++;
    }
    return 0;
}
在 Pentium 800Mhz CPU 上,溢出需要相当长的时间。

这个内容如下的示例程序永远不会迁移

#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>

...

key_t key; /* key to be passed to shmget() */
int shmflg; /* shmflg to be passed to shmget() */
int shmid; /* return value from shmget() */
int size; /* size to be passed to shmget() */

...

key = ...
size = ...
shmflg) = ...

if ((shmid = shmget (key, size, shmflg)) == -1) {
   perror("shmget: shmget failed"); exit(1); } else {
   (void) fprintf(stderr, "shmget: shmget returned %d\n", shmid);
   exit(0);
  }
...

像这样的使用管道的程序可以很好地迁移

int pdes[2];

pipe(pdes);
if ( fork() == 0 )
  { /* child */
                                 close(pdes[1]); /* not required */
                                 read( pdes[0]); /* read from parent */
                                 .....
                 }
else
                 { close(pdes[0]); /* not required */
                                 write( pdes[1]); /* write to child */
                                 .....
                 }
已修改 自 2.4.17 版本以来,使用 pthreads 的程序不会迁移,但是它们不再出现段错误。
//
// Very simple program demonstrating the use of threads.
//
// Command-line argument is P (number of threads).
//
// Each thread writes "hello" message to standard output, with
//   no attempt to synchronize.  Output will likely be garbled.
//
#include <iostream>
#include <cstdlib>              // has exit(), etc.
#include <unistd.h>             // has usleep()
#include <pthread.h>            // has pthread_ routines

// declaration for function to be executed by each thread
void * printHello(void * threadArg);

// ---- Main program -------------------------------------------------

int main(int argc, char* argv[]) {

  if (argc < 2) {
    cerr << "Usage:  " << argv[0] << " numThreads\n";
    exit(EXIT_FAILURE);
  }
  int P = atoi(argv[1]);

  // Set up IDs for threads (need a separate variable for each
  //   since they're shared among threads).
  int * threadIDs = new int[P];
  for (int i = 0; i < P; ++i)
    threadIDs[i] = i;

  // Start P new threads, each with different ID.
  pthread_t * threads = new pthread_t[P];
  for (int i = 0; i < P; ++i)
    pthread_create(&threads[i], NULL, printHello,
                   (void *) &threadIDs[i]);

  // Wait for all threads to complete.
  for (int i = 0; i < P; ++i)
    pthread_join(threads[i], NULL);

  // Clean up and exit.
  delete [] threadIDs;
  delete [] threads;
  cout << "That's all, folks!\n";
  return EXIT_SUCCESS;
}

// ---- Code to be executed by each thread ---------------------------

// pre:  *threadArg is an integer "thread ID".
// post:  "hello" message printed to standard output.
//        return value is null pointer.
void * printHello(void * threadArg) {
  int * myID = (int *) threadArg;
  cout << "hello, world, ";
  // pointless pause, included to make the effects of
  //   synchronization (or lack thereof) more obvious
  usleep(10);
  cout << "from thread " << *myID << endl;
  pthread_exit((void* ) NULL);
}

使用各种文件描述符(包括套接字)的程序会迁移(套接字不会随进程一起迁移,但是如果使用 oMFS/DFSA,文件会迁移)

(以上所有代码均由 Moshe 以 Moshe Bar 或 Moshe 以 Qlusters, Inc. 的 CTO 身份提供)

另请参阅 openMosix 的 man 页面,它们也充分解释了为什么进程不会迁移。

如果由于某种原因您的进程在不应该被锁定时保持锁定状态。您可以尝试通过简单地将以下内容放入

# tell shells to allow subprocs to migrate to other nodes
echo 0 > /proc/self/lock
"/etc/profile" 警告:此修复程序将允许所有进程迁移,而不仅仅是您想要的进程。要仅允许特定进程迁移,请使用 'mosrun -l' 仅解锁所需的进程。


12.3. 我看不到我所有的节点

首先,您是否在每台机器上使用相同的内核版本?“相同内核”是指版本。您可以构建相同源代码版本的不同内核映像,以满足给定节点的硬件/软件需求。但是,您需要确保在集群上安装 openMosix 时,所有机器都应安装 openmosix-x.x.x-y 内核,而不是一台机器运行 openmosix-x.x.z-x,另一台运行 openmosix-x.x.x-y,另一台运行 openmosix x.x.x-z,等等

当您运行 mosmon 时,按 t 查看正在运行的机器总数。它是否警告您 mosix 未运行?

如果是,请确保您的机器 IP 包含在 /etc/mosix.map 中(不要使用 127.0.0.1 - 如果您的机器 IP 是这样的,那么您的 dhcp 服务器/名称服务器可能存在问题)。如果它没有告诉您 mosix 未运行,请查看显示了哪些机器。您只看到您的机器吗?

如果是,那么您的机器很可能正在运行防火墙,并且不允许 openmosix 通过。

如果不是,那么问题很可能出在未显示的机器上。另外:节点上有两张网卡吗?然后您必须编辑 /etc/hosts 文件,使其包含以下格式的行

non-cluster_ip  cluster-hostname.cluster-domain cluster-hostname
您可能还需要设置路由表,这是一个完全不同的主题。

也许您在每台机器上使用了不同的内核参数?特别是如果您使用“支持具有复杂网络拓扑的集群”选项,则应注意在每台机器上为同时出现的选项“最大网络拓扑复杂性支持”使用相同的值。


12.4. 我经常收到错误:No such process(没有这样的进程)

我经常收到错误

bash: child setpgid (4061 to 4061): No such process
这是什么意思?

上面的行表示您正在使用的 shell 实际上已迁移到另一个节点?bash 的此打印输出是由旧版本 openmosix 中的错误引起的,但已提交修复程序。(Muli Ben-Yehuda mulix@actcom.co.il)


12.5. DFSA?MFS?

人们经常对 MFS 和 DFSA 到底是什么感到困惑。正如之前在 howto 中讨论的那样,MFS 是 openMosix 的一项功能,使您可以访问远程文件系统,就像这些文件系统是在本地挂载的一样。它们主要挂载在 /mfs 上。一个常见的误解是,您需要 MFS 才能使 openMosix 工作,这不是真的,但是它可以使事情变得更容易。

启用 DFSA 后,系统调用将在远程节点上执行,而无需将进程迁移回其主节点。此行为(直接文件系统访问)导致进程迁移到数据,而不是相反(这是常见的)。如果未启用 DFSA,MfS“仅仅”是一个非缓存网络文件系统。

一般来说,如果您没有启用 DFSA,则每个 I/O 都将转到主节点执行。如果启用了 DFSA,如果文件恰好位于进程所在的节点上,则 I/O 将在本地发生。

一个非常常见的错误是人们混合使用启用了 DFSA 和禁用了 DFSA 的内核。因此,必须有一种方法来确定 DFSA 是否实际启用。此信息可以通过键入以下内容获得

cat /proc/hpc/admin/version


12.6. Python 故障

有些人报告了 Python 的问题,更深入的研究表明,这些问题不是 openMosix 的问题,而是 glibc 的问题,但是似乎问题尤其在 openMosix 中显现出来。

一位用户通过删除他机器上的 /lib/i686/lib* 并让应用程序动态链接到 /lib/libpthread(和其他)来解决问题。但是,较新 glibc 版本中的错误修复程序与更新的 openMosix 版本相结合似乎已解决了这些问题。


第 13 章。提示和技巧

13.1. 锁定进程

如果由于某种原因,您发现您的进程始终在您的主节点中被锁定,并且您找不到原因,您可以将以下行放入您的 ~/.profile 中作为临时措施以自动启用迁移

        if [ -x /proc/$$/lock ]; then
           echo 0 > /proc/$$/lock
        fi
但是,您应该努力找出问题所在


13.2. 选择您的进程

在决定要为哪些程序启用迁移之前,您可能需要测试您的设置。例如,如果您在速度较慢的机器上运行 KDE2,并且速度明显更快的机器是您的 Mosix 集群的一部分,您可能会发现像 kmail 这样的资源密集型程序已迁移出去。这本身并不是一件坏事,但是,它可能会导致您的书写内容不会立即显示在屏幕上的短暂时刻。


13.3. Java 和 openMosix

Green Threads JVM 允许迁移,因为每个 Java 线程都是一个单独的进程。Linux 无法迁移 Java green thread JVM 以外的线程,因此 openMosix 无法迁移使用它们的程序。

如果您有 Java 应用程序的源代码,您或许可以将应用程序编译为本机代码。在这种情况下,您或许可以将您的应用程序迁移到另一个节点。

Gian Paolo Ghilardi 写了一篇题为 Consideration on OpenMosix 的论文,其中涉及 Java 和 openMosix 等主题。 http://www.democritos.it/events/openMosix/papers/crema.pdf


13.4. openMosix 和超线程

基本上,当禁用超线程时,openMosix 性能会随着当前的 Linux 调度程序而提高。您可以通过输入 'noht' 作为启动选项或在 BIOS 中禁用 HT 来执行此操作。

对于那些仍然想知道什么是超线程的人:Intel 解释了它


13.5. openMosix 和防火墙

人们经常对 openMosix 和防火墙有疑问。Amit 在这个问题上帮助了我

from hpc/comm.c:

#define MIG_DAEMON_PORT         0x3412
#define INFO_DAEMON_PORT        0x3415
转换为十进制,它们分别是:4660 和 5428。(转换 1234,而不是 3412,因为网络主机字节顺序转换。阅读 IP/TCP/UDP RFC 以获取信息)

mig_daemon 端口是 tcp 端口,info_daemon 端口是 udp。因此是 tcp/4660 和 udp/5428,Matt 还在某处提到了 tcp/723。


第 14 章。(压力)测试您的 openMosix 安装

14.1. 一个小的测试脚本

测试您的 openMosix 集群的最快方法是创建一个包含以下内容的小脚本。

awk 'BEGIN {for(i=0;i<10000;i++)for(j=0;j<10000;j++);}' &
我将其保存为 test_mosix,现在当我想查看一切是否正常工作时,我启动 op mosmon 并启动此脚本无数次,如下所示
for i in `ls /etc/` ; do ./test_mosix ; done 
现在观看 openMosix 在几秒钟后开始工作...

只需在主节点上 pkill awk 即可杀死它们全部 ;)


14.2. Charles Nadeau 的 Perl 程序

Perl 程序,用于测试 openMosix 集群。

这是一个我编写的用于测试 openMosix 集群的快速程序。这是摘自我于 2002 年 3 月 6 日发布到 openMosix-devel 邮件列表的帖子:“Charles 编写了这个小程序(用 Perl 编写),以压力测试他的家庭集群(3 个 P200MMX 和一个 P166)。这是一个模拟给定时间段内投资组合中不同股票集的程序。代码文档齐全,应该很容易添加/删除股票并更改每只股票的平均每月收益率和标准差。由于投资组合优化问题无法通过分析解决,因此它模拟了许多投资组合并在最后报告结果。请注意,此程序未考虑股票相关性。它尚未完成,但这是一个良好的开端。我计划在程序末尾添加更多代码,以改进数据报告格式(动态生成 SVG 图形)。但是模拟部分工作得非常好。为了利用 openMosix 提供的并行性,它使用了 Perl 模块 Parallel::?ForkManager(来自 CPAN)来扩展线程,然后 openMosix 可以将线程分配给集群的所有机器(它还需要另一个用于统计计算的模块,不要忘记安装这两个模块,我在代码的注释中提供了 URL)。看看它,告诉我你的想法。干杯!”

#! /usr/bin/perl -w

# this mill unlock this process and all tis childs
sub unlock { 
open (OUTFILE,">/proc/self/lock") || 
die "Could not unlock myself!\n"; 
print OUTFILE "0"; 
} 

unlock;

# this will count the nodes
sub cpucount {
 $CLUSTERDIR="/proc/hpc/nodes/";
 $howmany=0;
 opendir($nodes, $CLUSTERDIR);
 while(readdir($nodes)) {
  $howmany++;
 }

 $howmany--;
 $howmany--;
 closedir ($nodes);
 return $howmany;
}

my $processes=cpucount;
$processes=$processes*3;

print("starting $processes processes\n");

#Portfolio.pl, version 0.1
#Perl program that simulate a portfolios for various stock composition for a given period of time
#We run various scenarios to find the mix of assets that give the best performance/risk ratio
#This method is base on the book "The intelligent asset allocator" by William Bernstein
#Can be used to test an OpenMosix cluster
#This program is licensed under GPL
#Author: Charles-E. Nadeau Ph.D., (c) 2002
#E-mail address: charlesnadeau AT hotmail DOT com

use Parallel::ForkManager; #We use a module to parallelize the calculation

#Available at http://theoryx5.uwinnipeg.ca/mod_perl/cpan-search?filetype=%20distribution%20name%20or%20description;join=and;arrange=file;download=auto;stem=no;case=clike;site=ftp.funet.fi;age=;distinfo=2589

use Statistics::Descriptive::Discrete; #A module providing statistical values

#Available at http://theoryx5.uwinnipeg.ca/mod_perl/cpan-search?new=Search;filetype=%20distribution%20name%20or%20description;join=and;arrange=file;download=auto;stem=no;case=clike;site=ftp.funet.fi;age=;distinfo=2988

srand; #We initialize the random number generator

#Initializing constant
$NumberOfSimulation=$processes;  #Number of simulation to run
$NumberOfMonth=100000; #Number of month for wich to run the simulation
$NumberOfStock=6; #Number of different stocks in the simulation

#Portfolio to simulate
#TODO: Read the stock details from a file
$Stock[0][0]="BRKB"; #Stock ticker
$Stock[0][1]=0.01469184; #Stock average monthly return
$Stock[0][2]=0.071724934; #Stock average monthly standard deviation
$Stock[1][0]="TEST "; #Stock ticker
$Stock[1][1]=-0.01519; #Stock average monthly return
$Stock[1][2]=0.063773903; #Stock average monthly standard deviation
$Stock[2][0]="SPDR"; #Stock ticker
$Stock[2][1]=0.008922718; #Stock average monthly return
$Stock[2][2]=0.041688404; #Stock average monthly standard deviation
$Stock[3][0]="BRKB"; #Stock ticker
$Stock[3][1]=0.01469184; #Stock average monthly return
$Stock[3][2]=0.071724934; #Stock average monthly standard deviation
$Stock[4][0]="TEST "; #Stock ticker
$Stock[4][1]=-0.01519; #Stock average monthly return
$Stock[4][2]=0.063773903; #Stock average monthly standard deviation
$Stock[5][0]="SPDR"; #Stock ticker
$Stock[5][1]=0.008922718; #Stock average monthly return
$Stock[5][2]=0.041688404; #Stock average monthly standard deviation




my $pm = new Parallel::ForkManager($NumberOfSimulation); #Specify the number of threads to span

$pm->run_on_start(
  sub { my ($pid,$ident)=@_;
  print "started, pid: $pid\n";
  }
);



#We initialize the array that will contain the results
@Results=();
for $i (0..$NumberOfSimulation-1){
	for $j (0..$NumberOfStock+3){
		$Results[$i][$j]=0.0; #Equal to 0.0 to start
	}
}

for $i (0..$NumberOfSimulation-1){ #Loop on the number of simulation to run
	$Results[$i][0]=$i; #The first column of each line is the number of the simulation
	$pm->start and next; #Start the thread

		$TotalRatio=1; #The sum of the proprtion of each stock

		#Here we calculate the portion of each investment in the portfolio for a given simulation
		for $j (0..$NumberOfStock-2){ #We loop on all stock until the second to last one
			#TODO: Replace rand by something from Math::TrulyRandom
			$Ratio[$j]=rand($TotalRatio);
			$Results[$i][$j+1]=$Ratio[$j]; #We store the ratio associated to this stock
			$TotalRatio=$TotalRatio-$Ratio[$j];
		}
		$Ratio[$NumberOfStock-1]=$TotalRatio; #In order to have a total of the ratios equal to one, we set the last ratio to be the remainder
		$Results[$i][$NumberOfStock]=$Ratio[$NumberOfStock-1]; #We store the ratio associated to this stock. Special case for the last stock

		$InvestmentValue=1; #Initially the investment value is 1 time the initial capital amount.
		my $stats=new Statistics::Descriptive::Discrete; #We initialize the module used to calculate the means and standard deviations

		for $j (1..$NumberOfMonth){ #Loop on the number of months

			$MonthlyGrowth[$j]=0.0; #By how much did we grow this month. Initially, no growth yet.

			#We loop on each stock to find its monthly contribution to the yield 
			for $k (0..$NumberOfStock-1){

			$MonthlyGrowth[$j]=$MonthlyGrowth[$j]+($Ratio[$k]*((gaussian_rand()*$Stock[$k][2])+$Stock[$k][1])); #We had the growth for this stock to the stock already calculated for the preceding stocks
			}

			$stats->add_data($MonthlyGrowth[$j]); #Add the yield for this month so we can later on have the mean and standard deviation for this simulation
			$InvestmentValue=$InvestmentValue*(1+$MonthlyGrowth[$j]); #Value of the Investment after this month
		}
		$Results[$i][$NumberOfStock+1]=$stats->mean(); #Calculate the average monthly growth
		$Results[$i][$NumberOfStock+2]=$stats->standard_deviation(); #Calculate the standard deviation of the monthly growth

	$pm->finish; #Finish the thread
}
$pm->wait_all_children; #We wait until all threads are finished

#Printing the results
print "Simulation ";
for $j (0..$NumberOfStock-1){
	print "Ratio$Stock[$j][0] ";
}
print "  Mean StdDev YieldRatio\n";
for $i (0..$NumberOfSimulation-1){
	printf "%10d ", $Results[$i][0];
	for $j (1..$NumberOfStock){
		printf "   %6.2f ",$Results[$i][$j];
	}

	if($Results[$i][$NumberOfStock+2]!=0) {
		printf "%5.4f %5.4f    %5.4f\n", $Results[$i][$NumberOfStock+1], $Results[$i][$NumberOfStock+2], ($Results[$i][$NumberOfStock+1]/$Results[$i][$NumberOfStock+2]);

	} else {
		printf "%5.4f %5.4f    %5.4f\n", $Results[$i][$NumberOfStock+1], $Results[$i][$NumberOfStock+2], 0;

	}
}



#Subroutines

#Subroutine to generate two numbers normally distributed
#From "The Perl Cookbook", recipe 2.10
sub gaussian_rand {
	my ($u1, $u2);
	my $w;
	my ($g1, $g2);

	do {
		$u1=2*rand()-1;
		$u2=2*rand()-1;
		$w=$u1*$u1+$u2*$u2;
	} while ($w>=1 || $w==0); #There was an error in the recipe, I corrected it here

	$w=sqrt(-2*log($w)/$w);
	$g2=$u1*$w;
	$g1=$u2*$w;
	return wantarray ? ($g1,$g2) : $g1;

}


14.3. openMosix 压力测试

作者:Matt Rechenburg


14.3.1. 一般描述

此压力测试旨在测试 openMosix 集群 + 内核。它将执行多个应用程序 + 内核测试,以检查 openMosix 的稳定性和其他功能(例如,进程迁移、mfs 等)。在此测试期间,集群将主要处于负载状态,因此您应在启动测试之前停止其他正在运行的应用程序。完成后,它会生成一份关于每个被测组件的完整详细报告。


14.3.2. 详细描述

openMosix 压力测试运行多个程序以检查整个系统的功能。在以下部分中,您将找到每个测试应用程序的描述

  • distkeygen:此应用程序用于生成 4000 个密钥长度为 1024 位的 RSA 密钥对。它通过 fork 分布到 openMosix 集群中与处理器数量相同的进程中。

    要求:gcc 编译器和 OpenSSL 库 Copyright (C) 2001 Ying-Hung Chen (GPL) http://www.yingternet.com/mosix

  • portfolio 'portfolio' 是一个 perl 程序,它模拟给定时间段内各种股票组成的投资组合。此方法基于 William Bernstein 的著作“The intelligent asset allocator”。

    此程序在 GPL 下获得许可 作者:Charles-E. Nadeau Ph.D., (c) 2002 电子邮件地址:charlesnadeau AT hotmail DOT com

  • eatmem:简单地从值 1000000 次计算 sin+sqrt 并输出,它将循环计数输出到一个文件(该文件将变得很大)。此测试会自动启动多次,次数与您的 openMosix 集群中的处理器数量相同。

  • forkit:'forkit' 测试类似于 'eatmem' 测试,但使用 fork 创建多个进程(3*[您的_openMosix_集群中的_处理器_数量]),除了它不写入文件。

  • mfstest 这将创建一个 10MB 的文件并将其来回复制到所有节点。它用于检查 oMFS 的功能。

  • 内核系统调用测试:Linux 测试项目是 SGI、IBM、OSDL 和 Bull 的联合项目,其目标是向开源社区提供测试套件,以验证 Linux 的可靠性、健壮性和稳定性。Linux 测试项目是用于测试 Linux 内核和相关功能的一组工具。目标是通过将测试自动化引入内核测试工作来改进 Linux 内核。鼓励感兴趣的开源贡献者加入该项目。有关更多信息,请访问:http://ltp.sf.net

  • moving:'moving.sh' 将在运行压力测试本身的同时,在您的 openMosix 集群中的每个节点周围移动 'start_openMosix_test.sh'。因此,'start_openMosix_test.sh' 将在测试运行期间每分钟迁移到另一个节点。取决于测试在您的集群上运行的时间,它将被迁移 20-40 次。


14.3.3. 安装压力测试套件

首先,从 http://www.openmosixview.com/omtest/ 下载 rpm 或源代码包

  • 使用源代码包

    例如,使用以下命令在 /usr/local 中解压缩 openMosix 压力测试

              gunzip omtest.tar.gz
              tar -xvf omtest.gz
    然后 'cd' 进入 /usr/local/omtest 目录并执行
              ./compile_tests.sh
    这将安装所需的 perl 模块并编译测试程序。这些模块的安装需要 root 权限。稍后您也可以以普通用户身份运行 openMosix 压力测试。(您可能必须删除 root 的测试运行中的旧临时文件,因为您将没有权限以普通用户身份覆盖它)您现在可以使用以下命令运行测试
              ./start_openMosix_test.sh

  • 使用 RPM 包

    安装 omtest.rpm 时需要满足一些要求,例如您需要 expect 和 compat-libstdc++-7.3-2.96.110(如果您在 RH 8.0 上)。只需使用以下命令安装 omtest.rpm

              rpm -ihv omtest.rpm
    现在您可以使用以下命令启动 openMosix 压力测试
              start_openMosix_test.sh
    (RPM 包将安装在 /usr/local/omtest 中)(请注意,RPM 包还将安装一些 perl 模块)。


14.3.4. 运行测试

[root@dhcp51 omtest]# ./start_openMosix_test.sh


starting the openMosix stress test now!

the results will be saved in : /tmp/openMosix-stress-test-report-03/16/2003-11:27:02.txt

oMFS is not mounted at /mfs! oMFS-test will be disabled.
Please mount oMFS before running this openMosix-test
You will find instructions how to configure and use oMFS at:
http://howto.ipng.be/openMosix-HOWTO/x222.htm#AEN243


(return to continue, ctrl-c for cancel)

IV. 在 openMosix 上运行应用程序


第 15 章。提高编译性能

15.1. 简介

本节正在进行中

很多人尝试将 openMosix 用作一种编译场,但他们通常会非常失望。本 howto 的本章将尝试解释在哪些情况下您的编译将从 openMosix 中受益,以及如何提高您的成功率。

首先,您必须记住一件事。openMosix 不会迁移您在集群上启动的所有进程,只会迁移那些从迁移到另一个节点中受益的进程。对于编译来说,这意味着进程必须持续足够长的时间。内核编译通常由许多短编译组成,每个编译都不够长,无法实际迁移。


第 16 章。使用 openMosix 进行成像

16.1. 简介

本节正在进行中

计算机图形一直是需要大量 CPU 功率的应用程序,这种情况没有改变。在本章中,我将通过一些实际示例演示计算机图形如何从 openMosix 中受益。


16.2. Povray

Persistence of Vision Raytracer 是一款高质量、完全免费的工具,用于创建令人惊叹的三维图形。

光线追踪是一种渲染技术,它通过模拟光线在真实世界中传播的方式来计算场景的图像。但是,它的工作方式是向后进行的。在现实世界中,光线从光源发射并照亮物体。光线从物体反射或穿过透明物体。这种反射光击中我们的眼睛或可能击中相机镜头。由于绝大多数光线永远不会击中观察者,因此追踪场景将花费很长时间。

这些类型的应用程序可以通过使用 pvmpovray 轻松实现并行化。Pvmpovray 期望在 Beowulf 风格的集群上工作,并使用 pvm 将其负载分散到其他节点。openMosix 的方法是相同的,但是我们只是在一台机器上执行此操作,并让 openMosix 为您完成负载分散工作!

关于 PVM Povray 的伟大 Howto 将向您展示如何设置 PVMPovray。以下是一个小摘要。

$ cd pvmpov3_1g_2
$ tar xfz ../povuni_s.tgz
$ tar xfz ../povuni_d.tgz                                                      
$ ./inst-pvm
Trying to apply the patch.
Searching for rejected files
$
现在使用 aimk 进行编译(aimk 是 pvm rpm 提供的包装脚本,但可能不在您的路径中。(一些读者可能还记得来自其他平台/应用程序的 aimk)

如果您在 RH 8.0 box 上,则将 libpng 和 zlib 移动到 .notused .. 这是为了防止版本问题.. 与其他 libpng 和 zlib 版本发生冲突。

export PATH=$PATH:/usr/share/pvm3/lib
export PVMROOt=/usr/share/pvm3
然后我运行 aimk newunix。然后我们启动 pvm 并退出它。守护程序保持活动状态..

新手 pvm 用户不知道的最后一件事是 pvm 使用其自己的路径,您必须将 pvmpov 放在该路径中,或者使用完整路径名启动它。

[root@dhcp71 povray31]# /usr/local/bin/pvmpov -L 
/usr/src/povray/pvmpov3_1g_2/povray31/include/ +Iskyvase.pov  
+Oskyvase.tga +NT16 +NW64 +NH64 +v +w1024 +h768
Persistence of Vision(tm) Ray Tracer Version 3.1g.Linux.gcc
  This is an unofficial version compiled by:
  Jakob Flierl  - PVMPOV Version 3.1g.2
  The POV-Ray Team(tm) is not responsible for supporting this version.
Copyright 1999 POV-Ray Team(tm)
Never found section  in file 
/usr/src/povray/pvmpov3_1g_2/povray31/include/.
Initializing PVMPOV
  Spawning /usr/local/bin/pvmpov with 16 PVM tasks on 1 hosts...
  ...16 PVM tasks successfully spawned.
  Waiting up to 120s for first slave to start...
  Slave 0 successfully started.
Parsing Options
  Input file: skyvase.pov (compatible to version 3.1)
  Remove bounds........On  Split unions........Off
  Library paths: /usr/local/lib/povray31 /usr/local/lib/povray31/include
Output Options
  Image resolution 1024 by 768 (rows 1 to 768, columns 1 to 1024).
  Output file: skyvase.tga, 24 bpp PNG
  Graphic display.....Off
  Mosaic preview......Off
  CPU usage histogram.Off
  Continued trace.....Off  Allow interruption...On  Pause when 
done.....Off
  Verbose messages.....On
Tracing Options
  Quality:  9
  Bounding boxes.......On  Bounding threshold: 25
  Light Buffer.........On  Vista Buffer.........On
  Antialiasing........Off
  Radiosity...........Off
Animation Options
  Clock value....   0.000  (Animation off)
PVM Options
  Block Width....      64  Block Height...      64
  PVM Tasks......      16
  PVM Nice.......       5
  PVM Arch.......
  PVM Slave...... /usr/local/bin/pvmpov
  PVM WorkingDir. /usr/src/povray/pvmpov3_1g_2/povray31
Redirecting Options
  All Streams to console..........On
  Debug Stream to console.........On
  Fatal Stream to console.........On
  Render Stream to console........On
  Statistics Stream to console....On
  Warning Stream to console.......On

Starting frame 0...
 Slave 1 at dhcp71.office.be.stone-it.com successfully started.
 Slave 2 at dhcp71.office.be.stone-it.com successfully started.
 Slave 3 at dhcp71.office.be.stone-it.com successfully started.
 Slave 4 at dhcp71.office.be.stone-it.com successfully started.
 Slave 5 at dhcp71.office.be.stone-it.com successfully started.
 Slave 6 at dhcp71.office.be.stone-it.com successfully started.
 Slave 7 at dhcp71.office.be.stone-it.com successfully started.
 Slave 8 at dhcp71.office.be.stone-it.com successfully started.
 Slave 9 at dhcp71.office.be.stone-it.com successfully started.
 Slave 10 at dhcp71.office.be.stone-it.com successfully started.
 Slave 11 at dhcp71.office.be.stone-it.com successfully started.
 Slave 12 at dhcp71.office.be.stone-it.com successfully started.
 Slave 13 at dhcp71.office.be.stone-it.com successfully started.
 Slave 14 at dhcp71.office.be.stone-it.com successfully started.
 Slave 15 at dhcp71.office.be.stone-it.com successfully started.
  0:00:53 86.46 of blocks complete.Not using dhcp71.office.be.stone-it.com 
for reassignment (77%)
  0:00:53 86.98 of blocks complete.Not using dhcp71.office.be.stone-it.com 
for reassignment (67%)
Not using dhcp71.office.be.stone-it.com for reassignment (86%)
Not using dhcp71.office.be.stone-it.com for reassignment (85%)
  0:00:55 89.06 of blocks complete.   640 of  768 lines finished (in frame 
0).Not using dhcp71.office.be.stone-it.com for reassignment (65%)
  0:00:56 91.67 of blocks complete.Not using dhcp71.office.be.stone-it.com 
for reassignment (72%)
  0:00:56 92.71 of blocks complete.Not using dhcp71.office.be.stone-it.com 
for reassignment (80%)
  0:00:57 93.75 of blocks complete.
Slave at dhcp71.office.be.stone-it.com has exited.
  0:00:57 94.79 of blocks complete.
Slave at dhcp71.office.be.stone-it.com has exited.

Slave at dhcp71.office.be.stone-it.com has exited.
  0:00:58 95.83 of blocks complete.
Slave at dhcp71.office.be.stone-it.com has exited.
  0:00:58 96.35 of blocks complete.   672 of  768 lines finished (in frame 
0).Not using dhcp71.office.be.stone-it.com for reassignment (77%)

Slave at dhcp71.office.be.stone-it.com has exited.
  0:00:58 97.14 of blocks complete.   688 of  768 lines finished (in frame 
0).
Slave at dhcp71.office.be.stone-it.com has exited.
  0:00:59 97.92 of blocks complete.
Slave at dhcp71.office.be.stone-it.com has exited.
  0:00:60 98.44 of blocks complete.   704 of  768 lines finished (in frame 
0).
Slave at dhcp71.office.be.stone-it.com has exited.
  0:01:03 100.00 of blocks complete.   768 of  768 lines finished (in 
frame 0).
Finishing frame 0...rtw. 768


Waiting for remaining slave stats.


PVM Task Distribution Statistics:
           host name  [ done ] [ late ]           host name  [ done ] [ 
late ]
dhcp71.office.be.stone-it.com  [ 5.21%] [ 
0.00%]dhcp71.office.be.stone-it.com  [ 7.81%] [ 0.07%]
dhcp71.office.be.stone-it.com  [ 8.85%] [ 
1.17%]dhcp71.office.be.stone-it.com  [ 4.69%] [ 0.00%]
dhcp71.office.be.stone-it.com  [ 8.85%] [ 
0.98%]dhcp71.office.be.stone-it.com  [ 4.17%] [ 0.00%]
dhcp71.office.be.stone-it.com  [ 5.21%] [ 
0.00%]dhcp71.office.be.stone-it.com  [ 8.33%] [ 0.52%]
dhcp71.office.be.stone-it.com  [ 5.21%] [ 
0.00%]dhcp71.office.be.stone-it.com  [ 5.73%] [ 0.72%]
dhcp71.office.be.stone-it.com  [ 7.29%] [ 
2.73%]dhcp71.office.be.stone-it.com  [ 4.17%] [ 0.00%]
dhcp71.office.be.stone-it.com  [ 5.21%] [ 
0.00%]dhcp71.office.be.stone-it.com  [ 6.77%] [ 0.13%]
dhcp71.office.be.stone-it.com  [ 4.69%] [ 
0.00%]dhcp71.office.be.stone-it.com  [ 7.81%] [ 0.00%]


POV-Ray statistics for finished frames:
skyvase.pov Statistics (Partial Image Rendered), Resolution 1024 x 768
----------------------------------------------------------------------------
Pixels:          303104   Samples:          303104   Smpls/Pxl: 1.00
Rays:           1192710   Saved:                 0   Max Level: 0/5
----------------------------------------------------------------------------
Ray->Shape Intersection          Tests       Succeeded  Percentage
----------------------------------------------------------------------------
Cone/Cylinder                  1842227          900504     48.88
CSG Intersection               2742731          323346     11.79
CSG Union                      1801008          521692     28.97
Plane                         20223278        11233348     55.55
Quadric                        1801008         1196533     66.44
Sphere                         1801008          461786     25.64
Bounding Object                1842227          900504     48.88
----------------------------------------------------------------------------
Calls to Noise:            1201944   Calls to DNoise:        2108954
----------------------------------------------------------------------------
Shadow Ray Tests:          2856188   Succeeded:                85620
Reflected Rays:             889606
----------------------------------------------------------------------------
Smallest Alloc:                  9 bytes   Largest:            20508
Peak memory used:          5643343 bytes
----------------------------------------------------------------------------
Time For Trace:    0 hours  1 minutes   7.0 seconds (67 seconds)
    Total Time:    0 hours  1 minutes   7.0 seconds (67 seconds)
如您所见,该应用程序被拆分为不同的部分并单独运行,然后 openMosix 完成了将负载平衡到其他机器的工作。

我在可用 CPU 数量的 2 到 3 倍时获得了良好的结果


第 17 章。生物信息学和 openMosix

17.1. 简介


17.2. Blast

Blast 是该领域更常用的应用程序之一,Blast 有一个补丁可用,使其与 openMosix 的工作更顺畅,但这并不是唯一的选择。

首先,此补丁和 Blast 的其他版本存在一些已知问题,Blast 有时会发生段错误,这主要发生在您从 Internet 下载的预格式化数据库中。如果您在原始数据库上运行 formatdb,这些错误往往会消失。

除了 openMosix blast 补丁之外,很多人都在运行 MPIBlast 鉴于 openMosix 倾向于加速 MPI,将 openMosix 添加到此配置甚至可能会为您带来更多物有所值的性能,但是我们将不得不做一些额外的研究才能证实这一点。

V. openMosix 开发


第 18 章。openMosix 内部原理入门

18.1. 简介

这部分由 Amit Shah 撰写

目前内核的文档不多。我希望在未来几周内写一些。无论如何,以下是源代码的布局方式

openMosix 代码主要位于 hpc/ 和 include/hpc 中。从 arch/i386 目录到 mm/、fs/ 等,到处都有对核心内核文件的大量补丁。您需要阅读您感兴趣的代码,并思考这对于当前情况很重要(这应该不是问题,因为您已经完成内核编码)。

以下是您应该在每个源文件中期望的内容

  • hpc/badops.c:一个处理所有错误操作的文件:主要返回错误代码

  • hpc/balance.c:负载均衡器代码(负载 + 内存使用量 + 网络使用量)

  • hpc/comm.c:集群内通信设置

  • hpc/config.c:openMosix 的配置代码:在您运行启动脚本后

  • hpc/decay.c:衰减(老化)从其他节点收集的统计信息和信息

  • hpc/deputy.c:在 deputy 上执行的代码:服务远程系统调用(即在进程迁移后)、信号等。

  • hpc/dfsa.c:直接文件系统访问代码:分布式文件系统抽象层

  • hpc/div.c:执行浮点除法的算法

  • hpc/export.c:导出其他文件中需要的符号

  • hpc/freemem.c:跟踪空闲、可用内存并在需要时释放它。很大程度上取自 Linux mm/ 代码。

  • hpc/hpcadmin.c:调整 openMosix 管理值(通过 /proc/hpc)

  • hpc/hpcproc.c:/proc/hpc 代码在此处处理

  • hpc/info.c:信息守护程序:在整个集群中发送和接收(多播)负载 + 内存使用统计信息

  • hpc/init.c:初始化代码:初始化守护程序等。

  • hpc/kernel.c:大多数“核心”代码:所有重要的算法、决策等都在此处制定。

  • hpc/load.c:本地负载等的计算。

  • hpc/mig.c:处理迁移的代码。此文件中的代码在任何迁移时调用:deputy->remote,remote->deputy;remote->remote

  • hpc/prequest.c:处理进程的请求:信号、更多内存等。

  • hpc/remote.c:当进程位于远程时执行的代码:远程系统调用处理、将控制权传递给 deputy 等。

  • hpc/rinode.c:fs/ 相关内容:主要用于 DFSA

  • hpc/service.c:设置守护程序、获取内存等。

  • hpc/syscalls.c:在此处处理所有远程系统调用

  • hpc/ucache.c:处理 ucache:主要是 mm/、fs/ 内容。

其他文件(如 auto_syscalls.c、alternate.c)是在编译时生成的。


第 19 章。openMosix FAQ

19.1. 常规

19.1.1. 什么是 openMosix?:
19.1.2. 单映像集群术语是什么意思?:
19.1.3. openMosix 有主页吗?:
19.1.4. 是否有任何 openMosix 的邮件列表?:
19.1.5. 我可以为 openMosix 项目做出贡献吗?:
19.1.6. 谁是 openMosix 的版权所有者?:
19.1.7. openMosix 是 MOSIX 的分支吗?:
19.1.8. 为什么 openMosix 从 MOSIX 组拆分出来?:

19.1.1. 什么是 openMosix?

openMosix 系统是用于单映像集群的 Linux 内核扩展。它扩展了杰出的 MOSIX 项目,但已根据 GNU General Public License (GPL) 获得许可。

19.1.2. 单映像集群术语是什么意思?

集群有很多种,单映像集群具有单个操作系统内核的多个副本。

19.1.3. openMosix 有主页吗?

是的。它位于 www.openMosix.org。SourceForge 项目页面位于 http://openmosix.sf.net/

19.1.4. 是否有任何 openMosix 的邮件列表?

是的。有三个

  1. 对于一般讨论,请使用 mailto:openmosix-general@lists.sourceforge.net,其一般信息页面位于 http://lists.sourceforge.net/lists/listinfo/openmosix-general

  2. 对于开发人员,请使用 mailto:openmosix-devel@lists.sourceforge.net,其一般信息页面位于 http://lists.sourceforge.net/lists/listinfo/openmosix-devel

  3. 由 Democritos(位于的里雅斯特的 INFM 国家模拟中心)托管的意大利语 openMosix 邮件列表

19.1.5. 我可以为 openMosix 项目做出贡献吗?

是的。openMosix 工作已经有 10 多位贡献者。与 Linux 内核维护系统不同,Moshe Bar 任命官方维护人员,然后将提交权限授予这些维护人员,以访问 openMosix CVS 源代码树,类似于 FreeBSD。

现在,我们正在寻找更多经验丰富的内核黑客来研究检查点/重启等新功能。

如果您想成为 openMosix 开发人员,请写信给 mailtomoshe@moelabs.com。

19.1.6. 谁是 openMosix 的版权所有者?

所有 MOSIX 代码的版权均归耶路撒冷希伯来大学的 Amnon Barak 教授所有。所有 openMosix 代码的版权均归特拉维夫的 Moshe Bar 所有。openMosix 系统不包含任何非 GPL(即 MOSIX)代码。

19.1.7. openMosix 是 MOSIX 的分支吗?

最初,openMosix 是 MOSIX 的一个分支,但它已发展成为一个先进的集群平台。openMosix 系统不再包含任何非 GPL(即 MOSIX)代码。

与 MOSIX 相比,添加了许多功能

移植到 UML(用户模式 Linux)架构
新的更简洁的迁移代码
更好的负载均衡器
大大减少的内核延迟
支持 Dolphin 和 IA64
大大简化的安装过程,使用 RPM 打包
丰富的文档

19.1.8. 为什么 openMosix 从 MOSIX 组拆分出来?

主要问题是 MOSIX 没有使用开源许可证授权。


19.2. 获取、构建、安装和运行 openMosix

19.2.1. 在哪里可以获取 openMosix?:
19.2.2. 我可以在同一个集群中混合使用 MOSIX 和 openMosix 节点吗?:
19.2.3. 如何构建 openMosix?:
19.2.4. 什么是用户空间工具?:

19.2.1. 在哪里可以获取 openMosix?

openMosix 的 RPM 和源代码可以从我们的下载/文件区获取。请先阅读发行说明!

此外,还可以使用 Gentoo Linux 的 emerge sys-apps/openmosix-user 和 Debian GNU/Linux openMosix 软件包。

19.2.2. 我可以在同一个集群中混合使用 MOSIX 和 openMosix 节点吗?

不可以。就像旧版本的 MOSIX 一样,您不应该混合使用节点,因为协议会根据版本进行未声明的更改。此外,每个新版本都有错误修复,因此有必要更新到新内核。

19.2.3. 如何构建 openMosix?

  1. 首先,在一个目录(例如 /usr/src)中解压缩 Linux 内核源代码和相应的 openMosix 发行版。

  2. 然后

    $ cd /usr/src; tar xzf linux-2.x.xx.tar.gz ;gunzip openMosix2.x.xx.gz

  3. 使用以下命令将 openMosix 补丁应用于原始 Linux 内核源代码

          $ patch -p1 openMosix2.x.xx-x
    目录 /usr/src/linux-2.x.xx 现在包含带有 openMosix 补丁的 2.x.xx 内核源代码。像往常一样编译并安装生成的内核。

19.2.4. 什么是用户空间工具?

用户空间工具是用于检查和控制 openMosix 节点的管理工具集合。


19.3. 内核问题

19.3.1. openMosix 支持哪些内核版本?:
19.3.2. 我正在尝试编译一个 openMosix 补丁内核。我应该使用哪个编译器版本?:
19.3.3. 我已经从源代码编译了内核。如何将其添加到引导加载程序(LILO、GRUB、或其他)?:
19.3.4. 我安装了一个 Linux 发行版,它说它的内核是 x.x.x-x。openMosix README 文件说不要混合使用内核版本。这是否意味着 openmosix-x.x.x-y RPM 将无法在我的机器上工作?:
19.3.5. “每台机器上的内核相同”这句话是什么意思?是指相同的内核版本,还是相同的内核镜像?:

19.3.1. openMosix 支持哪些内核版本?

最新支持的 Linux 内核是 2.4.19。将支持 2.4 系列的更高版本,以及 2.5 系列的内核版本。

19.3.2. 我正在尝试编译一个 openMosix 补丁内核。我应该使用哪个编译器版本?

您应该使用 gcc-2.95.3,因为这是 2.4 内核的推荐编译器。这是 Linux 内核的要求,而不仅仅是 openMosix 的要求。但是,这并不妨碍您在同一系统上同时拥有用于内核编译的 gcc-2.95.3 和用于非内核编译的 gcc-3.x。

补充说明:gcc-3.x 编译器存在许多与内核相关的问题。内联、优化和页面对齐会对操作系统内核产生奇怪的影响。标准的 Linux 内核仅保证使用 gcc 2.95.3 编译并正常工作。

但是,Red Hat gcc 2.96 编译器是 2.95 + RH 补丁。在这种情况下,您应确保使用 gcc-2.96-74 或更高版本。gcc-2.96-54 将无法正确构建内核。此外,请注意编译器优化。任何大于 -O2 的值都可能不明智。同样,如果您选择使用 gcc-2.95.x 或衍生版本,请务必不要使用 -fstrict-aliasing(根据您的 gcc 2.95.x 版本,可能需要使用 -fno-strict-aliasing)。

19.3.3. 我已经从源代码编译了内核。如何将其添加到引导加载程序(LILO、GRUB、或其他)?

将 openMosix 内核视为任何其他内核即可。openMosix 系统只是内核的扩展,并且会被您的引导加载程序视为标准内核。

19.3.4. 我安装了一个 Linux 发行版,它说它的内核是 x.x.x-x。openMosix README 文件说不要混合使用内核版本。这是否意味着 openmosix-x.x.x-y RPM 将无法在我的机器上工作?

不会。它的意思是,如果您在集群上安装 openMosix,则所有机器都应安装 openmosix-x.x.x-y 内核。您不应混合使用具有不同内核版本的内核,即不要混合使用 openmosix-x.x.z-x 和 openmosix-x.x.x-y 等。

19.3.5. “每台机器上的内核相同”这句话是什么意思?是指相同的内核版本,还是相同的内核镜像?

指的是相同的内核版本。您可以构建同一源代码版本的不同内核镜像,以满足给定节点的硬件/软件需求。


19.4. 文件系统

19.4.1. 什么是 oMFS,我该如何使用,以及在哪里可以获取它?:
19.4.2. 谁能向我解释一下 MFS 和 DFSA 之间的区别,以及为什么我需要 DFSA?:

19.4.1. 什么是 oMFS,我该如何使用,以及在哪里可以获取它?

openMosix 文件系统 (oMFS) 是 openMosix 内核使用的文件系统。您可以通过在集群节点上安装 openMosix 内核来获取它,并在内核配置中启用 oMFS。(在 openMosix RPM 中应默认启用。)

您还应该启用直接文件系统访问 (DFSA),这允许迁移的进程在远程节点本地执行许多系统调用,而无需将其迁移回其主节点。

oMFS 的使用和管理与 NFS 非常相似,但与 NFS 不同,oMFS 具有以下特点

  • 缓存一致性

  • 时间戳一致性

  • 链接一致性

oMFS 之上的 DFSA 层确保在必要时将进程移动到数据,而不是反之。

请阅读 HOWTO 前面章节中有关 oMFS 及其使用方法的更多信息。

19.4.2. 谁能向我解释一下 MFS 和 DFSA 之间的区别,以及为什么我需要 DFSA?

DFSA 代表直接文件系统访问,是一种优化。它允许远程进程在本地执行某些文件系统系统调用,而不是将它们发送到其主节点。MFS 代表 Mosix 文件系统,允许所有节点访问所有节点的文件系统。DFSA 在集群文件系统(在本例中为 MFS)之上运行。


19.5. 编程 openMosix

19.5.1. 通常,我该如何编写一个 openMosix 感知的程序?:
19.5.2. 我可以用 perl 编写 openMosix 程序吗?:

19.5.1. 通常,我该如何编写一个 openMosix 感知的程序?

像往常一样编写程序即可。您生成的任何进程都可能是迁移到另一个节点的候选对象。

19.5.2. 我可以用 perl 编写 openMosix 程序吗?

可以。使用 CPAN 上提供的 Parallel::ForkManager,或直接从 http://www.cpan.org/authors/id/D/DL/DLUX/Parallel-ForkManager-x.x.x.tar.gz 获取。


19.6. 资源

19.6.1. 在哪里可以找到有关 openMosix 的技术细节?:
19.6.2. 还有哪些其他资源可用?:

19.6.1. 在哪里可以找到有关 openMosix 的技术细节?

这里有一些链接

  • Brian Pontz 的 openMosix 源代码浏览器位于 http://www.openmosix.org/lxr/source。

  • openMosix 内部原理:openMosix 如何工作 位于 http://sourceforge.net/docman/display_doc.php?docid=10390&group_id=46729。

  • LTSP + openMosix:快速入门指南 位于 http://sourceforge.net/docman/display_doc.php?docid=10431&group_id=46729。

  • 分布式操作系统:openMosix 的一般描述 位于 http://sourceforge.net/docman/display_doc.php?docid=9562&group_id=46729。

更多链接请访问 HOWTO 的链接部分。

19.6.2. 还有哪些其他资源可用?

这里有一些

  • 并行执行框架的目标是创建一个独立的设备,以便轻松地将标准 PC 集群化。请参阅 http://parallel.sourceforge.net。


19.7. 其他

19.7.1. 我看不到所有节点。发生了什么事?:
19.7.2. /etc/mosix.map、/etc/hpc.map、/etc/openmosix.map 之间有什么区别?:
19.7.3. setpe:提供的表格式良好,但我的 IP 地址 (127.0.0.1) 不在那里!:
19.7.4. 我想安装 openMosix,但我担心我的机器太弱了,无法安装:
19.7.5. VMWare 在什么条件下可以与 openMosix 一起工作?:
19.7.6. 除了 x86(例如 SPARC、AXP、PPC...),openMosix 还支持哪些架构?:
19.7.7. 是否有像 MPmake 这样的 openMosix 并行 make 工具?:

19.7.1. 我看不到所有节点。发生了什么事?

当您运行 'mosmon' 时,按 't' 查看正在运行的机器总数。它是否警告您 openMosix 未运行?

如果是,请确保您的机器 IP 地址包含在 /etc/openmosix.map 中。不要使用 127.0.0.1。如果这样做,您的 DHCP 服务器或 DNS 名称服务器可能会出现问题。

如果不是,请查看显示哪些机器。您只看到自己的机器吗?

如果是,则您的机器很可能正在运行防火墙,并且不允许 openMosix 通过。

如果不是,则问题很可能出在未显示的机器上。

另请注意:您的节点上是否有两张 NIC 卡?如果是,您必须编辑 /etc/hosts 以使其具有以下格式的行

<non-cluster ip> <cluster-hostname>.<cluster-domain> <cluster-hostname>
您可能还需要设置路由表,这是一个完全不同的主题。

也许您在每台机器上使用了不同的内核参数?特别是如果您使用“支持具有复杂网络拓扑的集群”选项,则应注意在每台机器上为同时出现的选项“最大网络拓扑复杂性支持”使用相同的值。

19.7.2. /etc/mosix.map、/etc/hpc.map、/etc/openmosix.map 之间有什么区别

它们代表了 Mosix/openmosix 发展的三个阶段。文件 /etc/mosix.map 是原始 Mosix 映射名称,文件 /etc/hpc.map 是早期的 openMosix 映射名称(并且 'hpc' 仍然用于 openMosix 中的 /proc 文件)。当前的映射名称是 /etc/openmosix.map。

19.7.3. setpe:提供的表格式良好,但我的 IP 地址 (127.0.0.1) 不在那里!

您需要修改您的 /etc/hosts 文件。在 Red Hat 机器上,大多数情况下 /etc/hosts 文件包含如下行

127.0.0.1 hostname.domain.com localhost

如果 hostname.domain.com 的 IP 地址为 192.168.10.250,并且您查找 hostname.domain.com,您可能会得到 127.0.0.1 作为答案。

但是,如果您放入

192.168.10.250 hostname.domain.com 
127.0.0.1 localhost
在您的 /etc/hosts 中,openMosix 就不会抱怨了。

19.7.4. 我想安装 openMosix,但我担心我的机器太弱了,无法安装

机器永远不会太弱:我有三台 P200(每台 64MB)和两台 P166(一台 48MB,一台 192MB)。其中两台在 10Base-T 网络上,另外三台在 100Base-T 网络上。即使使用这些过时的机器和“异构”网络,我也可以获得完美的负载均衡来运行我用 Perl 编写的模拟程序。(请查看我们的 ProgramToTestACluster”)。不要因为您的机器老旧而退缩。对我们来说,这是 openMosix 的一个很好的特性:您可以随着新机器的可用而将其添加到现有集群中。而且您不需要拥有所有相同的机器。这太棒了!

但是,建议使用 100Base-T 网络!由 Charles Nadeau 贡献。

19.7.5. VMWare 在什么条件下可以与 openMosix 一起工作

如果您打算在 openMosix 下运行 VMWare,以便 openMosix 可以负载均衡该软件的多个实例(是的,这可行)。但是,如果您想在多个 VMWare 实例中运行 openMosix 并让这些实例进行负载均衡(这将失败)。

第一种情况有效。后一种情况无效,因为 VMware 在其 Pentium 仿真中存在一个错误,该错误会导致 VMware 在首次迁移时崩溃(不是 openMosix,而是 VMware 二进制文件)。

19.7.6. 除了 x86(例如 SPARC、AXP、PPC...),openMosix 还支持哪些架构?

目前仅支持 IA-32。openMosix 到 Intel(r) Itanium(tm) IA-64 处理器系列的移植已完成。openMosix 第二年的项目计划包括移植到 64 位 AMD Opteron(tm) 处理器。

19.7.7. 是否有像 MPmake 这样的 openMosix 并行 make 工具?

您可以使用常规的 gcc make。只需使用 make -j #,其中 # 表示要生成的子进程数。


第 20 章 PlumpOS 常见问题解答

20.1. 常见问题

20.1.1. 什么是 PlumpOS?
20.1.2. 为什么我要使用 PlumpOS?
20.1.3. 它是如何工作的?
20.1.4. 我可以在哪里获得更多帮助?
20.1.5. 您的主页在哪里?
20.1.6. 企鹅要吃掉标志中可怜的比目鱼了!

20.1.1. 什么是 PlumpOS?

PlumpOS 是一个迷你 Linux 发行版,旨在提供一种简单的方式来将节点添加到 openMosix 集群,而无需大量工作甚至思考。最初的想法来自 ClumpOS(现在已故的项目,由 Jean-David Marrow 开发),ClumpOS 的目标与 MOSIX 集群非常相似,而当前 PlumpOS 的开发也受到 ClumpOS 的启发。

20.1.2. 为什么我要使用 PlumpOS?

使用 PlumpOS 的首要原因是尝试以简单方便的方式使用 openMosix 集群。第二个原因是在不进行大量工作的情况下将节点添加到现有集群。PlumpOS 绝不是企业集群的替代品,也不力求成为某种超级集群项目;它仅仅提供了一种快速简便的方法,将您的普通 586+ PC 变成集群的另一个节点。

20.1.3. 它是如何工作的?

从开发人员的角度来看,它有点困难,但对于普通用户来说却非常简单:只需将包含所有必需文件的 ISO 刻录到 CDROM 驱动器中,启动 PC(确保已安装可正常工作的网卡和网线),您就又多了一台计算机来分发负载/派生进程。由于它是子/从属节点,因此您必须已经有一个正在运行的 openMosix 盒子来运行 PlumpOS 计算机要处理的任务。如果没有主节点,PlumpOS 就几乎没用。该计算机或某些其他网络设备必须已经在提供 DHCP 地址,否则您会发现自己需要手动配置所有 PlumpOS 节点(这不会让网络管理员高兴 - 但这就是我们有初级管理员的原因 ^_^)。此外,请确保您的主节点上运行了 openMosix 自动发现守护程序(又名 omdiscd)。自动发现守护程序可以在 openMosix 的 userspace-tools 软件包中找到。

20.1.4. 我可以在哪里获得更多帮助?

嗯,对于 PlumpOS 的特定帮助,您应该加入 PlumpOS 邮件列表,网址为 http://lists.sourceforge.net/lists/listinfo/plumpos-general 并提出问题(本 FAQ 中未解答的问题),或者访问 irc.freenode.net #PlumpOS。对于与 openMosix 相关的问题,您应该加入 openMosix-general 或 openMosix-devel 邮件列表,网址为 http://openmosix.sourceforge.net/mailing.html 或访问 irc.freenode.net #openMosix

20.1.5. 您的主页在哪里?

PlumpOS 的官方主页位于 http://PlumpOS.sourceforge.net/。您将在那里找到本文档的更新版本,以及更新的新闻、信息等。

20.1.6. 企鹅要吃掉标志中可怜的比目鱼了!

是的,但不用担心:在制作徽标的过程中没有比目鱼受到伤害。比目鱼在心脏病发作后被发现死在冰漂上。此外,比目鱼可能与另一个操作系统选择的吉祥物有任何相似之处,纯属巧合。


附录 A. 如何生成 openMosix 的内核 RPM 文件

A.1. 如何生成 openMosix 的内核 RPM 文件

Mirko Caserta 撰写的针对愚蠢的发布经理和冒险的“自己动手”RPM 打包者的分步指南

  1. 在您的机器上安装 RedHat 8 (psyche)。这是目前用于生成 rpm 的平台,并且已知其工作良好

  2. 从 oM 的 CVS 存储库获取“linux-openmosix”模块的更新副本 - 详细信息可以在 http://sourceforge.net/cvs/?group_id=46729 找到

  3. 获取我们将要修补的 Linux 内核源代码的 tarball,并将其放在 /usr/src/redhat/SOURCES 中 - 假设我们正在讨论 2.4.20 内核,请从许多 https://linuxkernel.org.cn/ 镜像站点之一获取 linux-2.4.20.tar.bz2 文件

  4. 在 /usr/src 下解压缩内核 tarball,即

       # cd /usr/src
       # tar vxjf redhat/SOURCES/linux-2.4.20.tar.bz2

  5. 创建一个指向您检出 linux-openmosix 模块的目录的符号链接,例如

       # ln -s /home/mcaserta/src/linux-openmosix/linux-openmosix \
                    /usr/src/linux-openmosix

  6. 复制 .spec 文件和在此目录中找到的所有 .config 文件到 /usr/src/redhat/SOURCES 下,即

       # cp /usr/src/linux-openmosix/configs/openmosix-kernel.spec \
            /usr/src/redhat/SOURCES
    
       # cp /usr/src/linux-openmosix/configs/*.config \
            /usr/src/redhat/SOURCES

  7. 现在是检查版本号的时候了,然后再制作补丁文件:确保以下文件中的最前面几行

       /usr/src/linux-openmosix/Makefile and
       /usr/src/redhat/SOURCES/openmosix-kernel.spec have the correct
    内核版本和 openMosix 修订号

  8. 好的,是时候制作补丁了(假设我们正在为 2.4.20 Linux 内核和 openMosix 的第 3 个版本发布补丁)

       # cd /usr/src
       # diff -Naur --exclude=CVS --exclude=configs \
              linux-2.4.20 linux-openmosix > \
              /usr/src/redhat/SOURCES/openMosix-2.4.20-3
       # bzip2 /usr/src/redhat/SOURCES/openMosix-2.4.20-3

  9. 此时,您的 /usr/src/redhat/SOURCES 目录应如下所示

       # ls /usr/src/redhat/SOURCES
       kernel-2.4.20-athlon.config      kernel-2.4.20-i686-smp.config
       kernel-2.4.20-athlon-smp.config  linux-2.4.20.tar.bz2
       kernel-2.4.20-i386.config        openMosix-2.4.20-3.bz2
       kernel-2.4.20-i686.config        openmosix-kernel.spec

  10. 现在您只需要 rpmbuild 整个东西 - 我通常做的是

       # cd /usr/src/redhat/SOURCES
       # rpmbuild -ba --target   i386   openmosix-kernel.spec
       # rpmbuild -bb --target   i686   openmosix-kernel.spec
       # rpmbuild -bb --target athlon   openmosix-kernel.spec
    但是您可以通过调用轻松构建所有 rpm
     # rpmbuild -ba --target all_x86  openmosix-kernel.spec

  11. 在 rpmbuild 完成其工作后,您应该在 /usr/src/redhat 目录下拥有以下文件

      a) RPMS/i386/openmosix-kernel-2.4.20-openmosix3.i386.rpm
        b) RPMS/i686/openmosix-kernel-2.4.20-openmosix3.i686.rpm
        c) RPMS/i686/openmosix-kernel-smp-2.4.20-openmosix3.i686.rpm
        d) RPMS/athlon/openmosix-kernel-2.4.20-openmosix3.athlon.rpm
        e) RPMS/athlon/openmosix-kernel-smp-2.4.20-openmosix3.athlon.rpm
        f) RPMS/i386/openmosix-kernel-source-2.4.20-openmosix3.i386.rpm
        g) SRPMS/openmosix-kernel-2.4.20-openmosix3.src.rpm
        h) SOURCES/openMosix-2.4.20-3.gz
    其中
      a) binary kernel package for i386 UP* machines
        b) binary kernel package for i686 UP* machines
        c) binary kernel package for i686 SMP** machines
        d) binary kernel package for athlon UP* machines
        e) binary kernel package for athlon SMP** machines
        f) source kernel package for any x86 machine (basically this is
           useful if you need to have the openMosix kernel headers)
        g) source kernel package (see point 11)
        h) kernel patch file compressed with gzip

  12. 从 .src.rpm 文件中获取所有文件的魔咒是:# rpm2cpio openmosix-kernel-....src.rpm | cpio -di

特别感谢 Martin H�y 在我尝试将所有内容组合在一起时提供的帮助。

希望您觉得本文档有用。至少对我来说是这样,因为我往往在完成事情后几分钟就忘记了 :)

* UP = 单处理器(即一个 CPU)** SMP = 对称多处理(即多个 CPU)


附录 B. 更多信息

B.1. irc

一些 openMosix 爱好者在线上花费时间在 irc 上帮助人们。我们在 irc.freenode.net 上的 #openMosix 上。加入我们,讨论您的问题、想法以及有关 openMosix 的其他内容


B.2. 进一步阅读


B.3. 翻译

有些人一直在努力将本 HOWTO 的部分内容翻译成他们自己的语言,或者只是纯粹的 openMosix 文档。

如果您正在翻译本文档,请告知我们。


B.3.1. 中文

Ding Wei 用中文编写了一些文档,您可以在 http://software.ccidnet.com/pub/disp/Article?columnID=732&articleID=25795&pageNO=1 上阅读

这是中文文档的 本地 PDF 副本


B.3.2. 西班牙语

Miquel Catal�n Co�thas 与一些同事一起致力于 HOWTO 的西班牙语翻译 http://w3.akamc2.net/


B.3.3. 俄语

Dmitry Katusubo 翻译了 openmosix 网站,并与 Yuri Prushinsky 一起翻译了 openMosix HOWTO http://www.openmosix.org.ru/docs/openMosix-HOWTO-multi/


附录 C. 鸣谢

为本 HOWTO 做出贡献的人员名单很长,我实际上已经忘记了所有应该在这里的人员。我经常在他们贡献的部分旁边添加他们的名字。

如果您觉得您的名字遗漏在此处,请随时与我联系,我很乐意将您的名字添加到列表中。

Scot W. Stevenson

我必须感谢 Scot W. Stevenson 在我接手之前为本 HOWTO 所做的所有工作。他为本文档开了一个好头。

Assaf Spanier

与 Scott 一起起草了本 HOWTO 的布局和章节。现在承诺帮助我完成本文档。

Matthias Rechenburg

Matthias Rechenburg 应该感谢他在 openMosixview 和随附文档方面所做的工作,我们已将其包含在本 HOWTO 中。

Jean-David Marrow

是 Clump/OS 的作者,他将有关其发行版的文档贡献给了 HOWTO。

Bruce Knox

是 openMosix 网站的维护者,他尽其所能提供帮助并提供了大量反馈!

Evan Hisey

感谢他努力在 WIKI 中添加额外的文档

Charles Nadeau

感谢他努力在 WIKI 中添加额外的文档

Louis Zechter

Moshe Bar

感谢他编写的代码,并在他知道答案的地方帮助文档!

Amit Shah

感谢他开始研究 openMosix 内部原理

Mirko Caserta

感谢他向本 HOWTO 发送了大量的补丁

Ramon Pons

感谢他校对 HOWTO 并提供了一些建议


附录 D. GNU 自由文档许可证

版本 1.1,2000 年 3 月

版权所有 (C) 2000 Free Software Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 允许任何人复制和分发本许可证文档的完整副本,但不允许更改它。


0. 前言

本许可证的目的是使手册、教科书或其他书面文档在自由的意义上“自由”:以确保每个人都有效地自由地复制和再分发它,无论是否对其进行修改,无论是商业性还是非商业性。其次,本许可证为作者和出版商保留了一种为其作品获得荣誉的方式,同时不被视为对他人所做的修改负责。

本许可证是一种“反版权”,这意味着文档的衍生作品本身必须在相同的意义上是自由的。它补充了 GNU 通用公共许可证,后者是为自由软件设计的反版权许可证。

我们设计本许可证是为了将其用于自由软件的手册,因为自由软件需要自由文档:自由程序应附带提供与软件相同自由的手册。但是,本许可证不限于软件手册;它可以用于任何文本作品,无论主题是什么,也无论是否以印刷书籍形式出版。我们主要建议将本许可证用于目的在于指导或参考的作品。


1. 适用性和定义

本许可证适用于任何手册或其他包含版权所有者放置的声明的作品,声明该作品可以根据本许可证的条款分发。“文档”(以下简称“文档”)是指任何此类手册或作品。任何公众成员均为被许可人,并被称为“您”。

“文档的修改版本”是指包含文档或其一部分的任何作品,无论是逐字复制,还是进行修改和/或翻译成另一种语言。

“次要章节”是文档的命名附录或前言章节,专门处理文档的出版商或作者与文档的总体主题(或相关事项)的关系,并且不包含任何可以直接归入该总体主题的内容。(例如,如果文档部分是数学教科书,则次要章节可能不解释任何数学。)这种关系可能是与主题或相关事项的历史联系,或者与有关它们的法律、商业、哲学、伦理或政治立场有关。

“不变章节”是某些次要章节,其标题在声明文档根据本许可证发布的声明中被指定为不变章节的标题。

“封面文字”是在声明文档根据本许可证发布的声明中列出的某些短语,作为封面文字或封底文字。

“透明”文档副本是指机器可读的副本,以其规范可供公众使用的格式表示,其内容可以使用通用文本编辑器或(对于由像素组成的图像)通用绘画程序或(对于绘图)某些广泛可用的绘图编辑器直接且直接地查看和编辑,并且适合输入文本格式化程序或自动翻译成各种适合输入文本格式化程序的格式。以其他透明文件格式制作的副本,其标记旨在阻止或阻止读者随后进行修改,则不是透明的。不“透明”的副本称为“不透明”。

透明副本的合适格式示例包括没有标记的纯 ASCII、Texinfo 输入格式、LaTeX 输入格式、使用公开可用的 DTD 的 SGML 或 XML,以及为人工修改而设计的符合标准的简单 HTML。不透明格式包括 PostScript、PDF、只能由专有文字处理器读取和编辑的专有格式、DTD 和/或处理工具通常不可用的 SGML 或 XML,以及某些文字处理器仅出于输出目的而生成的机器生成的 HTML。

“标题页”对于印刷书籍,是指标题页本身,以及为清晰地容纳本许可证要求出现在标题页中的材料所需的后续页。对于没有标题页格式的作品,“标题页”是指最突出显示作品标题附近的文本,位于正文文本的开头之前。


2. 逐字复制

您可以以任何媒介复制和分发文档,无论是商业性还是非商业性,前提是在所有副本中复制本许可证、版权声明和声明本许可证适用于文档的许可证声明,并且您不得在本许可证的条款中添加任何其他条件。您不得使用技术措施来阻止或控制您制作或分发的副本的阅读或进一步复制。但是,您可以接受报酬以换取副本。如果您分发的副本数量足够大,您还必须遵循第 3 节中的条件。

您也可以在上述相同的条件下借出副本,并且您可以公开展示副本。


3. 批量复制

如果您出版的文档印刷副本数量超过 100 份,并且文档的许可证声明要求封面文字,则您必须将副本装在封面上,封面上清晰且清晰地印有所有这些封面文字:封面上的封面文字和封底上的封底文字。两个封面还必须清晰且清晰地将您标识为这些副本的出版商。封面必须以标题中的所有单词同样突出和可见的方式呈现完整标题。您可以在封面上添加其他材料。只要封面保留文档的标题并满足这些条件,则对封面进行更改的复制可以被视为其他方面的逐字复制。

如果任一封面的所需文字太多而无法清晰地容纳,则应将列出的第一个文字(尽可能多地容纳)放在实际封面上,并将其余文字继续放在相邻页面上。

如果您出版或分发数量超过 100 份的文档不透明副本,则必须在每个不透明副本中包含一个机器可读的透明副本,或者在每个不透明副本中或随附声明一个公开可访问的计算机网络位置,其中包含文档的完整透明副本,不包含添加的材料,并且使用公共标准网络协议,一般网络用户可以匿名免费下载。如果您使用后一个选项,则当您开始批量分发不透明副本时,您必须采取合理谨慎的步骤,以确保此透明副本在声明的位置保持可访问状态,直到您向公众分发该版本的最后一个不透明副本(直接或通过您的代理商或零售商)后至少一年。

建议但不要求您在再分发大量副本之前与文档的作者联系,让他们有机会向您提供文档的更新版本。


4. 修改

您可以根据以上第 2 节和第 3 节的条件复制和分发文档的修改版本,前提是您根据本许可证精确地发布修改版本,修改版本在其中充当文档的角色,从而许可修改版本的发行和修改给拥有其副本的任何人。此外,您必须在修改版本中执行以下操作

  1. 在标题页(以及封面,如果有的话)中使用与文档标题不同的标题,以及与先前版本的标题不同的标题(如果存在任何先前版本,则应在文档的历史记录部分中列出)。如果该版本的原始出版商允许,您可以使用与先前版本相同的标题。

  2. 在标题页上,将一个或多个对修改版本的修改负责的个人或实体列为作者,并列出文档的至少五位主要作者(如果文档的主要作者少于五位,则列出所有主要作者)。

  3. 在标题页上,声明修改版本的出版商名称作为出版商。

  4. 保留文档的所有版权声明。

  5. 在其他版权声明旁边,为您的修改添加适当的版权声明。

  6. 在版权声明之后,立即包含一份许可声明,声明公众有权根据本许可证的条款使用修改版本,声明格式如下文附录所示。

  7. 在该许可声明中,保留文档许可声明中给出的不变章节和要求的封面文本的完整列表。

  8. 包含本许可证的未修改副本。

  9. 保留标题为“History”的章节及其标题,并在其中添加一项,至少说明标题页上给出的修改版本的标题、年份、新作者和出版商。如果文档中没有标题为“History”的章节,则创建一个,说明标题页上给出的文档的标题、年份、作者和出版商,然后添加一项,描述如前一句所述的修改版本。

  10. 保留文档中给出的任何网络位置,以便公众访问文档的透明副本,以及文档中给出的其所基于的先前版本的网络位置。这些可以放在“History”章节中。对于在文档本身至少四年前发布的作品,或者如果其引用的版本的原始出版商给予许可,您可以省略网络位置。

  11. 在任何标题为“Acknowledgements”或“Dedications”的章节中,保留该章节的标题,并在该章节中保留其中给出的每个贡献者致谢和/或献词的所有实质内容和语气。

  12. 保留文档的所有不变章节,其文本和标题均不得修改。章节编号或等效内容不被视为章节标题的一部分。

  13. 删除任何标题为“Endorsements”的章节。修改版本中不得包含此类章节。

  14. 不要将任何现有章节重命名为“Endorsements”,或使其标题与任何不变章节的标题冲突。

如果修改版本包含符合二级章节条件的新前置章节或附录,并且不包含从文档复制的材料,您可以选择将其中部分或全部章节指定为不变章节。为此,请将它们的标题添加到修改版本的许可声明中的不变章节列表中。这些标题必须与任何其他章节标题不同。

您可以添加一个标题为“Endorsements”的章节,前提是它只包含各方对您的修改版本的认可——例如,同行评审声明或文本已被某个组织批准为标准的权威定义。

您可以在修改版本的封面文本列表末尾添加最多五个单词的封面前页文本,以及最多 25 个单词的封底文本。任何一个实体只能添加(或通过安排添加)一段封面前页文本和一段封底文本。如果文档已经包含同一封面的封面文本,该文本 ранее 由您添加或通过您代表的同一实体安排添加,则您不得添加另一个;但您可以在获得添加旧文本的前出版商的明确许可后替换旧文本。

文档的作者和出版商并未通过本许可证授予使用其姓名进行宣传或声明或暗示认可任何修改版本的许可。


5. 合并文档

您可以将文档与根据本许可证发布的其他文档合并,根据上文第 4 节中为修改版本定义的条款,前提是您在合并中包含所有原始文档的所有不变章节,且不得修改,并在其许可声明中将它们全部列为合并作品的不变章节。

合并的作品只需要包含一份本许可证的副本,多个相同的不变章节可以用单个副本替换。如果有多个名称相同但内容不同的不变章节,请通过在其末尾添加括号,注明该章节的原始作者或出版商的名称(如果已知),或者添加一个唯一的数字,使每个此类章节的标题唯一。在合并作品的许可声明中的不变章节列表中,对章节标题进行相同的调整。

在合并中,您必须合并各个原始文档中任何标题为“History”的章节,形成一个标题为“History”的章节;同样合并任何标题为“Acknowledgements”的章节和任何标题为“Dedications”的章节。您必须删除所有标题为“Endorsements”的章节。


6. 文档集合

您可以创建一个集合,其中包含文档和根据本许可证发布的其他文档,并将各个文档中本许可证的单独副本替换为集合中包含的单个副本,前提是您在所有其他方面都遵循本许可证关于每个文档逐字复制的规则。

您可以从此类集合中提取单个文档,并根据本许可证单独分发,前提是您在提取的文档中插入本许可证的副本,并在关于该文档逐字复制的所有其他方面都遵循本许可证。


7. 与独立作品的聚合

在存储或分发介质的卷中或卷上,将文档或其衍生作品与其他单独且独立的文档或作品汇编在一起,整体上不计为文档的修改版本,前提是未对汇编声明汇编版权。这种汇编称为“聚合”,并且本许可证不适用于与文档汇编在一起的其他独立作品,因为它们是这样汇编在一起的,如果它们本身不是文档的衍生作品。

如果第 3 节的封面文本要求适用于文档的这些副本,那么如果文档小于整个聚合的四分之一,则文档的封面文本可以放置在仅围绕聚合内文档的封面上。否则,它们必须出现在围绕整个聚合的封面上。


8. 翻译

翻译被认为是一种修改,因此您可以根据第 4 节的条款分发文档的翻译。用翻译替换不变章节需要其版权持有人的特别许可,但您可以除了这些不变章节的原始版本之外,还包括部分或全部不变章节的翻译。您可以包含本许可证的翻译,前提是您也包含本许可证的原始英文版本。如果翻译版本与本许可证的原始英文版本之间存在分歧,则以原始英文版本为准。


9. 终止

除非本许可证明确规定,否则您不得复制、修改、再许可或分发文档。任何其他尝试复制、修改、再许可或分发文档的行为均属无效,并将自动终止您在本许可证下的权利。但是,根据本许可证从您处收到副本或权利的各方,只要这些方保持完全合规,其许可证就不会终止。


10. 本许可证的未来修订

自由软件基金会可能会不时发布 GNU 自由文档许可证的新修订版本。这些新版本在精神上与当前版本相似,但在细节上可能有所不同,以解决新的问题或疑虑。请参阅 https://gnu.ac.cn/copyleft/

本许可证的每个版本都有一个区分版本号。如果文档指定本许可证的特定编号版本“或任何后续版本”适用于它,您可以选择遵循指定版本的条款和条件,或者遵循自由软件基金会已发布的(非草案)任何后续版本的条款和条件。如果文档未指定本许可证的版本号,您可以选择自由软件基金会曾发布的(非草案)任何版本。


如何将本许可证用于您的文档

要在您编写的文档中使用本许可证,请在文档中包含本许可证的副本,并将以下版权和许可声明放在标题页之后

版权所有 (c) 年份 您的姓名。根据自由软件基金会发布的 GNU 自由文档许可证 1.1 版或任何后续版本的条款,授予复制、分发和/或修改本文档的许可;不变章节为 列出它们的标题,封面前页文本为 列出,封底文本为 列出。许可证的副本包含在标题为“GNU 自由文档许可证”的章节中。

如果您没有不变章节,请写“没有不变章节”,而不是说哪些是不变的。如果您没有封面前页文本,请写“没有封面前页文本”,而不是“封面前页文本为 列出”;封底文本也一样。

如果您的文档包含重要的程序代码示例,我们建议您在您选择的自由软件许可证(例如 GNU 通用公共许可证)下并行发布这些示例,以允许在自由软件中使用它们。


索引