Beowulf HOWTO

Kurt Swendson

2004-05-17

修订历史
修订 1.02005-01-08
首次正式发布
修订 0.92004-05-17修订者:01
初始修订

本文档描述了构建 Beowulf 集群的逐步说明。 这是本文档的 Red Hat 和 LAM 特定版本。


目录
1. 简介
1.1. 版权和许可
1.2. 免责声明
1.3. 鸣谢/贡献者
1.4. 反馈
2. 定义
3. 要求
4. 设置主节点
4.1. 主机
4.2.
4.3. NFS
4.4. IP 地址
4.5. 服务
4.6. SSH
4.7. MPI
5. 设置从节点
5.1. 基础 Linux 安装
5.2. 硬件
5.3. 安装后命令
5.4. 从节点上的 SSH
5.5. 从节点上的 NFS 设置
5.6. 从节点上的 Lilo 修改
6. 验证
7. 运行程序

1. 简介

本文档描述了构建 Beowulf 集群的逐步说明。 在查看了所有可用的文档之后,我感觉存在足够的差距和遗漏,因此我认为我自己的文档可以准确地描述如何构建 Beowulf 集群,这将是有益的。

我最初在《科学美国人》杂志上看到了托马斯·斯特林的文章,并立即购买了这本书,因为它的标题是“如何构建 Beowulf”。 毫无疑问,这是一份有价值的参考资料,但它并没有引导您完成有关具体操作的说明。

以下是我成功完成的工作的描述。 这只是一个例子 - 我的例子。 您可以选择不同的消息传递接口; 您可以选择不同的 Linux 发行版。 您也可以像我一样花费大量时间进行研究和实验,并自行学习。


1.1. 版权和许可

本文档《Beowulf HOWTO》版权归 Kurt Swendson 所有,(c) 2004 年。 在 GNU 自由文档许可证 1.1 版或自由软件基金会发布的任何后续版本的条款下,允许复制、分发和/或修改本文档; 不包含不变章节,不包含封面文本,也不包含封底文本。 许可证副本可在 https://gnu.ac.cn/copyleft/fdl.html 获取。

Linux 是 Linus Torvalds 的注册商标。


1.2. 免责声明

对于本文档的内容,概不承担任何责任。 使用文中的概念、示例和信息,风险自负。 可能存在错误和不准确之处,可能会对您的系统造成损害。 尽管这种情况极不可能发生,但请谨慎操作。 作者不对您的行为承担责任。

所有版权均归其各自所有者所有,除非另有特别说明。 在本文档中使用术语不应被视为影响任何商标或服务标志的有效性。 对特定产品或品牌的命名不应被视为认可。


1.3. 鸣谢/贡献者

感谢托马斯·约翰逊给予的所有支持和鼓励,当然,还要感谢硬件,没有硬件我甚至无法开始。

感谢我可爱的妻子莎伦,感谢她在我在“群狼”身上花费大量时间期间的理解和耐心。

Jacek Radajewski 和 Douglas Eadline 撰写的 原始 Beowulf HOWTO


1.4. 反馈

请将您的添加、评论和批评发送至.


2. 定义

什么是 Beowulf 集群? 原始 Beowulf HOWTO 的作者 Jacek Radajewski 和 Douglas Eadline 在他们的文档中提供了一个很好的定义:“Beowulf 是一种多计算机架构,可用于并行计算。 它是一个系统,通常由一个服务器节点和一个或多个客户端节点组成,这些节点通过以太网或其他网络连接在一起”。 站点 beowulf.org 列出了许多关于个人和组织构建的 Beowulf 系统的网页。 通过这两个链接,人们可以接触到大量关于 Beowulf 架构的观点,并得出他/她自己的结论。

真正的 Beowulf 集群和 COW [工作站集群] 之间有什么区别? Brahma 给出了一个很好的定义: http://www.phy.duke.edu/brahma/beowulf_book/node62.html

