- Linuxマシンをクラスタリングしてみよう
- 用意するもの
- セットアップ作業(ヘッドレスインストール)
- Pi 3 (Controller)からClusterの制御
- ネットワーク構成の確認
- 計算ノード(Pi Zero)がインターネット接続できるようにする(Pi Zero W の場合は不要)
- ソフトウェアアップデートを行う
- さいごに
書き溜めておいた記事を予約投稿します。
Linuxマシンをクラスタリングしてみよう
今回は、Raspberry Pi 3 1台をControllerノードとして稼働させ、Raspberry Pi Zero を4台用意してクラスタ構成にする所までやっていきましょう。
用意するもの
今回は、自宅に眠っている Pi 3と、Pi Zero を用意しました。なお、Pi Zero のピンヘッダのはんだ付け不要です。はんだ付けしたモデルは、P4の箇所に1台のみ接続できました。
ご参考までに、予算でいうと14,000円~18,000円程度になります(PCを除く)。 Cluster Hat v2.0は追加購入しましたが、それ以外は自宅にあるものを使用しています。
パーツ名 | 金額 | 販売店 |
---|---|---|
Raspberry Pi 3 | 5670円 | スイッチサイエンス |
Raspberry Pi Zero または Zero W x4枚 |
648円~/枚 | スイッチサイエンス |
microSD カード 16GB以上 x5枚 | 800円~ | Amazon |
Cluster Hat v2.0 | 3500円+送料 | Pimoroni |
microUSB電源 (2.5A/5V) | 1800円 | スイッチサイエンス |
PC |
Pi Zero のmicroSDカードを節約したい場合
「microSDカードが勿体無い」「そんなに集められない」といった声があります。そんなときは、Pi Zero のmicroSD カード無しでusbboot/rpiboot で動作させる方法があります。こちらは未検証ですが紹介のみ行っておきます。
Cluster Hat v2.0について
Cluster Hat v2.0 は Raspberry Pi を誰でも簡単に・楽しくクラスタリングするためのツールで、Pimoroniより購入できます。
Cluster Hat v2.0の特長としては以下になります。
- USB Ether gadge (USB Ethernetでのシリアルコンソール対応)
- オンボード 4 port USB 2.0ハブ
- Controller Pi GPIO(USBオプション)を介してPi Zero にログイン
- Controller Pi GPIO(I2C)を介して Pi Zero それぞれの電源を制御
- Controller シリアルコンソール用コネクタ(FTDIベーシック)搭載
- Controller Piは、Pi Zero への電源を中断することなく再起動可能(ネットワークは起動時に回復)
ポイントや注意点など
- PCはWindows 10 を用意していますが、macOSでもLinuxマシンでも問題無いです
- microSDカードは5枚もあるので、マッキーなどで番号を記入しておくと判別しやすいです
- Raspberry Pi Zero でも Zero W でもどちらでも構いません(メンテナンスのしやすさでいうと Pi Zero W ですが、お手持ちの Pi Zeroで十分です)
- microUSB電源 (2.5A/5V)はPi 3 および Pi Zero 4台へ電源供給するために用いられます。安全のため、作業が終わったらOSをシャットダウンし、USB電源を抜いてください
セットアップ作業(ヘッドレスインストール)
それでは、実際にセットアップ作業に入っていきましょう。Raspberry Pi にインストールするイメージはRaspbianで、ヘッドレスインストールしています。そのため、ラズパイ専用のモニターとキーボードは使用せず、全てPCからSSHで接続します。またGUI(X Window System)も起動せずにコマンドライン上で全ての設定を行います。
とても時間が掛かるので、作業の途中で次の作業に取りかかったり、コーヒーを飲んで休憩したり、時間の使い方を工夫しましょう。
(1) Raspbian イメージのダウンロード
まずは、Raspbianのイメージを用意します。今回は公式サイトではなく、Cluster Hat 提供元のページにて専用のRaspbianイメージをPCにダウンロードします。クラスタ構成を行うために設定がカスタマイズされています。
赤い部分のリンクから、それぞれイメージをダウンロードしましょう。ダウンロードには時間が掛かりますので、それが終わるまで次の手順を先にやりましょう。
(2) SDカードのフォーマット
SDカードをフォーマットします。フォーマット用のソフトは以下からダウンロードしてインストールします。
SDカードを選択し、上書きフォーマットで、フォーマットを実行します。これを5枚分実行します。かなり時間が掛かりますので、終わるまで次の手順を進めてください。
(3) イメージファイルをコピーする
(1) Raspbian イメージのダウンロードでダウンロードしたファイルをそれぞれ展開します。そして、 (2) SDカードのフォーマットでフォーマットしたmicroSDカードにそれぞれコピーしていきます。ClusterHAT-2017-09-07-lite-1-controller.img
は Pi3用 、そして残りの p1,p2,p3,p4はPi Zero または Pi Zero W 用です。
- ClusterHAT-2017-09-07-lite-1-controller.img
- ClusterHAT-2017-09-07-lite-1-p1.img
- ClusterHAT-2017-09-07-lite-1-p2.img
- ClusterHAT-2017-09-07-lite-1-p3.img
- ClusterHAT-2017-09-07-lite-1-p4.img
Win32 Disk Imager でコピーしていきます。イメージを選択し、microSDカードにコピーします。これを5台分実施します。そのとき、(4)の作業も並行して実施します。
(4) SSH を有効にする
1台ずつ設定するのが大変なので、イメージのコピーが完了したら、microSDカード直下に空のファイルssh
(拡張子無し)を作ります。
次にWi-Fi接続設定をPi3、Zero Wで設定しておきましょう。
wpa_supplicant.conf
を作成し、以下のようにWi-Fi設定を記述します。SSIDとPSKは使用するWi-Fi環境のものを確認してください。作成したら、同様にmicroSD直下に配置します。
なお、計算ノードがRaspberry Pi Zero の場合はwpa_supplicant.conf
の作成は不要で、ssh
ファイルの配置のみ行います。
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev update_config=1 country=JP network={ ssid="ssid" psk="pass" key_mgmt=WPA-PSK }
以下は、microSDカードの のイメージ直下に配置したファイルの例になります。
(5) Raspberry Pi にmicroSD をセットする
イメージをコピーし、SSHとWi-Fiの設定が完了したらそれぞれRaspberry Pi にセットします。そして、Pi Zero は ClusterHat に搭載させます。
Pi 3のIPアドレスのみ控えておきます。
Pi 3 (Controller)からClusterの制御
Pi 3 (Controller)にログインし、以下のコマンドを実行してCluster Hat に接続されているノード(Pi Zero 全て)を起動します。
$ clusterhat on
クラスタを停止するときは、以下を実行します。
$ clusterhat off
ノードを指定して、起動・停止することも可能です。複数指定可。
$ clusterhat on p1 $ clusterhat on p2 p4 $ clusterhat off p1 p2 p4
Cluster Hat のアラートLEDをON/OFFにします。
$ clusterhat alert on $ clusterhat alert off
ネットワーク構成の確認
Controllerにログインし、clusterhat を有効化後、lsusbコマンドを実行します。Cluster Hat は、USB Ether gadgeでブリッジ接続をしています。Pi Zeroへは、このUSB Ether gadge経由でSSHログインします。
pi@controller:~ $ clusterhat on pi@controller:~ $ lsusb Bus 001 Device 015: ID 0525:a4aa Netchip Technology, Inc. Linux-USB CDC Composite Gadge (Ethernet and ACM) Bus 001 Device 016: ID 0525:a4aa Netchip Technology, Inc. Linux-USB CDC Composite Gadge (Ethernet and ACM) Bus 001 Device 019: ID 0525:a4aa Netchip Technology, Inc. Linux-USB CDC Composite Gadge (Ethernet and ACM) Bus 001 Device 020: ID 0525:a4aa Netchip Technology, Inc. Linux-USB CDC Composite Gadge (Ethernet and ACM) Bus 001 Device 004: ID 05e3:0608 Genesys Logic, Inc. Hub Bus 001 Device 003: ID 0424:ec00 Standard Microsystems Corp. SMSC9512/9514 Fast Ethernet Adapter Bus 001 Device 002: ID 0424:9514 Standard Microsystems Corp. SMC9514 Hub Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
ネットワーク構成の確認
ネットワーク構成をbrctlコマンドで確認すると、Controller (Pi3) からブリッジしている事がわかります。
pi@controller:~ $ brctl show br0 bridge name bridge id STP enabled interfaces br0 8000.002282fffe01 no eth0 ethpi1 ethpi2 ethpi3 ethpi4
Controller(Pi3)から計算ノードにログインする
Controller ではavahi-daemonが有効になっていて、各ノードにp1.local
などでログインすることができます。
$ systemctl status avahi-daemon ● avahi-daemon.service - Avahi mDNS/DNS-SD Stack Loaded: loaded (/lib/systemd/system/avahi-daemon.service; enabled; vendor preset: enabled) Active: active (running) since Wed 2018-01-01 00:15:28 UTC; 1h 10min ago Main PID: 452 (avahi-daemon) Status: "avahi-daemon 0.6.32 starting up." CGroup: /system.slice/avahi-daemon.service tq452 avahi-daemon: running [controller.local] mq466 avahi-daemon: chroot helper
Controllerから各ノードへSSHログインします。clusterhat on
コマンド実行後、SSHが有効化されるまで数分かかりますので少し待ちましょう。
$ ssh pi@p1.local $ ssh pi@p2.local $ ssh pi@p3.local $ ssh pi@p4.local exit
計算ノード(Pi Zero)がインターネット接続できるようにする(Pi Zero W の場合は不要)
このままの設定だと、 計算ノード(Pi Zero)はインターネットに接続できません。ソフトウェアのアップデートなどを行うために Pi Zero のusb0
からController(Pi3)の wlan0
を経由してインターネットへ接続できるように経路を作ります。なお、Wi-Fi搭載のRaspberry Pi Zero W を使用している場合は自力でインターネットに接続できるためこの作業は不要です。
Controller(Pi3) で、iptables コマンドで以下のようにNATを設定します。Wi-Fiでインターネットに接続している場合は wlan0
を指定します。
pi@controller:~ $ sudo iptables -t nat -A POSTROUTING -o wlan0 -j MASQUERADE
iptables の設定を永続的に保存する場合は、こちらなどを参照して下さい。
ネットワークインタフェースのパケット転送を有効化するためには、カーネル内でIP転送設定をONにする必要があります。そのため、カーネルパラメータを以下のように変更します。
pi@controller:~ $ sudo sysctl -w net.ipv4.ip_forward=1 net.ipv4.ip_forward = 1 pi@controller:~ $ sudo sysctl net.ipv4.ip_forward net.ipv4.ip_forward = 1 pi@controller:~ $ sudo sysctl -p
計算ノード(Pi Zero)で静的ルーティングを追加する
計算ノード(p1~p4)にログインし、Ping コマンドでcontroller のIPアドレスを確認します。確認できたら Ctrl+C
でキャンセルします。
$ ssh pi@p1.local pi@p1:~ $ ping controller.local PING controller.local (169.254.184.139) 56(84) bytes of data. 64 bytes from controller.local (169.254.184.139): icmp_seq=1 ttl=64 time=0.312 ms 64 bytes from controller.local (169.254.184.139): icmp_seq=2 ttl=64 time=0.324 ms 64 bytes from controller.local (169.254.184.139): icmp_seq=3 ttl=64 time=0.348 ms
計算ノード(p1~p4)でルーティングテーブルを追加します。
$ sudo ip route add default via 169.254.184.139 $ ip route default via 169.254.184.139 dev usb0 169.254.0.0/16 dev usb0 proto kernel scope link src 169.254.102.163 metric 202
※ 静的ルーティングの永続的な追加については、こちらなどを参照してください。
ソフトウェアアップデートを行う
計算ノード(p1~p4)でソフトウェアアップデートを実行し、再起動します。最後に、Controller(Pi3)も同様にソフトウェアアップデートをします。このタイミングで、必要なパッケージなどをインストールしますのでお好みでどうぞ。
$ sudo apt-get update $ sudo apt-get upgrade $ sudo reboot
さいごに
自宅の机を掃除したら、ラズパイZeroが8台もあったことがきっかけでクラスタを組みました。ただ、使い道としては何も考えていないのでこれから考えます。ミニHPCっぽい使い方もできるはずですが、Pi Zero が非力なので使い方は限定的かと思います。
最初なので手作業で組みましたが、意外と大変だと思うので、大量にクラスタを組む場合は自動化した方がいいと思いました。自動化の話については、また後日エントリーを書く予定です。
次回は、ClusterHatの活用方法について書いてみる予定です。
オススメ記事