0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

バックアップ間の変更されたブロックを取得してみる

Last updated at Posted at 2025-12-04

はじめに

  • この記事では、Phoenixリージョンで実施しているため、可用性ドメインが3つ存在しており、可用性ドメイン名もphoenixとなっている
  • 今回はわかりやすく、アタッチしたブロック・ボリュームにXFSファイルシステムを作成し、そこにテキストファイルを作成して、作成前後でボリュームのバックアップに差が生じるようにする

SCSI3-PRについて

概要

  • APIで2つのバックアップ間で変更されたブロックをスキャンできる
  • ユースケース:バックアップ/リストア・ソリューションのデータ保護サービス・ベンダーや開発者が、2つのバックアップから2つのフル・ボリュームをリストアして比較および処理する必要がなくなり、バックアップ・プロセスをより最適化できる

cbt_architecture.png

制限・考慮事項

  • インスタンスへのアタッチに際し、準仮想化アタッチメントおよび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.基本情報のシェイプ選択欄の下にある「拡張オプション」を開く
vm_creating1_bvmanagement.png

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

1-2. ブロック・ボリュームの作成

項目 名称
名前 SourceVolume
サイズ 50 GB
VPU 10

1-3. OCIコンソールから、インスタンスにブロック・ボリュームをアタッチ

1. インスタンスにブロック・ボリュームをアタッチ

  • iSCSIアタッチメント
    ※ ソース・ボリュームは 準仮想化 アタッチメントで問題ないが、後に作成する差分ボリュームは必ず iSCSI アタッチメントを使用する必要があり、今回はそちらに揃えて iSCSI アタッチメントを使用
  • 読取り/書込み
  • 「Oracle Cloudエージェントを使用して、iSCSIでアタッチされたボリュームに自動的に接続します」を有効化
  • デバイス・パスを指定
    • いずれかのパスを指定(例では .../oraclevdb を使用)

画像はブロック・ボリューム詳細画面からアタッチする場合。
bv_attach1.png
bv_attach2.png

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/fstabUUID="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]$

bv_backup_screen.png
bv_backup1.png

2. /mnt/bv1 に "hello" の文字列を書いたテキストファイル test.txt を作成し、「増分」バックアップを作成する。

[opc@sourcevolumevm bv1]$ sudo vi test.txt
[opc@sourcevolumevm bv1]$ cat test.txt 
hello

bv_backup2.png

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

bv_ad.png

3. バックアップのOCIDをコピー

ブロック・ボリュームの「バックアップ」タブから、作成した2つのバックアップのOCIDを取得する。
各バックアップの右端の三点リーダーから、「OCIDのコピー」をクリックし、コピーしたOCIDをテキストエディタなどにメモしておく。

bv_backup_ocid.png

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 という名前で差分ボリュームが作成されたことがわかる。
bv_list_delta.png
bv_delta_details.png

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-iiI-iii セクションのipythonの結果を比べてみると、hello の文字列は、sg_get_lba_status コマンドで3つ目の mapped ステータスで出力されていた ことがわかる。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?