はじめに

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

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

ブロック・ボリュームのクローニング手順を、実機検証を交えてお伝えいたします!

過去記事も是非ご覧くださいね。

概要

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

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

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

また下記記事にて、
インスタンスにアタッチ済みブロック・ボリュームのサイズ変更手順について記載しております!
こちらも併せてご参照頂けますと幸いです!
OCI ブロック・ボリュームのサイズを変更してみよう!

クローニングとは

クローニングとは、クローン(コピー)を作成することです。
ブロック・ボリュームのクローニングを実施することで、バックアップとリストアを実行することなく
既存のブロック・ボリュームのクローンを作成することができます。

もちろん、ブロック・ボリューム内のデータもしっかりコピーされます!
また、ソース・ブロック・ボリュームより大きいサイズのクローンを作成することもできます!
※ソース・ブロック・ボリュームより小さいサイズでクローニングすることはできませんので、
ご注意ください。(2024年3月時点)

クローニングされたブロック・ボリュームは、
新しいボリュームとして別インスタンスにアタッチできますので、既存の環境を素早く複製することができます。
本番データを用いた検証を実施したい時に、検証環境作成が簡単にできます!

なお、以下のような制限がございますので、ご留意ください。

  • 1つのソース・ブロック・ボリュームから同時に作成できるクローンの数
    ブロック・ボリュームがインスタンスにアタッチ済みの場合    :1個
    ブロック・ボリュームがインストールにアタッチされていない場合 :10個
  • クローンの作成先
    同じ可用性ドメイン及びテナンシ

バックアップとクローニングの違い

ブロック・ボリュームを複製する方法として、ブロック・ボリュームのバックアップがあります。
バックアップとクローニングの違いについては以下の表に記載いたします。
用途に合わせて使い分けることができます!

クローニング バックアップ
説明 ソース・ブロック・ボリュームのコピーを
新しいブロック・ボリュームとして
即時作成する。
ブロック・ボリューム内のデータを
オブジェクト・ストレージにバックアップする。
バックアップからリストアすることで、
新しいブロック・ボリュームを作成できる。
使用例 既存のボリュームを素早く複製し、
別環境を作成する。
ビジネス継続性の要件を満たすため、
データの破損等に備えたバックアップを
取得する
速度 高速 低速
コスト 高コスト 低コスト
保持ポリシー 有効期限なし ポリシーベースのバックアップでは
有効期限を指定可能
範囲 可用性ドメイン リージョン

ブロック・ボリュームのクローニング検証

検証環境について

それでは検証していきましょう!
今回の検証の流れは下記のようになります。

  1. 検証環境1にアタッチされたソース・ブロック・ボリュームをクローニングする
  2. クローニングで作成されたブロック・ボリュームを検証環境2にアタッチする
  3. 検証環境2にアタッチしたブロック・ボリュームをマウントする

検証環境1と2の情報はそれぞれ下記となります。

【検証環境1】
インスタンス名:test_instance
OS:Oracle Linux 8
shape:VM.Standard.E4.Flex

【検証環境2】
インスタンス名:test_instance_clone
OS:Oracle Linux 8
shape:VM.Standard.E4.Flex

また、ソース・ブロック・ボリュームの情報は下記になります。

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

以下、検証環境1で確認したソース・ブロック・ボリュームです。
50GBのパーティション「sda1」「/mnt/blockvol1」にマウントされていますね!

[opc@test-instance ~]$ sudo lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 50G 0 disk
Lsda1 8:1 0 50G 0 part /mnt/blockvol1

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

また、テストデータとして100MBの空ファイルを「/mnt/blockvol1」配下に配置しています。
作成コマンドは「dd if=/dev/zero of=test_data bs=1M count=100」です。

[opc@test-instance ~]$ cd /mnt/blockvol1
[opc@test-instance blockvol1]$ 
[opc@test-instance blockvol1]$ dd if=/dev/zero of=test_data bs=1M count=100
100+0 records in
100+0 records out
104857600 bytes (105 MB, 100 MiB) copied, 0.0500826 s, 2.1 GB/s
[opc@test-instance blockvol1]$ 
[opc@test-instance blockvol1]$ ls -ltr
total 102400
-rw-rw-r--. 1 opc opc 104857600 Mar 15 05:27 test_data
[opc@test-instance blockvol1]$

