はじめに

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

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

ブロック・ボリュームのサイズ変更手順を、実機検証を交えてお伝えいたします!

過去の執筆記事も是非ご覧下さいね!
たくみさんの執筆記事はいつも人気記事にランクインしています。

概要

ブロック・ボリュームとは

ブロック・ボリュームとはOCIのストレージ・サービスの一種です。
OCI内のインスタンスに永続的耐久性の高いストレージを提供し、主にDBデータの格納などに用いられます。

詳しくは下記の記事にあります!
OCI ブロック・ボリュームをインスタンスにアタッチしてみよう!

ブロック・ボリュームのサイズ変更について

ブロック・ボリュームのサイズを変更するにあたって、1つ注意点があります。
それは「サイズを小さくすることができない」ということです!
※2023年10月時点

そのため、サイズを大きくする際はサイズの桁を間違えないように注意してください!!
また、その他の注意点もございますので、詳細は以下のマニュアル等をご参考ください。

[マニュアル(ボリュームのサイズ変更)]

さて、サイズを変更する方法ですが、主に以下の方法があります。

①コンソールを使用したオンライン・サイズ変更
ブロック・ボリュームをインスタンスにアタッチした状態で、サイズを変更する方法です。

②コンソールを使用したオフライン・サイズ変更
ブロック・ボリュームをインスタンスからデタッチしてから、サイズを変更する方法です。
一度デタッチしているため、同じインスタンスに再アタッチさせる際は、
デバイス・パスの一貫性を確保できるかなど、いくつかの考慮事項があります。

③バックアップからのリストアによるサイズ変更
ブロック・ボリュームのバックアップを取得し、より大きなサイズにリストアする方法です。

④クローニングによるサイズ変更
ブロック・ボリュームをより大きなサイズでクローニングする方法です。

今回は①の検証結果についてご紹介します!

ブロック・ボリュームのサイズ変更の検証

検証環境について

それでは検証していきましょう!
まずはじめに検証環境の設定について簡単にご紹介します。

まず、ブロック・ボリュームがアタッチされているインスタンス環境は下記となります。
OSはOracle Linuxを使用していますが、
Oracle Linux以外のOSの場合は、サイズ変更の手順が後述の検証と違いますのでご注意ください。

インスタンス名:test_instance
OS:Oracle Linux 8
shape:VM.Standard.E4.Flex

今回サイズを変更するブロック・ボリュームの設定は下記です。

ブロック・ボリューム名:test_block_volume
初期サイズ:50GB
デバイス・パス:/dev/oracleoci/oraclevdb
ボリューム名:/dev/sdb
ボリュームのパーティション:/dev/sdb1
マウント先:/mnt/blockvol1

インスタンス内で「df -h」を実施した結果です。
50GBの「/dev/sdb1」に「/mnt/blockvol1」がマウントされていますね!

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

ブロック・ボリュームをインスタンスにアタッチする方法は前述の
OCI ブロック・ボリュームをインスタンスにアタッチしてみよう! やマニュアルをご参照ください!

それでは早速、ブロック・ボリュームのサイズを変更していきましょう!

ブロック・ボリュームの拡張

まずはOCIのコンソールからブロック・ボリュームを拡張します。

ナビゲーション・メニューを開き、「ストレージ」>「ブロック・ボリューム」の順にクリックします。

ブロック・ボリュームのリストからサイズを変更するブロック・ボリュームを選択します。
今回は「test_block_volume」を選択します。

「test_block_volume」の詳細画面が出てきますので、「編集」をクリックします。
ちなみにサイズが50GBであることも確認できますね!

すると、下記のように「ボリュームの編集」画面が出てきます!
ここの「ボリューム・サイズとパフォーマンス」「ボリューム・サイズ(GB)」のサイズを変更しましょう!

今回は検証ですので、10GB拡張の60GBとします。
最後に「変更の保存」をクリックします。

最後に下記のように「再スキャン・コマンド」が表示されます。

このコマンドは後で使用しますので、忘れずにコピーしましょう!!
コピーができたら「閉じる」を押してください。

ブロック・ボリュームの詳細画面を見ると、無事にサイズが60GBになっていることを確認できますね!

ところが!
インスタンスに接続して「lsblk」を実行してみると…

[opc@test-instance ~]$ sudo lsblk
NAME      MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
・
【略】
・
sdb       8:16    0  50G  0 disk 
└sdb1     8:17    0  50G  0  part /mnt/blockvol1
[opc@test-instance ~]$

まだボリューム(sdb)が50GBのままですね…
そこで登場するのが先ほどコピーした「再スキャン・コマンド」です!
こちらのコマンドを実行してみます。

[opc@test-instance ~]$ sudo dd iflag=direct if=/dev/oracleoci/oraclevdb of=/dev/null count=1
1+0 records in
1+0 records out
512 bytes copied, 0.000557828 s, 918 kB/s
[opc@test-instance ~]$ 
[opc@test-instance ~]$ echo "1" | sudo tee /sys/class/block/`readlink /dev/oracleoci/oraclevdb | cut -d'/' -f 2`/device/rescan
1
[opc@test-instance ~]$

もう一度ボリュームを確認すると…

[opc@test-instance ~]$ sudo lsblk
NAME      MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
・
【略】
・
sdb       8:16    0  60G  0  disk 
└sdb1     8:17    0  50G  0  part /mnt/blockvol1

無事にボリュームのサイズが60GBとして認識されましたね!
これでボリュームそのものの拡張はできました!!

しかし、まだ「/mnt/blockvol1」がマウントしているパーティション(sdb1)が拡張出来ていませんね。
今後はパーティションを拡張していきましょう!

