こんにちは、松本です。
本日はAzureでsymbolのノードの構築方法を記事にしました。
かれこれノードの運用方法がわからず、悪戦苦闘しましたがなんとか身につけたので、読んでいただけますと幸いです。
AzureのポータルにアクセスしてVirtual Machinesを選択しましょう。
パソコンの中にキューブのデザインがVirtual Machinesです。
視覚的にもわかりやすいデザインで探すのが簡単でした。
Azureのトップページ(セキュリティ系の情報は見えないようにしました)
これ以降はセキュリティ上スクリーンショットが厳しいので、載せていません。
まず、ノードを立てるのに耐えれるAzureのVMを探しましょう。
Azureではversionの番号を数字で表現しますv2 ~ v5 (2022年時点)基本的にバージョンは新しい方を選ぶ必要があります。
新しく作るにあたって古いバージョンを作る意味はないそうです。(基本的に上位互換)
Azureで使用するスペックとしては
Dシリーズが汎用的なので、こちらを使用します。
vcpu数は8が推奨でそれに対応するメモリは32GiBになります
ですので、Standard D8ds v5(8vcpu 数、32GiBメモリ)を選択しました。
次にデータドライブを選択します。
基本的にはデータドライブは1024GiBを選択します。
サイズは750GiBが推奨なので1024GiBを選択(その以下が512GiB)次に最大IOPSは1500以上が推奨なのでデータディスクは最大でIOPSが5000なのでそのまま使用します。
この時VM削除時にデータドライブも削除するように設定します。
pemキーを新しく作る
pemキーは共通化するとなんやかんやで面倒なので、VM単位で区別します。
Bastionはなんかうまくいかなかったりするので、注意です。(勉強しないとな)
タグをつける
タグはつけましょうName: VMの名前Service: VMの使用用途Owner: 作成者
つける癖をお願いします。
さてこれでいろいろ設定できたので、VMを作成します。
リソースグループ
Azureではリソースグループ単位でサービスを管理できます。どのリソースとどのリソースが結びついているのか?という部分が確認できます。
VMに接続しましょう。
chmod 400 <keyname.pem>// ダウンロードしたpemキーです
ssh -i <keyname.pem>azureuser@IPv4
このノード接続はVMのメニューに「接続」という項目があるのでそこで確認できます。
さてそれでは接続しましょう。
VMにデータディスクをマウントします。
symbolのノードをどこで立てるか問題が発生しますが、推奨要件の750GBが必要なので、このデータ領域を確保する必要があります。
そしたら先ほどのデータドライブをマウントする必要があります。
ログイン
ssh -i <pemkey.pem> azureuser@IPv4address
ログインをしたらまずはどのようにデータディスクが適応されているのか確認します。
lsblk -o NAME,HCTL,SIZE,MOUNTPOINT | grep -i "sd"
となります、このコマンドを実行するとVMのデータサイズを確認することができます。
azureuser@symbol-main-09:~$ lsblk -o NAME,HCTL,SIZE,MOUNTPOINT | grep -i "sd"
sda 1:0:0:0 1T
└─sda1 1024G /datadrive
sdb 0:0:0:0 30G
├─sdb1 29.9G /
├─sdb14 4M
└─sdb15 106M /boot/efi
sdc 0:0:0:1 300G
└─sdc1 300G
今こちらはデータディスクがマウントされている状態を示していますが、最初にVMを立ち上げた時はこのようになります。
azureuser@symbol-main-09:~$ lsblk -o NAME,HCTL,SIZE,MOUNTPOINT | grep -i "sd"
sda 1:0:0:0 1T
sdb 0:0:0:0 30G
├─sdb1 29.9G /
├─sdb14 4M
└─sdb15 106M /boot/efi
sdc 0:0:0:1 300G
└─sdc1 300G
こんな感じです。
ちなみに「sda」となっていますが、これは接続したタイミングや再起動したタイミングによって変わるそうです。
ここではsdaでした、この「sda」が「sdc」になることもあります。(今の所sdbは見たことがないです。)
ここでのsdaはデータディスクになりますが、そしたらsdcとはなんでしょうか?となります。
現在選択しているのはDシリーズの8vcpuのv5になります。ここの一時ストレージが300GiBになりますので、こちらが該当します。
Dasv5 および Dadsv5 シリーズ - Azure Virtual Machines適用対象: ✔️ Linux VM ✔️ Windows VM ✔️ フレキシブル スケール セット ✔️ 均一スケール セット Dasv5 シリーズおよび Dadsv5 シリーズは、AMD の第 3 世代 EPYC TM 7763v… docs.microsoft.com
そしたらここでデータディスクはアタッチされている(接続されている)ので次は使えるように(マウント)をできるようにしましょう。
マウントする
さてマウントをしていきましょう。
参考記事。
データ ディスクを Linux VM に接続する - Azure Virtual Machines適用対象: ✔️ Linux VM ✔️ フレキシブルなスケール セット この記事では、Azure ポータルを使用して新しいディスクと既存のディスクの両方を Linux 仮想マシンに接続する方法について示します。 Azure Portal… docs.microsoft.com
■望む結果
VMをリブートして再起動したときにマウントされていればOK(以前半角空白と全角空白があってうまくマウントされていなかった)
■パーティションparted ユーティリティを使用すれば、データ ディスクのパーティション分割とフォーマットを行うことができます。
データディスクをパーティション分割する必要があります。これは全部100%を使用するとしてもパーティションとして実施する必要があります。
azureuser@symbol-main-09:~$ lsblk -o NAME,HCTL,SIZE,MOUNTPOINT | grep -i "sd"
sda 1:0:0:0 1T
sdb 0:0:0:0 30G
├─sdb1 29.9G /
├─sdb14 4M
└─sdb15 106M /boot/efi
sdc 0:0:0:1 300G
└─sdc1 300G
さて、以前検索したときに確認した内容としてはsdaにありました。ですのでここはsdcではなくsdaにパーティションを作成する必要があります。
sudo parted /dev/sda --script mklabel gpt mkpart xfspart xfs 0% 100%
sudo mkfs.xfs /dev/sda1
sudo partprobe /dev/sda1
こういった感じでパーティションができます。
azureuser@symbol-main-09:~$ lsblk -o NAME,HCTL,SIZE,MOUNTPOINT | grep -i "sd"
sda 1:0:0:0 1T
└─sda1 1024G
sdb 0:0:0:0 30G
├─sdb1 29.9G /
├─sdb14 4M
└─sdb15 106M /boot/efi
sdc 0:0:0:1 300G
└─sdc1 300G
こういうふうにsda1が1024G分のパーティションができていればOKです。
■マウント
まずはルートディレクトの下の階層にdatadriveというディレクトリを作成します。
sudo mkdir /datadrive
mount を使用して、ファイル システムをマウントします。
sudo mount /dev/sda1 /datadrive
再起動後にドライブを自動的に再マウントするために、そのドライブを /etc/fstab ファイルに追加する必要があります。 ドライブを参照する場合に、デバイス名 ( /dev/sdc1 など) だけでなく、UUID (汎用一意識別子) を /etc/fstab で使用することもお勧めします。 UUID を使用すると、OS が起動中にディスク エラーを検出した場合に、間違ったディスクが特定の場所にマウントされるのを防ぐことができます。 その後、残りのデータ ディスクは、その同じデバイス ID に割り当てられます。 新しいドライブの UUID を確認するには、blkid ユーティリティを使用します。
■新しいドライブのUUIDを確認する
sudo blkid
こちらはサンプルを編集しています。
/dev/sda1: LABEL="cloudimg-rootfs" UUID="11111111-1b1b-1c1c-1d1d-1e1e1e1e1e1e" TYPE="ext4" PARTUUID="1a1b1c1d-11aa-1234-1a1a1a1a1a1a"
/dev/sda15: LABEL="UEFI" UUID="BCD7-96A6" TYPE="vfat" PARTUUID="1e1g1cg1h-11aa-1234-1u1u1a1a1u1u"
/dev/sdb1: UUID="22222222-2b2b-2c2c-2d2d-2e2e2e2e2e2e" TYPE="ext4" TYPE="ext4" PARTUUID="1a2b3c4d-01"
/dev/sda14: PARTUUID="2e2g2cg2h-11aa-1234-1u1u1a1a1u1u"
/dev/sda1: UUID="33333333-3b3b-3c3c-3d3d-3e3e3e3e3e3e" TYPE="xfs" PARTLABEL="xfspart" PARTUUID="c1c2c3c4-1234-cdef-asdf3456ghjk"
最後の行の/dev/sda1はファイルディスクにマウントしたものです、そこのUUIDが一意の識別子なのでこのUUIDをコピーします(ダブルクォートは削除します)
次に、テキスト エディターで次のように /etc/fstab ファイルを開きます。
sudo nano /etc/fstab
この例では、前の手順で作成した /dev/sda1 デバイスに対して UUID 値を使用し、マウント ポイントとして /datadrive を使用します。 次の行を /etc/fstab ファイルの末尾に追加します。
UUID=33333333-3b3b-3c3c-3d3d-3e3e3e3e3e3e /datadrive xfs defaults,nofail 1 2
チェック
lsblk -o NAME,HCTL,SIZE,MOUNTPOINT | grep -i "sd"
結果
azureuser@symbol-main-09:~$ lsblk -o NAME,HCTL,SIZE,MOUNTPOINT | grep -i "sd"
sda 1:0:0:0 1T
└─sda1 1024G /datadrive
sdb 0:0:0:0 30G
├─sdb1 29.9G /
├─sdb14 4M
└─sdb15 106M /boot/efi
sdc 0:0:0:1 300G
└─sdc1 300G
再起動チェック
sudo reboot
ssi -i <azure.pem> azureuser@IPv4
lsblk -o NAME,HCTL,SIZE,MOUNTPOINT | grep -i "sd"
結果
azureuser@symbol-main-09:~$ lsblk -o NAME,HCTL,SIZE,MOUNTPOINT | grep -i "sd"
sda 1:0:0:0 1T
└─sda1 1024G /datadrive
sdb 0:0:0:0 30G
├─sdb1 29.9G /
├─sdb14 4M
└─sdb15 106M /boot/efi
sdc 0:0:0:1 300G
└─sdc1 300G
こうなっていればOKです。
これでマウントはOKです。
symbol-bootstrapの設定
さてログインしている前提で話します。
ssi -i <azure.pem> azureuser@IPv4
ここからは/datadriveの下の階層で実施する話です。まずは設定を最新の状態にしましょう。
sudo apt update
sudo apt upgrade -y
sudo apt install -y jq
この状態で最新の状態になるようです。
で次にグローバルな環境にいろいろと入れていきます。
curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.35.3/install.sh | bash
source .bashrc
nvm install v14.12.0
curl https://get.docker.com | sh
sudo usermod -aG docker azureuser
sudo reboot
ssi -i <azure.pem> azureuser@IPv4
sudo systemctl start docker
sudo systemctl enable docker
ここまでくるとDockerが動いているみたいです。
sudo curl -L https://github.com/docker/compose/releases/download/1.25.1/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
npm install -g symbol-bootstrap
これでsymbol-boostrapがグローバル環境に入った模様です。
次にsymbol-bootstrapを使うのですが、一旦ディレクトリを作ります。
mkdir symbol-bootstrap
cd symbol-bootstrap
これで/datadriveの下にsymbol-bootstrapというディレクトリが完成しました。
次にmypresets.ymlを設定します。(どうせ後で変わるので内容は以下でOKです。)
nano mypresets.yml
書く内容
beneficiaryAddress: なんかアドレス入れてや
maxUnlockedAccounts: 50
minFeeMultiplier: 10
起動
symbol-bootstrap compose
symbol-bootstrap start -d
これでsymbol-bootstrapが起動できました。
次にデータベースとデータを最新の状態に移し替えます。これをすることで、ファイナライズやブロックの生成を簡潔にすることができます。
wget https://symbol-archives.s3.ap-northeast-1.amazonaws.com/archives/mainnet.databases.tar.gz
wget https://symbol-archives.s3.ap-northeast-1.amazonaws.com/archives/mainnet.data.tar.gz
ダウンロードができたら展開しましょう!
tar xvzf mainnet.databases.tar.gz
tar xzvf mainnet.data.tar.gz
これには時間がかかるので、別のシェルで並行作業をする方がいいかと思います(20分ぐらいかかる)お菓子持ってこようね。
ただこの作業をするだけで0ブロックから同期しなくていいので、マジで快適。
ダウンロードができたら一旦symbol-bootstrapを止めます
symbol-bootstrap stop
今あるdatabasesを削除します。
rm -rf target/databases
解凍したdatabasesをtargetの下の階層に移動します。
mv databases target
target/nodes/node/dataを削除します。
rm -rf target/nodes/node/data
解凍したdataをtarget/nodes/nodeの下の階層に移動します。
mv data target/nodes/node
起動します。
symbol-bootstrap run -d
これでhttpの野良ノードになります。
今日はここまで、こっからは移行するためやHttps化について書くのでそれは別記事にします。