[Amazon FSx for NetApp ONTAP] SnapLockによるWORMを試してみた

SnapMirrorの転送先ボリュームでSnapLockをかける運用から始めよう
2024.04.17

書き込みして一定時間経過したファイルは編集できないようにしたい

こんにちは、のんピ(@non____97)です。

皆さんは書き込みして一定時間経過したファイルは編集できないようにしたいなと思ったことはありますか? 私はあります。

ファイルをロックすることで、データの改ざんや誤削除を防ぐことが可能です。また、コンプライアンス要件として一定期間データの保持が義務付けられている場合にも役立つでしょう。

Amazon FSx for NetApp ONTAPではSnapLockというWORM(Write Once Read Many)の機能があります。

SnapLockを活用することで、上述の要件を満たすことが可能です。

以降SnapLockの説明をします。

いきなりまとめ

  • SnapLockとはONTAPが提供するWORM機能
  • 保持期間が経過するまで基本的に削除はできない
    • 例外としてEnterpriseモードで特権削除を使用できる場合は削除できる
  • SnapMirrorの転送先でのみSnapLockを有効化して運用するのが現実的か
    • この時、SnapMirror policyはvaultである必要がある

SnapLockとは

概要

SnapLockとは、ONTAPが提供するWORM機能です。

WORMとは、一度書き込んだデータを読み出せるが変更をさせない方式です。SnapLock以外のWORM機能は、AWSだとS3のオブジェクトロックやAWS Backupのボールトロックなどがあります。

SnapLockにおいては、ボリュームに書き込んだファイルを改ざんや削除から保護します。

サポートプロトコルはNFSとSMBです。iSCSI LUNは原則サポートしていないので注意しましょう。

SnapLock では、CIFSやNFSなどの標準オープンファイルプロトコルを使用して、ファイルレベルでこのようなデータ保持を実行できます。SnapLock でサポートされるオープンファイルプロトコルは、NFS(バージョン2、3、4)とCIFS(SMB 1.0、2.0、および3.0)です。 . . (中略) . . SnapLockでは、SnapLock以外のボリュームで作成されたSnapshotコピーをSnapLockバックアップ関係の一部として保護するためにSnapLockに転送する場合にのみ、LUNがサポートされます。読み取り/書き込みSnapLockボリュームではLUNはサポートされません。ただし、Snapshotコピーの改ざんは、SnapMirrorのソースボリュームと、LUNを含むデスティネーションボリュームの両方でサポートされます。

SnapLock とは

また、SnapLockはボリューム単位で設定します。一度SnapLockを有効にしたボリュームはSnapLockの概要は以下ドキュメントにもまとまっています。

WORM状態の遷移

SnapLockを有効にしたボリューム上のファイルはその瞬間から永久に削除できないという訳ではありません。WORM状態前のファイルは編集、削除は可能ですし、WORM状態になってから指定された保持期間を経過したファイルを削除することが可能です。

WORM状態にするためには以下の3つの方法があります。

  1. NFSやSMBのファイル属性操作
  2. SnapLockの自動コミット機能により、指定した期間書き込みがない場合
  3. ボリュームアペンドモード(VAM)を有効にした場合

順番に説明します。

「1. NFSやSMBのファイル属性操作」とは、ファイルを読み取り専用にする操作です。

具体的には以下のように書き込み権限を奪えば、対象ファイルはWORM状態になります。

bashの場合

$ chmod -w document.txt

cmdの場合

$ attrib +r document.txt

WORMにコミットされたファイルはatimeが保持時刻に設定されます。

$ ls -l /mnt/fsxn/vol_snaplock2/random_pattern_binary_block_1GiB*
-rw-r--r--. 1 root root 1073741824 Apr 16 09:51 /mnt/fsxn/vol_snaplock2/random_pattern_binary_block_1GiB
-rw-r--r--. 1 root root 1073741824 Apr 16 09:51 /mnt/fsxn/vol_snaplock2/random_pattern_binary_block_1GiB_2

# WORMコミット前の atime の確認
$ stat /mnt/fsxn/vol_snaplock2/random_pattern_binary_block_1GiB*
  File: /mnt/fsxn/vol_snaplock2/random_pattern_binary_block_1GiB
  Size: 1073741824      Blocks: 2105424    IO Block: 65536  regular file
Device: 33h/51d Inode: 98          Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Context: system_u:object_r:nfs_t:s0
Access: 2024-04-16 09:51:34.944474000 +0000
Modify: 2024-04-16 09:51:41.284633000 +0000
Change: 2024-04-16 09:51:41.284633000 +0000
 Birth: -
  File: /mnt/fsxn/vol_snaplock2/random_pattern_binary_block_1GiB_2
  Size: 1073741824      Blocks: 2105424    IO Block: 65536  regular file
Device: 33h/51d Inode: 99          Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Context: system_u:object_r:nfs_t:s0
Access: 2024-04-16 09:51:52.052487000 +0000
Modify: 2024-04-16 09:51:58.352767000 +0000
Change: 2024-04-16 09:51:58.352767000 +0000
 Birth: -

# WORMコミット
$ sudo chmod -w /mnt/fsxn/vol_snaplock2/random_pattern_binary_block_1GiB*

# WORMコミット後の atime の確認
$ stat /mnt/fsxn/vol_snaplock2/random_pattern_binary_block_1GiB*
  File: /mnt/fsxn/vol_snaplock2/random_pattern_binary_block_1GiB
  Size: 1073741824      Blocks: 2105424    IO Block: 65536  regular file