如果您是您所在组织的“用户”,并且您可以使用一些节点,您仍然可以按照此处显示的说明创建 COW。 但是,如果您“拥有”节点,也就是说,如果您完全控制它们,并且能够完全擦除和重建它们,您可以创建一个真正的 Beowulf 集群。

在 Brahma 的网页中,他建议您手动配置每个盒子,然后在稍后(在您感受到完成整个“狼化”过程之后),您可以自动设置新节点(我将在以后的文档中描述)。


3. 要求

让我们简要概述一下要求

拥有 kvm 切换器不是必需的,[您知道,该切换器可以在多个盒子之间共享一个键盘、视频和鼠标],但在设置和/或调试时很方便。


4. 设置主节点

那么让我们开始“狼化”。 选择功能最强大的盒子作为主节点。 在那里安装 Linux 并选择您想要的所有软件包。 唯一的要求是您选择“网络服务器”[在 Red Hat 术语中],因为您需要 NFS 和 ssh。 这就是您所需要的全部。 在我的例子中,我将要开发 Beowulf 应用程序,所以我添加了 X 和 C 开发。

我的经验是,您实际上并不需要 NFS,但我发现它对于在节点之间复制文件以及自动化安装过程非常宝贵。 在本文档的后面,我将描述如何在不使用 NFS 的情况下运行简单的 Beowulf 应用程序,但更复杂的应用程序可能会使用 NFS 或实际上依赖于 NFS。

那些研究 Beowulf 系统的人也会知道您如何在主节点上安装第二张网卡,以便您可以从外部世界访问它。 这对于集群的运行不是必需的。

我付出了惨痛的代价才学会:使用符合您的 Linux 发行版的强密码约束的密码。 我为我的用户使用了像“a”这样容易输入的密码,结果整个事情都无法工作。 当我将密码更改为包含混合数字、字符、大小写的合法密码时,它就工作了。

如果您使用 lam 作为您的消息传递接口,您将在手册中读到要关闭防火墙,因为它们使用随机端口号在节点之间进行通信。 这里有一条规则:如果手册告诉您要做某事,那就去做吧! lam 手册还告诉您以非 root 用户身份运行。 为每个盒子创建相同的用户。 使用相同的用户和密码构建集群上的每个盒子。 我将该非 root 用户命名为“wolf”。


4.1. 主机

首先我们修改 /etc/hosts。 在其中,您将看到注释告诉您不要管“localhost”行。 忽略该建议,并将其更改为不包含环回地址中您盒子的名称。

修改说以下内容的行

127.0.0.1 wolf00 localhost.localdomain localhost

...现在改为

127.0.0.1 localhost.localdomain localhost 

然后添加您想要在集群上的所有盒子。 注意:这对于 Beowulf 集群的运行不是必需的; 只是为了方便,这样当您引用集群上的盒子时,您可以键入简单的“wolf01”,而不是更繁琐的 192.168.0.101

192.168.0.100 wolf00
192.168.0.101 wolf01
192.168.0.102 wolf02
192.168.0.103 wolf03
192.168.0.104 wolf04

4.2. 组

为了负责任地设置您的集群,特别是如果您是盒子的“用户”[请参阅定义],您应该采取一些安全措施。

在您创建用户后,创建一个组,并将用户添加到该组。 然后,您可以修改您的文件和目录,使其仅可由该组内的用户访问

groupadd beowulf 
usermod -g beowulf wolf 

...并将以下内容添加到 /home/wolf/.bash_profile

umask 007

现在,用户“wolf”[或组内任何用户] 创建的任何文件都将自动仅对组“beowulf”可写。


4.3. NFS

请参阅以下网站: http://www.ibiblio.org/mdw/HOWTO/NFS-HOWTO/server.html

打印出来,并放在您身边。 我将指导您如何修改您的系统以创建 NFS 服务器,但我发现这个网站非常宝贵,您也可能如此。

创建一个目录供所有人共享

mkdir /mnt/wolf 
chmod 770 /mnt/wolf 
chown wolf:beowulf /mnt/wolf -R 

