Raspberry PI シリーズで分散環境構築(その7: 各ラズパイ向けの tftp ルート設定と起動試験)

# 序(連載一覧)
1. [Raspberry PI シリーズで分散環境構築(その1:モデル別、ディスクレスクライアント化の可否まとめ)](https://qiita.com/p_cub/items/e81dd0f49b3f6fb024a5)
2. [Raspberry PI シリーズで分散環境構築(その2: PiServer の解析と代替システムの設計まで)](https://qiita.com/p_cub/items/69fa32a9a62890ca1d04)
3. [Raspberry PI シリーズで分散環境構築(その3: dnsmasq のインストールと設定)](https://qiita.com/p_cub/items/e7c889b0f92a868a6c20)
4. [Raspberry PI シリーズで分散環境構築(その4: NFSサーバの構築とクライアント用OSのインポート)](https://qiita.com/p_cub/items/dd682de7de28276129e6)
5. [Raspberry PI シリーズで分散環境構築(その5: クラスタノード向け Raspberry PI OS のカスタマイズ(1))](https://qiita.com/p_cub/items/ecf4c48b7ecb08d971b1)
6. [Raspberry PI シリーズで分散環境構築(その6: クラスタノード向け Raspberry PI OS のカスタマイズ(2))](https://qiita.com/p_cub/items/73dc833302c3f064dc39)
7. [Raspberry PI シリーズで分散環境構築(その7: 各ラズパイ向けの tftp ルート設定と起動試験)](https://qiita.com/p_cub/items/ecef742e86ab2991c1b0)
8. [Raspberry PI シリーズで分散環境構築(その8: Webクラスタ構築のケース(前半))](https://qiita.com/p_cub/items/10751e2daa2d3b74c5d5)
9. [Raspberry PI シリーズで分散環境構築(その9: Webクラスタ構築のケース(後半))](https://qiita.com/p_cub/items/c4c837a57e6487a076d4)

本稿は その7 となります。

[前回](https://qiita.com/p_cub/items/73dc833302c3f064dc39)は NFS(またはPXE)サーバ上にインストールした qemu-user-static を利用して、NFSマシンにコピーしたクライアント向け OS イメージをカスタマイズしましたが、今回はこのOSイメージの /boot ディレクトリに対してシンボリックリンクを張ることで tftp ルートとして、起動試験を行います(今回は短めです)。

## 参考(筆者の環境)
![RaspiCloudSystem.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267238/9d0ab7af-1f13-cf7b-3cc9-9b4e8c6cb4fd.png)

# 実際の作業
NFS サーバと PXE サーバが分離されているものとして記載します。

## 1. PXE サーバから NFS サーバの共有ディレクトリをマウント

### 1.1. PXE サーバでマウントポイントを作成してマウント

<dl>
<dt>NFS サーバの IP</dt><dd>192.168.172.17</dd>
<dt>共有ディレクトリ名</dt><dd>/exports/os4pi</dd>
</dl>

NFS/PXE 両サーバ上に qemu-user-static がインストール済みで、どちらからでもラズパイ向けOSをカスタマイズしたい場合は rw 設定にしますが、PXE サーバ上でカスタマイズする必要がない場合は ro で構いません。
 
```shell-session
# mkdir /mnt/os4pi
# mount -t nfs -o proto=tcp,vers=3,rw,noatime 192.168.172.17:/exports/os4pi /mnt/os4pi
```

### 1.2. PXE サーバの /etc/fstab に行を追加して永続化

```config
192.168.172.17:/exports/os4pi   /mnt/os4pi   nfs    tcp,vers=3,rw,noatime,_netdev    0  0
```

## 2. dnsmasq で設定した tftp ルートにシンボリックリンクを張っていく

### 条件

<dl>
<dt>tftp ルート(基準ディレクトリ)</dt><dd>/srv/tftp</dd>
<dt>ラズパイ2B の MAC アドレス</dt><dd>b8-27-eb-GG-HH-II</dd>
<dt>ラズパイ2B に割り振られる固定IP</dt><dd>192.168.172.32</dd>
<dt>ラズパイ2B 向け OS の /boot の位置</dt><dd>/mnt/os4pi/raspbian/armhf/boot</dd>
<dt>ラズパイ3B の MAC アドレス</dt><dd>b8-27-eb-XX-YY-ZZ</dd>
<dt>ラズパイ3B に割り振られる固定IP</dt><dd>192.168.172.33</dd>
<dt>ラズパイ3B 向け OS の /boot の位置</dt><dd>/mnt/os4pi/raspbian/armhf_64/boot</dd>
<dt>ラズパイ4B の MAC アドレス</dt><dd>dc-a6-32-PP-QQ-RR</dd>
<dt>ラズパイ4B に割り振られる固定IP</dt><dd>192.168.172.34</dd>
<dt>ラズパイ4B 向け OS の /boot の位置</dt><dd>/mnt/os4pi/raspbian/aarch64/boot</dd>
</dl>

```shell-session
# cd /srv/tftp
# rm -Rf b8-27-eb-GG-HH-II
# ln -sf /mnt/os4pi/raspbian/armhf/boot b8-27-eb-GG-HH-II
# ln -sf /mnt/os4pi/raspbian/armhf/boot 192.168.172.32
# rm -Rf b8-27-eb-XX-YY-ZZ
# ln -sf /mnt/os4pi/raspbian/armhf_64/boot b8-27-eb-XX-YY-ZZ
# ln -sf /mnt/os4pi/raspbian/armhf_64/boot 192.168.172.33
# rm -Rf dc-a6-32-PP-QQ-RR
# ln -sf /mnt/os4pi/raspbian/aarch64/boot dc-a6-32-PP-QQ-RR
# ln -sf /mnt/os4pi/raspbian/aarch64/boot 192.168.172.34
```

### 注意事項

+ IP/MACアドレスはお手持ちのラズパイの実際のアドレスに直してください。
+ 3B/3B+ の場合、 aarch64 にしても問題ありません
+ シンボリックリンクを張る前に、[その3](https://qiita.com/p_cub/items/e7c889b0f92a868a6c20) で作成した空フォルダを削除しています。
+ 固定IPでもリンクを張っておきます。こうしておくと dnsmasq の設定を「tftp ルートを IP毎に振り分け」に変更しても対応可能となります


## 3. ラズパイの試験起動

### 3.0. 下準備

1. NFSサーバ→PXEサーバの順で電源投入。ログイン可能になるまで待つ。
2. [その1](https://qiita.com/p_cub/items/e81dd0f49b3f6fb024a5) を参考に、各モデルをディスクレスブートが可能な状態にしておく

### 3.1. Raspberry PI 2B の場合

1. 第1パーテーションが FAT でフォーマットされた空の microSD (容量は少なくて構わない)に、最新の RaspberryPI OS インストーライメージから bootcode.bin ファイルのみをコピーして、ラズパイに挿入
2. HDMI,キーボード,LANを接続
3. USB(電源)を接続
4. microSD 上の bootcode.bin の読み込みが完了し、モニタにカラーグラデーションが出ることを確認。表示されない場合は、microSD が死んでいる(FATフォーマットではない場合を含む)、ラズパイの microSD ドライブが不良、bootcode.bin のファイルコピーに失敗した、のいずれかとなります。 
5. LAN のアクセスランプが点灯することを確認。点灯しない場合は、ラズパイの GPU/SoC が故障している、またはネットワーク接続がきちんと行われていない可能性があります。
6. 画面にラズパイロゴやブートログが出て来ることを確認(tftp の設定まではOKということ)。画面が真っ黒のまま進行しない場合は tftp サーバ自体の設定ミス、tftpサーバ上にある config.txt ファイルの設定ミスとなります。
7. ログイン可能な状態になることを確認。途中で止まる場合は、tftp サーバ上の cmdline.txt の設定ミス、NFSサーバの設定ミス、/etc/fstab ファイルの設定ミス等が考えられます。

### 3.2. Raspberry PI 3B/3B+ の場合

1. microSD を抜く
2. HDMI,キーボード,LANを接続
3. USB(電源)を接続 
4. LAN のアクセスランプが点灯することを確認。点灯しない場合は、3B固有の事前準備が行われていない、ネットワークがきちんと接続されていない、または GPU/SoC が不良である可能性が有ります。[^不良]
5. モニタにカラーグラデーションが表示されることを確認。この確認ができると、tftp サーバから bootcode.bin のダウンロードまでは OK ということになります。カラーグラデーションが表示されない場合は、tftp サーバの設定がおかしいことが考えられます。
6. 画面にラズパイロゴやブートログが出て来ることを確認。画面が真っ黒のまま進行しない場合は tftpサーバ上にある config.txt ファイルの設定ミスとなります。
7. ログイン可能な状態になることを確認。途中で止まる場合は、tftp サーバ上の cmdline.txt の設定ミス、NFSサーバの設定ミス、/etc/fstab ファイルの設定ミス等が考えられます。

[^不良]: 実際、私は購入直後から頻繁に microSD で起動できない現象を引き起こす 3B 個体を１つ持っていました。常々「microSD が死んだ/相性が悪いんだろう」と思っていたのですが、ディスクレスブートの試験をして行く中、「これは初期不良だ」と気づきました。購入後4年経ってから初めて気づいた初期不良・・・

### 3.3. Raspberry PI 4B の場合

1. microSD を抜く
2. HDMI,キーボード,LANを接続
3. USB(電源)を接続 
4. LAN のアクセスランプが点灯することを確認。点灯しない場合は、事前準備が行われていない、ネットワークがきちんと接続されていない、または EEPROM/SoC が不良である可能性が有ります。
5. モニタにカラーグラデーションが表示され、ブラックアウトすることを確認。EEPROM の初期不良は無い、ということが確認できます。
6. 画面にラズパイロゴやブートログが出て来ることを確認。画面が真っ黒のまま進行しない場合は tftpサーバ上にある config.txt ファイルの設定ミスとなります。
7. ログイン可能な状態になることを確認。途中で止まる場合は、tftp サーバ上の cmdline.txt の設定ミス、NFSサーバの設定ミス、/etc/fstab ファイルの設定ミス等が考えられます。

# 次回予告
今回はここまでとなります。全ラズパイで Raspberry PI OS のディスクレス(2Bは半ディスクレス)クライアント化できたはずです。ただ、このままだと、「何も連携なしのディスクレスクライアント群」に過ぎませんから、次回以降、全ノードをコントロールするコントローラPC + NFSサーバ + ラズパイノード群の構成を取る分散環境を順次構築していきたいと思います。
初回となる次回は、最も構築が簡単な分散環境、Apache を利用した負荷分散(冗長化) Web サーバを構築してみたいと思います。