はじめに

こんにちは!
2019年に新卒で入社した、技術チームの「たくみ」です。

今回は、Oracle Cloud Infrastructure(以下OCI)のストレージの1つである、
ブロック・ボリュームをインスタンスにアタッチする方法
についてご紹介します。

ここで言うインスタンスとは仮想マシン・インスタンスベアメタル・インスタンスのことを指します。

ボリュームを提供するブロック・ボリューム・サービスの概要についてもお伝えします。

過去の執筆記事も是非ご覧下さいね!

OCIのストレージ・サービス

最初にOCIのストレージ・サービスについて簡単にご紹介します。
OCIには主に以下のストレージ・サービスが存在します。

ブロック・ボリューム・サービス

Cloud内のインスタンスに永続的で耐久性の高いストレージ(ブロック・ストレージ・ボリューム)
を提供するサービス。主にDBデータの格納に用いられる。

ファイル・ストレージ・サービス

ネットワーク・ファイル・システム(NFS)を利用したストレージを提供するサービス。
複数のインスタンスでファイルを共有したい場合に用いられる。

オブジェクト・ストレージ・サービス

OCI内部からだけでなく、インターネット経由でのデータのアップロードやダウンロードが可能なストレージを提供するサービス。
また、頻繁に書き換えないデータの格納に適したストレージも提供する。
バックアップデータの格納外部からアクセスしたいデータの格納に用いられる。

この他にもOCIには様々なストレージ・サービスがあります。
詳細はマニュアル等をご参照ください。

ブロック・ボリューム・サービス

ここからはブロック・ボリューム・サービスについてより詳しくご紹介します。
上述の通り、ブロック・ボリューム・サービスではブロック・ストレージ・ボリュームが提供されます。

PCのハード・ディスクに相当するストレージですが、インスタンスに内蔵されているわけではなく、リモートのストレージです。
そのため、インスタンスとストレージ間のデータの送受信ではネットワーク通信が行われることに留意してください。
また、アタッチするインスタンスと同じ可用性ドメイン内に作成する必要があります。

ボリュームの種類としてブロック・ボリュームブート・ボリュームがあります。
ブート・ボリュームとはインスタンス作成時に作成され、インスタンスの起動に使用されるイメージを含むボリュームです。

呼称こそ違いますが、基本的にはブロック・ボリュームと同じ仕組みのボリュームです。
細かな違いについてはマニュアル等をご参照ください。

本記事では主にブロック・ボリュームについて記述していきますね!

ブロック・ボリューム

ブロック・ボリュームの用途

ブロック・ボリュームを使用する局面として考えられるのは、インスタンスのストレージを拡張したい時です。
ブロック・ボリュームをOCI上で作成し、インスタンスにアタッチすることで、OS領域を拡張させることができます。

このアタッチの方法は後程、紹介しますね!

また、ブロック・ボリュームの特徴として永続したストレージ領域という点が挙げられます。
この永続の意味は、ブロック・ボリュームがアタッチされているインスタンスを終了(Terminate)しても、ブロック・ボリュームとそこに格納されたデータは残り続けるということです。

そのため、あるインスタンスのブロック・ボリュームをデタッチし、別のインスタンスにアタッチすることで、インスタンス間のデータ移動が可能です

ブロック・ボリュームの耐久性

ブロック・ボリューム・サービスのすべてのボリュームは自動的にレプリケートされるため、高い耐久性があります。

サービス・レベル目標を満たすため、ブロック・ボリューム(及びブート・ボリューム)には99.99%の年間耐久性を提供するように設計されています。

ボリューム・アタッチメント・タイプ

ブロック・ボリュームのアタッチメント・タイプとしては以下の2つが選択できます。

  • 準仮想化
    インスタンスにアタッチする際に、OSからのコマンド操作が不要なため、簡単に利用できる
  • iSCSI
    アタッチする際にOSコマンドが必要となるが、準仮想化と比較してIOPSパフォーマンスは高い
    ベアメタル・インスタンスを利用する場合はiSCSIのみが選択できる

ボリューム・アクセス・タイプ

