2016年4月22日金曜日

[OpenMPI] 用 VirtualBox 5.0 基於 Ubuntu Server x64 14.04.4 建立 cluster

因為實機測試不走對外網路,要測試變得很麻煩,所以乾脆直接在家裡的電腦建模擬環境。
雖然說比不上實際 cluster 的效能,但至少簡單的測試還是可以做。


要準備的東西

1. ubuntu server x64 14.04.4 的 iso 檔
2. VirtualBox 5.0 以上的版本
3. 要能對外的網路

建置步驟

1. 建立一台當作 Master 的虛擬機
2. 在 Master 虛擬機裡安裝 VirtualBox Guest Additions
3. 建立一台或多台 Slaver 的虛擬機
4. 在每台 Slaver 虛擬機裡分別安裝 VirtualBox Guest Additions
5. 建立虛擬網路
6. 安裝 OpenMPI 和 SSH

建立一台當作 Master 的虛擬機

建立至少一台的 Master 和一台的 Slaver。
也就是說,至少會有兩台 VM 存在。
這次的筆記就以最低限度的兩台來實作。

1. 建立一台當作 Master 的虛擬機


↑ 按 [New] 建立一台虛擬機


↑ 名字隨便取就好


↑ 記憶體依照需求配置,這邊使用最小建議需求的 768 MB


↑ 選第二個,弄顆新的虛擬硬碟出來


↑ 為了方便就用 VDI 形式就好


↑ 用動態的大小可以避免一次占用掉太多的實體硬碟空間


↑ 中間右邊的按鈕可以選擇 vdi 映像檔存放的路徑,至於大小就看需求給就好。


↑ 建好之後第一次開機會遇到要插入光碟的選項,選擇 ubuntu-14.04.4-server-amd64.iso

2. 安裝 ubuntu server x64 14.04.4


↑ 一開始就是選擇語言,這邊選自己習慣的就好,我是選 [English]


↑ 選第一個 [Install Ubuntu Server] 開始安裝


↑ 又要在選一次語言,我還是選 [English]


↑ 接著要選國家,台灣的選項在 [other]→[Asia]→[Taiwan]


↑ 選擇鍵盤配置,按<Yes>會自動偵測,我是按<No>


↑ 因為我的鍵盤配置並不是美規的所以必須要另外選擇


↑ 然後就是一直等待安裝了


↑ 這裡要輸入 Hostname,這邊的名字很重要,因為 cluster 的每個 node 就是靠這個在判斷的


↑ 輸入使用者的名字,這邊隨興就好


↑ 輸入帳戶的名字


↑ 建立使用者密碼


↑ 再次輸入,確認使用者密碼


↑ 因為我密碼打了 [1234],所以被問是否要使用這個弱密碼,然後按 <Yes>


↑ 這邊不要加密選 <No>


↑ 接著又是一直等待


↑ 確認時區是否正確


↑ 選擇 partition 形式,這邊選第二個 [Guided - use entire disk and set up LVM]


↑ 選擇磁區,也就只有這麼一個可以選


↑ 確認變更硬碟設定選 <Yes>


↑ 輸入硬碟大小,這邊預設就全部的容量


↑ 確認變更設定


↑ 因為沒有要用 proxy 所以這邊空白就好


↑ 通常伺服器應該不會隨便更新,所以這邊選 [No automatic updates]


↑ 選則伺服器的種類,因為只是單純的 cluster ,所以這邊選 OpenSSH server


↑ 安裝 GRUB 開機選單


↑ 完成安裝,按 <Continue> 重開機

在 Master 虛擬機裡安裝 VirtualBox Guest Additions

接著開機完之後就是安裝 VirtualBox Guest Additions

這邊安裝 VirtualBox Guest Additions 的目的是為了和 Host 共用 shared 資料夾

或是調整螢幕解析度和其他 Host-Client 之間的溝通等功能

所以這裡的步驟不是必需的

如果沒有要用 VirtualBox 的功能和 Host 做溝通的話

這裡就可以省略不做

1. 在安裝之前先更新開發套件


↑  更新套件清單並將套件升級

sudo aptitude update && sudo aptitude -y upgrade


2. 更新並升級完成


↑ 更新完成畫面

3. 安裝 VirtualBox Guest Additions 套件所需的開發工具


↑ 套件指令

sudo aptitude -y install make gcc xserver-xorg xserver-xorg-core build-essential module-assistant linux-headers-`uname -r` dkms


↑ 開發套件安裝完成畫面

4. 插入 VirtualBox Guest Additions iso 檔


↑ 從 [Device]->[Insert Guest Addition CD Image]

5. 開始安裝


 掛載映像檔

sudo mount /dev/cdrom /media/cdrom



↑ 切換路徑到 /media/cdrom


cd /media/cdrom



↑ 切換路徑


