ブロック・ボリュームをiSCSIでアタッチする

**更新情報**
* <font color="red">[2022/05/31にOracle Cloud AgentによるiSCSIの自動アタッチ機能が追加されました](https://docs.oracle.com/en-us/iaas/releasenotes/changes/4f1c804a-2045-47c8-a6a2-533839a59e02/)</font>

# 1. はじめに
ブロック・ボリュームのアタッチ方法（アタッチメント・タイプ）には「**準仮想化（Paravirtualized）**」と「**iSCSI**」がある。以前書いた「 [OCI Computeでブロックボリュームをマウントする](https://qiita.com/yamada-hakase/items/4360d723245126f43eb9)」では、手順が簡単な「準仮想化」を使用している。

しかし、マニュアル「[Block Volume Performance](https://docs.cloud.oracle.com/en-us/iaas/Content/Block/Concepts/blockvolumeperformance.htm)」には「パフォーマンスSLAの対象になるのはiSCSIアタッチメントだけ」と書いてある。

> Block Volume performance SLA for IOPS per volume and IOPS per instance applies to iSCSI volume attachments only, not to paravirtualized attachments.

以前テストしたときは、それほどパフォーマンスは変わらなかった。しかしながらSLAの条件なので、iSCSIについても説明する。

なお、もうひとつのパフォーマンス指標である帯域幅はシェイプに依存するので、アタッチメント・タイプとは関係ない。

### 1-1. 対象環境

* Oracle Cloud Infrastructure
* Oracle Linux 6 / 7 / 8。CentOSなども同様

### 1-2. 参考資料

* [OCIマニュアル - ボリュームに接続](https://docs.oracle.com/cd/E97706_01/Content/Block/Tasks/connectingtoavolume.htm)
* [OCI Manual - Connecting to a Volume](https://docs.cloud.oracle.com/iaas/Content/Block/Tasks/connectingtoavolume.htm#)
* [Oracle Linux Administrator's Guide for Release 7 - About iSCSI Storage](https://docs.oracle.com/cd/E52668_01/E54669/html/ol7-s15-storage.html)
* [Oracle Linux Administrator's Guide for Release 6 ](https://docs.oracle.com/cd/E37670_01/E41138/html/ch18s07.html)
* [Red Hat Enterprise Linux 7 ストレージ管理者ガイド - iSCSI](https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/7/html/storage_administration_guide/ch-iscsi)
* [Red Hat Enterprise Linux 6 ストレージ管理者ガイド - iSCSI](https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/6/html/storage_administration_guide/ch-iscsi)
* [動画：Configure a Linux ISCSI Target and Initiator on Oracle Cloud Infrastructure](https://apexapps.oracle.com/pls/apex/f?p=44785:24:105611054124126:PRODUCT:::P24_CONTENT_ID,P24_PREV_PAGE,P24_PROD_SECTION_GRP_ID:25701,141,10621)

# 2. iSCSIアタッチメントの基本

Oracle Cloud Infrastructureでブロック・ボリュームは外部ストレージに存在する。そのときインスタンスからブロック・ボリュームを接続する方法として、「**準仮想化**」と「**iSCSI**」がある。それぞれの違いを説明する。

### 2-1. 準仮想化とiSCSIの違い

詳しい技術的な違いは置いておくとして、覚えるべきは次の3点だ。

* ベアメタル・インスタンスが利用できるのは「**iSCSI**」に限られる
* パフォーマンスSLAが適用されるのは「**iSCSI**」に限られる
* 「**準仮想化**」のほうが利用手順が簡単

さらに追加としてUltra High Performanceボリュームのためには、「iSCSIアタッチ」かつ「マルチパス対応」で構成する必要がある。

### 2-2. 利用手順の違い

次の表は、新しいブロック・ボリュームの使用手順を「準仮想化」と「iSCSI」で比較したものだ。iSCSIでは「3.iSCSIコマンド等でアタッチ」の手順が増える。

| 手順 | 準仮想化 | iSCSI |
|:--|:--|:--|
| 1.ブロック・ボリュームの作成  | ○ | ○ |
| 2.管理コンソールやCLIでブロック・ボリュームの<font color="red">アタッチ</font>  | ○ | ○ |
| 3.iSCSIコマンド等で<font color="red">アタッチ<font>  | 不要 | ○  |
| 4.ディスク・パーティションの作成  | ○  | ○ |
| 5.ファイル・システムの作成  | ○ | ○ |
| 6.mountコマンドでマウント  | ○ | ○ |

<font color="red">アタッチ</font>は2回あり、それぞれで意味が違う。**手順2**のアタッチは「ケーブルの接続」に相当し、**手順3**のアタッチは「OSからボリュームの認識」に相当する。

また**手順3**のアタッチには、次の4つの実現方法がある。

1. iSCSIコマンドで手動アタッチする
2. oci-iscsi-configで手動アタッチする
3. ocidサービスで自動アタッチする
4. Oracle Cloud Agentで自動アタッチする

どれを使ってもほとんど同じだが、ocidを使う方法が簡単だ。ただしUltra High Performanceボリュームでは、Oracle Cloud Agentの方法が必須になる。

### 2-3. デタッチも気をつける

利用開始したブロック・ボリュームをデタッチする機会は少ない。しかし「ブロック・ボリュームのサイズをオフライン拡張する」「完全に一貫性のあるバックアップを取得する」「インスタンスやボリュームをリカバリーする」「シェイプを変更する（※）」などのメンテナンス作業ではデタッチが必要になる。

※必須ではないが推奨

次の表はデタッチの手順だ。アタッチの逆順になる。ocidサービスで自動アタッチしているときでも、デタッチはコマンドを実行する必要があるので注意すること。

| 手順 | 準仮想化 | iSCSI |
|:--|:--|:--|
| 1.mountコマンドでアンマウント  | ○ | ○ |
| 2.iSCSIコマンド等でデタッチ  | 不要 | ○  |
| 3.管理コンソールやCLIでブロック・ボリュームのデタッチ  | ○ | ○ |

# 3. iSCSIアタッチする

4つのアタッチ方法のなかで、以下のアタッチ方法を説明する。oci-iscsi-configは知っておくと便利なコマンドなので「6. oci-iscsi-configの使い方」で説明する。

* iSCSIコマンドで手動アタッチする
* ocidサービスで自動アタッチする
* Oracle Cloud Agentで自動アタッチする

### 3-1. iSCSIコマンドでアタッチする 

はじめに、iSCSIコマンド利用したアタッチ方法を説明する。こちらがオーソドックスな方法である。

1. 管理コンソールでブロック・ボリュームをアタッチする。
![iscsi05.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266049/29081b27-00ad-78b9-0d96-3d6dcc46630c.png)
2. アタッチしたブロック・ボリュームを表示する。右の「・・・」をクリックして「iSCSI
Commands & Information」を選択する。
![iscsi03.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266049/a8ec1aa5-05b8-cacd-4d1b-dce51102a174.png)
3. アタッチ／デタッチするコマンドが表示されるのでコピーする。
![iscsi06.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266049/2f043dc9-051b-6706-9e63-c0f91be66355.png)
4. OSにログインして、コピーしたコマンドを実行する。「iSCSI IP address:iSCSI port」はインスタンスによって異なることがあるので使い回さないこと。

```shell-session
sudo iscsiadm -m node -o new -T <volume IQN> -p <iSCSI IP address>:<iSCSI port>
sudo iscsiadm -m node -o update -T <volume IQN> -n node.startup -v automatic
sudo iscsiadm -m node -T <volume IQN> -p <iSCSI IP address>:<iSCSI port> -l
```

5.iSCSIコマンドに成功すると、アタッチしたボリュームが表示される。<font color="red">コマンドを実行するのは初回だけで、起動／停止しても再実行する必要は無い。</font>

```shell-session
# iscsiadm -m session
tcp: [1] 169.254.2.2:3260,1 iqn.2015-12.com.oracleiaas:a37bb084-07c4-4a21-b73c-e0d4b2894037 (non-flash)
```

### 3-2. ocidサービスでアタッチする


ocidサービスを起動した状態でブロック・ボリュームを管理コンソールなどでアタッチすると、iSCSIコマンドを実行しなくても自動的にアタッチできる。

なお、ocidサービスを利用できるのは、Oracle Linux 7以降のバージョンに限られる。

1. ocidサービスの状態を確認する。

```shell-session
systemctl status ocid
```

```shell-session:停止しているときはinactive(dead)
● ocid.service - Oracle Cloud Infrastructure utilities daemon
   Loaded: loaded (/etc/systemd/system/ocid.service; disabled; vendor preset: enabled)
   Active: ★inactive (dead)★
```

```shell-session:起動しているときはactive(running)
● ocid.service - Oracle Cloud Infrastructure utilities daemon
   Loaded: loaded (/etc/systemd/system/ocid.service; disabled; vendor preset: enabled)
   Active: ★active (running)★ since 土 2020-04-11 03:12:19 JST; 2s ago
 Main PID: 30244 (python2.7)
   CGroup: /system.slice/ocid.service
           └─30244 python2.7 /usr/libexec/ocid
```

2.ocidサービスが停止しているときは起動する。

```shell-session
systemctl start ocid
```

3.自動起動を有効化する。

```shell-session
# systemctl enable ocid
Created symlink from /etc/systemd/system/multi-user.target.wants/ocid.service to /etc/systemd/system/ocid.service.

# systemctl list-unit-files | grep ocid
ocid.service                                  enabled★自動起動有効
```

4.管理コンソールでブロック・ボリュームをアタッチする。

5.オペレーティング・システムから認識できるようになるまで2，3分かかる。`/var/log/messages`に次のようなログが表示されたら完了だ。ocidによる自動化は、単純に省力化できるだけで無く、カスタムイメージやオートスケールを使用するときに役に立つ。

```shell-session
# tail -f /var/log/messages
eiaas:d6557dec-6f18-4432-acfa-f8335e5d3e52, portal: 169.254.2.2,3260] through [iface: default] is operational now
Sep  9 09:47:58 ol7srv3 kernel: scsi 3:0:0:0: RAID              IET      Controller       0001 PQ: 0 ANSI: 5
Sep  9 09:47:58 ol7srv3 kernel: scsi 3:0:0:0: Attached scsi generic sg1 type 12
Sep  9 09:47:59 ol7srv3 kernel: scsi 3:0:0:2: Direct-Access     ORACLE   BlockVolume      1.0  PQ: 0 ANSI: 6
Sep  9 09:47:59 ol7srv3 kernel: sd 3:0:0:2: Attached scsi generic sg2 type 0
Sep  9 09:47:59 ol7srv3 kernel: sd 3:0:0:2: [sdb] 104857600 512-byte logical blocks: (53.7 GB/50.0 GiB)
Sep  9 09:47:59 ol7srv3 kernel: sd 3:0:0:2: [sdb] 4096-byte physical blocks
```

ocidによる自動アタッチは、こちらの記事を参考にさせていただきました。

* [OCI で Oracle Linux を使うときに超絶便利なツール oci-utils](https://qiita.com/mmarukaw/items/f62391703bb3181e27d5)

### 3-3. Oracle Cloud Agentでアタッチする

Oracle Cloud Agentで自動アタッチするには、前提条件として以下の条件を満たしている必要がある。詳しい手順はマニュアルを読んでほしい。

* oracle-cloud-agentのバージョンが1.23.0以降
* ComputeインスタンスはパブリックIPアドレスを持っているか、サービス・ゲートウェイにアクセス可能なこと
* ダイナミックグループを構成してポリシーを設定

1. oracle-cloud-agentのバージョンが1.23.0以降であることを確認する。

```shell-session
$ rpm -qi oracle-cloud-agent
Name        : oracle-cloud-agent
Version     : 1.23.0

```

2.管理コンソールでブロック・ボリュームをアタッチする。ここでエラーが表示されたときには、前提条件を満たしていない可能性が高い。
![iSCSI-2022-06-21.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266049/59c922e8-b405-88db-8e73-149d5a324d3e.jpeg)


# 4. アタッチしているiSCSIを確かめる

もっとも一般的な方法は、次のコマンドだ。準仮想化のときは何も表示されない。

```shell-session
#  iscsiadm -m session
tcp: [1] 169.254.2.2:3260,1 iqn.2015-12.com.oracleiaas:99ccef68-e6de-4f3b-bc0f-xxxxxxxxxxxx (non-flash)
```

7系以降に限られるが、便利なのは`lsblk`の`-S`オプションだ。iSCSIでアタッチしているときは一番右に表示される。

```shell-session
# lsblk -S
NAME HCTL       TYPE VENDOR   MODEL             REV TRAN
sdb  3:0:0:2    disk ORACLE   BlockVolume      1.0  iscsi
sda  2:0:0:1    disk ORACLE   BlockVolume      1.0
```

同様に7系では`oci-iscsi-config`コマンドも使える。コマンドの使い方は`--help`でどうぞ。

```shell-session
# oci-iscsi-config -s
Warning:
For full functionality of this utility the ocid service must be running
The administrator can start it using this command:
    sudo systemctl start ocid.service

Currently attached iSCSI devices:

Target iqn.2015-12.com.oracleiaas:99ccef68-e6de-4f3b-bc0f-xxxxxxxxxxxx
   Persistent portal:    169.254.2.2:3260
      Current portal:    169.254.2.2:3260
               State:    LOGGED_IN
     Attached device:    sdb
                Size:    300G
    File system type:    Unknown
          Mountpoint:    Not mounted

Need OCI services to display available devices.
```

# 5. iSCSIデタッチする

「2-3. デタッチも気をつける」で説明したように、管理コンソールでブロック・ボリュームデタッチするときは、先にiSCSIコマンドでデタッチする必要がある。

<font color="red">ocidサービスで自動アタッチしているときでも、デタッチするときは手動でコマンドを実行する必要があるので注意すること。</font>

1. ocidサービスが起動していると自動アタッチされるのでサービスを停止する。

```shell-session
systemctl status ocid
systemctl stop ocid
```

2.ボリュームをアンマウントする。

```shell-session
umount ＜マウントポイント＞
```

3.アタッチしたときと同様な手順で、こんどはデタッチのコマンドをコピーする。
![iscsi08.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266049/a001d081-a120-7bee-fe3f-4dc9131a4a95.png)

4.コピーしたコマンドを実行する。複数ブロック・ボリュームをアタッチしているときは、それぞれで実行する。

```shell-session
sudo iscsiadm -m node -T <volume IQN> -p <iSCSI IP address>:<iSCSI port> -u
sudo iscsiadm -m node -o delete -T <volume IQN> -p <iSCSI IP address>:<iSCSI port>
```

5.次のように何も表示されなければデタッチに成功している。

```shell-session
$ iscsiadm -m session
iscsiadm: No active sessions.
```

6.管理コンソールでブロック・ボリュームをデタッチする。以上で終了だ。

# 6. oci-iscsi-configの使い方

**oci-iscsi-config**は、oci-utilsパッケージに含まれるiSCSIユーティリティーだ。iscsiadmを使わずに簡単にアタッチ／デタッチができる。詳しくはmanを見るとして、基本的な使い方を説明する。なおroot権限で実行する必要がある。

### 6-1. oci-iscsi-configでアタッチする

1. 管理コンソールからブロック・ボリュームの「・・・」をクリックして「iSCSI Commands & Information」を選択する。ここで **[VOLUME IQN]** をコピーする。
![iscsi07.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266049/8a0037a4-f933-83ad-06f2-c1e44f7a7539.png)

2. oci-iscsi-configコマンドでアタッチする。ワーニングは無視してよい。

```shell-session
# oci-iscsi-config -a ＜コピーしたVOLUME IQN＞
Warning:
For full functionality of this utility the ocid service must be running
The administrator can start it using this command:
    sudo systemctl start ocid.service

Target iqn.2015-12.com.oracleiaas:a37bb084-07c4-4a21-b73c-e0d4b2894037 is already attached.
```

3.次のコマンドを実行するとアタッチされているボリュームが表示される。

```shell-session
# oci-iscsi-config -s
Currently attached iSCSI devices:

Target iqn.2015-12.com.oracleiaas:a37bb084-07c4-4a21-b73c-e0d4b2894037
   Persistent portal:    169.254.2.2:3260
      Current portal:    169.254.2.2:3260
               State:    LOGGED_IN
     Attached device:    sdb
                Size:    50G
    File system type:    Unknown
          Mountpoint:    Not mounted

Need OCI services to display available devices.
```

### 6-2. oci-iscsi-configでデタッチする

1. ocidサービスが起動していると自動アタッチされるのでサービスを停止する。

```shell-session
systemctl status ocid
systemctl stop ocid
```

2.oci-iscsi-configコマンドでデタッチする。ワーニングは無視してよい。

```shell-session
# oci-iscsi-config -d ＜コピーしたVOLUME IQN＞
Warning:
For full functionality of this utility the ocid service must be running
The administrator can start it using this command:
    sudo systemctl start ocid.service

Updating ignore file: ['iqn.2015-12.com.oracleiaas:a37bb084-07c4-4a21-b73c-e0d4b2894037']
```

3.確認するとDetachedと表示される。

```shell-session
# oci-iscsi-config -s
Warning:
For full functionality of this utility the ocid service must be running
The administrator can start it using this command:
    sudo systemctl start ocid.service

Currently attached iSCSI devices:
Error: Local iSCSI info not available.
List info from Cloud instead(No boot volume).

Need OCI services to display available devices.
Detached devices:

Target iqn.2015-12.com.oracleiaas:a37bb084-07c4-4a21-b73c-e0d4b2894037
              Portal:    169.254.2.2:3260
               State:    Detached★
```


# 7. おわりに

いままで自分ではあまり使っていないiSCSIアタッチだが、実際にやってみると簡単なことがわかる。マニュアルには、他にもいろいろ書かれているのでどうぞ。

* **ブロック・ボリュームのアタッチ方法には「準仮想化」と「iSCSI」がある**
* **ベアメタル・インスタンスが利用できるのは「iSCSI」に限られる**
* **パフォーマンスSLAが適用されるのは「iSCSI」に限られる**
* **「準仮想化」のほうが利用手順が簡単**
* **iSCSIでアタッチするには「iSCSIコマンドで手動実行する方法」と「ocidサービスによる自動実行する方法」がある**
* **iSCSIでデタッチするときには、管理コンソールでデタッチする前に、OSレベルでデタッチする必要がある**