我的初步想法:1. 台式机XP虚拟Ubuntu10.04 + 笔记本Ubuntu9.04
2. 台式机XP虚拟Ubuntu10.04 + Ubuntu10.04_2
3. 在大型机上实验
配置Virtualbox环境:
均采用桥接方式:bridge,dhcp,这样能分别获得独立的同网段的ip地址
1.桥接方式(bridge) :
默认使用vmnet0
将虚拟机的ip设置与主机同网段未使用ip,其余与主机相同:
ip地址与主机同段相异,
子网掩码与主机相同,
网关与主机相同,
DNS服务器与主机相同。
实现虚拟机<--->主机虚拟机<---->互联网通信。
2.共享方式(nat) :
默认使用vmnet8
将虚拟机设置成使用dhcp方式上网,windows下选择"自动获取ip",linux下开启dhcp服务即可。
手动设置:
ip设置与vmnet8同网段,
网关设置成vmnet8的网关,
DNS服务器设置与主机相同,
实现虚拟机<--->主机虚拟机<---->互联网通信。
查找vmnet1的网关,通常是xxx.xxx.xxx.2
例如 vmnet8 ip:172.16.249.1 gw :172.16.249.2
虚拟机设置: ip :172.16.249.100 gw: 172.16.249.2
3.私有方式(host-only):
默认使用vmnet1
将虚拟机ip设置与vmnet8同网段,gateway设置成vmnet1的ip,其余设置与vmnet1相同,dns设置与主机相同
例如 vmnet1 ip :172.16.245.1
虚拟机设置: ip :172.16.245.100 gateway :172.16.245.1
这样就实现了虚拟机<--->主机通信,但是虚拟机<--->互联网 仍无法通信
采用第二种方法,因为发现1和2情况一样
配置Virtualbox环境:
均采用桥接方式:bridge,dhcp,这样能分别获得独立的同网段的ip地址
1.桥接方式(bridge) :
默认使用vmnet0
将虚拟机的ip设置与主机同网段未使用ip,其余与主机相同:
ip地址与主机同段相异,
子网掩码与主机相同,
网关与主机相同,
DNS服务器与主机相同。
实现虚拟机<--->主机虚拟机<---->互联网通信。
2.共享方式(nat) :
默认使用vmnet8
将虚拟机设置成使用dhcp方式上网,windows下选择"自动获取ip",linux下开启dhcp服务即可。
手动设置:
ip设置与vmnet8同网段,
网关设置成vmnet8的网关,
DNS服务器设置与主机相同,
实现虚拟机<--->主机虚拟机<---->互联网通信。
查找vmnet1的网关,通常是xxx.xxx.xxx.2
例如 vmnet8 ip:172.16.249.1 gw :172.16.249.2
虚拟机设置: ip :172.16.249.100 gw: 172.16.249.2
3.私有方式(host-only):
默认使用vmnet1
将虚拟机ip设置与vmnet8同网段,gateway设置成vmnet1的ip,其余设置与vmnet1相同,dns设置与主机相同
例如 vmnet1 ip :172.16.245.1
虚拟机设置: ip :172.16.245.100 gateway :172.16.245.1
这样就实现了虚拟机<--->主机通信,但是虚拟机<--->互联网 仍无法通信
采用第二种方法,因为发现1和2情况一样
SSH配置和多机并行 MPI的多机并行是用mpdboot来管理启动的,是由参与计算的其中一台机器通过mpdboot同时启动其他机器上的mpd管理器并运行相应MPI程序的,所以,需要赋予运行mpdboot的机器执行其他机器上程序的能力。 MPICH2支持通过ssh和rsh来做到这一点,其中ssh是默认的,而且其安全性也优于rsh,因此,我在项目中是用的ssh。 首先,我们需要修改所有机器上的/etc/hosts文件,在里面添加上参与计算的机器名和ip地址,比如本文中有两台机器参加的例子里, hosts文件应当为: 127.0.0.1 localhost.localdomain localhost 192.168.50.110 node0// 主机名为node0的机器ip地址为192.168.50.110 192.168.50.107 node1 // 主机名为node1的机器ip地址为192.168.50.107 当然,其实这一步也可以跳过,因为我们也可以在操作过程中直接使用ip地址,只不过那样不太方便。 另外就是,有些机器默认情况下第一行可能包括本机的主机名,比如在ip为192.168.50.110的node0上,hosts文件第一行是 127.0.0.1 localhost.localdomain localhost node0 这样可能会使得mpdboot工作不正常,所以还是最好给成上面的那种形式。 第二步是创建ssh密钥,命令行下: #ssh-keygen -t rsa -t rsa指的是密钥类型,具体请察看ssh相关资料,这里不多说。这样就在当前用户的home目录下生成了一个.ssh目录,本文中的就是/home/mpi/.ssh。 第三步,将/home/mpi/.ssh下的id_rsa.pub文件拷贝改名为authorized_keys,即 #cp id_rsa.pub authorized_keys 第四步,在其他所有机器上进行以下操作。 #ssh-keygen -t rsa 生成.ssh文件夹 #scp node0的IP:/home/mpi/.ssh/* ~/.ssh 拷贝node0上的.ssh文件夹覆盖本地的
第五步,在所有机器上建立与自己和所有其他机器的信任连接。 对每个节点执行: #ssh node0 #ssh node1 根据提示键入yes即可。然后就可以在不需要用户名密码的情况下通过ssh登陆其他机器了,比如在node0上#ssh node1, 就可以直接进入node1。
第六步,在启动mpdboot的机器上创建一个参与计算的host列表文件,如文件mpd.hosts,每行是一个主机名,创建过程如 #cd ~ #touch mpd.hosts #vi mpd.hosts node1 node2可以启动运算集群了
#mpdboot -n 2 -f mpd.hosts -n表示要启动的机器个数,一般是不大于mpd.hosts文件中的机器数,比如本文中的例子就是两台机器。这样,列表中的机器就会启动其本机上的mpd管理器。 =============================================================== 【报错】 【mpdboot_node1 (handle_mpd_output 405): failed to handshake with mpd on node2; recvd output={}】(我被它搞死了,mpd无法连通,就啥也干不了) 可能的原因: (1).mpd.conf设置不对,注意他的权限必须是600 (2)无密码的ssh不通,一定要保证它通 (3)这是我遇到的,我的/etc/hosts: 127.0.0.1 localhost 127.0.1.1 shenjie-desktop.shenjie-desktopshenjie-desktop 192.168.50.107 node2 192.168.50.110 node1 这样永远得不到正确的解析了,应该改成: 127.0.0.1 localhost 192.168.50.107 node2 192.168.50.110 node1 ====================================================
#mpirun -np 2 ./a.out -n表示要启动的进程个数,一般是不大于mpd.hosts文件中的机器数(或者cpu核心数?偶用的机器就是双核的了,所以单机的时候双进程比单进程效率好很多,但是三进程就不行)。 #mpirun -machinefile ./mm -np 8 ./a.out 由mm文件设定在不同的节点上需要使用的处理器个数,在mm文件中分别写了4个node1和node2.(需要换行写,个数不可以大于8,取用时从上往下分配节点)Mpd在运行过程中,可以通过mpdtrace显示参与计算的机器名,mpdtrace –l则是显示机器名以及其端口。
每次启动重新设置好/etc/hosts,以便域名解析