↑ 執行 VirtualBox Guest Additions 建置及安裝


sudo ./VBoxLinuxAdditions.run



↑ 在 [Building the VirtualBox Guest Additions kernel modules] 這邊會等待一段時間


↑ 編譯和安裝完成

紅色框框裡面的那段文字一定要出現 [...done.]

這裡是最重要的,如果沒有出現就代表失敗了。


↑ 確認安裝成功

lsmod | grep vboxguest



↑ 有出現紅色的 [vboxguest] 這行就表示有完成


↑ 安裝完成後關機


sudo poweroff


為了要掛載 shared folder 所以這邊先暫時關機

6. 掛載 shared folder

回到 VirtualBox Manager


↑ 對這台虛擬機器點選 [設定]


↑ 從左邊點選 [Shared folders] 並按下圖中紅色箭頭指的圖示


↑ 選擇要位於 Host 端要被掛載的資料夾,並將 [Auto-mount]打勾


↑ 新增完成後會像這張圖一樣多出一行共用資料夾,按下 [OK] 離開

將虛擬機開機並登入


↑ 重開機後登入完成畫面


↑ 重新確認 virtualbox guest additions 有沒有被執行


lsmod | grep vboxguest


像上圖這樣表示沒有在執行

在沒有執行的情況下,是無法掛載資料夾的

所以只好再來一次了


↑ 找到 VirtualBox Guest Additions 的安裝路徑

因為剛剛已經插入過 VirtualBox Guest Additions 的映像檔了

所以這邊不用再插入一次,直接進行掛載就可以了


sudo mount /dev/cdrom /media/cdrom
cd /media/cdrom
ll #兩個小寫的 L 用來列出當前路徑下的東西


如果遇到

[sudo] password for <username>: 

就直接輸入使用者密碼按 [Enter]


↑ 再次執行完成的結果


sudo ./VBoxLinuxAdditions.run



↑ 確認 vboxguest 有被執行


lsmod | grep vboxguest



↑ 建立一個資料夾用來掛載 shared folder,並變更權限


sudo mkdir /mnt/<shared folder name>
sudo chmod 777 /mnt/<shared folder name>


<shared folder name> 的名字可以依個人喜好設定


↑  確認資料夾內容


ls -ld /mnt/<shared folder name>



↑ 列出資料夾資訊的結果

接著要掛載資料夾


↑ 掛載資料夾的時候要使用到 Host 的 shared folder 名字


sudo mount -t vboxsf <host shared folder name> /mnt/<shared folder name>


<host shared folder name> 是掛載資料夾時設定的名稱

<shared folder name> 是剛剛取好名字的資料夾名稱


↑ 掛載完成


↑ 切換路徑到掛載的資料夾下,並列出資料夾的內容物


cd /mnt/<shared folder name>
ll

如果掛載成功就可以看到 guest 端出現和 host 端資料夾一樣的內容物

7. 將掛載進來的資料複製出來

這個步驟並不是必要的

不過因為這種掛載方式是暫時的

也就是說只要一旦重開機,就要在重新掛載一次

為了省麻煩,乾脆把資料給複製到 guest 端裡面


↑ 執行複製資料夾指令


cp -avr /mnt/<shared folder name> ~/<any name>


要複製到哪個路徑基本上隨個人喜好設定即可

這邊為了作業方便,所以直接複製到家目錄底下

<shared folder name> 就是剛剛一直出現的那個名字
<any name> 基本上也是自行決定即可


↑ 複製完資料夾的結果


↑ 切換到家目錄底下看看資料夾是否有被成功建立


cd
ll



↑ 切換到 <shared folder name> 路徑下


↑ 列出資料夾內的內容物


ll #列出內容


確認是否資料夾內容物都有完整的複製進去

建立一台或多台 Slaver 的虛擬機

這裡基本上和建立 Master 虛擬機的部分一樣。

只有在取 hostname 的時候要有區別而已。

其實可以直接用 clone 的方式就好。

只是這樣複製出來的機器還需要從 guest 端裡面去改 hostname。

反正不趕時間,所以就慢慢再裝一台。

這裡只記錄跟建立 Master 不一樣的地方。


↑ 幫虛擬機取個跟 Master 不一樣的名字


↑ 找個空間存放虛擬機 Slaver 的映像檔


↑ 幫 Slaver 取個名字

這個這個 Hostname 不能被重複,在 MPI 的網路中,這個名字是用來做識別用的

也就是說,如果有多台 slaver 的話,可能就要取個什麼 slaver1, slaver2, slaver3...之類的

這邊因為只用一台 slaver,所以就不做編號了



↑ user name 這邊為了 MPI 通訊方便,所以取跟 Master 一樣的名稱


↑ 同樣的 username

既然是 cluster,每個節點在通訊的時候自然需要使用者權限,