ブロック・ボリュームをアタッチする際に、以下のアクセス・タイプのオプションを選択することができます。

  • 読取り/書込み
    デフォルトのオプション。このオプションを選択することで、
    インスタンスはデータの読込み及び書込みをボリュームに対して実行できる。
  • 読取り/書込み – 共有可能
    このオプションを選択することで、1つのボリュームを複数のインスタンスに同時にアタッチすることが可能となる。
    また、アタッチされたすべてのインスタンスは、データの読込み及び書込みをボリュームに対して実行できる。
    複数のインスタンスから読み書きを同時に行う場合は、
     システムに対してクラスタ対応ソリューションをインストールして構成する必要があります。
  • 読取り専用 – 共有可能
    このオプションを選択した場合、インスタンスはデータの読込みのみをボリュームに対して実行できる。
    また、1つのボリュームを複数のインスタンスに同時にアタッチすることが可能となる。

ボリューム・アクセス・タイプは一度ボリュームをインスタンスからデタッチし、再度アタッチする際にオプションを選択することで変更することも可能です!

ブロック・ボリュームの暗号化

ブロック・ボリューム(及びブート・ボリューム)とボリューム・バックアップ内のデータはすべて暗号化されます。
デフォルトではOracle提供の暗号化キーで暗号化されますが、自分が所有する暗号化キーで暗号化することも可能です。

また、上述の通りインスタンスとブロック・ボリューム間を移動するデータは、OCI内のネットワークを介して転送されます。
この転送中のデータを暗号化するために転送中暗号化を有効にするオプションも含まれています。
※構成によっては転送中暗号化を使用できませんので、ご注意ください。

ブロック・ボリューム・パフォーマンス

ブロック・ボリューム・パフォーマンスはボリュームのサイズによって異なります。

パフォーマンスは1GBあたりのIOPSで表現されますので、基本的にはサイズが大きくなればパフォーマンスも良くなります
※一定のサイズ以上になった場合はパフォーマンスが向上しなくなります。

また、パフォーマンスのレベルは以下の中から選択することができます。
高いレベルを選択するとパフォーマンスは向上しますが、その分コストも高くなります。

  • より低いコスト
    パフォーマンス:2 IOPS/GB
  • バランス
    パフォーマンス:60 IOPS/GB
  • より高いパフォーマンス
    パフォーマンス:75 IOPS/GB
  • 超高パフォーマンス
    パフォーマンス:90~225 IOPS/GB
    ※「90、105、120、135、150、165、180、195、210、225」中から10段階で選択可能です。

さらに、パフォーマンスの自動チューニング機能もあります。
種類としては、以下の2種類があります。

  • パフォーマンス・ベースの自動チューニング
    指定したデフォルトVPU/GB(最低値。自動チューニングが無効な場合、ここで指定したレベルで固定)と、最大VPU/GB (最高値)の間で、負荷状況に応じてパフォーマンス・レベルが自動的にチューニングされる。
    ※VPU(ボリューム・パフォーマンス・ユニット)。
    この値が大きくなるほど、パフォーマンス・レベルは向上する。
  • デタッチ済ボリューム自動チューニング
    ボリュームをデタッチすると、一番低いパフォーマンス・レベルのより低いコストに自動的にチューニングされる。
    再度アタッチすると、デフォルトのパフォーマンス・レベル(デフォルトVPU/GB)に戻る。

ブロック・ボリュームのインスタンスへのアタッチ

お待たせしました!
ここからは実際にブロック・ボリュームをインスタンスにアタッチする検証結果をご紹介します!

事前準備

事前準備として「test_instance」という名の仮想マシン・インスタンスを作成しています。
OSはOracle Linux 8です。
インスタンスの作成手順については別記事やマニュアル等をご参照ください。

今回はこの仮想マシン・インスタンスにブロック・ボリュームをアタッチします!

ブロック・ボリュームの作成

早速、ブロック・ボリュームを作成していきましょう!

まず、OCI画面の左上にある「Ξ」から、コンソールメニューを開き、
「ストレージ」>「ブロック・ボリューム」の順にクリックします。

「ブロック・ボリュームの作成」をクリックします。