转到 /etc 目录,并将您的“shared”目录添加到 exports 文件

cd /etc 
cat >> exports 
/mnt/wolf 192.168.0.100/192.168.0.255 (rw) 
<control d>

4.4. IP 地址

我的网络是 192.168.0.nnn,因为它是“私有”IP 范围之一。 托马斯·斯特林在他的书的第 106 页谈到了这一点。 它在我的防火墙内,并且工作正常。

我的主节点,我称之为“wolf00”,是 192.168.0.100,每个其他节点都命名为“wolfnn”,IP 地址为 192.168.0.100 + nn。 我遵循了许多网页上的明智建议,并为更轻松地扩展我的集群做好了准备。


4.5. 服务

确保我们需要的服务已启动

chkconfig -add sshd 
chkconfig -add nfs 
chkconfig -add rexec 
chkconfig -add rlogin 
chkconfig -level 3 rsh on 
chkconfig -level 3 nfs on 
chkconfig -level 3 rexec on 
chkconfig -level 3 rlogin on

...并且,在启动期间,我看到了一些我知道我不想要的服务,并且在我看来,可以删除。 您可以添加或删除其他适合您需要的服务; 只需包含上面显示的服务即可。

chkconfig -del atd 
chkconfig -del rsh
chkconfig -del sendmail

4.6. SSH

为了负责任,我们让 ssh 工作。 以 root 用户身份登录后,您必须修改 /etc/ssh/sshd_config 文件。 以下行

#RSAAuthentication yes 
#AuthorizedKeysFile .ssh/authorized_keys