それではブロック・ボリュームをクローニングしていきましょう!

ブロック・ボリュームのクローニング

ブロック・ボリュームのクローニングはOCIのコンソールからできます。

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

ブロック・ボリュームの一覧からソース・ブロック・ボリュームを選択肢します。
今回は「test_block_volume」です。

「test_block_volume」の詳細画面がでてきます。
左下の「リソース」から「ブロック・ボリュームのクローン」を選択肢し、
「クローンの作成」をクリックします。

すると、下記のように「クローンの作成」画面がでてきます。
まず作成するクローンの名前を記入します。今回は「test_block_volume_clone」とします。
また、クローンを作成するコンパーメントを選択します。

次に「ボリュームサイズとパフォーマンス」から、クローンのサイズを指定します。
前述の通り、
ここでソース・ブロック・ボリュームより小さいサイズは指定できないことに注意してください。
今回はせっかくなので、10GBだけ拡張してみましょう!
「カスタム」を選択し、サイズに「60GB」を指定してみます。

パフォーマンスについてはソース・ブロック・ボリュームと同じ「より低いコスト」にしています。

最後に「クロス・リージョン・レプリケーション」「オフ」
暗号化「Oracle管理キーを使用した暗号化」と設定し、「クローンの作成」をクリックします。

無事にソース・ブロック・ボリュームのクローンが完成しました!
サイズも60GBになっていますね!

クローンのインスタンスへのアタッチ

次に作成したクローンを検証環境2にアタッチします!

ナビゲーション・メニューを開き、「コンピュート」>「インスタンス」の順にクリックします。

インスタンス一覧から、クローンをアタッチするインスタンスを選びます。
今回は「test_instance_clone」です。

「test_instance_clone」の詳細画面がでてきます。
左下の「リソース」から「アタッチされたブロック・ボリューム」を選択肢し、
「ブロック・ボリュームのアタッチ」をクリックします。

すると、下記のように「ブロック・ボリュームのアタッチ」画面がでてきます。
最初にアタッチするボリュームを指定します。
「ボリュームの選択」クリックし、「test_block_volume_clone」を選択します。

次に「アタッチメント・タイプ」を設定します。
「カスタム」を選択し、「準仮想化」を選択します。
また「転送中の暗号化」はチェックを入れず、「デバイス・パス・オプション」「/dev/oracleoci/oraclevdb」を指定します。

最後に「アクセス」「読取り/書込み」を選択肢、「アタッチ」をクリックします。

無事に「test_block_volume_clone」がインスタンスにアタッチされました!

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

パーティションの拡張

最後にインスタンスにアタッチされたクローンが使用できるように
ディレクトリにマウントしていきたいと思います!

クローンのデバイスパスは「/dev/oracleoci/oraclevdb」ですので、
まずはボリュームが存在するか確認してみます

[opc@test-instance-clone ~]$ ls -ltr /dev/oracleoci
total 0
・
【中略】
・
lrwxrwxrwx. 1 root root 6 Mar 13 08:55 oraclevdb -> ../sdb
lrwxrwxrwx. 1 root root 7 Mar 13 08:55 oraclevdb1 -> ../sdb1

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

「/dev/oracleoci/oraclevdb」が存在することが確認できました。
デバイスパスと紐づいたボリューム名は「/dev/sdb」です。
また「slbk」コマンドの結果を見ると、既にパーティションが作成されていることも確認できますね!
しかし、ボリュームサイズが50GBから60GBに拡張されているのに対して、
パーティションは50GBのままです。

そこで、「parted」コマンドを用いてパーティションの拡張を実施します!
なお、「parted」コマンドを実行すると下記のようなエラーが発生することがあります。
この場合はエラーを修正する「FIX」を選択してください!

[opc@test-instance-clone ~]$ sudo parted -l
Warning: Not all of the space available to /dev/sda appears to be used, you can
fix the GPT to use all of the space (an extra 7180288 blocks) or continue with
the current setting? 

Fix/Ignore? Fix

まずは「parted /dev/sdb」で編集するパーティションを含むボリュームを選択します。