ブロック・ボリュームの作成ウインドウが立ち上がりますので、以下の項目を入力していきます。

  • 名前
    ブロック・ボリュームの名前を指定します。
    ここでは「test_block_volume」としています。
  • コンパートメントに作成
    ブロック・ボリュームを作成するコンパートメントを指定します。
  • 可用性ドメイン
    ブロック・ボリュームを作成する可用性ドメインを指定します。
    アタッチ対象のインスタンスと同じ可用性ドメインを指定します。
  • ボリューム・サイズとパフォーマンス
    • ボリューム・サイズ
      「デフォルト」か「カスタム」を選択できます。
      ここでは「カスタム」を選択し、
      ボリューム・サイズは設定できる最小サイズである「50GB」に設定しています。
    • ターゲットのボリューム・パフォーマンス
      ボリュームのパフォーマンスについて、それぞれ下記の通りに設定しています。
       「パフォーマンス・ベースの自動チューニング」オフ
         「パフォーマンス・レベル」より低いコスト(デフォルトVPU/GBは0となる。)
       「デタッチ済ボリューム自動チューニング」オフ
  • バックアップ・ポリシー
    ポリシーを選択することで、自動的にボリュームのバックアップが取得できます。
    今回は何も選択していません
  • クロス・リージョン・レプリケーション
    ブロック・ボリュームを他リージョンに非同期で継続してレプリケートするかを選択できます。
    今回は「オフ」にしています。
  • 暗号化
    暗号化の際に使用する暗号化キーの種類を選択します。
    今回は「Oracle管理キーを使用した暗号化」を選択しています

最後に「ブロック・ボリュームの作成」をクリックすると、ブロック・ボリュームの作成が始まります。

無事にブロック・ボリュームを作成することができました!

ブロック・ボリュームのインスタンスへのアタッチ

次に作成したブロック・ボリュームを、事前準備で作成した仮想マシン・インスタンスにアタッチします!

まず、OCI画面の左上にある「Ξ」から、コンソールメニューを開き、
「コンピュート」>「インスタンス」の順にクリックします。

「インスタンス名のリンク」(今回はtest_instance)をクリックします。

インスタンスの詳細画面の左下にある「リソース」から「アタッチされたブロック・ボリューム」を選択し、
「ブロック・ボリュームのアタッチ」をクリックします。

ブロック・ボリュームのアタッチウインドウが立ち上がりますので、以下の項目を入力していきます。

  • ボリューム
    「ボリュームの選択」を選択し、先ほど作成したtest_block_volume」を選択します。
    「デバイス・パス・オプション」には「/dev/oracleoci/oraclevdb」を選択します。
  • アタッチメント・タイプ
    「準仮想化」か「ISCSI」を選択できます。
    ここでは「準仮想化」を選択しています。
    また、転送中暗号化の使用」空欄にしています。
  • アクセス
    「読取り/書込み」、「読取り/書込み – 共有可能」、「読取り専用 – 共有可能」の
    いずれかを選択できます。
    ここでは「読取り/書込み」を選択しています。

最後に「アタッチ」をクリックすると、インスタンスへのアタッチが開始されます。

無事にブロック・ボリュームのインスタンスへのアタッチが完了しました!

ブロック・ボリュームのフォーマットとマウント

最後にアタッチしたブロック・ボリュームをインスタンス上に使用できるようにフォーマット及びマウントします!
ここではOracle Linux 8 での一例をご紹介します。

まず、デバイスを確認します。
ボリュームをアタッチする際に「デバイス・パス・オプション」「/dev/oracleoci/oraclevdb」指定していますので、確認してみましょう。
「test_instance」
にログインし、「ls」コマンドを実行します。

[opc@test-instance ~]$ ls -ltr /dev/oracleoci/
total 0
lrwxrwxrwx. 1 root root 6 May 2 04:43 oraclevda -> ../sdb
lrwxrwxrwx. 1 root root 6 May 2 04:43 oraclevdb -> ../sda
・
・
【略】

この結果より、ブロック・ボリュームのディスク名が「/dev/sda」であることがわかります。
また、「lsblk」コマンドでもデバイスを確認することができます。

[opc@test-instance ~]$ sudo lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda  8:0   0  50G 0 disk
sdb  8:16   0 46.6G  0 disk