...被注释掉了,因此取消注释它们 [删除 #]。

重新启动,并以 wolf 身份重新登录,因为您的集群的操作将始终从用户“wolf”完成。 此外,之前完成的 hosts 文件修改必须生效。 注销并重新登录不会执行此操作。 为了确保,请重新启动盒子,并确保您的提示符显示主机名“wolf00”。

要生成您的公钥和私钥 SSH 密钥,请执行以下操作

ssh-keygen -b 1024 -f ~/.ssh/id_rsa -t rsa -N "" 

...它将显示一些消息,并告诉您它创建了公钥/私钥对。 您将在 /home/wolf/.ssh 目录中看到这些文件 id_rsa 和 id_rsa.pub。

将 id_rsa.pub 文件复制到名为“authorized_keys”的文件中,就在 .ssh 目录中。 我们稍后将使用此文件。 验证此文件的内容是否显示主机名 [我们重新启动盒子的原因]。 修改文件和目录的安全性

chmod 644 ~/.ssh/auth* 
chmod 755 ~/.ssh 

根据 LAM 用户组的说法,只有主节点需要登录到从节点; 而不是相反。 因此,当我们复制公钥文件时,我们只将主节点的密钥文件复制到每个从节点,并在主节点上设置代理。 这比将所有 authorized_keys 文件复制到所有节点要容易得多。 我稍后会更详细地描述这一点。

注意:我仅记录消息传递接口的 LAM 发行版的要求; 如果您选择另一个消息传递接口来构建您的集群,您的要求可能会有所不同。

在 /home/wolf/.bash_profile 的末尾,添加以下语句 [同样,这是 lam 特有的; 您的要求可能会有所不同]

export LAMRSH='ssh -x' 
ssh-agent sh -c 'ssh-add && bash'

4.7. MPI

最后,将您的消息传递接口放在盒子上。 正如 1.2 要求中所述,我使用了 lam。 您可以从这里获取 lam

http://www.lam-mpi.org/

...但您可以使用您想要的任何其他消息传递接口或并行虚拟机软件。 同样,我只是向您展示对我有效的方法。

您可以从提供的源代码构建 LAM,也可以使用其预编译的 RPM 软件包。 描述这一点不在本文档的范围之内; 我只是获取了源代码并按照说明进行操作,在另一个实验中,我安装了他们的 rpm。 它们都工作正常。 记住我们做这件事的全部原因是为了学习; 前进并学习。

您还可以阅读更多关于 LAM 和其他消息传递接口软件的文档 此处。


5. 设置从节点

拿出您的网线。 在第一个非主节点上安装 Linux。 对每个非主节点执行以下步骤。


5.1. 基础 Linux 安装

按照我的示例节点名称和 IP 地址,这是我在设置期间选择的内容

Workstation 
auto partition 
remove all partitions on system 
use LILO as the boot loader 
put boot loader on the MBR 
host name wolf01 
ip address 192.168.0.101 
add the user "wolf"
same password as on all other nodes 
NO firewall

唯一安装的软件包:网络服务器。 取消选择所有其他软件包。

您选择其他任何内容都无关紧要; 这是您需要的最低限度。 为什么要用您永远不会使用的非必要软件填充盒子? 我的研究一直集中在寻找启动和运行的最小配置。

这是另一个非常重要的点:当您转向自动化安装和配置时,您实际上永远不会登录到盒子。 只有在设置和安装期间,我才会在盒子上直接键入任何内容。


5.2. 硬件

当计算机启动时,如果它没有连接键盘,它会抱怨。 我无法修改 BIOS,因为我的盒子是较旧的丢弃盒子,没有文档,所以我只是连接了一个“假”键盘。

我在计算机行业工作,看到成百上千的键盘来来往往,有时有些键盘最终会被扔进垃圾桶。 我从垃圾桶里拿出旧的坏键盘,只拆下带有小电路板的电线,电路板在角落里,数字锁定和 Caps Lock 指示灯在那里。 然后我插入电线,计算机认为它有一个完整的键盘而没有任何问题。

同样,如果您能够修改您的 BIOS,您最好修改您的 BIOS。 这只是在您没有 bios 程序时使用的一个技巧。


5.3. 安装后命令

在您新安装的盒子重新启动后,再次以 root 身份登录,然后...

  • 执行上面所述的相同 chkconfig 命令来设置正确的服务。

  • 修改 hosts; 从 localhost 中删除“wolfnn”,并仅添加 wolfnn 和 wolf00。

  • 安装 lam

  • 创建 /mnt/wolf 目录并为其设置安全性。

  • 执行 ssh 配置

到目前为止,我们与主节点几乎相同。 我不修改 exports 文件。

另外,不要将此行添加到 .bash_profile

sh -c 'ssh-add && bash'

5.4. 从节点上的 SSH

回想一下,在主节点上,我们创建了一个文件“authorized_keys”。 将在您的主节点上创建的该文件复制到从节点上的 ~/.ssh 目录。 HEAD 节点将登录到所有 SLAVE 节点。

LAM 用户手册中规定的要求是,从主节点登录到任何从节点时都不应需要交互。 因此,将主节点的公钥复制到每个从节点的“authorized_keys”文件中,告诉每个从节点“允许 wolf00 上的 wolf 用户在此处登录而无需任何密码; 我们知道这是安全的。”

但是,您可能还记得文档指出,第一次登录时,它会要求确认。 因此,仅在完成上述配置后,返回到主节点,然后键入 ssh wolfnn,其中“wolfnn”是您新配置的从节点的名称。 它会要求您确认,您只需回答“yes”即可,这将是您最后一次需要交互。

通过注销来证明这一点,然后 ssh 返回到该节点,它应该立即登录您,而没有任何对话框。


5.5. 从节点上的 NFS 设置

以 root 身份,输入以下命令

cat >> /etc/fstab 
wolf00:/mnt/wolf /mnt/wolf nfs rw,hard,intr 0 0 
<control d> 

我们在这里所做的是自动挂载我们在主节点上的 /etc/exports 文件中导出的目录。 稍后在本文档中将对 nfs 进行更多讨论。


5.6. 从节点上的 Lilo 修改

然后修改 /etc/lilo.conf。

此文件的第 2 行说

timeout=nn

修改该行以说

timeout=1200

修改后,我们调用更改。 您键入“/sbin/lilo”,它将显示“added linux *”以确认它已接受您对 lilo.conf 文件所做的更改

/sbin/lilo
Added linux * 

我为什么要进行此 lilo 修改? 如果您在 Web 上研究 Beowulf,并了解了我到目前为止所做的一切,您可能会想,“我不记得读到过任何关于 lilo.conf 的内容。”

我的所有 Beowulf 节点都共享一个电源排插。 我打开电源排插,集群上的每个盒子都会立即启动。 随着启动过程的进行,它会挂载文件系统。 看到非主节点从主节点挂载共享目录,它们都必须稍等片刻,直到主节点启动并准备好 NFS。 因此,我让每个从节点在 lilo 步骤中等待 2 分钟。 与此同时,主节点启动,并使共享目录可用。 到那时,从节点最终开始启动,因为 lilo 已等待 2 分钟。


6. 验证

全部完成! 您几乎可以开始狼化了。

重新启动您的盒子。 它们都启动了吗? 您可以从每个盒子 ping 主节点吗? 您可以从主节点 ping 每个节点吗? 您可以 ssh 吗? 不要担心以 root 身份执行 ssh; 仅以 wolf 身份执行。 还要仅担心从主节点到从节点的 ssh,而不是相反方向。

如果您以 wolf 身份登录,并 ssh 到一个盒子,它会自动进行,而无需提示输入密码吗?

在节点启动后,以 wolf 身份登录,然后说“mount”。 它是否显示已挂载 wolf00:/mnt/wolf? 在主节点上,将一个文件复制到 /mnt/wolf。 您可以从从节点读取和写入该文件吗?

这实际上不是必需的; 仅仅是为了方便起见,在主节点上驻留一个公共目录。 通过公共共享目录,您可以轻松地使用 scp 在盒子之间复制文件。 斯特林在他的书的第 119 页指出,单个 NFS 服务器会严重阻碍扩展到大量节点。 当我从少量盒子增加到大量盒子时,我了解到了这一点。


7. 运行程序

一旦您可以完成上面显示的所有测试,您应该能够运行程序了。 从此以后,说明是 lam 特有的。

返回到主节点,以 wolf 身份登录,然后输入以下命令

cat > /nnt/wolf/lamhosts 
wolf01 
wolf02 
wolf03 
wolf04 
<control d>

转到 lam 示例目录,并编译“hello.c”

mpicc -o hello hello.c 
cp hello /mnt/wolf 

然后,如 lam 文档所示,启动 lam

[wolf@wolf00 wolf]$ lamboot -v lamhosts 
LAM 7.0/MPI 2 C++/ROMIO - Indiana University 
n0<2572> ssi:boot:base:linear: booting n0 (wolf00) 
n0<2572> ssi:boot:base:linear: booting n1 (wolf01) 
n0<2572> ssi:boot:base:linear: booting n2 (wolf02) 
n0<2572> ssi:boot:base:linear: booting n3 (wolf04) 
n0<2572> ssi:boot:base:linear: finished

所以我们现在终于准备好运行一个应用程序了。 [记住,我正在使用 lam; 您的消息传递接口可能具有不同的语法]。

[wolf@wolf00 wolf]$ mpirun n0-3 /mnt/wolf/hello 
Hello, world! I am 0 of 4 
Hello, world! I am 3 of 4 
Hello, world! I am 2 of 4 
Hello, world! I am 1 of 4 
[wolf@wolf00 wolf]$

回想一下,我上面提到了 NFS 的使用。 我告诉节点都使用 nfs 共享目录,当使用大量盒子时,这将成为瓶颈。 您可以轻松地将可执行文件复制到每个盒子,并在 mpirun 命令中指定节点本地目录:mpirun n0-3 /home/wolf/hello。 这样做的先决条件是所有文件都必须在本地可用。 事实上,我已经这样做了,并且它的工作效果比使用 nfs 共享可执行文件更好。 当然,如果我的集群应用程序需要修改集群中共享的文件,那么这个理论就会崩溃。