為了方便操作,這邊用同樣的使用者名稱確保 MPI 通訊時可以穿過每個節點。



↑ 安裝完,並登入的畫面

接下來的安裝步驟跟 Master 就完全一樣了。

所以這邊就略過不記錄了XD

在每台 Slaver 虛擬機裡分別安裝 VirtualBox Guest Additions

這裡同樣和在 Master 虛擬機裡安裝 VirtualBox Guest Additions 的步驟一樣。

完全照抄就好。

因為我懶得截圖再寫一次一樣的步驟。

所以這邊就拉回去看上面的 「在 Master 虛擬機裡安裝 VirtualBox Guest Additions」。

然後這段就這樣沒了XD

建立虛擬網路

既然是 cluster,也就是說這幾台虛擬機都要可以互相透過網路溝通。

所以這邊幫每台虛擬機都增加一張虛擬網卡用來當作互聯的內網。

原本的那張虛擬網卡就繼續留著當作對外網路。

VirtualBox 提供的虛擬網路有很多種介面。

這次使用一個 NAT 做對外網路,和一個 Host-Only Adapter 做對內網路

所以一台虛擬機就會有兩張虛擬網卡。

這裡回到 VirtualBox Manager

一台一台的設定網卡。

1. 建立 Master 虛擬機的網卡


↑ 找到要設定網卡的 Master 虛擬機然後按設定

↑ 在紅色箭頭找到 [network]


↑ 找到紅色箭頭的第二個標籤


↑ 啟用這張網卡,並找到 [Host-Only Adapter] 的選項


↑ 設定好之後按 [OK] 離開

2. 建立 Slaver 的虛擬網卡


↑ 找到 Slaver 虛擬機按右鍵選 [setting] 進入設定


↑ 一樣找到紅色箭頭的 [Network]


↑ 找到 [Adapter 2] 的標籤,啟用它,並選到 [Host-Only Adapter]


↑ 完成後,按 [OK] 離開

3. 建立群組


↑ 找到 Master 虛擬機,按右鍵選 [Group]

這時候會 Master 虛擬機會跑進新的群組裡面。


↑ 新增的群組

這時候找到 Slaver 虛擬機,按住滑鼠左鍵,

用拖拉的方式把它加進剛剛建立的群組裡面。


↑ 把 Slaver 虛擬機拖進群組裡

加入群組之後的結果

就會跟下面的那張圖看起來很類似

一次出現多台虛擬機的訊息

如果有多台 slaver 的話

全部都要加進群組裡面


↑ 群組狀態

接著進入虛擬機裡面進行網卡設定

這邊使用群組開機


↑ 在群組的標籤按右鍵找到開機選項

接著你的畫面可能會像下面這樣

很多台被啟動的虛擬機


↑ 多台一起開機

分別登入兩台主機


↑ 兩台主機登入完的畫面

4. 建立 cluster 虛擬網路

首先要編輯 host 清單


↑ 對兩台分別下指令編輯 hosts 文件

Master, Slaver
sudo vi /etc/hosts


有可能會需要輸入使用者密碼,有需要就輸入。


↑ 個別的 hosts 文件內容

然後把文件分別改成下面的圖的樣子。


↑ 寫入所有的 hostname

如果不會 vi 操作的話,就自己 google 好了。

不然這樣這篇會太長XD

然後存檔離開

基本上使用 192.168.*.* 當作內網 IP

這時候 Master 的 IP 準備要使用 192.168.56.105

而 Slaver 的 IP 準備要使用 192.168.56.106

如果有多台 Slaver 的話就一直往下增加就好了。

基本上是每台都要寫,所以越多台,這個檔案就會越長。


↑ 分別查看網卡訊息

Master, Slaver
ifconfig -a


正常來說,剛剛在 VirtualBox Manager 設定的第二張網卡

因為都還沒有做設定,所以應該只會跟上圖一樣不會有其他 IP 的訊息。

這時候就要對每台的第二張網卡 eht1 寫入 IP。


↑ 寫入 IP 訊息

Master
sudo ifconfig eth1 <static ip> netmask 255.255.255.0


Slaver
sudo ifconfig eth1 <static ip> netmask 255.255.255.0


<static ip> 是剛剛在 hosts 文件裡面設定的 IP

也就是說根據每台的 Hostname 分別決定要寫入的 IP

這時候在分別查看兩台的 eth1 網卡訊息


↑ eth1 網卡訊息

Master, Slaver
ifconfig -a


這時候應該可以看到 eth1 網卡有剛剛寫進去的 IP 訊息

這邊要注意的是,這個方法是暫時性的,

也就是說,如果關機再重來的話,這個步驟就要再重做一次。


↑ ping 任何一台的位置

ping 任何一台測試看看網路有沒有通

因為這邊只有兩台,所以就變成互相 ping 對方了

Master, Slaver
ping <any ip>



