【OCI】1つのブロック・ボリュームを複数のUbuntuインスタンスでread/writeする

複数のUbuntuインスタンスにブロック・ボリュームをマウントした備忘録を共有。
（OCI Linux向けのドキュメントは揃っていましたが、Ubuntu向けはなかったので）

## 参考
先人の力をお借りしました。
- http://uramocha02.blogspot.com/2017/02/ocfs2.html
- https://zenn.dev/kotapon/articles/d887eef29914e8

## 想定
- Ubuntuインスタンス0（ブート・ボリューム 50GB）【以後、ins0と呼びます】
- Ubuntuインスタンス1（ブート・ボリューム 50GB）【以後、ins1と呼びます】
- ブロック・ボリューム 100GB
    - ブロック・ボリュームを使って、ストレージを拡張したい
    - ついでにファイルをインスタンス間で共有したい
- 同一のVCNを使用

## Step1. インスタンスとブロック・ストレージを起動
ドキュメントがたくさん公開されているので、ここでは省略。

## Step2. インスタンスにブロック・ストレージをアタッチ
ins0とins1のそれぞれにブロック・ボリュームを接続します。
次の1つの注意点を除いて、一般的な手順で進めてください。

- アクセスはどちらのインスタンスでも「読取り/書込み - 共有可能」を選択します。
![スクリーンショット 2022-03-18 17.56.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2529987/c8a875d7-ecb6-bfa5-6d71-03e44291789c.png)

各コンテナで3つのiSCSIコマンドを実行するところまで完了させてください。
※パーティションの作成以降はこのあとで

参考になる記事
https://zenn.dev/kotapon/articles/d887eef29914e8

## Step3. 各インスタンスのローカルIPを確認 & 7777番ポートを開ける
Step2で注意メッセージが表示されたと思いますが、そのままで複数のインスタンスからアクセスすることはデータ破損を起こし危険です。
（また、各インスタンスでファイル情報を手動で更新しなければなりません。）

そこでOracleが提供しているOCFS2（Oracle Cluster File System Version 2）というクラスターファイルシステムサービスを利用します。
詳細を知りたい場合はここを参照してみてください。
- 【公式ブログ】https://blogs.oracle.com/cloud-infrastructure/post/using-the-multiple-instance-attach-block-volume-feature-to-create-a-shared-file-system-on-oracle-cloud-infrastructure
- 【日本語に翻訳されています】https://orablogs-jp.blogspot.com/2020/01/using-the-multi-attach-block-volume-feature-to-create-a-shared-file-system-on-oracle-cloud-infrastructure.html

OCFS2により、各インスタンス間は7777番ポートで通信するので環境を整えます。

### ローカルIPとホスト名
まず、各インスタンスのローカルIPとホスト名を確認します。
各インスタンスの「インスタンスの詳細」を開き、プライマリVNICのプライベートIPアドレスとホスト名をメモしておきます。
このインスタンスは10.0.0.23とmainでした。
![スクリーンショット 2022-03-18 18.08.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2529987/51b5e09b-7011-af4b-fc12-95f0760e0b88.png)

### イングレス・ルール
VCNのイングレス・ルールにより、ポート番号は制限されているため、
"ローカルからの7777番ポートへのアクセス"を解除します。

該当VCNの セキュリティ・リスト > Default Security List for * > イングレス・ルール と開き、イングレス・ルールの追加。
ソースCIDRに「10.0.0.0/16」を、宛先ポート範囲に「7777」を入力して追加する。
![スクリーンショット 2022-03-18 18.14.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2529987/20d866d0-480d-7a48-d12d-e7887e3a4699.png)

### iptables
またOCIの場合、Ubuntu側のファイアウォールでもポートが制限されているので解除します。
各コンテナで実行してください。

```bash
# iptablesで7777を許可
sudo iptables -I INPUT -p tcp --dport 7777 -j ACCEPT
# 永続化
sudo /etc/init.d/netfilter-persistent save
sudo /etc/init.d/netfilter-persistent reload
```

これでコンテナ間で7777番にアクセスできるようになりました。

## Step4. OCFS2のインストールと実行
各コンテナで次の作業を行っていきます。

まずOCFS2をインストールします。

```bash
$ sudo apt-get update
$ sudo apt-get install ocfs2-tools
```

続いて、OCFS2の設定ファイルを作成します。

```bash
$ sudo o2cb add-cluster ociocfs2
# 対象のインスタンスの数だけ次を実行（実行順は全てのインスタンスで統一しておきます）
# sudo o2cb add-node ociocfs2 [ホスト名] --ip [ローカルIPアドレス]
$ sudo o2cb add-node ociocfs2 main --ip 10.0.0.15 
$ sudo o2cb add-node ociocfs2 sub --ip 10.0.0.16
```

マウント先のディレクトリを作成します。

```bash
# マウント先はご自由に
sudo mkdir /mnt/ocfs2
```

`/etc/default/o2cb`を編集して、OCFS2を有効にします。（falseをtrueに置換）

```:/etc/default/o2cb
︙
O2CB_ENABLED=true
︙
```

最後に起動します。

```bash
$ sudo systemctl restart o2cb
```

## Step5. パーティションとフォーマット
ここでは任意の1つのインスタンスだけで実行します。
まずはパーティションの作成。

```bash
$ sudo fdisk /dev/sdb # sdbは環境により異なるかもしれません

Welcome to fdisk (util-linux X.XX).

Command (m for help): n
Select (default p): p
Partition number (1-4, default 1): 1
First sector (2048-209715199, default 2048):
Last sector, +/-sectors or +/-size{K,M,G,T,P} (2048-209715199, default 209715199):

︙

Command (m for help): w

︙
```

ocfs2でフォーマット。

```bash
$ sudo mkfs.ocfs2 /dev/sdb1 # ここも環境により少し異なるかもしれません
```

## Step6. マウント
各インスタンスで次のようにマウントすれば晴れて完了です。

```bash
$ sudo mount -t ocfs2 /dev/sdb1 /mnt/ocfs2
# 念のため確認
$ df
```