はじめに
- この記事では、Phoenixリージョンで実施しているため、可用性ドメインが3つ存在しており、可用性ドメイン名もphoenixとなっている
- 今回はわかりやすく、アタッチしたブロック・ボリュームにXFSファイルシステムを作成し、そこにテキストファイルを作成して、作成前後でボリュームのバックアップに差が生じるようにする
SCSI3-PRについて
概要
- APIで2つのバックアップ間で変更されたブロックをスキャンできる
- ユースケース:バックアップ/リストア・ソリューションのデータ保護サービス・ベンダーや開発者が、2つのバックアップから2つのフル・ボリュームをリストアして比較および処理する必要がなくなり、バックアップ・プロセスをより最適化できる
制限・考慮事項
- インスタンスへのアタッチに際し、準仮想化アタッチメントおよびWindowsベースのインスタンスへのアタッチメントは非対応
- ブロック・ボリューム/ブート・ボリューム/ボリューム・グループ(個々のボリューム・バックアップの変更されたブロックを取得)のバックアップでサポート
- 2つのバックアップが同一ボリュームからのバックアップでなければならない
- 最初のバックアップは完全or増分、2番目は増分でなければならず、最初のバックアップも増分の場合、2つの増分バックアップの間に完全バックアップがあってはならない
- バックアップ間でボリュームのサイズ変更をしてはならない
- 推奨スキャン長は最大1GBの論理ブロックで、これを超えるスキャン長は非対応。スキャン長の指定が0または指定なしの場合、スキャン長はボリューム全体と見なされて1GBが制限となる
- 変更されたブロックを取得するために作成したボリュームは通常のボリュームの様には使用できないため、作業完了後は削除推奨
- 変更されたブロックを取得するために作成したボリュームは、「低コスト」パフォーマンス・レベルは非対応
- 変更されたブロックを取得するために作成したボリュームは、バックアップのソース・ボリュームと同じサイズになり、そのサイズで課金される
- ブロック・ボリュームのブロック・サイズはデフォルトで4KB。ブロック・サイズを拡張してボリュームをエクスポートする場合、リストア時に “changeBlockSizeInBytes” パラメータにより、外部バックアップ形式でより大きなブロック・サイズを指定
前提
- VCNやゲートウェイ、セキュリティ・ルールなど、必要なネットワーク環境は構成済み
- OCICLIが使用できる(本手順ではCloud Shellを利用)
1. ブロック変更前後のバックアップの準備
1-1. インスタンスの作成
以下の設定でインスタンスを2つ作成(名前以外は同じ設定)
1. 基本情報
| 項目 | 名称 | 備考 |
|---|---|---|
| 名前 | SourcevolumeVM DeltavolumeVM |
|
| イメージ | Oracle Linux 8 | 2025年10月25日時点では、後ほどSSHでTeraTermを使用する場合、Oracle Linux 9以降ではSSHキーでは接続できないため注意(TeraTermでESAキーなどを使用する、TeraTerm以外の端末から接続する) |
| シェイプ | VM.Standard.E5.Flex | 拡張オプションでOracle Cloudエージェントの「ブロック・ボリューム管理」プラグインにチェック |
2. セキュリティ
- デフォルトのまま
3. ネットワーキング
- パブリック・サブネットに配置
- SSHキー追加で「キー・ペアを自動で生成」を選択する場合、他の選択肢をクリックすると自動登録された公開キーが変更されてしまうため、両方のキーをダウンロードし直す必要がある
↓ 1.基本情報のシェイプ選択欄の下にある「拡張オプション」を開く

インスタンス作成時にOracle Cloudエージェントの「ブロック・ボリューム管理」プラグインを有効化し忘れても、該当インスタンスの「管理」タブからもプラグインを有効化することができる