サイズが50GBであることも確認できますね!
ちなみに「sdb」はブート・ボリュームです。

次は「parted」コマンドでパーティション情報を確認します。

[opc@test-instance ~]$ sudo parted -l
Error: /dev/sda: unrecognised disk label
Model: ORACLE BlockVolume (scsi)
Disk /dev/sda: 53.7GB
Sector size (logical/physical): 512B/4096B
Partition Table: unknown
Disk Flags:
・
・
【略】

Partition Table「unknown」となっており、まだパーティションが作成されてないことがわかります。
そのため、今度はパーティションを作成していきます。
コマンドは「parted」を使います。

[opc@test-instance ~]$ sudo parted -s -a optimal /dev/sda \
> mklabel gpt \
> mkpart primary 0% 100%
[opc@test-instance ~]$

パーティションが作成できたことを確認します。

[opc@test-instance ~]$ sudo parted -l
Model: ORACLE BlockVolume (scsi)
Disk /dev/sda: 53.7GB
Sector size (logical/physical): 512B/4096B
Partition Table: gpt
Disk Flags:

Number Start End Size File system Name Flags
1 1049kB 53.7GB 53.7GB primary
・
・
・
【略】
[opc@test-instance ~]$
[opc@test-instance ~]$ sudo lsblk
NAME               MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda                  8:0    0   50G  0 disk
└-sda1         8:1    0   50G  0 part
・
・
・
【略】

無事に「sda1」という名のパーティションが作成されました!

次は「mkfs.xfs」コマンドで、今作成したパーティションに「xfs」ファイルシステムを作成します。

[opc@test-instance ~]$ sudo mkfs.xfs /dev/sda1
meta-data=/dev/sda1              isize=512    agcount=4, agsize=3276672 blks
         =                       sectsz=4096  attr=2, projid32bit=1
         =                       crc=1        finobt=1, sparse=1, rmapbt=0
         =                       reflink=1    bigtime=0 inobtcount=0
data     =                       bsize=4096   blocks=13106688, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0, ftype=1
log      =internal log           bsize=4096   blocks=25600, version=2
         =                       sectsz=4096  sunit=1 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0
Discarding blocks...
Done.
[opc@test-instance ~]$

次は「mkdir」コマンドでマウントポイント(ディスクをマウントするディレクトリ)を作成します。

[opc@test-instance ~]$ sudo mkdir /mnt/blockvol1
[opc@test-instance ~]$ sudo chown opc:opc /mnt/blockvol1
[opc@test-instance ~]$ ls -ld /mnt/blockvol1
drwxr-xr-x. 2 opc opc 6 May 2 06:24 /mnt/blockvol1
[opc@test-instance ~]$

次は「lsblk」コマンドで「sda1」のUIDを確認します。

[opc@test-instance ~]$ lsblk -o +UUID
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT UUID
sda 8:0 0 50G 0 disk
└-sda1 8:1 0 50G 0 part 46781913-4a21-4197-a6e7-a0aab97dc264
・
・
・
【略】

そして、先ほど作成したマウントポイント「sda1」にマウントするため、
下記コマンドで「/etc/fstab」ファイルを編集します。

sudo vi /etc/fstab

編集内容は下記の追記です。

UUID=<確認したUUID> /mnt/blockvol1 xfs defaults,_netdev,nofail 0 2

最後に「/etc/fstab」の設定を反映します!

sudo mount -a

それでは「df -h」でマウントができたか確認してみましょう!

[opc@test-instance ~]$ df -h
Filesystem Size Used Avail Use% Mounted on
・
・
【略】
/dev/sda1  50G 389M    50G   1% /mnt/blockvol1
[opc@test-instance ~]$

無事にマウントできたことが確認できました!

これにて、インスタンスへのブロック・ボリュームのアタッチは完了です!

さいごに

いかがだったでしょうか。

今回はブロック・ボリューム・サービスの概要
ブロック・ボリュームをインスタンスにアタッチする方法
ついてご紹介しました!

実際にブロック・ボリュームをアタッチされる際の参考となりましたら、幸いです。
最後までご精読頂きまして、ありがとうございました!