Mana Blog Next

自宅IoT、仕事と家庭、カメラ、筋トレ生活

Raspberry Pi + Cluster Hat でクラスタリングしてみた【ヘッドレスインストール】

書き溜めておいた記事を予約投稿します。

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にダウンロードします。クラスタ構成を行うために設定がカスタマイズされています。

f:id:mana-cat:20180207143622p:plain

赤い部分のリンクから、それぞれイメージをダウンロードしましょう。ダウンロードには時間が掛かりますので、それが終わるまで次の手順を先にやりましょう。

(2) SDカードのフォーマット

SDカードをフォーマットします。フォーマット用のソフトは以下からダウンロードしてインストールします。

SDカードを選択し、上書きフォーマットで、フォーマットを実行します。これを5枚分実行します。かなり時間が掛かりますので、終わるまで次の手順を進めてください。

f:id:mana-cat:20180207112301p:plain

(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)の作業も並行して実施します。

f:id:mana-cat:20180207122627p:plain

(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カードの のイメージ直下に配置したファイルの例になります。

f:id:mana-cat:20180207123336p:plain

(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の活用方法について書いてみる予定です。

オススメ記事

codezine.jp