1-2. ブロック・ボリュームの作成
| 項目 | 名称 |
|---|---|
| 名前 | SourceVolume |
| サイズ | 50 GB |
| VPU | 10 |
1-3. OCIコンソールから、インスタンスにブロック・ボリュームをアタッチ
1. インスタンスにブロック・ボリュームをアタッチ
- iSCSIアタッチメント
※ ソース・ボリュームは準仮想化アタッチメントで問題ないが、後に作成する差分ボリュームは必ずiSCSIアタッチメントを使用する必要があり、今回はそちらに揃えてiSCSIアタッチメントを使用 - 読取り/書込み
- 「Oracle Cloudエージェントを使用して、iSCSIでアタッチされたボリュームに自動的に接続します」を有効化
- デバイス・パスを指定
- いずれかのパスを指定(例では
.../oraclevdbを使用)
- いずれかのパスを指定(例では
2. デバイスの確認
以下では、sda はブート・ボリューム、sdb がアタッチしたブロック・ボリューム。
ブロック・ボリュームがアタッチされており、「ブロック・ボリューム管理」プラグインがiSCSIコマンドを実行してくれたことがわかる。
[opc@sourcevolumevm ~]$ lsblk -o +UUID
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT UUID
sda 8:0 0 46.6G 0 disk
├─sda1 8:1 0 100M 0 part /boot/efi 349C-BCCC
├─sda2 8:2 0 1G 0 part /boot 5097b6ba-ed0e-418a-9c2c-fb25d577991f
└─sda3 8:3 0 45.5G 0 part VVm7za-zVxq-rlc2-c8S5-gZBI-Vmig-5ENtYy
├─ocivolume-root 252:0 0 35.5G 0 lvm / b6a02660-0016-4f87-bfc5-273315d7c2e4
└─ocivolume-oled 252:1 0 10G 0 lvm /var/oled 91dcb4d9-240a-42b6-b0ed-a199437d63bb
sdb 8:16 0 50G 0 disk
[opc@sourcevolumevm ~]$ ll /dev/oracleoci/oraclevd*
lrwxrwxrwx. 1 root root 6 Nov 25 06:17 /dev/oracleoci/oraclevda -> ../sda
lrwxrwxrwx. 1 root root 7 Nov 25 06:17 /dev/oracleoci/oraclevda1 -> ../sda1
lrwxrwxrwx. 1 root root 7 Nov 25 06:17 /dev/oracleoci/oraclevda2 -> ../sda2
lrwxrwxrwx. 1 root root 7 Nov 25 06:17 /dev/oracleoci/oraclevda3 -> ../sda3
lrwxrwxrwx. 1 root root 6 Nov 25 06:25 /dev/oracleoci/oraclevdb -> ../sdb
1-4. アタッチしたブロック・ボリュームのフォーマットとマウント
まずは、ブロック・ボリュームにXFSファイルシステムを作成する。
1. パーティションの確認
Disk 欄に注目すると、/dev/sda はブート・ボリュームで Oracle Linux 8 ではパーティション・テーブルは GPT、ファイルシステムは XFS。
/dev/sdb はブロック・ボリュームで、パーティションなし。
parted コマンド
主にLinux/Unix系OSで使われる、ディスクのパーティションの作成、破棄、サイズ変更、移動、コピーなどを実行できるコマンド。
parted コマンドリファレンス:ORACLEマニュアル parted
| オプション | 説明 |
|---|---|
| -l, --list | すべてのブロックデバイスのパーティション情報を表示 |
| -s, --script | 対話処理しない |
| -a, --align | パーティションのアラインメント方法を指定 |
| optimal | ブロックサイズの倍数に合わせて調整 |
| mklabel | ディスクラベルを作成。bsd、dvh、gpt、loop、mac、msdos、pc98、sunのいずれかを指定 |
| mkpart | パーティションの開始位置、終了位置を指定(primaryはパーティションタイプ) |
[opc@sourcevolumevm ~]$ 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 1228 blocks) or continue with the
current setting?
Fix/Ignore? Ignore
Model: ORACLE BlockVolume (scsi)
Disk /dev/sda: 50.0GB
Sector size (logical/physical): 512B/4096B
Partition Table: gpt
Disk Flags:
Number Start End Size File system Name Flags
1 1049kB 106MB 105MB fat16 EFI System Partition boot, esp
2 106MB 1180MB 1074MB xfs
3 1180MB 50.0GB 48.9GB lvm
Error: /dev/sdb: unrecognised disk label
Model: ORACLE BlockVolume (scsi)
Disk /dev/sdb: 53.7GB
Sector size (logical/physical): 512B/4096B
Partition Table: unknown
Disk Flags:
2. パーティションの作成と確認
sudo parted -s -a optimal /dev/sdb mklabel gpt mkpart primary 0% 100% を実行すると、 sdb1 が作成される。
[opc@sourcevolumevm ~]$ sudo parted -s -a optimal /dev/sdb mklabel gpt mkpart primary 0% 100%
[opc@sourcevolumevm ~]$ sudo parted /dev/sdb print
Model: ORACLE BlockVolume (scsi)
Disk /dev/sdb: 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@sourcevolumevm ~]$ lsblk -o +UUID
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT UUID
sda 8:0 0 46.6G 0 disk
├─sda1 8:1 0 100M 0 part /boot/efi 349C-BCCC
├─sda2 8:2 0 1G 0 part /boot 5097b6ba-ed0e-418a-9c2c-fb25d577991f
└─sda3 8:3 0 45.5G 0 part VVm7za-zVxq-rlc2-c8S5-gZBI-Vmig-5ENtYy
├─ocivolume-root 252:0 0 35.5G 0 lvm / b6a02660-0016-4f87-bfc5-273315d7c2e4
└─ocivolume-oled 252:1 0 10G 0 lvm /var/oled 91dcb4d9-240a-42b6-b0ed-a199437d63bb
sdb 8:16 0 50G 0 disk
└─sdb1 8:17 0 50G 0 part
3. ファイルシステムの作成
sudo mkfs.xfs /dev/sdb1 で /dev/sdb1 にXFSファイルシステムを作成する。
[opc@sourcevolumevm ~]$ sudo mkfs.xfs /dev/sdb1
meta-data=/dev/sdb1 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.
4. マウントポイントの作成
OS側にマウントポイントとして /mnt/bv1 ディレクトリを作成し、ユーザーとグループの所有権を opc に変更する。
[opc@sourcevolumevm ~]$ sudo mkdir /mnt/bv1
[opc@sourcevolumevm ~]$ sudo chown opc:opc /mnt/bv1
5. マウントの永続化
ファイルにエントリを追加し、システムの再起動後も自動マウントするように設定する。
まず、sdb1のUUIDを確認し、/etc/fstab に記載する。
以下の例では、sdb1のUUIDは 7249b60e-7f4f-45a9-9d9a-039ee53e12ed
[opc@sourcevolumevm ~]$ lsblk -o +UUID
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT UUID
sda 8:0 0 46.6G 0 disk
├─sda1 8:1 0 100M 0 part /boot/efi 349C-BCCC
├─sda2 8:2 0 1G 0 part /boot 5097b6ba-ed0e-418a-9c2c-fb25d577991f
└─sda3 8:3 0 45.5G 0 part VVm7za-zVxq-rlc2-c8S5-gZBI-Vmig-5ENtYy
├─ocivolume-root 252:0 0 35.5G 0 lvm / b6a02660-0016-4f87-bfc5-273315d7c2e4
└─ocivolume-oled 252:1 0 10G 0 lvm /var/oled 91dcb4d9-240a-42b6-b0ed-a199437d63bb
sdb 8:16 0 50G 0 disk
└─sdb1 8:17 0 50G 0 part 7249b60e-7f4f-45a9-9d9a-039ee53e12ed
/etc/fstab に UUID="7249b60e-7f4f-45a9-9d9a-039ee53e12ed" /mnt/bv1 xfs defaults,_netdev,nofail 0 2 を追記する。
[opc@sourcevolumevm ~]$ sudo vi /etc/fstab
[opc@sourcevolumevm ~]$ cat /etc/fstab
#
# /etc/fstab
# Created by anaconda on Wed Jan 15 00:37:33 2025
#
# Accessible filesystems, by reference, are maintained under '/dev/disk/'.
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info.
#
# After editing this file, run 'systemctl daemon-reload' to update systemd
# units generated from this file.
#
/dev/mapper/ocivolume-root / xfs defaults 0 0
UUID=5097b6ba-ed0e-418a-9c2c-fb25d577991f /boot xfs defaults 0 0
UUID=349C-BCCC /boot/efi vfat defaults,uid=0,gid=0,umask=077,shortname=winnt 0 2
/dev/mapper/ocivolume-oled /var/oled xfs defaults 0 0
tmpfs /dev/shm tmpfs defaults,nodev,nosuid,noexec 0 0
######################################
## ORACLE CLOUD INFRASTRUCTURE CUSTOMERS
##
## If you are adding an iSCSI remote block volume to this file you MUST
## include the '_netdev' mount option or your instance will become
## unavailable after the next reboot.
## SCSI device names are not stable across reboots; please use the device UUID instead of /dev path.
##
## Example:
## UUID="94c5aade-8bb1-4d55-ad0c-388bb8aa716a" /data1 xfs defaults,noatime,_netdev 0 2
UUID="7249b60e-7f4f-45a9-9d9a-039ee53e12ed" /mnt/bv1 xfs defaults,_netdev,nofail 0 2
##
## More information:
## https://docs.us-phoenix-1.oraclecloud.com/Content/Block/Tasks/connectingtoavolume.htm
/.swapfile none swap sw,comment=cloudconfig 0 0
そして、sudo systemctl daemon-reload でデーモンを再起動して systemd をアップデートし、sudo mount -a で fstab の設定に基づいてパーティションをマウントする。
[opc@sourcevolumevm ~]$ sudo systemctl daemon-reload
[opc@sourcevolumevm ~]$ sudo mount -a
すると、sdb1 のマウントポイントに /mnt/bv1 が登録される。
[opc@sourcevolumevm ~]$ lsblk -o +UUID
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT UUID
sda 8:0 0 46.6G 0 disk
├─sda1 8:1 0 100M 0 part /boot/efi 349C-BCCC
├─sda2 8:2 0 1G 0 part /boot 5097b6ba-ed0e-418a-9c2c-fb25d577991f
└─sda3 8:3 0 45.5G 0 part VVm7za-zVxq-rlc2-c8S5-gZBI-Vmig-5ENtYy
├─ocivolume-root 252:0 0 35.5G 0 lvm / b6a02660-0016-4f87-bfc5-273315d7c2e4
└─ocivolume-oled 252:1 0 10G 0 lvm /var/oled 91dcb4d9-240a-42b6-b0ed-a199437d63bb
sdb 8:16 0 50G 0 disk
└─sdb1 8:17 0 50G 0 part /mnt/bv1 7249b60e-7f4f-45a9-9d9a-039ee53e12ed
1-5. アタッチしたブロック・ボリュームへの書き込みとバックアップの取得
1. /mnt/bv1 が空であることを確認し、「完全」または「増分」バックアップを作成する。今回はコンソール画面から完全バックアップを作成する。
[opc@sourcevolumevm ~]$ cd /mnt/bv1
[opc@sourcevolumevm bv1]$ ls
[opc@sourcevolumevm bv1]$
2. /mnt/bv1 に "hello" の文字列を書いたテキストファイル test.txt を作成し、「増分」バックアップを作成する。
[opc@sourcevolumevm bv1]$ sudo vi test.txt
[opc@sourcevolumevm bv1]$ cat test.txt
hello
2. 差分ボリュームの作成とインスタンスへのアタッチ
差分ボリュームはコンソール画面から作成することはできず、CLIまたはAPIで作成する。
今回はOCI CLIを使用する。差分ボリュームは、ソース・ボリュームと同じコンパートメント、同じ可用性ドメインに作成される。
OCI CLI コマンドリファレンス:create-volume-source-from-volume-backup-delta
2-1. 必要な情報の収集
1. コンパートメントのOCIDを取得
ソース・ボリュームのコンパートメントのOCIDを取得する。
ナビゲーション・メニュー > 「アイデンティティとセキュリティ」 > 「コンパートメント」 から、該当コンパートメントを探してOCIDをコピーし、テキストエディタなどにメモしておく。
2. ソース・ボリュームの可用性ドメイン名を取得
ソースのボリュームの詳細画面か、ソースのボリュームを含むブロック・ボリュームの一覧表示画面から取得できる。
以下の例では、可用性ドメイン名は TGjA:PHX-AD-1
3. バックアップのOCIDをコピー
ブロック・ボリュームの「バックアップ」タブから、作成した2つのバックアップのOCIDを取得する。
各バックアップの右端の三点リーダーから、「OCIDのコピー」をクリックし、コピーしたOCIDをテキストエディタなどにメモしておく。
2-2. 2つのバックアップから1つの差分ボリュームをリストア
2つのバックアップから1つの変更されたブロックを含む差分ボリュームを作成し、SCSIコマンドで変更されたブロックを取得する。
1. CLIを使用して、2つのバックアップから1つの差分ボリュームをリストアする(APIでも可能)
oci bv volume create-volume-source-from-volume-backup-delta --compartment-id <sourcevolume_compartment_ID> --source-details-first-backup-id <first_backup_ID> --source-details-second-backup-id <second_backup_ID> --availability-domain <sourcevolume_ADname> --display-name [OPTIONS; text]
| パラメータ(一部紹介) | 要否 | 説明 |
|---|---|---|
--compartment-id |
必須 | ソース・ボリュームのコンパートメントのOCIDを指定 |
--source-details-first-backup-id |
必須 | メモしておいた最初のバックアップのOCIDを指定 |
--source-details-second-backup-id |
必須 | メモしておいた2つ目のバックアップのOCIDを指定 |
--availability-domain |
必須 | メモしておいたソース・ボリュームの可用性ドメイン名を指定 |
--display-name |
オプション | 表示したいボリューム名をテキストで指定 |
cloudshell:~ (us-phoenix-1)$ COMPID=(ソース・ボリュームのコンパートメントのOCID)
cloudshell:~ (us-phoenix-1)$ BACKUP1ID=ocid1.volumebackup.oc1.phx.abyhqljrtwsfqpb3fkgmensdwiqwuh27z6hgvnbdgh3nmnhbvhaol4m7mqeq
cloudshell:~ (us-phoenix-1)$ BACKUP2ID=ocid1.volumebackup.oc1.phx.abyhqljrdofdxynhskjy4gdz4xf3nn2vlfsidk4ont6cjzkuoimfizz343na
cloudshell:~ (us-phoenix-1)$ ADNAME=TGjA:PHX-AD-1
cloudshell:~ (us-phoenix-1)$ DISPLAYNAME=DeltaVolume
cloudshell:~ (us-phoenix-1)$ oci bv volume create-volume-source-from-volume-backup-delta --compartment-id $COMPID --source-details-first-backup-id $BACKUP1ID --source-details-second-backup-id $BACKUP2ID --availability-domain $ADNAME --display-name $DISPLAYNAME
{
"data": {
"auto-tuned-vpus-per-gb": null,
"autotune-policies": [],
"availability-domain": "TGjA:PHX-AD-1",
"block-volume-replicas": null,
"cluster-placement-group-id": null,
"compartment-id": "(ソース・ボリュームのコンパートメントのOCID)",
"defined-tags": {
"Oracle-Tags": {
"CreatedBy": "oracleidentitycloudservice/yurimai",
"CreatedOn": "2025-11-12T02:38:54.518Z"
}
},
"display-name": "DeltaVolume",
"freeform-tags": {},
"id": "ocid1.volume.oc1.phx.abyhqljrnvpu6cknvi3rf6u2gh7a2h7e33ne5ofad36etvfrnjxhodrxdlbq",
"is-auto-tune-enabled": false,
"is-hydrated": false,
"is-reservations-enabled": false,
"kms-key-id": null,
"lifecycle-state": "PROVISIONING",
"size-in-gbs": 50,
"size-in-mbs": 51200,
"source-details": {
"change-block-size-in-bytes": 4096,
"first-backup-id": "ocid1.volumebackup.oc1.phx.abyhqljrtwsfqpb3fkgmensdwiqwuh27z6hgvnbdgh3nmnhbvhaol4m7mqeq",
"second-backup-id": "ocid1.volumebackup.oc1.phx.abyhqljrdofdxynhskjy4gdz4xf3nn2vlfsidk4ont6cjzkuoimfizz343na",
"type": "volumeBackupDelta"
},
"system-tags": {},
"time-created": "2025-11-25T13:54:09.781000+00:00",
"volume-group-id": null,
"vpus-per-gb": 10
},
"etag": "fdf4d42fde6cfc2f51e2a7c6fe2c2e8a"
}
実行後、ソース・ボリュームと同じコンパートメント・可用性ドメインに、ソース・ボリュームと同サイズで、指定した DeltaVolume という名前で差分ボリュームが作成されたことがわかる。


