经过一天的努力,终于完成了openMPI的多节点安装,即小集群安装。本文使用的是openmpi-1.6.5,下载地址见:http://www.open-mpi.org/software/ompi/v1.6/
1.安装准备
1.1 首先肯定是需要安装GCC和G++编译器,这个直接apt-get就OK了;
sudo apt-get g++ gfortran
1.2 设置主机名
先在/etc/hosts中删除原来的hostname,然后 vi /etc/hostname改成你想要的,注意必须顶行写。然后使用hostname命令来重新得到hostname, logout一下再login就会改掉。
这里我用的是node1-ubuntu和node2-ubuntu。
1.3 修改hosts文件,修改如下:
192.168.1.133 node1-ubuntu server 192.168.1.135 node2-ubuntu
1.4 配置自动ssh登录
这里主要是要各个机器之间能无密码访问,主要用到的就是SSH,因此需要一些设置。
首先,我们需要导出各个节点的公钥和私钥:
$ ssh-keygen -t rsa
在运行过程中,会提示你输入这个输入那个,不用管那么多,直接回车就完了。等运行结束后,进入.ssh目录,你会看到公钥和私钥文件;
$ cd ~/.ssh $ ls id_rsa id_rsa.pub
其中id_rsa就是私钥,id_rsa.pub就是公钥,现在我们需要把各个节点上的公钥都集中发送到一个节点上,来制作授权文件(authorized_keys).
注意:在两台机器必须安装ssh(sudo apt-get install ssh openssh-server)而且必须设置root密码(sudo passwd root),才能远程登录
$ scp ~/.ssh/id_rsa.pub node1-ubuntu:~/.ssh/1.pub
在将node2-ubuntu拷贝到node1-ubuntu后,在node1-ubuntu进行如下处理:
$ cp ~/.ssh/id_rsa.pub authorized_keys $ cat ~/.ssh/1.pub >> authorized_keys
在node1-ubuntu上制作好的authorized_keys拷贝到node2-ubuntu上:(node1-ubuntu使用scp)
$ scp ~/.ssh/authorized_keys node2-ubuntu:~/.ssh/
要想让这两台机器无密码登录,所以我们需要更改一下必要的文件的权限(所有节点都要更改):其实只要保证authorized_keys的文件权限为600或者644
$ chmod 755 ~ $ chmod 755 ~/.ssh $ chmod 600 ~/.ssh/authorized_keys $ chmod 600 ~/.ssh/id_rsa $ chmod 644 ~/.ssh/id_rsa.pub
至此,SSH配置就完成了。下面检验一下:
在一个主机上面SSH另一个主机:
$ ssh node1-ubuntu
2.安装openMPI
2.1 首先将下载的文件解压,下载的文件在当前用户目录里面的“下载”目录里面,我直接解压到当前目录:
$ tar xvfz openmpi-1.6.5.tar.gz
2.2 安装官方文档配置的,可以查看解压后的README文档参考:由于是bash,因此选择以下命令,prefix指示安装路径,USERNAME就是当前用户的用户名,,
在此之前当然要建立安装openMPI的路径,也就是:
$ mkdir openmpi
运行shell程序configure对openmpi进行一些配置,关于configure选项,参见openmpi-1.6.5下的README文件。
$ ./configure --prefix=/home/<USERNAME>/openmpi 2>&1 | tee install1.log
而且在之前的安装过程中,我发现如果不禁止fortran,安装会出问题,会导致openMPI安装不完全而出错,是因为没有安装fortran编译器,如果使用C/C++的话,这里建议禁用fortran。
接下来,编译和安装:
$ make all 2>&1 | tee make.log $ make install 2>&1 | tee install2.log
安装完成后,会有如下情况:
至此,OpenMPI安装完成。
2.3 设置进程的配置环境
这里设置环境变量主要是将openmpi的安装目录加到系统环境变量中,这里我在/etc/environment中加入对应的路径:
用vim编辑器打开/etc/environment:
$ sudo vim /etc/environment
输入密码之后,将下面语句添加到最后一行:
PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/home/awy/openmpi/bin"
LD_LIBRARY_PATH=/home/awy/openmpi/lib
3.验证是否成功:
1 3 $ which mpicc 4 /home/awy/openmpi/bin/mpicc 5 $ which mpiexec 6 /home/awy/openmpi/bin/mpiexec 7 $ which mpirun 8 /home/awy/openmpi/bin/mpirun
这样就说明openmpi已经安装成功了。
运行安装目录中examples下的例子,在此之前,先编译下make:
mpiexec -np 2 ./openmpi-1.6.5/examples/hell_f90
4 配置机器数量以及进程数
用vim编辑一个文件命名为hosts:如果你想在一个节点上运行多个进程,那么hostfile 可以使用 "slots" 属性。如果没有指定"slots",那么将假设其数目为1.
node1-ubuntu
node2-ubuntu
或者
node1-ubuntu slots=4
node2-ubuntu slots=2
让两个节点并行运行例子程序,如下所示:
$ mpiexec -hostfile hosts -np 8 ./openmpi-1.6.5/examples/hello_f90
5.安装过程中遇到的问题:
1.出现这种错误./openmpi-1.6.5/examples/hello_f90: error while loading shared libraries: libmpi_f77.so.1: cannot open shared object file: No such file or directory,或者
bash: orted: command not found -------------------------------------------------------------------------- A daemon (pid 27974) died unexpectedly with status 127 while attempting to launch so we are aborting. There may be more information reported by the environment (see above). This may be because the daemon was unable to find all the needed shared libraries on the remote node. You may set your LD_LIBRARY_PATH to have the location of the shared libraries on the remote nodes and this will automatically be forwarded to the remote nodes. -------------------------------------------------------------------------- -------------------------------------------------------------------------- mpirun noticed that the job aborted, but has no info as to the process that caused that situation. -------------------------------------------------------------------------- mpiexec: clean termination accomplished
说明是LD_LIBRARY_PATH为空,可以进行这样查看:
mpiexec -n 1 printenv | grep PATH
查看LD_LIBRARY_PATH,如果没有,则可以进行如下操作:
$ source /etc/environment
$ export LD_LIBRARY_PATH
如此,便可以成功了。
2.如果要在IPv6的环境下运行openMPI,则安装的时候要开启:即在./configure --prefix=/home/<username>/openmpi --enable-ipv6,这样便可以了。