パーティションの拡張

それでは拡張していきましょう。

最初に「sdb1」にマウントされている「/mnt/blockvol1」
「umount <directory_name>」でアンマウントします。

[opc@test-instance ~]$ sudo umount /mnt/blockvol1

次に「parted」コマンドを用いて、パーティションを編集していきます!
なお、「parted」コマンドを実行すると、次のようなエラーが発生することがあります。

[opc@test-instance ~]$ sudo parted -l
・
【略】
・
Warning: Not all of the space available to /dev/sdb appears to be used, you can
fix the GPT to use all of the space (an extra 20971520 blocks) or continue with
the current setting? 
Fix/Ignore?Fix

この場合はエラーを修正する「Fix」を選択してください!
※ちなみに私の検証時は、ボリューム拡張後に「sudo parted -l」コマンドを実行した際にでてきました。

それでは「parted」コマンドを実行していきましょう。
まずは「sudo parted <volume_id>」で編集するパーティションを含むボリュームを選択します
※<volume_id>にはボリュームの識別子(ボリューム名)を指定します。今回は「/dev/sdb」です。

[opc@test-instance ~]$ sudo parted /dev/sdb
GNU Parted 3.2
Using /dev/sdb
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted)

次にボリュームの正確な開始位置がわかるように「unit s」コマンドを実行し、
表示単位をセクターに変更します。
さらに「print」コマンドを実行し、現在のパーティションを表示します。

(parted) unit s
(parted) print
Model: ORACLE BlockVolume (scsi)
Disk /dev/sdb: 125829120s
Sector size (logical/physical): 512B/4096B
Partition Table: gpt
Disk Flags: 

Number Start End        Size       File system Name Flags
1      2048s 104855551s 104853504s xfs         primary
(parted)

ここの「Number」「Start」「File system」列の値は後で使用しますので、
メモしておきましょう!

メモができたら、既存のパーティションを「rm <partition_number>」コマンドで削除します。
※<partition_number>には先ほどメモした「Number」列の値を入れてください。今回は「1」です。

(parted) rm 1

エラーなく削除ができたら、新しいパーティションの作成です!
コマンドは「mkpart」を使用します。いくつか設定の入力を求められますので、下記のように入力します。

Partition name?:パーティションの名前を入力します。特に指定しない場合はそのまま「enter」を押してください。
File system type?:「print」コマンドで確認した「File system」列の値を入力します。今回は「xfs」です。
Start?:「print」コマンドで確認した「Start」列の値を入力します。今回は「2048s」です。
End?:「100%」を指定します。

(parted) mkpart
Partition name? []? 
File system type? [ext2]? xfs
Start? 2048s
End? 100%
(parted)

最後に「quit」コマンドで「parted」から抜けてください。

(parted) quit
Information: You may need to update /etc/fstab.
[opc@test-instance ~]$

それではパーティションが拡張されたかを確認しましょう!

[opc@test-instance ~]$ lsblk
NAME      MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
・
【略】
・
sdb       8:16    0  60G  0  disk 
└sdb1     8:17    0  60G  0  part /mnt/blockvol1

無事に「sdb」のパーティション「sdb1」60GBに拡張されていますね!

ところが!
「df -h」を実行してみると…

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

まだ「sda1」のサイズが50GBのままですね。

そこで必要となってくるのがファイル・システムの拡大です!

ファイル・システムの拡大

※今回はXFSファイル・システムの場合の手順になります。
 他のファイルシステムの場合は手順が異なりますので、詳細はマニュアル等をご参考ください。

まずは/mnt/blockvol1「sdb1」に自動的にマウントされたので、アンマウントします。

[opc@test-instance ~] $ sudo umount /mnt/blockvol1

次に「xfs_repair <partition_id>」を実行します。
※<partition_id>にはパーティション名を入力します。今回は「/dev/sdb1」です。

[opc@test-instance ~]$ sudo xfs_repair /dev/sdb1
Phase 1 - find and verify superblock...
・
【略】
・
Phase 7 - verify and correct link counts...
done
[opc@test-instance ~]$

そして、「mount <partition_id> <directory_name> -o nouuid」を実行し、
再び「/mnt/blockvol1」「/dev/sdb1」にウントします。

[opc@test-instance ~]$ sudo mount /dev/sdb1 /mnt/blockvol1 -o nouuid

最後に「xfs_growfs -d <directory_name>」を実行し、ファイル・システムを拡大します!

[opc@test-instance ~]$ sudo xfs_growfs -d /mnt/blockvol1
meta-data=/dev/sdb1 isize=512 agcount=4, agsize=3276672 blks
・
【略】
・
data blocks changed from 13106688 to 15728128
[opc@test-instance ~]$

それでは「df -h」を実行してみましょう!

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

無事に60GBに拡張されました!!

まとめ

いかがだったでしょうか。
今回はブロック・ボリュームをインスタンスにアタッチした状態でのリサイズについてご紹介いたしました。

繰り返しにはなりますが、
2023年の10月時点では、サイズの縮小ができないことに注意してください!!

本記事が実際の作業の参考となりましたら幸いです。
最後までご精読頂きまして、ありがとうございました。

OCIに関して何かございましたら、お気軽に当社までお問合せください!

投稿者プロフィール

技術チーム
技術チーム
DBひとりでできるもんを盛り上げるべく、技術チームが立ち上がり早6年。ひとりでできるもんと言いつつ、技術者が読んでプッとなるような、極めてピンポイントでマニアックな技術ネタを執筆しています!