↑ ping 測試的結果

從上圖可以看到這樣內部網路應該是有通了


↑ 測試對外網路

找個外部網路試試看,確認外部網路沒有掛掉。

這邊找的外部網路直接用 google 來測試。

Master, Slaver
ping www.google.com



↑ ping www.google.com 的結果

從結果來看,外部網路應該也還活著。

外部網路要活著的原因是因為等等要裝 OpenMPI 和相關套件

所以需要用到外部網路

不然正常的話,cluster 其實不需要對外網路。

安裝 OpenMPI 和 SSH

接著安裝 OpenMPI

這時候同樣對著每台虛擬機下指令安裝 OpenMPI


↑ 安裝 OpenMPI 指令

Master, Slaver
sudo aptitude -y openmpi-bin libopenmpi-dev



↑ 安裝結果

這邊兩台結果不一樣是因為

其中一台之前已經裝過了...OTL

只是打這篇筆記的時候再打開來下指令

所以就會變成這樣

不然正常都沒有安裝的話

應該要出現跟右邊一樣的結果才對XD

接下來 Master 和 Slaver 分別要安裝不一樣的東西

Master 要安裝 nfs server 套件

Slaver 要安裝 SSH 和 nfs 套件


↑ 分別安裝 nfs 和 SSH

Master
sudo aptitude -y install nfs-kernel-server


Slaver
sudo aptitude -y install nfs-common ssh 



↑ 分別完成安裝的結果

==========

到這邊基本上就全部結束了

測試?

因為實在太麻煩了,所以這篇筆記基本上就到這裡

測試等有空的時候再來寫下一篇好了

光是這篇筆記打到這就已經花了快20個小時了...(~_~;)


相關來源

Ubuntu 14.04.01中安装Virtualbox guest addition
http://kiwenlau.blogspot.tw/2015/05/ubuntu-140401virtualbox-guest-addition.html

Ubuntu on VirtualBox で ホストとのファイル共有ができなくなった
http://xawa99.blogspot.tw/2013/05/Ubuntsu-Vbox-FailToMountSharedFolder.html

PGIコンパイラによる MPICH2 の使い方(Linux)
https://www.softek.co.jp/SPG/Pgi/TIPS/public/general/mpich2_use.html

OpenMPIライブラリ | スーパーコンピュータシステムの使い方

Ubuntu日本語フォーラム / LAN内でsshに接続できません(port 22: Connection timed out)
https://forums.ubuntulinux.jp/viewtopic.php?id=10673

UbuntuへのVirtualBox Guest Additionsのインストール
http://d.hatena.ne.jp/akamushi97/20140131/1391157868

Ubuntu 14.04 : Install VirtualBox Guest Additions & also create videos
http://sharadchhetri.com/2014/10/07/ubuntu-14-04-install-virtualbox-guest-additions-also-create-videos/

How to install Virtualbox guest additions on Ubuntu 14.04
http://www.binarytides.com/vbox-guest-additions-ubuntu-14-04/

Install a Cluster of Ubuntu Servers on Oracle VM VirtualBox
http://www.ixtendo.com/install-ubuntu-server-on-oracle-vm-virtualbox/

【 Virtual Box 】共有フォルダを介して、ホストOS(Windows 7) と ゲストOS(Debian/ MathLibre)でファイルやりとりするための設定
http://qiita.com/HirofumiYashima/items/6044cfc64cfa3e84f97c

Show the List of Installed Packages on Ubuntu or Debian
http://www.howtogeek.com/howto/linux/show-the-list-of-installed-packages-on-ubuntu-or-debian/

Ubuntu Linux: Start / Stop / Restart OpenSSH ( SSH ) Server
http://www.cyberciti.biz/faq/howto-start-stop-ssh-server/

MPI (Message Passing Interface Standard)
http://www.hitachi.co.jp/Prod/comp/hpc/foruser/sr8000/tebiki/mpi_exec.html

MPICH2のインストール
http://www.nslabs.jp/mpi-setup.rhtml

Sshでログインできないときに疑うべき点
http://dev.satake7.net/posts/292

Vagrantを使って2つの仮想マシン上にPacemaker + Heartbeatによる2ノードクラスタを作る
http://l-w-i.net/t/pacemaker/setup_002.txt

計算機クラスタ構築メモ
http://d.hatena.ne.jp/Tayama/20110803/1312375197

Ceph : クラスターの設定
http://www.server-world.info/query?os=Ubuntu_14.04&p=ceph

並列プログラミングのための、 linux クラスタ環境の構築
http://maijou2501.hateblo.jp/entry/20120523/1337783387

CUDA対応ビデオカード搭載の複数ホスト間でGPGPU ( その4: CUDA-aware 対応のため OpenMPI のコンパイル )
http://maijou2501.hateblo.jp/entry/2015/05/17/230059