[opc@test-instance-clone ~]$ 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) 
(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 Name」列の値は後々に使用しますので、
メモしておいてください!

次に既存のパーティションを「rm <Partition Number>」コマンドで削除します。
<Partition Number>は先ほど確認した「Number」列の値を使用するので、今回は「rm 1」です。

(parted) rm 1

削除が完了したら、新しいパーティションを作成しましょう!
コマンドは「mkpart」コマンドを使用します。いくつか質問されますので、以下のように回答しましょう!

  • Partition name?
    パーティションの名前を指定します。特に指定しない場合はそのまま「enter」を押してください。
  • File system type?
    ファイルシステムを指定します。
    今回は「print」コマンドで確認した「File system Name」列の値である「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-clone ~]$

「lsblk」コマンドで確認してみると60GBのパーティションが作成されていることが確認できます!

[opc@test-instance-clone ~]$ sudo lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
・
【中略】
・
sdb 8:16 0 60G 0 disk 
Lsdb1 8:17 0 60G 0 part 
[opc@test-instance-clone ~]$
ファイル・システムの拡張

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

最初に「xfs_repair <partition_Name>」を実行します。
今回の<partition_Name>は「/dev/sdb1」です。

[opc@test-instance-clone ~]$ sudo xfs_repair /dev/sdb1
Phase 1 - find and verify superblock...
・
【中略】
・
- moving disconnected inodes to lost+found ...
Phase 7 - verify and correct link counts...
done
[opc@test-instance-clone ~]$

次に「/dev/sdb1」に対してディレクトリをマウントします。
今回はマウントターゲットディレクトリとして/mnt/blockvol1_clone」を作成しています。

[opc@test-instance-clone ~]$ ls -ld /mnt/blockvol1_clone
drwxr-xr-x. 2 opc opc 6 Mar 13 09:03 /mnt/blockvol1_clone
[opc@test-instance-clone ~]$

マウントは「mount <partition_Name> <Mount Target Directory> -o nouuid」コマンドで
実行します。

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

最後に「xfs_growfs -d <Mount Target Directory>を実行します。

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

以上でマウント作業は完了です!

それでは確認してみましょう!

[opc@test-instance-clone ~]$ df -h
Filesystem Size Used Avail Use% Mounted on
・
【中略】
・
/dev/sdb1 60G 561M 60G 1% /mnt/blockvol1_clone
[opc@test-instance-clone ~]$ 
[opc@test-instance-clone ~]$ cd /mnt/blockvol1_clone
[opc@test-instance-clone blockvol1_clone]$ ls -lh
total 100M
-rw-rw-r--. 1 opc opc 100M Mar 13 07:42 test_data
[opc@test-instance-clone blockvol1_clone]$

無事にマウント出来ていることを確認できましたね!
また、ソース・ブロック・ボリュームに作成した100MBの空ファイルもしっかりコピーできています!

ちなみにOS再起動後もマウント状態を維持するためには下記のような流れで
「/etc/fstab」を編集してください。


パーティションのUUIDを確認する。

[opc@test-instance-clone ~]$ lsblk -o +UUID
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT UUID
・
【中略】
・
sdb 8:16 0 60G 0 disk 
Lsdb1 8:17 0 60G 0 part 20075ff4-2e88-4b3a-a599-3f8391324bc3
[opc@test-instance-clone ~]$


「/etc/fstab」に下記を追記する

「UUID=<①で確認したパーティションのUUID> <Mount Target Directory> xfs defaults,_netdev,nofail 0 2」

[opc@test-instance-clone ~]$ sudo vi /etc/fstab
※/etc/fstabにUUID=20075ff4-2e88-4b3a-a599-3f8391324bc3 /mnt/blockvol1_clone xfs defaults,_netdev,nofail 0 2を追記
[opc@test-instance-clone ~]$ cat /etc/fstab
・
【中略】
・
UUID=20075ff4-2e88-4b3a-a599-3f8391324bc3 /mnt/blockvol1_clone xfs defaults,_netdev,nofail 0 2
[opc@test-instance-clone ~]$

まとめ

いかがだったでしょうか。
今回はブロック・ボリュームのクローニングについてご紹介いたしました。

今回はソース・ブロック・ボリュームのサイズより大きいサイズのクローンを作成いたしましたが、
ソース・ブロック・ボリュームと同じサイズのクローンも作成可能です。
しかしながら、2024年3月時点で
ソース・ブロック・ボリュームより小さいサイズのクローンは作成できないことにご注意ください!

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

お問い合わせはこちら

投稿者プロフィール

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