[Symbol]ラズパイでノードを運用してみよう(Client構築編)

Raspberry PiでSymbolのdualノードを構築、ハーベスト設定、HTTPS化、運用まで。
本記事ではclientインストールまでを扱います。
Client構築編：Clientインストールまで <- 今ここ
Client設定編：ハーベスト設定まで
Rest構築編：HTTPS化まで
メンテナンス編：HA構成、アップグレードetc

前提知識
===
* symbol-bootstrapでノードを運用できる
* ノード運用においての専門用語を理解している
* OSに関する基礎知識がある

準備する機器
===
* Raspberry Pi 4B 8GBモデル
* SSD 1TBくらいあるとうれしい
* その他周辺機器(キーボード、モニタ、SSDとラズパイ繋ぐアダプタ、ラズパイ電源ケーブル、etc)

バージョン情報
===
執筆時点で構築するバージョンはこのようになります。
Catapult Client: 1.0.3.3
※今はまだ、バージョンを重ねるごとに構築手順やディレクトリ構造が変わっています。このバージョンでない場合、手順が異なる可能性が高いのでご了承ください。

Ubuntu Server 20.04を構築する
===
### OSインストール
今回、Ubuntu ServerはUSBブートで構築します。
結局SSDは繋ぎますし、OSごとSSDにあるほうが高速です。

Ubuntu20.04のUSBブートは公式から落としてきたイメージをそのままでは起動できません。
下記からイメージを落としてきます。

https://forums.raspberrypi.com/viewtopic.php?t=278791

今では[Raspberry Pi Imager](https://www.raspberrypi.com/software/)があるのでOS起動まで楽になりました。
※apt upgradeでカーネルが更新されるとOSが起動しなくなる恐れがあります。
apt upgrade後は必ずこのコマンドを実行しましょう。
```bash:/boot/firmware/
zcat vmlinuz > vmlinux
```

### メモリスワップ設定
現状、8GBメモリあれば十分ですが、将来を考えると心もとないです。
下記を参考にスワップ領域を確保しておきましょう。私は追加で8GB確保しています。(こんなにはいらないと正直思う)

https://www.digitalocean.com/community/tutorials/how-to-add-swap-space-on-ubuntu-20-04-ja

### File Descriptor
```/etc/security/limits.conf
* hard nofile 65535
* soft nofile 65535
root hard nofile 65535
root soft nofile 65535
```

Catapult Clientを構築する
===
### 必要なものをインストール
aptでインストールしていきます。github上のドキュメントではこのようになっています。
```bash
apt install git gcc g++ cmake curl libssl-dev ninja-build pkg-config python3-pip
```
後にコンパイル中 gtest.hが見つからないとエラーが出ると思います。追加でlibgtest-devをインストールします。
```bash
apt install libgtest-dev
```
(追記)v1.0.3.4だとうまくいかなくなりました。パッケージは削除しgitから最新のgoogle testをインストールしたところうまくいきました。
### Clientインストール
githubからソースをダウンロードします。私は/home/ubuntu/にダウンロードしインストール先としました。
※バージョンのタグを指定しましょう。最新で実施するとテストされておらず未知のエラーに遭遇する場合があります。
```bash:/home/ubuntu/
git clone https://github.com/symbol/symbol.git -b client/catapult/v1.0.3.3
```
依存関係をインストールしていきます。/home/ubuntu/symbol/client/catapult/に_depsディレクトリが出来上がります。
```bash:/home/ubuntu/
cd symbol/client/catapult
PYTHONPATH="../../jenkins/catapult/" python3 "../../jenkins/catapult/installDepsLocal.py" \
	--target "./_deps" \
	--versions "../../jenkins/catapult/versions.properties" \
	--download \
	--build
```
インストールした依存関係へパスを通します。執筆時点でこの手順がgithub上のドキュメントから消えてしまったのですが、まだ必要そうです。
```bash:
export CAT_DEPS_DIR=/home/ubuntu/symbol/client/catapult/_deps
export LD_LIBRARY_PATH=$CAT_DEPS_DIR/boost/lib:$CAT_DEPS_DIR/facebook/lib:$CAT_DEPS_DIR/google/lib:$CAT_DEPS_DIR/mongodb/lib:$CAT_DEPS_DIR/zeromq/lib
```
再起動後もパス設定が残るように.bashrcに書き込んでおきます。
```bash:/home/root/.bashrc
...
export CAT_DEPS_DIR=/home/ubuntu/symbol/client/catapult/_deps
export LD_LIBRARY_PATH=$CAT_DEPS_DIR/boost/lib:$CAT_DEPS_DIR/facebook/lib:$CAT_DEPS_DIR/google/lib:$CAT_DEPS_DIR/mongodb/lib:$CAT_DEPS_DIR/zeromq/lib
```
Clientのソースをコンパイル、インストールします。
```bash:/home/ubuntu/symbol/client/catapult/
mkdir -p _build && cd _build
BOOST_ROOT="$(realpath ../_deps/boost)" cmake .. \
	-DCMAKE_BUILD_TYPE=RelWithDebInfo \
	-DCMAKE_PREFIX_PATH="$(realpath ../_deps/facebook);$(realpath ../_deps/google);$(realpath ../_deps/mongodb);$(realpath ../_deps/zeromq)" \
	-GNinja
ninja publish
ninja
```
※コンパイルに一晩かかります。ninja実行後はPCつけたまま寝ましょう
Clientがインストールされたか確認します。
```bash:/home/ubuntu/symbol/client/catapult/_build/bin
./catapult.tools.address --help
```