Device: 33h/51d Inode: 98          Links: 1
Access: (0444/-r--r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Context: system_u:object_r:nfs_t:s0
Access: 2024-04-16 09:55:34.000000000 +0000
Modify: 2024-04-16 09:51:41.284633000 +0000
Change: 2024-04-16 09:53:34.000000000 +0000
 Birth: -
  File: /mnt/fsxn/vol_snaplock2/random_pattern_binary_block_1GiB_2
  Size: 1073741824      Blocks: 2105424    IO Block: 65536  regular file
Device: 33h/51d Inode: 99          Links: 1
Access: (0444/-r--r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Context: system_u:object_r:nfs_t:s0
Access: 2024-04-16 09:55:34.000000000 +0000
Modify: 2024-04-16 09:51:58.352767000 +0000
Change: 2024-04-16 09:53:34.000000000 +0000
 Birth: -

# 現在の時刻 + デフォルト保持期間2分が atime として設定される
$ date
Tue Apr 16 09:53:44 UTC 2024

毎度毎度、手動でファイルを読み取り専用にするのは面倒ですよね。そんな時には「2. SnapLockの自動コミット機能により、指定した期間書き込みがない場合」です。

自動コミット期間中にファイルの変更がなかった場合、SnapLockボリューム上でファイルがWORM状態にコミットされます。自動コミットの期間は、5 分から 10 年の間で指定できます。

最後に「3. ボリュームアペンドモード(VAM)を有効にした場合」です。

WORMで保護されたファイルにある既存のデータは変更できません。ただし、VAMを有効にしたボリュームについては、作成されたファイルは追記可能だが、既存データの編集はできない状態にすることが可能です。手動コミットをすることで以降の書き込みを防ぐことも可能です。

保持期間の計算

各ファイルの保持期間の計算は、ベースとなるComplianceClockと、ファイルごとに設定された保持期間またはSnapLockのデフォルト保持期間によって行われます。

ComplianceClockとはSnapLock専用の時刻です。

ComplianceClockは管理者が1回だけ初期化でき、その後はONTAP内部で時刻計算をします。初期化後は管理者は時刻を進める操作はできなくなります。これにより、WORMファイルの保持期間の短縮を防ぐことが可能です。

また、WORMの保持期間が経過してもファイルに追記することはできません。削除するか、再度保持期間を指定してWORMコミットするかの2択です。

期限の切れた保持期間

WORM ファイルの保持期間が終了すると、ファイルを削除するか、新しい保持期間を設定して WORM 保護を再度有効にすることができます。WORM ファイルは、保持期間の終了後は、自動的に削除されることはありません。保持期間が終了しても、引き続き、WORM ファイルの内容を変更することはできません。

SnapLock の保持期間の設定 - FSx for ONTAP

保持期間の関係性はStorage-JAWS#1の以下資料が非常に分かりやすいです。

SnapLock WORM機能図解

抜粋 : Storage-JAWS #1

2種類のリテンションモード

SnapLockにはComplianceモードとEnterpriseモードという2種類のリテンションモードがあります。各リテンションモードの説明と相違点は以下のとおりです。

SnapLock 機能 SnapLock Compliance SnapLock Enterprise
説明 Compliance ボリューム上の WORM に移行したファイルは、保持期間が終了するまで削除することはできません。 Enterprise ボリューム上の WORM に移行したファイルは、権限を持つユーザーが特権削除を使用すると、保持期間の終了前に削除することができます。
ユースケース 政府または業界に固有の指令 (SEC 規則 17a-4 (f)、FINRA 規則 4511、CFTC 規制 1.31 など) に対応するため。

ランサムウェア攻撃から防御するため。

組織内のデータ整合性と内部コンプライアンスを強化するため。

SnapLock Compliance を使用する前に保持設定をテストするため。

自動コミット はい はい
イベントベースの保持 (EBR)* はい はい
リーガルホールド* はい いいえ
特権削除 いいえ はい
ボリューム付加モード はい はい
SnapLock 監査ログボリューム はい はい

抜粋 : SnapLock の働き - FSx for ONTAP

大まかに以下のような使い分けをすると良いと思います。

  • Complianceモード
    • 要件に対して厳格に対応する必要がある
    • いずれの管理者も信用しない
    • ファイルの改ざん、削除を確実に防ぎたい
  • Enterpriseモード
    • 組織内のポリシーを準拠する必要がある
    • 管理者は信用できる
    • FSxNの移行時など、必要に応じてボリュームを削除できる口が欲しい

上述の表に出てきた以下について以降説明します。

  • 特権削除
  • リーガルホールド
  • イベントベースの保持 (EBR)
  • SnapLock監査ログボリューム

特権削除

特権削除は保持期間が経過する前にWORMファイルを削除する機能です。

特権削除を有効化するには、SnapLockボリュームと同じSVMでSnapLock監査ログボリュームを最初に作成する必要があります。

特権削除をした際はSnapLock 監査ログボリュームに記録されます。特権削除で消せはできるけれども、その証跡はしっかり残るということですね。

特権削除の機能を完全に完全に無効化することも可能です。完全に無効にした場合、以降対象ボリュームで特権付き削除を有効にすることはできません。

リーガルホールド

リーガルホールドは保持期間経過後もWORMファイルとして扱うようにする機能です。

保持期間が経過したファイルであっても、リーガルホールドを有効化することで、ファイルの削除を防ぐことができます。

イベントベースの保持 (EBR)

関連する保持期間を含むカスタムポリシーを作成する機能です。

これにより、指定したパス配下のファイルをまとめてWORMにコミットすることが可能です。

SnapLock 監査ログボリューム

SnapLock 監査ログボリュームは、特権削除やリーガルホールドなどの消去できないイベントのレコードの保存先となるボリュームです。

監査ログボリュームは、/snaplock_audit_logというジャンクションパスにマウントする必要があります。

SnapLock 監査ログボリュームの最小保持期間は6か月です。これはボリュームがEnterpriseモードで作成されたとしても、この保持期間が経過するまで、SnapLock監査ログボリューム、SVM、およびそれに関連するファイルシステムを削除できなくなります。

気軽に作成してしまうと、6ヶ月削除できないFSxNファイルシステムの出来上がりです。注意しましょう。

SnapLock でサポートされる機能とサポートされない機能

SnapLock でサポートされる機能とサポートされない機能は以下のとおりです。

Feature Supported with SnapLock Compliance Supported with SnapLock Enterprise
Consistency Groups No No
Encrypted volumes Yes, beginning with ONTAP 9.2. Learn more about Encryption and SnapLock. Yes, beginning with ONTAP 9.2. Learn more about Encryption and SnapLock.
FabricPools on SnapLock aggregates No Yes, beginning with ONTAP 9.8. Learn more about FabricPool on SnapLock Enterprise aggregates.
Flash Pool aggregates Yes, beginning with ONTAP 9.1. Yes, beginning with ONTAP 9.1.
FlexClone You can clone SnapLock volumes, but you cannot clone files on a SnapLock volume. You can clone SnapLock volumes, but you cannot clone files on a SnapLock volume.
FlexGroup volumes Yes, beginning with ONTAP 9.11.1. Learn more about FlexGroup volumes. Yes, beginning with ONTAP 9.11.1. Learn more about FlexGroup volumes.
LUNs No. Learn more about LUN support with SnapLock. No. Learn more about LUN support with SnapLock.
MetroCluster configurations Yes, beginning with ONTAP 9.3. Learn more about MetroCluster support. Yes, beginning with ONTAP 9.3. Learn more about MetroCluster support.
Multi-admin verification (MAV) Yes, beginning with ONTAP 9.13.1. Learn more about MAV support. Yes, beginning with ONTAP 9.13.1. Learn more about MAV support.
SAN No No
Single-file SnapRestore No Yes
SnapMirror Business Continuity No No
SnapRestore No Yes
SMTape No No
SnapMirror Synchronous No No
SSDs Yes, beginning with ONTAP 9.1. Yes, beginning with ONTAP 9.1.
Storage efficiency features Yes, beginning with ONTAP 9.9.1. Learn more about storage efficiency support. Yes, beginning with ONTAP 9.9.1. Learn more about storage efficiency support.

抜粋 : What SnapLock is - Supported and unsupported features with SnapLock

FSxNの場合特に注意すべき点は、ComplianceモードだとFabric Poolをサポートしていない点です。

料金

SnapLock ライセンスとして、SnapLockボリュームの物理ストレージサイズに応じて課金が発生します。

東京リージョンのSingle-AZの場合は、0.0244USD/GBです。

ただし、上限が決まっています。具体的にはリージョンおよびアカウント単位で集計したSnapLockボリュームの最初の 60 TB 分に対してのみ課金が発生します。100TBスケールの環境の場合はコストメリットが出てきそうです。

やってみた

SnapLockの管理ユーザーの作成

実際にやってみましょう。

対象のFSxNファイルシステムのONTAPバージョンは9.13.1P7D3です。

::> set diag

Warning: These diagnostic commands are for use by NetApp personnel only.
Do you want to continue? {y|n}: y

::*> version
NetApp Release 9.13.1P7D3: Wed Feb 14 13:11:46 UTC 2024

SnapLockボリューム作成前にComplianceClockを確認します。

::*> snaplock compliance-clock show
Node        ComplianceClock Time                Node ID    ID
----------- ----------------------------------- ---------- -------------
FsxId0203a077973a5b898-01
            Mon Apr 15 05:24:47 UTC 2024 +00:00 3323134672 1713157822543
FsxId0203a077973a5b898-02
            Mon Apr 15 05:24:47 UTC 2024 +00:00 3323134545 1713157821689
2 entries were displayed.

::*> snaplock compliance-clock show -instance

                            Node: FsxId0203a077973a5b898-01
            ComplianceClock Time: Mon Apr 15 05:26:07 UTC 2024 +00:00
                         Node ID: 3323134672
                              ID: 1713157822543
     ComplianceClock Time (secs): 1713158767
     ComplianceClock Skew (secs): 2

                            Node: FsxId0203a077973a5b898-02
            ComplianceClock Time: Mon Apr 15 05:26:07 UTC 2024 +00:00
                         Node ID: 3323134545
                              ID: 1713157821689
     ComplianceClock Time (secs): 1713158767
     ComplianceClock Skew (secs): 2

2 entries were displayed.

既にComplianceClockは初期化されていそうですね。

試しにリーガルホールドの設定を確認してみます。

::*> snaplock legal-hold show

Error: show failed: Only a user with the security login role "vsadmin-snaplock" is allowed to perform this operation.

はい、vsadmin-snaplockのロールが割り当たっていないと確認できないようです。

現在ONTAP CLIを操作しているユーザーにはファイルシステムの管理ロールfsxadminが割り当たっています。これでも表示できないとのことです。

指示通り、vsadmin-snaplockのロールが割り当たているユーザーを作成します。vsadmin-snaplockは以下AWS公式ドキュメントの通り、特権削除を含む SnapLock オペレーションの実行が可能です。

今回はsnaplock-userというユーザーを作成します。

::*> security login show

Vserver: FsxId0203a077973a5b898
                                                                 Second
User/Group                 Authentication                 Acct   Authentication
Name           Application Method        Role Name        Locked Method
-------------- ----------- ------------- ---------------- ------ --------------
autosupport    console     password      autosupport      no     none
fsxadmin       http        password      fsxadmin         no     none
fsxadmin       ontapi      password      fsxadmin         no     none
fsxadmin       ssh         password      fsxadmin         no     none
fsxadmin       ssh         publickey     fsxadmin         -      none

Vserver: svm
                                                                 Second
User/Group                 Authentication                 Acct   Authentication
Name           Application Method        Role Name        Locked Method
-------------- ----------- ------------- ---------------- ------ --------------
vsadmin        http        password      vsadmin          yes    none
vsadmin        ontapi      password      vsadmin          yes    none
vsadmin        ssh         password      vsadmin          yes    none
8 entries were displayed.

::*> security login create -vserver svm -user-or-group-name snaplock-user -application ssh -authentication-method password -role vsadmin-snaplock

Please enter a password for user 'snaplock-user':
Please enter it again:

::*> security login show
Vserver: FsxId0203a077973a5b898
                                                                 Second
User/Group                 Authentication                 Acct   Authentication
Name           Application Method        Role Name        Locked Method
-------------- ----------- ------------- ---------------- ------ --------------
autosupport    console     password      autosupport      no     none
fsxadmin       http        password      fsxadmin         no     none
fsxadmin       ontapi      password      fsxadmin         no     none
fsxadmin       ssh         password      fsxadmin         no     none
fsxadmin       ssh         publickey     fsxadmin         -      none

Vserver: svm
                                                                 Second
User/Group                 Authentication                 Acct   Authentication
Name           Application Method        Role Name        Locked Method
-------------- ----------- ------------- ---------------- ------ --------------
snaplock-user  ssh         password      vsadmin-snaplock no     none
vsadmin        http        password      vsadmin          yes    none
vsadmin        ontapi      password      vsadmin          yes    none
vsadmin        ssh         password      vsadmin          yes    none
9 entries were displayed.

作成したユーザーでSVMにSSHします。

$ ssh snaplock-user@svm-090459f1740b295e5.fs-0203a077973a5b898.fsx.us-east-1.amazonaws.com
The authenticity of host 'svm-090459f1740b295e5.fs-0203a077973a5b898.fsx.us-east-1.amazonaws.com (10.0.8.35)' can't be established.
ED25519 key fingerprint is SHA256:tHz7BDMlAkonbVXcWjOTxF2/Ia1P6nvqaNxa3V11DdI.
This key is not known by any other names
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added 'svm-090459f1740b295e5.fs-0203a077973a5b898.fsx.us-east-1.amazonaws.com' (ED25519) to the list of known hosts.
(snaplock-user@svm-090459f1740b295e5.fs-0203a077973a5b898.fsx.us-east-1.amazonaws.com) Password:

This is your first recorded login.
svm::> set diag

Warning: These diagnostic commands are for use by NetApp personnel only.
Do you want to continue? {y|n}: y

svm::*>

接続できましたね。

先ほど失敗したコマンドを叩いてみます。

svm::*> snaplock legal-hold show
This table is currently empty.

正常に実行できました。

SnapLockボリュームの作成

次に、SnapLockボリュームを作成します。

今回はマネジメントコンソールから作成します。

::*> volume create -snaplock-type ?
  non-snaplock                Non SnapLock
  compliance                  SnapLock Compliance
  enterprise                  SnapLock Enterprise

SnapLock周りの設定をまとめると、以下のとおりです。

  • リテンションモード : Enterprise
  • 監査ログボリューム : 作成しない
  • 最小保持期間 : 1分
  • 最大保持期間 : 3分
  • デフォルト保持期間 : 2分
  • 自動コミット : 無効
  • 特権削除 : 無効
  • ボリュームアペンドモード : 無効

ボリュームの作成1

ボリュームの作成2

作成後、ONTAP CLIでボリュームの状態を確認します。

::*> volume efficiency show -volume vol_snaplock -fields state, policy, storage-efficiency-mode, inline-compression, inline-dedupe, compression, data-compaction, auto-adaptive-compression-savings, auto-adaptive-compression-existing-volume, using-auto-adaptive-compression
vserver volume       state    policy compression inline-compression storage-efficiency-mode inline-dedupe data-compaction auto-adaptive-compression-savings using-auto-adaptive-compression auto-adaptive-compression-existing-volume
------- ------------ -------- ------ ----------- ------------------ ----------------------- ------------- --------------- --------------------------------- ------------------------------- -----------------------------------------
svm     vol_snaplock Disabled auto   false       false              efficient               false         false           true                              false                           false


::*> volume show -volume vol_snaplock -fields available, filesystem-size, total, used, percent-used, performance-tier-inactive-user-data, performance-tier-inactive-user-data-percent, size, dedupe-space-saved, dedupe-space-saved-percent, dedupe-space-shared,logical-used, logical-used-percent,logical-used-by-afs, logical-available, physical-used, physical-used-percent, tiering-policy, snapshot-polic, snaplock-type, snapshot-locking-enabled
vserver volume       size  available filesystem-size total   used  percent-used snapshot-policy dedupe-space-saved dedupe-space-saved-percent dedupe-space-shared physical-used physical-used-percent snaplock-type logical-used logical-used-percent logical-available logical-used-by-afs tiering-policy performance-tier-inactive-user-data performance-tier-inactive-user-data-percent snapshot-locking-enabled
------- ------------ ----- --------- --------------- ------- ----- ------------ --------------- ------------------ -------------------------- ------------------- ------------- --------------------- ------------- ------------ -------------------- ----------------- ------------------- -------------- ----------------------------------- ------------------------------------------- ------------------------
svm     vol_snaplock 128GB 121.6GB   128GB           121.6GB 336KB 0%           none            0B                 0%                         0B                  336KB         0%                    enterprise    336KB        0%                   -                 336KB               none           0B                                  0%                                          false

確かにSnapLockがリテンションモードEnterpriseで設定されています。

ComplianceClockは変わりありませんでした。初期化されることなく、粛々と時刻を刻んでいます。

::*> snaplock compliance-clock show
Node        ComplianceClock Time                Node ID    ID
----------- ----------------------------------- ---------- -------------
FsxId0203a077973a5b898-01
            Mon Apr 15 05:47:01 UTC 2024 +00:00 3323134672 1713157822543
FsxId0203a077973a5b898-02
            Mon Apr 15 05:47:01 UTC 2024 +00:00 3323134545 1713157821689
2 entries were displayed.

また、aggregateがSnapLock aggregateになっていました。

::*> aggr show -fields snaplock-type
aggregate snaplock-type
--------- -------------
aggr1     enterprise

ONTAP 9.13.1はSnapLockボリュームと非SnapLockボリュームを同じaggregate上に作成できるので、特に気しなくても良いと思います。

ONTAP 9.10.1 よりも前のリリースでは、別の SnapLock アグリゲートを作成する必要があります。ONTAP 9.10.1 以降では、 SnapLock ボリュームと非 SnapLock ボリュームを同じアグリゲート上に配置できるため、 ONTAP 9.10.1 を使用している場合に別の SnapLock アグリゲートを作成する必要がなくなりました。

SnapLock アグリゲートを作成する

手動コミット

ファイルを作成して、手動コミットをしてみましょう。

SnapLockボリュームをマウントして、適当なファイルを作成します。

$ sudo mkdir -p /mnt/fsxn/vol_snaplock
$ sudo mount -t nfs svm-090459f1740b295e5.fs-0203a077973a5b898.fsx.us-east-1.amazonaws.com:/vol_snaplock /mnt/fsxn/vol_snaplock
$ df -hT -t nfs4
Filesystem                                                                           Type  Size  Used Avail Use% Mounted on
svm-090459f1740b295e5.fs-0203a077973a5b898.fsx.us-east-1.amazonaws.com:/vol_snaplock nfs4  122G  320K  122G   1% /mnt/fsxn/vol_snaplock

$ echo test | sudo tee -a /mnt/fsxn/vol_snaplock/test.txt > /dev/null
$ cat /mnt/fsxn/vol_snaplock/test.txt
test

コミット前なので追記や削除も可能です。

$ echo test2 | sudo tee -a /mnt/fsxn/vol_snaplock/test.txt > /dev/null
$ cat /mnt/fsxn/vol_snaplock/test.txt
test
test2

$ sudo rm /mnt/fsxn/vol_snaplock/test.txt
$ ls -l /mnt/fsxn/vol_snaplock/test.txt
ls: cannot access '/mnt/fsxn/vol_snaplock/test.txt': No such file or directory

再度ファイルを作成して、手動コミットします。

$ echo test | sudo tee -a /mnt/fsxn/vol_snaplock/test.txt > /dev/null
$ ls -l /mnt/fsxn/vol_snaplock/test.txt
-rw-r--r--. 1 root root 5 Apr 15 06:31 /mnt/fsxn/vol_snaplock/test.txt

$ sudo chmod -w /mnt/fsxn/vol_snaplock/test.txt
$ ls -l /mnt/fsxn/vol_snaplock/test.txt
-r--r--r--. 1 root root 5 Apr 15 06:31 /mnt/fsxn/vol_snaplock/test.txt
$ sudo chmod +w /mnt/fsxn/vol_snaplock/test.txt
chmod: changing permissions of '/mnt/fsxn/vol_snaplock/test.txt': Read-only file system

再度書き込み権限を付与しようとすると、拒否されました。

しばらくすると、保持期間を超過したのか書き込み権限を付与できました。

$ sudo chmod +w /mnt/fsxn/vol_snaplock/test.txt
$ ls -l /mnt/fsxn/vol_snaplock/test.txt
-rw-r--r--. 1 root root 5 Apr 15 06:31 /mnt/fsxn/vol_snaplock/test.txt

再度手動コミットしてみます。

$ sudo chmod -w /mnt/fsxn/vol_snaplock/test.txt
$ ls -l /mnt/fsxn/vol_snaplock/test.txt
-r--r--r--. 1 root root 5 Apr 15 06:31 /mnt/fsxn/vol_snaplock/test.txt

$ sudo chmod +w /mnt/fsxn/vol_snaplock/test.txt
$ ls -l /mnt/fsxn/vol_snaplock/test.txt
-rw-r--r--. 1 root root 5 Apr 15 06:31 /mnt/fsxn/vol_snaplock/test.txt

時間を空けずに書き込み権限を付与できました。保持期間を指定せずに再手動コミットはできないようです。

保持期間を超過したファイルを変更しようとしてみます。

$ echo test2 | sudo tee -a /mnt/fsxn/vol_snaplock/test.txt > /dev/null
tee: /mnt/fsxn/vol_snaplock/test.txt: Read-only file system

$ ls -l /mnt/fsxn/vol_snaplock/test.txt
-rw-r--r--. 1 root root 5 Apr 15 06:31 /mnt/fsxn/vol_snaplock/test.txt

はい、先述のとおり編集はできません。

削除は問題なくできることを確認します。

$ sudo rm /mnt/fsxn/vol_snaplock/test.txt
$ ls -l /mnt/fsxn/vol_snaplock/test.txt
ls: cannot access '/mnt/fsxn/vol_snaplock/test.txt': No such file or directory

保持期間の終了タイミングの確認

保持期間の終了タイミングの確認をします。

$ echo test | sudo tee -a /mnt/fsxn/vol_snaplock/test.txt > /dev/null
$ ls -l /mnt/fsxn/vol_snaplock/test.txt
-rw-r--r--. 1 root root 5 Apr 15 07:36 /mnt/fsxn/vol_snaplock/test.txt

$ sudo chmod -w /mnt/fsxn/vol_snaplock/test.txt
$ while true; do
    date
    
    sudo chmod +w /mnt/fsxn/vol_snaplock/test.txt
    result=$?

    ls -l /mnt/fsxn/vol_snaplock/test.txt

    if [ $result -eq 0 ]; then
        break
    fi

    sleep 5
done

Mon Apr 15 07:36:54 UTC 2024
chmod: changing permissions of '/mnt/fsxn/vol_snaplock/test.txt': Read-only file system
-r--r--r--. 1 root root 5 Apr 15 07:36 /mnt/fsxn/vol_snaplock/test.txt
Mon Apr 15 07:36:59 UTC 2024
chmod: changing permissions of '/mnt/fsxn/vol_snaplock/test.txt': Read-only file system
-r--r--r--. 1 root root 5 Apr 15 07:36 /mnt/fsxn/vol_snaplock/test.txt
.
.
(中略)
.
.
chmod: changing permissions of '/mnt/fsxn/vol_snaplock/test.txt': Read-only file system
-r--r--r--. 1 root root 5 Apr 15 07:36 /mnt/fsxn/vol_snaplock/test.txt
Mon Apr 15 07:38:52 UTC 2024
chmod: changing permissions of '/mnt/fsxn/vol_snaplock/test.txt': Read-only file system
-r--r--r--. 1 root root 5 Apr 15 07:36 /mnt/fsxn/vol_snaplock/test.txt
Mon Apr 15 07:38:57 UTC 2024
$ ls -l /mnt/fsxn/vol_snaplock/test.txt
-rw-r--r--. 1 root root 5 Apr 15 07:36 /mnt/fsxn/vol_snaplock/test.txt

ちょうど2分ですね。SnapLockで指定したデフォルト保持期間の間変更できなかったことが分かります。

自動コミット

次に自動コミットの動作確認です。

ONTAP CLIから自動コミットを有効化します。自動コミット期間はミニマムの5分です。

svm::*> volume snaplock show -volume vol_snaplock -instance

                          Volume: vol_snaplock
                   SnapLock Type: enterprise
        Minimum Retention Period: 1 minutes
        Default Retention Period: 2 minutes
        Maximum Retention Period: 3 minutes
               Autocommit Period: none
   Is Volume Append Mode Enabled: false
               Privileged Delete: -
                     Expiry Time: Mon Apr 15 07:38:53 GMT 2024
            ComplianceClock Time: Mon Apr 15 08:01:17 UTC 2024 +00:00
              ComplianceClock ID: 1713157822543
          ComplianceClock NodeID: 3323134672
     ComplianceClock Skew (secs): 0
                Litigation Count: 0
    Is SnapLock Audit Log Volume: false
Unspecified Retention File Count: 0

svm::*> volume snaplock modify -volume vol_snaplock -autocommit-period "5 minutes"

svm::*> volume snaplock show -volume vol_snaplock -instance

                          Volume: vol_snaplock
                   SnapLock Type: enterprise
        Minimum Retention Period: 1 minutes
        Default Retention Period: 2 minutes
        Maximum Retention Period: 3 minutes
               Autocommit Period: 5 minutes
   Is Volume Append Mode Enabled: false
               Privileged Delete: -
                     Expiry Time: Mon Apr 15 07:38:53 GMT 2024
            ComplianceClock Time: Mon Apr 15 08:08:33 UTC 2024 +00:00
              ComplianceClock ID: 1713157822543
          ComplianceClock NodeID: 3323134672
     ComplianceClock Skew (secs): 0
                Litigation Count: 0
    Is SnapLock Audit Log Volume: false
Unspecified Retention

自動コミットを有効化後、自動コミット期間内に定期的に書き込んでいる間はWORMにコミットされないことを確認します。

$ echo $(date) | sudo tee -a /mnt/fsxn/vol_snaplock/date.txt > /dev/null
$ while true; do
    date

    echo $(date) | sudo tee -a /mnt/fsxn/vol_snaplock/date.txt > /dev/null
    result=$?

    ls -l /mnt/fsxn/vol_snaplock/date.txt

    if [ $result -ne 0 ]; then
        break
    fi

    sleep 30
done
Mon Apr 15 08:21:00 UTC 2024
-rw-r--r--. 1 root root 58 Apr 15 08:21 /mnt/fsxn/vol_snaplock/date.txt
Mon Apr 15 08:21:31 UTC 2024
-rw-r--r--. 1 root root 87 Apr 15 08:21 /mnt/fsxn/vol_snaplock/date.txt
Mon Apr 15 08:22:01 UTC 2024
-rw-r--r--. 1 root root 116 Apr 15 08:22 /mnt/fsxn/vol_snaplock/date.txt
Mon Apr 15 08:22:31 UTC 2024
-rw-r--r--. 1 root root 145 Apr 15 08:22 /mnt/fsxn/vol_snaplock/date.txt
Mon Apr 15 08:23:02 UTC 2024
-rw-r--r--. 1 root root 174 Apr 15 08:23 /mnt/fsxn/vol_snaplock/date.txt
Mon Apr 15 08:23:32 UTC 2024
-rw-r--r--. 1 root root 203 Apr 15 08:23 /mnt/fsxn/vol_snaplock/date.txt
Mon Apr 15 08:24:03 UTC 2024
-rw-r--r--. 1 root root 232 Apr 15 08:24 /mnt/fsxn/vol_snaplock/date.txt
Mon Apr 15 08:24:33 UTC 2024
-rw-r--r--. 1 root root 261 Apr 15 08:24 /mnt/fsxn/vol_snaplock/date.txt
Mon Apr 15 08:25:03 UTC 2024
-rw-r--r--. 1 root root 290 Apr 15 08:25 /mnt/fsxn/vol_snaplock/date.txt
Mon Apr 15 08:25:34 UTC 2024
-rw-r--r--. 1 root root 319 Apr 15 08:25 /mnt/fsxn/vol_snaplock/date.txt
Mon Apr 15 08:26:04 UTC 2024
-rw-r--r--. 1 root root 348 Apr 15 08:26 /mnt/fsxn/vol_snaplock/date.txt
Mon Apr 15 08:26:34 UTC 2024
-rw-r--r--. 1 root root 377 Apr 15 08:26 /mnt/fsxn/vol_snaplock/date.txt
Mon Apr 15 08:27:05 UTC 2024
-rw-r--r--. 1 root root 406 Apr 15 08:27 /mnt/fsxn/vol_snaplock/date.txt
Mon Apr 15 08:27:35 UTC 2024
-rw-r--r--. 1 root root 435 Apr 15 08:27 /mnt/fsxn/vol_snaplock/date.txt
Mon Apr 15 08:28:05 UTC 2024
-rw-r--r--. 1 root root 464 Apr 15 08:28 /mnt/fsxn/vol_snaplock/date.txt
Mon Apr 15 08:28:36 UTC 2024
-rw-r--r--. 1 root root 493 Apr 15 08:28 /mnt/fsxn/vol_snaplock/date.txt
Mon Apr 15 08:29:06 UTC 2024
-rw-r--r--. 1 root root 522 Apr 15 08:29 /mnt/fsxn/vol_snaplock/date.txt
Mon Apr 15 08:29:36 UTC 2024
-rw-r--r--. 1 root root 551 Apr 15 08:29 /mnt/fsxn/vol_snaplock/date.txt
^C

最後に編集してから、5分経過後に書き込もうとするとエラーになりました。自動コミットされたタイミングで書き込み権限を奪うようです。

$ date
Mon Apr 15 08:34:49 UTC 2024

$ echo $(date) | sudo tee -a /mnt/fsxn/vol_snaplock/date.txt > /dev/null
tee: /mnt/fsxn/vol_snaplock/date.txt: Read-only file system

$ ls -l /mnt/fsxn/vol_snaplock/date.txt
-r--r--r--. 1 root root 551 Apr 15 08:29 /mnt/fsxn/vol_snaplock/date.txt

ボリュームアペンドモード(VAM)の確認

ボリュームアペンドモード(VAM)の確認をします。

マウント状態ではVAMを有効化することができないことを確認します。

svm::*> volume snaplock modify -volume vol_snaplock -is-volume-append-mode-enabled true

Error: command failed: Failed to modify volume append mode because the volume is in the mounted state. Unmount the volume using the "volume unmount -vserver svm -volume vol_snaplock" command, and then try the command again.

アンマウントしても、ボリューム内にファイルやSnapshotが存在している場合はVAMを有効化できないことを確認します。

::*> volume unmount -volume vol_snaplock
Queued private job: 28

svm::*> volume snaplock modify -volume vol_snaplock -is-volume-append-mode-enabled true

Error: command failed: Failed to modify volume append mode because the volume is not empty. It must not have any data or Snapshot copies.

ボリューム内のファイルを削除した上で、VAMを有効化します。

svm::*> volume mount -volume vol_snaplock -junction-path /vol_snaplock
Queued private job: 29

(ここから bash)
$ sudo rm -rf /mnt/fsxn/vol_snaplock/*
$ ls -l /mnt/fsxn/vol_snaplock/
total 0

(ここからONTAP CLI)
::*> volume unmount -volume vol_snaplock
Queued private job: 30

svm::*> volume snaplock modify -volume vol_snaplock -is-volume-append-mode-enabled true

svm::*> volume snaplock show -volume vol_snaplock -instance

                          Volume: vol_snaplock
                   SnapLock Type: enterprise
        Minimum Retention Period: 1 minutes
        Default Retention Period: 2 minutes
        Maximum Retention Period: 3 minutes
               Autocommit Period: 5 minutes
   Is Volume Append Mode Enabled: true
               Privileged Delete: -
                     Expiry Time: Mon Apr 15 08:36:36 GMT 2024
            ComplianceClock Time: Mon Apr 15 08:40:39 UTC 2024 +00:00
              ComplianceClock ID: 1713157822543
          ComplianceClock NodeID: 3323134672
     ComplianceClock Skew (secs): 0
                Litigation Count: 0
    Is SnapLock Audit Log Volume: false
Unspecified Retention File Count: 0

svm::*> volume mount -volume vol_snaplock -junction-path /vol_snaplock
Queued private job: 31

VAMの動作確認のため、空ファイルを作成します。

$ sudo touch /mnt/fsxn/vol_snaplock/date.txt
touch: setting times of '/mnt/fsxn/vol_snaplock/date.txt': Read-only file system

$ ls -l /mnt/fsxn/vol_snaplock/date.txt
-rw-r--r--. 1 root root 0 Apr 15 08:56 /mnt/fsxn/vol_snaplock/date.txt

モードビット上では書き込み権限が付与されていますが、内部的には読み込み専用と判定されたようです。

追記ができることを確認します。

$ echo $(date) | sudo tee -a /mnt/fsxn/vol_snaplock/date.txt > /dev/null
$ echo $(date) | sudo tee -a /mnt/fsxn/vol_snaplock/date.txt > /dev/null
$ cat /mnt/fsxn/vol_snaplock/date.txt
Mon Apr 15 08:57:22 UTC 2024
Mon Apr 15 08:57:47 UTC 2024

問題なくできますね。

書き込んだ内容を削除をしようとしてみます。

$ sudo sed -i '1d' /mnt/fsxn/vol_snaplock/date.txt
sed: cannot remove /mnt/fsxn/vol_snaplock/sedSNMW7M: Read-only file system

# 先頭行を削除して保存
$ sudo vi /mnt/fsxn/vol_snaplock/date.txt

$ ls -l /mnt/fsxn/vol_snaplock/date.txt
-rw-r--r--. 1 root root 58 Apr 15 08:57 /mnt/fsxn/vol_snaplock/date.txt

$ cat /mnt/fsxn/vol_snaplock/date.txt
Mon Apr 15 08:57:22 UTC 2024
Mon Apr 15 08:57:47 UTC 2024

書き込んだ内容の編集は拒否されました。自動コミット期間前に書き込んだ内容も削除できないので注意したいです。VAMを有効化するのはログファイル専用ボリュームなど適した用途のみ有効にしたいところです。

手動でコミットした後の変更はどうでしょうか。

$ sudo touch /mnt/fsxn/vol_snaplock/date2.txt
touch: setting times of '/mnt/fsxn/vol_snaplock/date2.txt': Read-only file system
$ ls -l /mnt/fsxn/vol_snaplock/date2.txt
-rw-r--r--. 1 root root 0 Apr 15 09:03 /mnt/fsxn/vol_snaplock/date2.txt

$ sudo chmod -w /mnt/fsxn/vol_snaplock/date2.txt
$ ls -l /mnt/fsxn/vol_snaplock/date2.txt
-r--r--r--. 1 root root 0 Apr 15 09:03 /mnt/fsxn/vol_snaplock/date2.txt

$ sudo chmod +w /mnt/fsxn/vol_snaplock/date2.txt

$ echo $(date) | sudo tee -a /mnt/fsxn/vol_snaplock/date2.txt > /dev/null

$ sudo chmod -w /mnt/fsxn/vol_snaplock/date2.txt
$ sudo chmod +w /mnt/fsxn/vol_snaplock/date2.txt
chmod: changing permissions of '/mnt/fsxn/vol_snaplock/date2.txt': Read-only file system

ファイルサイズが0バイトの状態で読み取り専用にした場合は保持期間内に書き込み権限の付与ができました。一方、ファイルサイズが0バイト超の場合は、手動コミットが効きました。

コミット後の重複排除

SnapLockと重複排除の相性はどうでしょうか。

コミット後のファイルに対して重複排除を効かせてもデータサイズは減少するのでしょうか。

以下のようにSnapLockはStorage Efficiencyをサポートしていそうです。

ストレージ効率

ONTAP 9.9.1以降SnapLock では、SnapLock およびアグリゲートに対して、データコンパクション、ボリューム間重複排除、適応圧縮などのStorage Efficiency機能がサポートされます。Storage Efficiencyの詳細については、を参照してください "CLI による論理ストレージ管理の概要"。

SnapLock とは

実際に試してみましょう。

Storage Efficiencyを有効にします。

svm::*> volume efficiency on -volume vol_snaplock
Efficiency for volume "vol_snaplock" of Vserver "svm" is enabled.

svm::*> volume efficiency show -volume vol_snaplock -fields state, policy, storage-efficiency-mode, inline-compression, inline-dedupe, compression, data-compaction, auto-adaptive-compression-savings, auto-adaptive-compression-existing-volume, using-auto-adaptive-compression
vserver volume       state   policy compression inline-compression storage-efficiency-mode inline-dedupe data-compaction auto-adaptive-compression-savings using-auto-adaptive-compression auto-adaptive-compression-existing-volume
------- ------------ ------- ------ ----------- ------------------ ----------------------- ------------- --------------- --------------------------------- ------------------------------- -----------------------------------------
svm     vol_snaplock Enabled auto   false       false              efficient               false         false           true                              false                           false

手動でコミットします。

$ sudo dd if=/dev/urandom of=/mnt/fsxn/vol_snaplock/random_pattern_binary_block_1GiB bs=1M count=1024
dd: closing output file '/mnt/fsxn/vol_snaplock/random_pattern_binary_block_1GiB': Read-only file system

$ sudo cp /mnt/fsxn/vol_snaplock/random_pattern_binary_block_1GiB /mnt/fsxn/vol_snaplock/random_pattern_binary_block_1GiB_2
cp: failed to close '/mnt/fsxn/vol_snaplock/random_pattern_binary_block_1GiB_2': Read-only file system

$ ls -l /mnt/fsxn/vol_snaplock/random_pattern_binary_block_1GiB*
-rw-r--r--. 1 root root 1073741824 Apr 15 09:46 /mnt/fsxn/vol_snaplock/random_pattern_binary_block_1GiB
-rw-r--r--. 1 root root 1073741824 Apr 15 09:46 /mnt/fsxn/vol_snaplock/random_pattern_binary_block_1GiB_2

$ sudo chmod -w /mnt/fsxn/vol_snaplock/random_pattern_binary_block_1GiB*
$ ls -l /mnt/fsxn/vol_snaplock/random_pattern_binary_block_1GiB*
-r--r--r--. 1 root root 1073741824 Apr 15 09:46 /mnt/fsxn/vol_snaplock/random_pattern_binary_block_1GiB
-r--r--r--. 1 root root 1073741824 Apr 15 09:46 /mnt/fsxn/vol_snaplock/random_pattern_binary_block_1GiB_2

重複排除を実行します。

::*> volume efficiency start -volume vol_snaplock -scan-old-data

Warning: This operation scans all of the data in volume "vol_snaplock" of Vserver "svm". It might take a significant time, and degrade performance during that time.
Do you want to continue? {y|n}: y
The efficiency operation for volume "vol_snaplock" of Vserver "svm" has started.

svm::*> volume show -volume vol_snaplock -fields available, filesystem-size, total, used, percent-used, performance-tier-inactive-user-data, performance-tier-inactive-user-data-percent, size, dedupe-space-saved, dedupe-space-saved-percent, dedupe-space-shared,logical-used, logical-used-percent,logical-used-by-afs, logical-available, physical-used, physical-used-percent, tiering-policy, snapshot-policy
vserver volume       size  available filesystem-size total   used    percent-used snapshot-policy dedupe-space-saved dedupe-space-saved-percent dedupe-space-shared physical-used physical-used-percent logical-used logical-used-percent logical-available logical-used-by-afs tiering-policy performance-tier-inactive-user-data performance-tier-inactive-user-data-percent
------- ------------ ----- --------- --------------- ------- ------- ------------ --------------- ------------------ -------------------------- ------------------- ------------- --------------------- ------------ -------------------- ----------------- ------------------- -------------- ----------------------------------- -------------------------------------------
svm     vol_snaplock 128GB 120.7GB   128GB           121.6GB 951.5MB 0%           none            807.8MB            46%                        807.8MB             951.5MB       1%                    1.72GB       1%                   -                 1.72GB              none           0B                                  0%

::*> aggr show-efficiency -instance

                             Name of the Aggregate: aggr1
                      Node where Aggregate Resides: FsxId0203a077973a5b898-01
Logical Size Used by Volumes, Clones, Snapshot Copies in the Aggregate: 1.71GB
                               Total Physical Used: 946.0MB
                    Total Storage Efficiency Ratio: 1.85:1
Total Data Reduction Logical Used Without Snapshots: 1.71GB
Total Data Reduction Physical Used Without Snapshots: 945.4MB
Total Data Reduction Efficiency Ratio Without Snapshots: 1.85:1
Total Data Reduction Logical Used without snapshots and flexclones: 1.71GB
Total Data Reduction Physical Used without snapshots and flexclones: 945.4MB
Total Data Reduction Efficiency Ratio without snapshots and flexclones: 1.85:1
Total Logical Size Used by Volumes, Clones, Snapshot Copies in the FabricPool Performance Tier: 1.72GB
Total Physical Used in FabricPool Performance Tier: 1013MB
Total FabricPool Performance Tier Storage Efficiency Ratio: 1.74:1
Total Data Reduction Logical Used without snapshots and flexclones in the FabricPool Performance Tier: 1.72GB
Total Data Reduction Physical Used without snapshots and flexclones in the FabricPool Performance Tier: 1013MB
Total FabricPool Performance Tier Data Reduction Efficiency Ratio without snapshots and flexclones: 1.74:1
                Logical Space Used for All Volumes: 1.71GB
               Physical Space Used for All Volumes: 945.2MB
               Space Saved by Volume Deduplication: 807.8MB
Space Saved by Volume Deduplication and pattern detection: 807.8MB
                Volume Deduplication Savings ratio: 1.85:1
                 Space Saved by Volume Compression: 0B
                  Volume Compression Savings ratio: 1.00:1
      Space Saved by Inline Zero Pattern Detection: 0B
                    Volume Data Reduction SE Ratio: 1.85:1
               Logical Space Used by the Aggregate: 946.0MB
              Physical Space Used by the Aggregate: 946.0MB
           Space Saved by Aggregate Data Reduction: 0B
                 Aggregate Data Reduction SE Ratio: 1.00:1
              Logical Size Used by Snapshot Copies: 1.76MB
             Physical Size Used by Snapshot Copies: 596KB
              Snapshot Volume Data Reduction Ratio: 3.02:1
            Logical Size Used by FlexClone Volumes: 0B
          Physical Sized Used by FlexClone Volumes: 0B
             FlexClone Volume Data Reduction Ratio: 1.00:1
Snapshot And FlexClone Volume Data Reduction SE Ratio: 3.02:1
                         Number of Volumes Offline: 0
                    Number of SIS Disabled Volumes: 1
         Number of SIS Change Log Disabled Volumes: 1

重複排除によってボリュームの物理使用量が減少していますね。また、aggregateの物理使用量も書き込んだデータサイズ1GB未満です。

SnapLockでWORMにコミットされた状態でも重複排除は効くようですね。

コミット後の圧縮

コミット後の圧縮はどうでしょうか。試してみます。

Inactive data compressionを有効化します。

svm::*> volume efficiency inactive-data-compression show -volume vol_snaplock -instance

                                                                Volume: vol_snaplock
                                                               Vserver: svm
                                                            Is Enabled: false
                                                             Scan Mode: -
                                                              Progress: IDLE
                                                                Status: SUCCESS
                                                 Compression Algorithm: lzopro
                                                        Failure Reason: -
                                                          Total Blocks: -
                                                Total blocks Processed: -
                                                            Percentage: -
                                                  Phase1 L1s Processed: -
                                                    Phase1 Lns Skipped: -
                                                   Phase2 Total Blocks: -
                                               Phase2 Blocks Processed: -
                                     Number of Cold Blocks Encountered: 0
                                             Number of Repacked Blocks: 0
                                     Number of Compression Done Blocks: 0
                                              Number of Vol-Overwrites: 0
           Time since Last Inactive Data Compression Scan started(sec): 0
             Time since Last Inactive Data Compression Scan ended(sec): 0
Time since Last Successful Inactive Data Compression Scan started(sec): -
  Time since Last Successful Inactive Data Compression Scan ended(sec): 0
                           Average time for Cold Data Compression(sec): 0
                                                        Tuning Enabled: true
                                                             Threshold: 14
                                                 Threshold Upper Limit: 21
                                                 Threshold Lower Limit: 14
                                            Client Read history window: 14
                                        Incompressible Data Percentage: 0%

svm::*> volume efficiency modify -volume vol_snaplock -compression true

svm::*> volume efficiency inactive-data-compression show -volume vol_snaplock -instance

                                                                Volume: vol_snaplock
                                                               Vserver: svm
                                                            Is Enabled: true
                                                             Scan Mode: -
                                                              Progress: IDLE
                                                                Status: SUCCESS
                                                 Compression Algorithm: lzopro
                                                        Failure Reason: -
                                                          Total Blocks: -
                                                Total blocks Processed: -
                                                            Percentage: -
                                                  Phase1 L1s Processed: -
                                                    Phase1 Lns Skipped: -
                                                   Phase2 Total Blocks: -
                                               Phase2 Blocks Processed: -
                                     Number of Cold Blocks Encountered: 0
                                             Number of Repacked Blocks: 0
                                     Number of Compression Done Blocks: 0
                                              Number of Vol-Overwrites: 0
           Time since Last Inactive Data Compression Scan started(sec): 0
             Time since Last Inactive Data Compression Scan ended(sec): 0
Time since Last Successful Inactive Data Compression Scan started(sec): -
  Time since Last Successful Inactive Data Compression Scan ended(sec): 0
                           Average time for Cold Data Compression(sec): 0
                                                        Tuning Enabled: true
                                                             Threshold: 14
                                                 Threshold Upper Limit: 21
                                                 Threshold Lower Limit: 14
                                            Client Read history window: 14
                                        Incompressible Data Percentage: 0%

圧縮が効きやすいファイルを作成して、手動でコミットします。

$ yes \
  $(base64 /dev/urandom -w 0 \
    | head -c 1K
  ) \
  | tr -d '\n' \
  | sudo dd of=/mnt/fsxn/vol_snaplock/1KB_random_pattern_text_block_16GiB bs=4M count=4096 iflag=fullblock
dd: closing output file '/mnt/fsxn/vol_snaplock/1KB_random_pattern_text_block_16GiB': Read-only file system
$ ls -lh /mnt/fsxn/vol_snaplock/1KB_random_pattern_text_block_16GiB
-rw-r--r--. 1 root root 16G Apr 15 09:58 /mnt/fsxn/vol_snaplock/1KB_random_pattern_text_block_16GiB

$ sudo chmod -w /mnt/fsxn/vol_snaplock/1KB_random_pattern_text_block_16GiB
$ ls -lh /mnt/fsxn/vol_snaplock/1KB_random_pattern_text_block_16GiB
-r--r--r--. 1 root root 16G Apr 15 09:58 /mnt/fsxn/vol_snaplock/1KB_random_pattern_text_block_16GiB

Inactive data compressionを実行します。

svm::*> volume efficiency inactive-data-compression start -volume vol_snaplock -inactive-days 0
Inactive data compression scan started on volume "vol_snaplock" in Vserver "svm"

svm::*> volume efficiency inactive-data-compression show -volume vol_snaplock -instance

                                                                Volume: vol_snaplock
                                                               Vserver: svm
                                                            Is Enabled: true
                                                             Scan Mode: default
                                                              Progress: RUNNING
                                                                Status: SUCCESS
                                                 Compression Algorithm: lzopro
                                                        Failure Reason: -
                                                          Total Blocks: -
                                                Total blocks Processed: -
                                                            Percentage: 0%
                                                  Phase1 L1s Processed: 4974
                                                    Phase1 Lns Skipped:
                                                                        L1:     0
                                                                        L2:     0
                                                                        L3:     0
                                                                        L4:     0
                                                                        L5:     0
                                                                        L6:     0
                                                                        L7:     0
                                                   Phase2 Total Blocks: 0
                                               Phase2 Blocks Processed: 0
                                     Number of Cold Blocks Encountered: 1001288
                                             Number of Repacked Blocks: 0
                                     Number of Compression Done Blocks: 726256
                                              Number of Vol-Overwrites: 0
           Time since Last Inactive Data Compression Scan started(sec): 0
             Time since Last Inactive Data Compression Scan ended(sec): 0
Time since Last Successful Inactive Data Compression Scan started(sec): -
  Time since Last Successful Inactive Data Compression Scan ended(sec): 0
                           Average time for Cold Data Compression(sec): 0
                                                        Tuning Enabled: true
                                                             Threshold: 14
                                                 Threshold Upper Limit: 21
                                                 Threshold Lower Limit: 14
                                            Client Read history window: 14
                                        Incompressible Data Percentage: 0%

svm::*> volume efficiency inactive-data-compression show -volume vol_snaplock -instance

                                                                Volume: vol_snaplock
                                                               Vserver: svm
                                                            Is Enabled: true
                                                             Scan Mode: default
                                                              Progress: RUNNING
                                                                Status: SUCCESS
                                                 Compression Algorithm: lzopro
                                                        Failure Reason: -
                                                          Total Blocks: -
                                                Total blocks Processed: -
                                                            Percentage: 43%
                                                  Phase1 L1s Processed: 17121
                                                    Phase1 Lns Skipped:
                                                                        L1:     0
                                                                        L2:     0
                                                                        L3:     0
                                                                        L4:     0
                                                                        L5:     0
                                                                        L6:     0
                                                                        L7:     0
                                                   Phase2 Total Blocks: 11004608
                                               Phase2 Blocks Processed: 4700241
                                     Number of Cold Blocks Encountered: 4108584
                                             Number of Repacked Blocks: 0
                                     Number of Compression Done Blocks: 3820576
                                              Number of Vol-Overwrites: 0
           Time since Last Inactive Data Compression Scan started(sec): 0
             Time since Last Inactive Data Compression Scan ended(sec): 0
Time since Last Successful Inactive Data Compression Scan started(sec): -
  Time since Last Successful Inactive Data Compression Scan ended(sec): 0
                           Average time for Cold Data Compression(sec): 0
                                                        Tuning Enabled: true
                                                             Threshold: 14
                                                 Threshold Upper Limit: 21
                                                 Threshold Lower Limit: 14
                                            Client Read history window: 14
                                        Incompressible Data Percentage: 0%


svm::*> volume efficiency inactive-data-compression show -volume vol_snaplock -instance

                                                                Volume: vol_snaplock
                                                               Vserver: svm
                                                            Is Enabled: true
                                                             Scan Mode: -
                                                              Progress: IDLE
                                                                Status: SUCCESS
                                                 Compression Algorithm: lzopro
                                                        Failure Reason: -
                                                          Total Blocks: -
                                                Total blocks Processed: -
                                                            Percentage: -
                                                  Phase1 L1s Processed: -
                                                    Phase1 Lns Skipped: -
                                                   Phase2 Total Blocks: -
                                               Phase2 Blocks Processed: -
                                     Number of Cold Blocks Encountered: 4108760
                                             Number of Repacked Blocks: 0
                                     Number of Compression Done Blocks: 3820752
                                              Number of Vol-Overwrites: 0
           Time since Last Inactive Data Compression Scan started(sec): 21
             Time since Last Inactive Data Compression Scan ended(sec): 0
Time since Last Successful Inactive Data Compression Scan started(sec): -
  Time since Last Successful Inactive Data Compression Scan ended(sec): 0
                           Average time for Cold Data Compression(sec): 21
                                                        Tuning Enabled: true
                                                             Threshold: 14
                                                 Threshold Upper Limit: 21
                                                 Threshold Lower Limit: 14
                                            Client Read history window: 14
                                        Incompressible Data Percentage: 5%

圧縮したデータブロックが3,820,752なので、3,820,752 * 4 / 1,024 / 1,024 = 14.57GiB分のデータを圧縮していそうですね。

Inactive data compression実行完了後のaggregateの物理使用量を確認します。

::*> aggr show-efficiency -instance

                             Name of the Aggregate: aggr1
                      Node where Aggregate Resides: FsxId0203a077973a5b898-01
Logical Size Used by Volumes, Clones, Snapshot Copies in the Aggregate: 16.32GB
                               Total Physical Used: 7.33GB
                    Total Storage Efficiency Ratio: 2.23:1
Total Data Reduction Logical Used Without Snapshots: 16.32GB
Total Data Reduction Physical Used Without Snapshots: 7.33GB
Total Data Reduction Efficiency Ratio Without Snapshots: 2.23:1
Total Data Reduction Logical Used without snapshots and flexclones: 16.32GB
Total Data Reduction Physical Used without snapshots and flexclones: 7.33GB
Total Data Reduction Efficiency Ratio without snapshots and flexclones: 2.23:1
Total Logical Size Used by Volumes, Clones, Snapshot Copies in the FabricPool Performance Tier: 16.60GB
Total Physical Used in FabricPool Performance Tier: 7.72GB
Total FabricPool Performance Tier Storage Efficiency Ratio: 2.15:1
Total Data Reduction Logical Used without snapshots and flexclones in the FabricPool Performance Tier: 16.60GB
Total Data Reduction Physical Used without snapshots and flexclones in the FabricPool Performance Tier: 7.72GB
Total FabricPool Performance Tier Data Reduction Efficiency Ratio without snapshots and flexclones: 2.15:1
                Logical Space Used for All Volumes: 16.32GB
               Physical Space Used for All Volumes: 15.46GB
               Space Saved by Volume Deduplication: 875.1MB
Space Saved by Volume Deduplication and pattern detection: 875.1MB
                Volume Deduplication Savings ratio: 1.06:1
                 Space Saved by Volume Compression: 0B
                  Volume Compression Savings ratio: 1.00:1
      Space Saved by Inline Zero Pattern Detection: 0B
                    Volume Data Reduction SE Ratio: 1.06:1
               Logical Space Used by the Aggregate: 21.28GB
              Physical Space Used by the Aggregate: 7.33GB
           Space Saved by Aggregate Data Reduction: 13.95GB
                 Aggregate Data Reduction SE Ratio: 2.90:1
              Logical Size Used by Snapshot Copies: 2.37MB
             Physical Size Used by Snapshot Copies: 736KB
              Snapshot Volume Data Reduction Ratio: 3.29:1
            Logical Size Used by FlexClone Volumes: 0B
          Physical Sized Used by FlexClone Volumes: 0B
             FlexClone Volume Data Reduction Ratio: 1.00:1
Snapshot And FlexClone Volume Data Reduction SE Ratio: 3.29:1
                         Number of Volumes Offline: 0
                    Number of SIS Disabled Volumes: 1
         Number of SIS Change Log Disabled Volumes: 1

7.33GBと書き込んだ量よりも少ないですね。

一晩寝かせると、5.16GBとさらに少なくなっていました。SnapLockでWORMにコミットされた状態でも圧縮は効くようですね。

::*> aggr show-efficiency -instance

                             Name of the Aggregate: aggr1
                      Node where Aggregate Resides: FsxId0203a077973a5b898-01
Logical Size Used by Volumes, Clones, Snapshot Copies in the Aggregate: 16.32GB
                               Total Physical Used: 5.16GB
                    Total Storage Efficiency Ratio: 3.16:1
Total Data Reduction Logical Used Without Snapshots: 16.32GB
Total Data Reduction Physical Used Without Snapshots: 5.16GB
Total Data Reduction Efficiency Ratio Without Snapshots: 3.16:1
Total Data Reduction Logical Used without snapshots and flexclones: 16.32GB
Total Data Reduction Physical Used without snapshots and flexclones: 5.16GB
Total Data Reduction Efficiency Ratio without snapshots and flexclones: 3.16:1
Total Logical Size Used by Volumes, Clones, Snapshot Copies in the FabricPool Performance Tier: 16.60GB
Total Physical Used in FabricPool Performance Tier: 5.56GB
Total FabricPool Performance Tier Storage Efficiency Ratio: 2.99:1
Total Data Reduction Logical Used without snapshots and flexclones in the FabricPool Performance Tier: 16.60GB
Total Data Reduction Physical Used without snapshots and flexclones in the FabricPool Performance Tier: 5.56GB
Total FabricPool Performance Tier Data Reduction Efficiency Ratio without snapshots and flexclones: 2.99:1
                Logical Space Used for All Volumes: 16.32GB
               Physical Space Used for All Volumes: 15.47GB
               Space Saved by Volume Deduplication: 875.1MB
Space Saved by Volume Deduplication and pattern detection: 875.1MB
                Volume Deduplication Savings ratio: 1.06:1
                 Space Saved by Volume Compression: 0B
                  Volume Compression Savings ratio: 1.00:1
      Space Saved by Inline Zero Pattern Detection: 0B
                    Volume Data Reduction SE Ratio: 1.06:1
               Logical Space Used by the Aggregate: 19.11GB
              Physical Space Used by the Aggregate: 5.16GB
           Space Saved by Aggregate Data Reduction: 13.95GB
                 Aggregate Data Reduction SE Ratio: 3.70:1
              Logical Size Used by Snapshot Copies: 2.37MB
             Physical Size Used by Snapshot Copies: 736KB
              Snapshot Volume Data Reduction Ratio: 3.29:1
            Logical Size Used by FlexClone Volumes: 0B
          Physical Sized Used by FlexClone Volumes: 0B
             FlexClone Volume Data Reduction Ratio: 1.00:1
Snapshot And FlexClone Volume Data Reduction SE Ratio: 3.29:1
                         Number of Volumes Offline: 0
                    Number of SIS Disabled Volumes: 1
         Number of SIS Change Log Disabled Volumes: 1

コミット後のSnapMirror

コミット後のデータをSnapMirrorできるか確認します。

VAMが有効だったり、自動コミットが有効だと検証しづらいので新規にボリュームを用意します。

::*> volume create -vserver svm -volume vol_snaplock2 -aggregate aggr1 -state online -type RW -security-style unix -size 64GB -tiering-policy none -snapshot-policy none -junction-path /vol_snaplock2 -language utf8mb4 -snaplock-type enterprise
[Job 65] Job succeeded: Successful

::*> volume show -volume vol_snaplock2 -fields available, filesystem-size, total, used, percent-used, performance-tier-inactive-user-data, performance-tier-inactive-user-data-percent, size, dedupe-space-saved, dedupe-space-saved-percent, dedupe-space-shared,logical-used, logical-used-percent,logical-used-by-afs, logical-available, physical-used, physical-used-percent, tiering-policy, snapshot-policy
vserver volume        size available filesystem-size total   used  percent-used snapshot-policy dedupe-space-saved dedupe-space-saved-percent dedupe-space-shared physical-used physical-used-percent logical-used logical-used-percent logical-available logical-used-by-afs tiering-policy performance-tier-inactive-user-data performance-tier-inactive-user-data-percent
------- ------------- ---- --------- --------------- ------- ----- ------------ --------------- ------------------ -------------------------- ------------------- ------------- --------------------- ------------ -------------------- ----------------- ------------------- -------------- ----------------------------------- -------------------------------------------
svm     vol_snaplock2 64GB 60.80GB   64GB            60.80GB 304KB 0%           none            0B                 0%                         0B                  304KB         0%      304KB        0%                   -                 304KB               none           -                                   -


svm::*> volume snaplock show -volume vol_snaplock2 -instance
                          Volume: vol_snaplock2
                   SnapLock Type: enterprise
        Minimum Retention Period: 0 years
        Default Retention Period: min
        Maximum Retention Period: 30 years
               Autocommit Period: none
   Is Volume Append Mode Enabled: false
               Privileged Delete: -
                     Expiry Time: none
            ComplianceClock Time: Tue Apr 16 04:39:56 UTC 2024 +00:00
              ComplianceClock ID: 1713157822543
          ComplianceClock NodeID: 3323134672
     ComplianceClock Skew (secs): 0
                Litigation Count: 0
    Is SnapLock Audit Log Volume: false
Unspecified Retention File Count: 0

svm::*> volume snaplock modify -volume vol_snaplock2 -minimum-retention-period "1 minutes" -default-retention-period "2 minutes" -maximum-retention-period "3 minutes"

svm::*> volume snaplock show -volume vol_snaplock2 -instance

                          Volume: vol_snaplock2
                   SnapLock Type: enterprise
        Minimum Retention Period: 1 minutes
        Default Retention Period: 2 minutes
        Maximum Retention Period: 3 minutes
               Autocommit Period: none
   Is Volume Append Mode Enabled: false
               Privileged Delete: -
                     Expiry Time: none
            ComplianceClock Time: Tue Apr 16 04:43:13 UTC 2024 +00:00
              ComplianceClock ID: 1713157822543
          ComplianceClock NodeID: 3323134672
     ComplianceClock Skew (secs): 0
                Litigation Count: 0
    Is SnapLock Audit Log Volume: false
Unspecified Retention File Count: 0

用意したボリュームに書き込みます。

$ sudo mkdir -p /mnt/fsxn/vol_snaplock2
$ sudo mount -t nfs svm-090459f1740b295e5.fs-0203a077973a5b898.fsx.us-east-1.amazonaws.com:/vol_snaplock2 /mnt/fsxn/vol_snaplock2

$ echo $(date) | sudo tee -a /mnt/fsxn/vol_snaplock2/date.txt > /dev/null
$ cat /mnt/fsxn/vol_snaplock2/date.txt
Tue Apr 16 04:53:49 UTC 2024

SnapMirrorの転送先ボリュームを作成して、SnapMirror relastionshipを作成します。

::*> volume create -vserver svm -volume vol_snaplock2_dst -aggregate aggr1 -state online -type DP -size 4GB -tiering-policy none -autosize-mode grow

Warning: The volume is being created on a SnapLock aggregate, but the "snaplock-type" has not been specified. The volume will be created as a non-SnapLock volume.
Do you want to continue? {y|n}: y
[Job 70] Job succeeded: Successful

::*> volume show -volume vol_snaplock2_dst -fields snaplock-type
vserver volume            snaplock-type
------- ----------------- -------------
svm     vol_snaplock2_dst non-snaplock

SnapMirror relastionshipに初期化をします。

::*> snapmirror initialize -destination-path svm:vol_snaplock2_dst
Operation is queued: snapmirror initialize of destination "svm:vol_snaplock2_dst".

::*>
::*> snapmirror show
                                                                       Progress
Source            Destination Mirror  Relationship   Total             Last
Path        Type  Path        State   Status         Progress  Healthy Updated
----------- ---- ------------ ------- -------------- --------- ------- --------
svm:vol_snaplock2
            XDP  svm:vol_snaplock2_dst
                              Uninitialized
                                      Idle           -         false   -

::*> snapmirror show-history

Destination Source                Start       End
Path        Path        Operation Time        Time        Result
----------- ----------- --------- ----------- ----------- -------
svm:vol_snaplock2_dst
            svm:vol_snaplock2
                        initialize
                                  4/16/2024 05:11:32
                                              4/16/2024 05:11:32
                                                          failure
svm:vol_snaplock2_dst
            svm:vol_snaplock2
                        create    4/16/2024 05:10:50
                                              4/16/2024 05:10:50
                                                          success
2 entries were displayed.

::*> snapmirror show-history -instance

           Destination Path: svm:vol_snaplock2_dst
                Source Path: svm:vol_snaplock2
            Relationship ID: b1043ac1-fbaf-11ee-9f88-c748fac02eac
    Relationship Group Type: none
                  Operation: initialize
               Operation ID: c9fb2831-fbaf-11ee-9f88-c748fac02eac
                 Start Time: 4/16/2024 05:11:32
                   End Time: 4/16/2024 05:11:32
                     Result: failure
              Transfer Size: -
     Additional Information: XDP relationship not supported between volumes with different SnapLock types: the SnapLock type of source volume is "enterprise" and the SnapLock type of destination volume is "non-snaplock".

           Destination Path: svm:vol_snaplock2_dst
                Source Path: svm:vol_snaplock2
            Relationship ID: b1043ac1-fbaf-11ee-9f88-c748fac02eac
    Relationship Group Type: none
                  Operation: create
               Operation ID: b1043a54-fbaf-11ee-9f88-c748fac02eac
                 Start Time: 4/16/2024 05:10:50
                   End Time: 4/16/2024 05:10:50
                     Result: success
              Transfer Size: -
     Additional Information: -

2 entries were displayed.

どうやら転送元がSnapLockボリュームの場合、転送先ボリュームは転送元と同じリテンションモードである必要があるようです。

ドキュメントをよくよく見ると、しっかり書いてありました。

SnapMirror を使用すると、ディザスタリカバリなどの目的で、地理的に離れた別の場所に WORM ファイルをレプリケートできます。ソースボリュームとデスティネーションボリュームの両方が SnapLock 用に設定されていて、両方のボリュームの SnapLock モードが Compliance または Enterprise である必要があります。ボリュームとファイルの主要な SnapLock プロパティがすべてレプリケートされます。

ディザスタリカバリ用にWORMファイルをミラーリング

転送元ボリュームと同じくEnterpriseモードのSnapLockの設定をした転送先ボリュームを用意して、SnapMirrorします。作成後にSnapLockのリテンションモードを変更することはできないようなので注意しましょう。

::*> volume create -vserver svm -volume vol_snaplock2_dst2 -aggregate aggr1 -state online -type DP -size 4GB -tiering-policy none -autosize-mode grow -snaplock-type enterprise
[Job 72] Job succeeded: Successful

::*> volume show -volume vol_snaplock2_dst2 -fields snaplock-type
vserver volume             snaplock-type
------- ------------------ -------------
svm     vol_snaplock2_dst2 enterprise

::*> snapmirror create -source-path svm:vol_snaplock2 -destination-path svm:vol_snaplock2_dst2 -policy MirrorAllSnapshots
Operation succeeded: snapmirror create for the relationship with destination "svm:vol_snaplock2_dst2".

::*> snapmirror initialize -destination-path svm:vol_snaplock2_dst2
Operation is queued: snapmirror initialize of destination "svm:vol_snaplock2_dst2".

::*> snapmirror show
                                                                       Progress
Source            Destination Mirror  Relationship   Total             Last
Path        Type  Path        State   Status         Progress  Healthy Updated
----------- ---- ------------ ------- -------------- --------- ------- --------
svm:vol_snaplock2
            XDP  svm:vol_snaplock2_dst
                              Uninitialized
                                      Idle           -         false   -
                 svm:vol_snaplock2_dst2
                              Snapmirrored
                                      Finalizing     13.85KB   true    04/16 05:15:28
2 entries were displayed.

::*> snapmirror show
                                                                       Progress
Source            Destination Mirror  Relationship   Total             Last
Path        Type  Path        State   Status         Progress  Healthy Updated
----------- ---- ------------ ------- -------------- --------- ------- --------
svm:vol_snaplock2
            XDP  svm:vol_snaplock2_dst
                              Uninitialized
                                      Idle           -         false   -
                 svm:vol_snaplock2_dst2
                              Snapmirrored
                                      Idle           -         true    -
2 entries were displayed.

::*> snapmirror show-history -destination-path svm:vol_snaplock2_dst2 -instance

           Destination Path: svm:vol_snaplock2_dst2
                Source Path: svm:vol_snaplock2
            Relationship ID: 35c53c26-fbb0-11ee-9f88-c748fac02eac
    Relationship Group Type: none
                  Operation: scheduled-update
               Operation ID: 246dc3cc-12f4-4d12-ae49-ae920599f6d4
                 Start Time: 4/16/2024 05:15:25
                   End Time: 4/16/2024 05:15:29
                     Result: success
              Transfer Size: 13.85KB
     Additional Information: -

           Destination Path: svm:vol_snaplock2_dst2
                Source Path: svm:vol_snaplock2
            Relationship ID: 35c53c26-fbb0-11ee-9f88-c748fac02eac
    Relationship Group Type: none
                  Operation: initialize
               Operation ID: 5450f18b-fbb0-11ee-9f88-c748fac02eac
                 Start Time: 4/16/2024 05:15:25
                   End Time: 4/16/2024 05:15:27
                     Result: success
              Transfer Size: 21.12KB
     Additional Information: -

           Destination Path: svm:vol_snaplock2_dst2
                Source Path: svm:vol_snaplock2
            Relationship ID: 35c53c26-fbb0-11ee-9f88-c748fac02eac
    Relationship Group Type: none
                  Operation: create
               Operation ID: 35c53bb6-fbb0-11ee-9f88-c748fac02eac
                 Start Time: 4/16/2024 05:14:32
                   End Time: 4/16/2024 05:14:33
                     Result: success
              Transfer Size: -
     Additional Information: -

3 entries were displayed.

正しく転送できました。

また、転送先ボリュームのSnapLockの設定を確認すると、転送元と同じ設定がされていました。良きように転送してくれるようです。

svm::*> volume snaplock show -volume vol_snaplock2_dst2 -instance

                          Volume: vol_snaplock2_dst2
                   SnapLock Type: enterprise
        Minimum Retention Period: 1 minutes
        Default Retention Period: 2 minutes
        Maximum Retention Period: 3 minutes
               Autocommit Period: none
   Is Volume Append Mode Enabled: false
               Privileged Delete: -
                     Expiry Time: Tue Apr 16 05:17:04 GMT 2024
            ComplianceClock Time: Tue Apr 16 05:18:57 UTC 2024 +00:00
              ComplianceClock ID: 1713157822543
          ComplianceClock NodeID: 3323134672
     ComplianceClock Skew (secs): 3
                Litigation Count: 0
    Is SnapLock Audit Log Volume: false
Unspecified Retention File Count: 0

SnapMirrorの転送先がSnapLockボリューム

続いて、SnapMirrorの転送先がSnapLockボリュームの場合を確認します。

以下のようにSnapLockボリュームでないボリュームを用意しました。

::*> volume show -volume vol1 -fields snaplock-type
vserver volume snaplock-type
------- ------ -------------
svm     vol1   non-snaplock

転送先のSnapLockボリュームを作成します。

::*> volume create -vserver svm -volume vol_dst -aggregate aggr1 -state online -type DP -size 4GB -tiering-policy none -autosize-mode grow -snaplock-type enterprise[Job 74] Job succeeded: Successful

::*>  volume snaplock show -volume vol_dst -instance

                         Vserver: svm
                          Volume: vol_dst
                   SnapLock Type: enterprise
        Minimum Retention Period: 0 years
        Default Retention Period: min
        Maximum Retention Period: 30 years
               Autocommit Period: none
   Is Volume Append Mode Enabled: false
               Privileged Delete: -
                     Expiry Time: none
            ComplianceClock Time: Tue Apr 16 05:30:40 UTC 2024 +00:00
              ComplianceClock ID: 1713157822543
          ComplianceClock NodeID: 3323134672
     ComplianceClock Skew (secs): 0
                Litigation Count: 0
    Is SnapLock Audit Log Volume: false
Unspecified Retention File Count: 0

::*> volume snaplock modify -volume vol_dst -minimum-retention-period "1 minutes" -default-retention-period "2 minutes" -maximum-retention-period "3 minutes"

::*> volume snaplock show -volume vol_dst -instance

                         Vserver: svm
                          Volume: vol_dst
                   SnapLock Type: enterprise
        Minimum Retention Period: 1 minutes
        Default Retention Period: 2 minutes
        Maximum Retention Period: 3 minutes
               Autocommit Period: none
   Is Volume Append Mode Enabled: false
               Privileged Delete: -
                     Expiry Time: none
            ComplianceClock Time: Tue Apr 16 05:31:10 UTC 2024 +00:00
              ComplianceClock ID: 1713157822543
          ComplianceClock NodeID: 3323134672
     ComplianceClock Skew (secs): 0
                Litigation Count: 0
    Is SnapLock Audit Log Volume: false
Unspecified Retention File Count: 0

SnapMirror relationshipを初期化します。

::*> snapmirror create -source-path svm:vol1 -destination-path svm:vol_dst -policy MirrorAllSnapshots
Operation succeeded: snapmirror create for the relationship with destination "svm:vol_dst".

::*> snapmirror initialize -destination-path svm:vol_dst
Operation is queued: snapmirror initialize of destination "svm:vol_dst".

::*> snapmirror show
                                                                       Progress
Source            Destination Mirror  Relationship   Total             Last
Path        Type  Path        State   Status         Progress  Healthy Updated
----------- ---- ------------ ------- -------------- --------- ------- --------
svm:vol1    XDP  svm:vol_dst  Uninitialized
                                      Idle           -         false   -
svm:vol_snaplock2
            XDP  svm:vol_snaplock2_dst
                              Uninitialized
                                      Idle           -         false   -
                 svm:vol_snaplock2_dst2
                              Snapmirrored
                                      Idle           -         true    -
3 entries were displayed.

::*> snapmirror show-history -destination-path svm:vol_dst -instance

           Destination Path: svm:vol_dst
                Source Path: svm:vol1
            Relationship ID: a38f5701-fbb2-11ee-9f88-c748fac02eac
    Relationship Group Type: none
                  Operation: initialize
               Operation ID: ac30a859-fbb2-11ee-9f88-c748fac02eac
                 Start Time: 4/16/2024 05:32:11
                   End Time: 4/16/2024 05:32:11
                     Result: failure
              Transfer Size: -
     Additional Information: Policy is not of type "vault" for SnapMirror relationship of type "XDP" on SnapLock destination volume "svm:vol_dst".

           Destination Path: svm:vol_dst
                Source Path: svm:vol1
            Relationship ID: a38f5701-fbb2-11ee-9f88-c748fac02eac
    Relationship Group Type: none
                  Operation: create
               Operation ID: a38f568f-fbb2-11ee-9f88-c748fac02eac
                 Start Time: 4/16/2024 05:31:56
                   End Time: 4/16/2024 05:31:56
                     Result: success
              Transfer Size: -
     Additional Information: -

2 entries were displayed.

SnapMirror policyのタイプがvaultでなければダメなようです。

mirror-vaultの場合はどうでしょうか。SnapMirror policyをMirrorAndVaultに変更して再トライします。

::*> snapmirror modify -destination-path svm:vol_dst -policy MirrorAndVault
Operation succeeded: snapmirror modify for the relationship with destination "svm:vol_dst".

::*> snapmirror initialize -destination-path svm:vol_dst
Operation is queued: snapmirror initialize of destination "svm:vol_dst".

::*> snapmirror show-history -destination-path svm:vol_dst -instance

           Destination Path: svm:vol_dst
                Source Path: svm:vol1
            Relationship ID: a38f5701-fbb2-11ee-9f88-c748fac02eac
    Relationship Group Type: none
                  Operation: initialize
               Operation ID: 0332bd6a-fbb3-11ee-9f88-c748fac02eac
                 Start Time: 4/16/2024 05:34:37
                   End Time: 4/16/2024 05:34:37
                     Result: failure
              Transfer Size: -
     Additional Information: Policy is not of type "vault" for SnapMirror relationship of type "XDP" on SnapLock destination volume "svm:vol_dst".

           Destination Path: svm:vol_dst
                Source Path: -
            Relationship ID: a38f5701-fbb2-11ee-9f88-c748fac02eac
    Relationship Group Type: none
                  Operation: modify
               Operation ID: fedf220e-fbb2-11ee-9f88-c748fac02eac
                 Start Time: 4/16/2024 05:34:29
                   End Time: 4/16/2024 05:34:29
                     Result: success
              Transfer Size: -
     Additional Information: -

           Destination Path: svm:vol_dst
                Source Path: svm:vol1
            Relationship ID: a38f5701-fbb2-11ee-9f88-c748fac02eac
    Relationship Group Type: none
                  Operation: initialize
               Operation ID: ac30a859-fbb2-11ee-9f88-c748fac02eac
                 Start Time: 4/16/2024 05:32:11
                   End Time: 4/16/2024 05:32:11
                     Result: failure
              Transfer Size: -
     Additional Information: Policy is not of type "vault" for SnapMirror relationship of type "XDP" on SnapLock destination volume "svm:vol_dst".

           Destination Path: svm:vol_dst
                Source Path: svm:vol1
            Relationship ID: a38f5701-fbb2-11ee-9f88-c748fac02eac
    Relationship Group Type: none
                  Operation: create
               Operation ID: a38f568f-fbb2-11ee-9f88-c748fac02eac
                 Start Time: 4/16/2024 05:31:56
                   End Time: 4/16/2024 05:31:56
                     Result: success
              Transfer Size: -
     Additional Information: -

4 entries were displayed.

エラー内容は変わりありません。vaultを含むではなく、vaultでなければならないようですね。

vaultであるXDPDefaultにSnapMirror policyを変更して再チャレンジします。

::*> snapmirror policy show -fields type
vserver                policy       type
---------------------- ------------ ------------
FsxId0203a077973a5b898 Asynchronous mirror-vault
FsxId0203a077973a5b898 AutomatedFailOver
                                    automated-failover
FsxId0203a077973a5b898 CloudBackupDefault
                                    vault
FsxId0203a077973a5b898 Continuous   continuous
FsxId0203a077973a5b898 DPDefault    async-mirror
FsxId0203a077973a5b898 DailyBackup  vault
FsxId0203a077973a5b898 Migrate      migrate
FsxId0203a077973a5b898 MirrorAllSnapshots
                                    async-mirror
FsxId0203a077973a5b898 MirrorAllSnapshotsDiscardNetwork
                                    async-mirror
FsxId0203a077973a5b898 MirrorAndVault
                                    mirror-vault
FsxId0203a077973a5b898 MirrorAndVaultDiscardNetwork
                                    mirror-vault
FsxId0203a077973a5b898 MirrorLatest async-mirror
FsxId0203a077973a5b898 SnapCenterSync
                                    sync-mirror
FsxId0203a077973a5b898 StrictSync   strict-sync-mirror
FsxId0203a077973a5b898 Sync         sync-mirror
FsxId0203a077973a5b898 Unified7year mirror-vault
FsxId0203a077973a5b898 XDPDefault   vault
17 entries were displayed.

::*> snapmirror policy show -type vault
Vserver Policy             Policy Number         Transfer
Name    Name               Type   Of Rules Tries Priority Comment
------- ------------------ ------ -------- ----- -------- ----------
FsxId0203a077973a5b898
        CloudBackupDefault vault         1     8  normal  Vault policy with daily rule.
  SnapMirror Label: daily                              Keep:       7
                                                 Total Keep:       7

FsxId0203a077973a5b898
        DailyBackup        vault         1     8  normal  Vault policy with a daily rule and a daily transfer schedule.
  SnapMirror Label: daily                              Keep:       7
                                                 Total Keep:       7

FsxId0203a077973a5b898
        XDPDefault         vault         2     8  normal  Vault policy with daily and weekly rules.
  SnapMirror Label: daily                              Keep:       7
                    weekly                                        52
                                                 Total Keep:      59

3 entries were displayed.

::*> snapmirror modify -destination-path svm:vol_dst -policy XDPDefault
Operation succeeded: snapmirror modify for the relationship with destination "svm:vol_dst".

::*> snapmirror initialize -destination-path svm:vol_dst
Operation is queued: snapmirror initialize of destination "svm:vol_dst".

::*> snapmirror show-history -destination-path svm:vol_dst -instance -max-rows-per-relationship 1

           Destination Path: svm:vol_dst
                Source Path: svm:vol1
            Relationship ID: a38f5701-fbb2-11ee-9f88-c748fac02eac
    Relationship Group Type: none
                  Operation: initialize
               Operation ID: 51303b10-fbb3-11ee-9f88-c748fac02eac
                 Start Time: 4/16/2024 05:36:48
                   End Time: 4/16/2024 05:36:50
                     Result: success
              Transfer Size: 17.82KB
     Additional Information: -

今度は正常に転送が完了しました。

転送されたSnapshotを確認すると、まだSnapLockの保持期間を示すsnaplock-expiry-timeは指定されていません。

::*> snapshot show -volume vol1, vol_dst -fields snaplock-expiry-time
vserver volume snapshot                                                                     snaplock-expiry-time
------- ------ ---------------------------------------------------------------------------- --------------------
svm     vol1   snapmirror.be28f0c9-fae6-11ee-9f88-c748fac02eac_2151788187.2024-04-16_053648 -
svm     vol_dst
               snapmirror.be28f0c9-fae6-11ee-9f88-c748fac02eac_2151788187.2024-04-16_053648 -
2 entries were displayed.

差分転送してみましょう。

転送元ボリュームに適当にファイルを作成します。

$ sudo mount -t nfs svm-090459f1740b295e5.fs-0203a077973a5b898.fsx.us-east-1.amazonaws.com:/vol1 /mnt/fsxn/vol1

$ echo $(date) | sudo tee -a /mnt/fsxn/vol1/date.txt > /dev/null

$ ls -l /mnt/fsxn/vol1/date.txt
-rw-r--r--. 1 root root 29 Apr 16 05:44 /mnt/fsxn/vol1/date.txt

$ cat /mnt/fsxn/vol1/date.txt
Tue Apr 16 05:44:34 UTC 2024

XDPDefaultsm_createdがありません。つまりは、SnapMirror転送時にSnapshotを取得してくれません。

SnapMirror policyを確認するとdailyweeklyというラベルが付与されているSnapshotは転送してくれそうです。

今回はdailyラベルが付与されたSnapshotを手動で作成します。

::*> snapshot create -vserver svm -volume vol1 -snapshot daily.snaplock-test -snapmirror-label daily

::*> snapshot show -volume vol1, vol_dst -fields snaplock-expiry-time, snapmirror-label
vserver volume snapshot                                                                     snapmirror-label snaplock-expiry-time
------- ------ ---------------------------------------------------------------------------- ---------------- --------------------
svm     vol1   snapmirror.be28f0c9-fae6-11ee-9f88-c748fac02eac_2151788187.2024-04-16_053648 -                -
svm     vol1   daily.snaplock-test                                                          daily            -
svm     vol_dst
               snapmirror.be28f0c9-fae6-11ee-9f88-c748fac02eac_2151788187.2024-04-16_053648 -                -
3 entries were displayed.

Snapshot作成後、SnapMirrorの差分同期をします。

::*> snapmirror update -destination-path svm:vol_dst
Operation is queued: snapmirror update of destination "svm:vol_dst".

::*> snapmirror show
                                                                       Progress
Source            Destination Mirror  Relationship   Total             Last
Path        Type  Path        State   Status         Progress  Healthy Updated
----------- ---- ------------ ------- -------------- --------- ------- --------
svm:vol1    XDP  svm:vol_dst  Snapmirrored
                                      Idle           -         true    -
svm:vol_snaplock2
            XDP  svm:vol_snaplock2_dst
                              Uninitialized
                                      Idle           -         false   -
                 svm:vol_snaplock2_dst2
                              Snapmirrored
                                      Idle           -         true    -
3 entries were displayed.

::*> snapmirror show-history -destination-path svm:vol_dst -instance -max-rows-per-relationship 1

           Destination Path: svm:vol_dst
                Source Path: svm:vol1
            Relationship ID: a38f5701-fbb2-11ee-9f88-c748fac02eac
    Relationship Group Type: none
                  Operation: manual-update
               Operation ID: beda1ea9-fbb4-11ee-9f88-c748fac02eac
                 Start Time: 4/16/2024 05:47:00
                   End Time: 4/16/2024 05:47:02
                     Result: success
              Transfer Size: 13.85KB
     Additional Information: -

::*> snapshot show -volume vol1, vol_dst -fields snaplock-expiry-time, expiry-time, snapmirror-label
vserver volume snapshot            snapmirror-label expiry-time snaplock-expiry-time
------- ------ ------------------- ---------------- ----------- --------------------
svm     vol1   daily.snaplock-test daily            -           -
svm     vol_dst
               daily.snaplock-test daily            -           4/16/2024 05:49:01 +00:00
2 entries were displayed.

転送先ボリュームに転送されたSnapshotにsnaplock-expiry-timeが設定されました。設定された時刻はSnapMirrorによって転送された時間 + SnapLockのデフォルト保持期間2分でした。

ボリュームのSnapLockの解除

できません。

volume modifyには、既存のボリュームのSnapLockモードを変更する方法は紹介されていません。

SnapLockボリュームから通常のボリュームに戻したい場合はDataSyncやrsync、Robocopyを使ってファイルを転送してあげましょう。

一方、非SnapLockボリュームからSnapLockボリュームへの変換についてはSnapMirrorで代替できると考えます。

SnapMirrorの転送先ボリュームでSnapLockをかける運用から始めよう

Amazon FSx for NetApp ONTAPでSnapLockによるWORMを試してみました。

コンプライアンス遵守や改ざん、誤削除対策としてWORM機能は非常に有用です。

ただし、使い方を間違えると数年削除できないファイルシステムを作成してしまう可能性があります。SnapLockを有効化する際は慎重に行いましょう。

個人的にはSnapLockを導入する場合、SnapMirrorの転送先ボリュームでSnapLockをかける運用から始めるのが良いと考えます。

オリジナルのボリュームにSnapLockをかけてしまうと「どうしても編集したいけど、編集できない」と運用が回らない可能性があります。SnapMirrorの転送先であれば元々読み取り専用ボリュームなので、そのような事象は回避できると考えます。

この記事が誰かの助けになれば幸いです。

以上、AWS事業本部 コンサルティング部の のんピ(@non____97)でした!