2-3. 差分ボリュームのアタッチ
iSCSIアタッチメントを使用してLinuxベースのインスタンスにアタッチする。準仮想化アタッチメントおよびWindowsベースのインスタンスへのアタッチメントはサポートされていないため注意。
OCIコンソールから、ソース・ボリュームの際と同様にインスタンスにブロック・ボリュームをアタッチし、デバイスを確認する。
以下では、sda はブート・ボリューム、sdb がアタッチしたブロック・ボリューム。
ブロック・ボリュームがアタッチされているため、プラグインがiSCSIコマンドを実行してくれたことがわかる。
[opc@deltavolumevm ~]$ lsblk -o +UUID
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT UUID
sda 8:0 0 46.6G 0 disk
├─sda1 8:1 0 100M 0 part /boot/efi 349C-BCCC
├─sda2 8:2 0 1G 0 part /boot 5097b6ba-ed0e-418a-9c2c-fb25d577991f
└─sda3 8:3 0 45.5G 0 part VVm7za-zVxq-rlc2-c8S5-gZBI-Vmig-5ENtYy
├─ocivolume-root 252:0 0 35.5G 0 lvm / b6a02660-0016-4f87-bfc5-273315d7c2e4
└─ocivolume-oled 252:1 0 10G 0 lvm /var/oled 91dcb4d9-240a-42b6-b0ed-a199437d63bb
sdb 8:16 0 50G 0 disk
[opc@deltavolumevm ~]$ ll /dev/oracleoci/oraclevd*
lrwxrwxrwx. 1 root root 6 Nov 25 06:17 /dev/oracleoci/oraclevda -> ../sda
lrwxrwxrwx. 1 root root 7 Nov 25 06:17 /dev/oracleoci/oraclevda1 -> ../sda1
lrwxrwxrwx. 1 root root 7 Nov 25 06:17 /dev/oracleoci/oraclevda2 -> ../sda2
lrwxrwxrwx. 1 root root 7 Nov 25 06:17 /dev/oracleoci/oraclevda3 -> ../sda3
lrwxrwxrwx. 1 root root 6 Nov 25 14:11 /dev/oracleoci/oraclevdb -> ../sdb
3. SCSIコマンドを使用した変更ブロックのスキャン
SCSI GET LBA STATUS コマンドを使用すると、アタッチされたボリュームのブロックをスキャンして変更されたブロックを取得できる。
SCSI GET LBA STATUS コマンドリファレンス:ORACLEマニュアル SCSI GET LBA STATUS
3-1. SCSI GET LBA STATUS コマンドとは
ボリュームのブロックをスキャンして変更されたブロックを取得できるコマンド。
デフォルトでは、応答を1行あたり1つのLBAステータス記述子にデコードし、ヘッダーとステータス記述子を標準出力に出力する。
出力順は、記述子LBA(16進数)、ブロック数(10進数)、プロビジョニングステータスと追加ステータス(10進数)である。
プロビジョニング状態は0(mapped または unknown)、1(unmapped)、2(anchored)、3(mapped)、4(unknown)。
sg_get_lba_status [--16] [--32] [--lba=LBA] [--maxlen=LEN] [--report-type=RT] [--scan-len=SL] DEVICE
| オプション | 説明 |
|---|---|
| -T、--32 | 32バイト版のSCSI GET LBA STATUS(32)コマンドを送信 |
| -l , --lba = LBA | プロビジョニング・ステータスを取得する後続のブロック数 |
| -m , --maxlen =LEN | LENは最大レスポンス長(bytes)。指定なしの場合は24。8 + 16n で指定(例:24、40、56…)。 |
| -t、 --report-type = RT | 0:すべてのLBAをレポート 1:ゼロ以外のプロビジョニング・ステータスのLBAをレポート 2:割当てされているLBAをレポート 3:割当て解除されたLBAをレポート 4:アンカーされているLBAをレポート 16:回復不能エラーを返す可能性のあるLBAをレポート |
| -s , --scan-len = SL | スキャン長。指定RTに該当する論理ブロックをスキャンする連続論理ブロックの最大数。32バイトコマンドでのみ有効。デフォルト値は0。 |
LBA(Logical Block Addressiong)
LBAとは
外部記憶装置(SSD、HDDなど)の記憶単位をセクターと呼ぶが、そのセクターに通し番号を振ってデータの位置を識別する方法。
ブロック(セクター)・サイズは通常 512 B か 4 KB。
つまり、sg_get_lba_status で最初に出力される記述子LBA(descriptor LBA)とは、そのセクターの番号のことであり、デコードされた応答の先頭のブロック位置を表す。
LBAステータスの使用に関する制限事項と考慮事項
- Linux用の32バイトコマンドのみサポート
- Linuxの16バイトコマンドはサポートされていない
- Windowsではコマンドはサポートされていない
- iSCSIでアタッチされたボリュームのみサポート
- 推奨されるスキャン長は、最大 1 GB 相当の論理ブロックであり、1 GB を超えるスキャン長はサポートしていない
- 出力は未定義
- スキャン長が0として指定または省略されている場合、動作は未定義
- デフォルトの割当て長は 24 Byte で、記述子は1つのみ
- レポート・タイプが0(すべて)の場合、未初期化ブロックのプロビジョニング・ステータスも結果に含まれる(未初期化ブロックと明示的に割当て解除されたブロックの区別がないため)
3-2. SCSI GET LBAステータスで変更されたブロックのボリュームのスキャン
今回は、sg_get_lba_status -T -m 32768 -s 2097152 -t 1 /dev/sdb で実行してみる。
-m と -s の引数はこちらを参照:OCIドキュメント 変更されたブロック・トラッキングの使用
mapped ステータスが3行出力された。
[opc@deltavolumevm ~]$ sudo sg_get_lba_status -T -m 32768 -s 2097152 -t 1 /dev/sdb
Command completed due to meeting scan length (--scan-len=SL)
RTP=1
descriptor LBA: 0x0000000000000800 blocks: 8 mapped
descriptor LBA: 0x0000000000000868 blocks: 56 mapped
descriptor LBA: 0x00000000000008c0 blocks: 8 mapped
3-3. 結果の見方
例えば descriptor LBA: 0x0000000000000800 blocks: 8 mapped なら、0x0000000000000800 (16進数、バイト表記)から8ブロック連続でマップ済み、となる。
I. [Appendix] text.txt の中身の hello が書き込まれたブロックを探してみる
I-i. 差分ボリュームの中身から文字列 hello の位置を探す
以下のコマンドを使用して探す。
-
xxdコマンド:ファイル名を渡すと、中身を16進数でダンプする -
grepコマンド:指定されたパターンを検索し、一致する各行を標準出力に書き出す
出力の最初の8桁の数字は、xxd コマンドによってこの行の先頭バイトの位置を16進数のバイト表示されたもの。
つまり、hello という文字列のデータは 00118000 バイト目にある ことがわかった。
[opc@deltavolumevm ~]$ sudo xxd /dev/sdb | grep "hello"
00118000: 6865 6c6c 6f0a 0000 0000 0000 0000 0000 hello...........
I-ii. ブロック位置の割り出し
先ほどの結果の 00118000 バイト目が、何ブロック目に当たるか計算してみる。
この論理ブロックサイズは、以下のコマンドの Sector size (logical/physical): 512B/4096B から、512 バイト であるとわかる。
[opc@deltavolumevm ~]$ sudo parted /dev/sdb print
Error: /dev/sdb: unrecognised disk label
Model: ORACLE BlockVolume (scsi)
Disk /dev/sdb: 53.7GB
Sector size (logical/physical): 512B/4096B
Partition Table: unknown
Disk Flags:
よって、00118000 を16進数から10進数に直し、512で割り算する。
ちなみに、ipythonを使用すると便利。Cloud Shellのローカルで、ipython と打つと起動できる。
In [1]: 0x00118000/512
Out[1]: 2240.0
すると、00118000 バイト目 は 2240 ブロック目 であるとわかる。
I-iii. sg_get_lba_status コマンドの出力結果と見比べる
sg_get_lba_status コマンドの記述子LBAを16進数から10進数に直して、そのブロックの最初の位置を見てみる。
出力は以下だったので、
descriptor LBA: 0x0000000000000800 blocks: 8 mapped
descriptor LBA: 0x0000000000000868 blocks: 56 mapped
descriptor LBA: 0x00000000000008c0 blocks: 8 mapped
ipythonで各行の記述子LBAを10進数に変換すると次のようになる。
In [2]: 0x000000000000080
Out[2]: 128
In [3]: 0x0000000000000868
Out[3]: 2152
In [4]: 0x00000000000008c0
Out[4]: 2240
この結果をI-ii と I-iii セクションのipythonの結果を比べてみると、hello の文字列は、sg_get_lba_status コマンドで3つ目の mapped ステータスで出力されていた ことがわかる。







