「Data Domain:sfs-dumpを使用してData Domainファイル システム上のファイルを一覧表示する方法
概要: この記事では、Data Domain CLIを使用して、個々のMTreeまたはファイル システム(FS)全体のファイルとディレクトリーのリストをダンプする方法について説明します。
現象
取得されたプロトコルに関係なく、Data Domain FSには、MTreeに編成されたファイル(ディレクトリー内)のみが含まれます。すべてのファイル(Active内のファイルと任意のCloud-Unit内のファイルの両方)は、同じルートとネームスペースを共有します。単一のネームスペースが存在するため、ファイルとディレクトリーのリストには、ActiveとCloud-Unit内のファイルが区別なく含まれます。
詳細なファイル ダンプを取得すると、次のような理由で役立ちます。
-
バックアップ アプリケーションによって管理されているファイルのリストと比較し、そのバックアップ アプリケーションから孤立したファイルを特定します。
-
特定の経過時間の閾値を超えるすべてのファイルを一覧表示して、バックアップ アプリケーションがバックアップの保存を正しく実施しているかを判断します。
原因
ファイル リストを作成するためのCLIツールは sfs_dump.
解決方法
SSHセッション ログを使用して、リスト出力を収集します。ファイルのリストを収集するためにDDコマンドライン インターフェイス(CLI)から実行する正確なコマンドは、使用中のData Domain Operating System (DDOS)のバージョンによって異なります。
CLIからData Domain内のファイルの詳細なリストを取得し、最終的にData Domainに格納されている ファイルに関する情報を取得する プロセスを取得する方法は、実行されているDDOSリリースによって異なります。
ファイルの詳細を含むテキスト出力ファイルが収集されると、より使いやすい形式への出力の処理は常に同じです。これは、すべてのDDOSリリースの出力形式が同じである(またはスクリプトを使用して共通の形式に変換できる)ためです。
すべてのDDOSリリースに共通する要件は、管理者ユーザーとしてData Domainにログインする必要があることです。これを行うには、クライアント側でコンソール出力のテキスト ファイルへのログ記録をサポートするSSHクライアントを使用します(これにはPuTTYが適しています)。クライアント上のテキスト ファイルに出力を記録するようにSSHクライアントを構成します(ログに記録される行数または個々の行の長さに制限がないことを確認します)。SSHセッション ログ ファイル(したがってDDファイル リスト)は、Data Domainではなく、(通常は)SSH接続が開始されたデスクトップ クライアントに書き込まれます
SSHセッションの出力を収集する場合は、ファイルに意味のある名前を付け(ダンプするData Domainホスト名とMTree名を追加するなど)、ログ ファイルに十分なスペースがあることを確認します。ログ ファイルには、100万個のファイルを含むData Domainで約200 MBの容量になる場合があります。
7.13.0.0、7.10.1.15、7.7.5.25、6.2.1.110より前のDDOSリリース:
これらのリリースでは、 se sfs_dump コマンドをサポートしています(および -c ファイルの詳細をそのままCSVとして出力することもできます)。ただし、セキュリティ上の理由からSEモードに移行することは推奨されません。代わりに、利用可能な最新のDDOSリリースにアップグレードしてください。
出力をディスクに書き込むように構成されたSSHクライアントを使用して、管理者ユーザーとしてData Domainにログインし、SE権限モードに変更してから、MTreeごとに次のコマンドを実行します。ファイルの詳細が必要です。
#### To produce the output directly as CSV # se sfs_dump -c <mtree-path> #### To produce the output as default format # se sfs_dump <mtree-path>
これらのバージョンのコマンドでは、(一度に1つのMTreeではなく)FS内のすべてのファイルのリストを一度に生成することもできます。FS内のすべてのファイルのファイル情報の詳細をダンプするには、MTreeパスをそのままにします。
# se sfs_dump -c
完了したら、ディスクへのSSHクライアントのログ記録を停止し、さらなる処理のためにファイルを準備しておきます。
このコマンドの出力形式は、ファイルごとに1行です。また、 -cの場合、フォーマットは以降のリリースで上記と同じです。次のような場合 -c (CSV出力の場合)使用された場合、形式は次のようになります(出力の最初の行として表示されるヘッダーを含む)。
name mtime fileid size seg_bytes seg_count redun_seg_count pre_lc_size post_lc_size /data/col1/backup/file 1656995350000000000 78 33554431 33668007 4016 0 33668007 34208564
DDOSリリース7.13.0.0、7.10.1.15、7.7.5.25、6.2.1.110以降:
リストされるMTreeは、「MTree」キーワードの後に続きます。
# filesys sfs-dump mtree <mtree-path>
filesys sfs-dump コマンドとの比較 se sfs_dumpファイルに置き換えます。
- 新しいコマンドは、ファイル情報をCSV(列)形式でダンプする
-cオプションをサポートしていません。 - 新しいコマンドでは、一度に1つのMTreeしか実行できません。1回の呼び出しでFS全体に対して実行することはできません
すべてのMTreeのファイルの詳細をファイルにダンプする必要がある場合は、Data Domain FS内のMTreeの全リストを反復処理し、各MTreeに対してコマンドを1回実行します。ユーザーは、次のコマンドを実行して、システム内のMTreeのリストを取得できます。
# mtree list
出力をディスクに書き込むように構成されたSSHクライアントを使用して、管理者ユーザーとしてData Domainにログインし、MTreeごとに次のコマンドを実行します。
# filesys sfs-dump mtree <mtree-path>
複数のMTreeのファイルの詳細が必要な場合は、すべてのダンプを同じ出力ファイルに実行するオプションを選択するか、SSHクライアント構成を異なるファイルに切り替えてから、各MTreeに対してコマンドを実行します。
または、SSHを使用してコマンドを実行して、無人で出力を収集します。
#### Releases 7.13.0.0, 7.10.1.15, 7.7.5.25 and 6.2.1.110 onwards only # ssh sysadmin@DD-HOSTNAME "filesys sfs-dump mtree /data/col1/backup" > sfs-dump-DD-backup.txt
いずれの場合も、出力情報はファイルごとに1行で、次の形式になります。
/data/col1/backup/file: mtime: 1580211658000000000 fileid: 175 size: 136794 type: 9 seg_bytes: 138282 seg_count: 18 redun_seg_count: 14 (78%) pre_lc_size: 15045 post_lc_size: 8760 (58%) mode: 02000100644 start_offset: 0 end_offset: 18446744073709551615
DDOSリリース8.1.0.0、7.13.1.10、7.10.1.30、7.7.5.40以降:
filesys sfs-dumpファイルに置き換えます。
- 出力をCSVに似た形式のバージョン(列で区切られたフィールド)で出力できる、
-cオプションを追加可能 - FS内のすべてのファイルのファイル ダンプ情報を一度に実行可能
- sshセッション ログを使用して出力を収集します。
コマンドは、直前のバージョンと同じですが、以下に要約する機能拡張が含まれます。
#### File listing for all the files in a given MTree path # filesys sfs-dump mtree <mtree-path> #### File listing for all the files in a given MTree path, with CSV-like output # filesys sfs-dump -c mtree <mtree-path> #### File listing for all the files in the FS # filesys sfs-dump #### File listing for all the files in the FS, with CSV-like output # filesys sfs-dump -c
このコマンドは引き続き「非表示」であるため、CLIの対話型ヘルプやドキュメントには表示されません。
有用な形式に sfs_dump または filesys sfs-dump のデータを変換する方法:
以下のように、 filesys sfs-dump または sfs_dump を使用した場合( -c オプションなし)に報告される各ファイルの形式を要約できます。
/data/col1/backup/file: mtime: 1580211658000000000 fileid: 175 size: 136794 type: 9 seg_bytes: 138282 seg_count: 18 redun_seg_count: 14 (78%) pre_lc_size: 15045 post_lc_size: 8760 (58%) mode: 02000100644 start_offset: 0 end_offset: 18446744073709551615 Field 01 : filename with full path (/data/col1/backup/file) Field 03 : file last modification time as UNIX epoch in nanoseconds (nanoseconds since January 1st 1970 at midnight) Field 05 : file (inode) ID, inode numbers are per MTree (175) Field 07 : pre-comp size for the file in bytes (136794) Field 09 : type of file (9) Field 11 : segment store bytes (this is NOT the file size), please ignore (138282) Field 13 : segment count, or the number of segments the file consists of (18) Field 15 : number of file segments which are redundant, or not unique (14) Field 16 : percentage of non-unique segments to total segments (78%) Field 18 : combined size of the file's unique segments after deduplication (15045) Field 20 : combined size of the file's unique segments after deduplication and local compression (8760) Field 21 : ratio of post-deduplicated + post-compressed unique segments size to post-deduplicated unique segment size (58%), shows how well local compression worked Field 23 : file mode, please ignore
上記の例では、元のファイルのサイズは136,794バイトです。Data Domain FS取得パイプラインを通過した後、重複排除後は15,045バイトを使用するように計算され、ディスクに書き込まれる前にファイルの一意のセグメントが圧縮される場合は8,760バイトが使用されます。したがって:
- ファイル重複排除(別名「
gcomp" または global compression) は係数 x9.09 (136,794 から 15,045 バイト) です。 - ファイルのローカル圧縮 (別名 "l
comp" は、ローカル圧縮の場合は係数 x1.72 (15,045 から 8760 バイト) です。 - 推定される合計ファイル サイズの短縮率(「圧縮率」と呼ばれる)は、係数がx15.62(136,794から8760バイト)です。
また、 sfs_dump -c の出力は似ていますが、より簡潔です。
/data/col1/backup/file 1656995350000000000 78 33554431 33668007 4016 0 33668007 34208564 Field 01 : filename with full path (/data/col1/backup/file) Field 02 : file last modification time as UNIX epoch in nanoseconds (nanoseconds since January 1st 1970 at midnight) Field 03 : file (inode) ID, inode numbers are per MTree Field 04 : pre-comp size for the file in bytes (33554431) Filed 05 : segment store bytes (this is NOT the file size), please ignore (33668007) Field 06 : segment count, or the number of segments the file consists of (4016) Field 07 : number of file segments which are redundant, or not unique (0) Field 08 : combined size of the file's unique segments after deduplication (33668007) Field 09 : combined size of the file's unique segments after deduplication and local compression (34208564)
この例では、前の計算と同じ計算を行うことができます。
- ファイル重複排除(別名「
gcomp" またはグローバル圧縮) は係数 x0.99 (33,554,431 から 33,668,007 バイト) です。 - ファイルのローカル圧縮 (別名 "
lcomp") は係数 x0.98 (33,668,007 から 34,208,564 バイト) です。 - 推定される合計ファイル サイズの短縮率(「圧縮率」と呼ばれる)は、係数がx0.98(33,554,431から34,208,564バイト)です。
これは、 -c オプションなしの例と比較すると、重複排除もされず(冗長セグメントなし)ローカル圧縮もされていません。これは、このファイルが圧縮されたファイルであることを示します。
post_lc_size が特定の量であるからといって、そのファイルによって使用されるディスク領域がその量と同じであることを意味するわけではありません。これは、ファイルごとのレベルでは考慮されないFSレベルのオーバーヘッドが多数存在するためです。制限事項は、次のコマンドですでに知られているものと同じです。
mtree show compression上記の出力ファイルの情報を活用する場合、ユーザーの目的に合った方法で数値データを処理する必要があります。ユース ケースの例をいくつか次に示します。
- 決定
gcompとlcomp特定のパスに対応するファイルの場合(パスが特定のバックアップ サーバー、クライアント、ポリシー、ジョブなどと一致する場合) - データ量 (
pre-comp)は、特定の場所に保存され、その期間は経過しています(孤立したバックアップを特定したり、バックアップ アプリケーションが期限を過ぎてバックアップが期限切れにならない問題のトラブルシューティングを行うため) - その他のタイプの統計の用途
sfs_dump -c オプション 最近のリリースでは、出力データを上記のCSV形式に変換してから、CSV形式のファイルを使用してさらに処理することをお勧めしますが、スキルによっては、CSV以外の出力を直接処理できます。
CSV以外の sfs_dump 出力を、 sfs_dump -c が出力されている場合は、次のLinuxコマンドラインを使用できます。
# cat sfs-dump-noCSV.txt | grep ^/ | awk '
BEGIN {print "name\tmtime\tfileid\tsize\tseg_bytes\tseg_count\tredun_seg_count\tpre_lc_size\tpost_lc_size"}
{
colon_index = index($0, ":")
filename = substr($0, 1, colon_index - 1)
gsub(/^[[:space:]]+|[[:space:]]+$/, "", filename)
n = split(substr($0, colon_index + 1), fields, " ")
print filename "\t" fields[2] "\t" fields[4] "\t" fields[6] "\t" fields[10] "\t" fields[12] "\t" fields[14] "\t" fields[17] "\t" fields[19]
}' > sfs-dump-CSV.csv
これ以降は、すべて現状のままユーザーに提供されます。以下に示す手順について、デル・テクノロジーズはいかなる保証もせず、責任も負いません。ファイル リストの詳細から情報を取得することはユーザーのタスクであり、それを実現する方法は、ファイル ダンプ出力のデータ マイニングに使用されるツール セット、達成すべき目標、および前述のコマンド出力からのデータを処理するユーザー自身の専門知識に完全に依存します。あるユーザは Linux のコマンドライン処理を使っていくつかの集計をダンプすることを選択するかもしれませんし、他のユーザは "gnuplot" を使って値をグラフ化するための入力を生成することを選択するかもしれませんが、大多数のユーザは、分析のために CSV ファイルからスプレッドシートを構築する、より単純な (ただし限定的な) アプローチを求めていると考えられています
Dellは、以下の手順が正しく機能し、ユーザーにとって有用であることを保証するよう努めていますが、サポートの範囲外であるため、その動作を保証することはできず、サポートも提供されません。
CSV形式の sfs_dump 出力をスプレッドシートにインポートする方法(Excelの例):
ファイルの詳細リストのCSVバージョンが入手できたら、データから情報を得る方法の1つとして、データをスプレッドシートソフトウェアにロードします。Microsoft Excelを例として使用しますが、他のソフトウェアでも同様の手順が必要です。CSVテキスト ファイルをCSVとしてExcelにインポートするには、次の手順に従います。
- Excelを開き、新しい空白のスプレッドシートを作成します。
- 上部の[データ]メニューに移動し、[テキストまたはCSVから]という名前のアイコンをクリックします。
- ダイアログを使用して、CSV形式のファイル データ(CSV以外の形式からの変換スクリプトの例にあるように
sfs-dump-CSV.csv)を参照し、それを選択して[インポート]をクリックします。 - 入力ファイルの形式が正しく、Excelが最初の200行から形式を描画できる場合(できるはずです)、ダイアログに生成されるスプレッドシートのプレビューが表示されます。情報を確認して、最初の行がヘッダーとして検出されていることを含め、問題がないことを確認します
- プレビューで問題がなければ、ダイアログの下部にある[ 読み込み ]ボタンをクリックすると、新しいスプレッドシートが適切なフォーマットで表示され、フィールドヘッダーが検索およびフィルター対応のものに変わります。
スプレッドシート内のデータはすでに役に立っています。たとえば、サイズなどの数値フィールドに数値フィルターを適用したり(特定のサイズを超えるファイルのみを表示するため)、名前フィールドにテキスト フィルターを適用して、特定のパターンに一致するData Domainファイル詳細出力内のファイルのみが表示されるようにしたりします(特定のMTreeのパスで始まるファイルのみ)。 そして、そのデータから他の派生計算を行います
適切にインポートされたExcelスプレッドシートには、列AからIにデータが含まれている必要があります。データが列 A にのみ存在するが、画面全体に広がっている場合は、Excel を閉じて、上記の手順 1 から 5 を再試行します。
計算フィールドを追加します。
スプレッドシートは、ユーザーが必要とする数の計算フィールドで拡張できます。追加すると役立つのは、ファイルのmtime(最終変更時刻、通常はDDに書き込まれた時刻)に対応する人間が判読できる日付と時刻です。また、データの使用目的によっては、ファイルごとの圧縮値の計算と表示が役立ちます。新しい列は、以下で説明するように、Excelの数式を使用して自動的に入力されます。
タイムスタンプの変換:
UNIXのようなタイムスタンプを人間が判読可能な日時に変換するには、次の手順を実行します。
- セルJ2を右クリックし、[セルの書式設定]を選択します。
- 左側の[表示形式]リストで[ユーザー定義]を選択します。
- まだ存在しない場合は、人間が判読できる日時形式の形式を作成します(この例では、末尾にEST文字列が含まれます。テキストのタイム ゾーン定義に置き換えるか、関心がない場合は "EST" を完全に削除できます): yyyy-mm-dd hh:mm:ss "EST"
- 完了したら[Ok]をクリックします。これで、セルJ2にデータのカスタム形式が設定されました。
- セルJ2に次の数式を追加します。数式の(-6*3600)を、「sfs-dump」データ取得時にData Domainで構成されたタイム ゾーンのUTCに対応する正しいタイム ゾーンの差に置き換えます。例えば、米国東部時間は夏季にUTCより6時間遅れているため、ここでは「-6」です。
(((B2/1000000000+(-6*3600))/86400)+25569) (((B2/1000000000)/86400)+25569)
- 数式をセルJ2に貼り付け、スプレッドシートの残りの行の各セルにも貼り付けます。
- スプレッドシート全体の数式を計算し、設定された形式で日付と時刻の値を表示します。
- 列を既存の列として整形し、ヘッダーを日付フィルターを適用できる日付として構成し、列の適切な名前(日付)を設定するだけです
圧縮情報:
上記で説明したように、ファイルごとの圧縮情報の列を追加できます。今回は数式に 「=」が含まれているため、テキスト全体をコピーし、 テキストとして[形式を選択して貼り付け]を行う必要があります。
- 次の式をコピーし、 Paste Special as TextをセルK2に貼り付けて、ファイルごとの重複排除の列を作成します。
gcompファイルに置き換えます。=IF(H2=0,0,D2/H2)
- 次の式をコピーし、[ テキストとして形式を選択して貼り付ける]をセルL2に入力して、ファイルごとのローカル圧縮用の列を作成するか、
lcompファイルに置き換えます。=IF(I2=0,0,H2/I2)
- 次の数式をコピーし、[形式を選択して貼り付け]でテキストとしてセルM2に貼り付け、ファイルごとの合計圧縮率用の列を作成します。
=K2*L2
新しい列に適切な名前を付けます。圧縮値の形式を別の形式にする場合は(小数点以下の桁数を制限する場合など)、日付と時刻の例のように、数式を貼り付ける前にセルの数値形式を事前に設定してください。
[ファイル]メニューに移動して、[名前を付けて保存]する際にファイルの種類がExcelブック(*.xlsx)であることを確認して、必ず作業を保存してください。そうすることで、書式設定とフィルターが保持されます。
説明されたアクションが完了すると、スプレッドシートには次の(関連する)列が含まれます。
- Aには、ファイル名
- Bには、ファイルが最後に書き込まれた日時のスタンプ(UNIXエポックでナノ秒単位)
- Dには、ファイルの元のサイズ
- Hには、グローバル圧縮後のサイズ
- Iには、グローバルおよびローカル圧縮後のサイズ
- Jには、ファイルが最後に書き込まれた日付のスタンプ(人間が判読できる形式)
- Kには、ファイルのグローバル圧縮率(重複排除)
- Lには、ファイルのローカル圧縮率
- Mには、ファイルの合計圧縮率
すべてのファイル サイズはバイト単位です
Excelでは、データのレポート作成に必要なフィルタリングや並べ替えができるようになりました。
- 例えば、30日以上経過したMTreeの/data/col1/backup内のファイルのみを表示するには、次の手順を実行します。
- [Name]ヘッダーの下矢印をクリックし、[Text Filters]、[Begins With]の順に選択して、
/data/col1/backup/とボックスに入力します。末尾のスラッシュは重要です。[OK]をクリックします。 - [Last Written Date]ヘッダーの下矢印をクリックし、[Date Filters]、[Before]の順に選択します。ダイアログの右側にある日付ピッカーを使用して、30日前の日付を選択します。「OK」をクリックします。
その他の情報
ファイルの場所(ActiveおよびCloud)をダンプするコマンド
どのファイルがActiveにあり、どれがCloud-Unitにあるかを示すファイルのリストをダンプする方法があります。その方法は次のとおりです。
#### For the DD FS as a whole # filesys report generate file-location #### For an individual MTree or subdirectory # filesys report generate file-location path /data/col1/test
いずれの場合も、出力は次のようになります。
------------------------- ---------------------- ---------------------- --------------------------- File Name Location(Unit Name) Size Placement Time ------------------------- ---------------------- ---------------------- --------------------------- /data/col1/test/file1.bin Cloud-Unit 200.00 GiB Sat Mar 5 13:24:10 2022 /data/col1/test/file2.bin Active 10.00 TiB Sat May 14 00:48:17 2022 ------------------------- ---------------------- ---------------------- ---------------------------
ただし、上記のコマンドは、ほとんどの目的では不十分である傾向があります。たとえば、サイズは人間が判読可能な単位で(バイト、MiB、または設定された乗数ではなく)、配置時間は、Active内のファイルについてはData Domainにバックアップが作成された時刻と一致しますが、Cloud-Unit内のファイルの場合は一致しません(クラウド内のファイルの「配置時間」は、ファイルがCloud-Unitに移動された日時です)。
また、次のコマンド(およびCSV以外の sfs_dumpから変換するスクリプト)は、タブで区切られた列にデータを出力します。出力に存在するタブ文字は、ログ ファイルに保存する必要があります。そうしないと、CSVをExcelにインポートするための前述の手順でフィールドを正しく分離できません。
sfs_dump -c
説明された手順では、Excelに関する十分な知識があることを前提としていますが、他の表計算ソフトに適用できる可能性があります。
最新バージョンのExcelでは多くの行を使用できますが、 sfs_dump コマンドで処理される出力形式は各ファイルに対し1行となるため、Excelでは、データセット内のファイルと同じ数の行を含むスプレッドシートをすばやく処理して更新できるようにする必要があります。ハード リミットは100万行をわずかに超えていますが、ファイル数がそれをはるかに下回っている場合でも、Excelはジョブに適していない可能性があります(遅すぎます)
もし sfs_dump 出力のファイル数がExcelのバージョンに対して多すぎる場合や、パフォーマンスのためにデータを小さなビットで処理する場合は、MTreeごとに手順を1回実行して、システムに複数のスプレッドシートが存在するようにします
MTreeが1つであっても sfs_dump 出力がExcelには大きすぎる場合があり、その場合は 、splitLinuxコマンド(または大きなテキストファイルをオンラインでエンド境界に分割する他の同様のツール)を使用して、いくつかの小さなCSVファイルを一度に1つずつ処理できます。
# split -b <size> <filename> <new filename prefix> (splits by file size) # split -l <size> <filename> <new filename prefix> (splits by number of lines) # split -n <size> <filename> <new filename prefix> (splits by number of pieces)
例えば、入力テキスト ファイルをそれぞれ200 MiBのチャンクに分割し、それぞれに名前を付けるには、まず次のようにします。
"sfs_dump.out.split"
次に、以下を実行します。
# split -b 200M sfs_dump.out sfs_dump.out.split
ファイル データのFSダンプ全体に "filesys sfs-dump" を使用するスクリプト
ファイルの詳細をCSV形式でダンプする機能がない一部のリリースでは、以下に示すスクリプトが現状のまま(保証なしで)Dellからユーザーに提供されています。これにより、CSV以外の sfs_dump 出力を処理して、同様の結果が得られます。
CSV出力をサポートしていないリリースでは、FS全体のすべてのファイルの情報をダンプすることも許可されていないため、スクリプトはSSHを使用してターゲットのData Domainに接続し、MTreeのリストを反復処理し、一度に1つのMTreeでファイル ダンプを実行して、すべてのMTreeのファイル リストを収集します。その後、さらなる処理のために適したCSV形式に変換します。
#!/bin/bash
#### WARNING
#### This script is provided to you by Dell Technologies with NO GUARANTEE, as best-effort sample code to get a full FS sfs-dump collected
#### for DDOS releases which do not support "se sfs-dump", or as an alternative to it, in releases which support "filesys fs-dump"
#### That this script does not work for you, or if you need help setting it up, extending it, or resolving any issues, is not entitled to support
#### This script is not part of Dell PowerProtect / Data Domain, and hence it is not supported
#### Replace values below to suit your needs
USERNAME="sysadmin"
DD_HOSTNAME="10.n.n.172"
#### NO CHANGES NEEDED BEYOND THIS POINT
clear
echo "Script collects a full FS sfs-dump from \"${DD_HOSTNAME}\", using the command \"filesys sfs-dump\", one MTree at a time"
echo " * Script has to be configured by settting the \"USERNAME\" and \"DD_HOSTNAME\" variables within the top of the script"
echo " * Script expects passwordless SSH connection as \"USERNAME\" to the \"DD_HOSTNAME\" configured"
echo " * To configure passwordless SSH login to a DataDomain, check KB at https://www.dell.com/support/kbdoc/000004033 "
echo " * Test passwordless login is configured and working prior to going ahead with this script"
echo " * If passwordless login is not configured, script will ask for the \"${USERNAME}\" password "
echo " - Once for getting the MTree list"
echo " - And once for each one of the MTrees in \"${DD_HOSTNAME}\" "
echo
echo -n "Are you sure you want to continue? (y/n) : "
read -n 1 answer
echo
if [ "${answer}" = "y" ]; then
echo "Going ahead with the script."
echo
else
echo "Stopping script now. Re-run when passwordless login to \"${DD_HOSTNAME}\" as \"${USERNAME}\" works. Bye."
exit 1
fi
echo -n "1/6 : Collecting list of MTrees from DD..."
ssh ${USERNAME}@${DD_HOSTNAME} "mtree list" 2>/dev/null | grep ^/ | awk '{print $(NF-3)}' > mtree-list.txt
echo "Done."
n_mtrees=$( wc -l mtree-list.txt | cut -d" " -f1 )
echo -n "2/6 : Collecting per-Mtree sfs-dump information for ${n_mtrees} MTrees ..."
for mtree in `cat mtree-list.txt`; do
name=$(echo $mtree | cut -d/ -f4)
ssh ${USERNAME}@${DD_HOSTNAME} "filesys sfs-dump mtree ${mtree}" 2>/dev/null | grep ^/ > sfs-dump-${name}.txt
echo -n "."
done
echo "Done."
echo -n "3/6 : Putting all the files together..."
for file in `ls sfs-dump-*.txt`; do
if [ -s "${file}" ]; then cat ${file} >> sfs-dump-noCSV.txt; fi
done
echo "Done."
echo -n "4/6 : Converting sfs-dump output to CSV format..."
cat sfs-dump-noCSV.txt | grep ^/ | grep -v ^$ | awk '
BEGIN {print "name\tmtime\tfileid\tsize\tseg_bytes\tseg_count\tredun_seg_count\tpre_lc_size\tpost_lc_size"}
{
colon_index = index($0, ":")
filename = substr($0, 1, colon_index - 1)
gsub(/^[[:space:]]+|[[:space:]]+$/, "", filename)
n = split(substr($0, colon_index + 1), fields, " ")
print filename "\t" fields[2] "\t" fields[4] "\t" fields[6] "\t" fields[10] "\t" fields[12] "\t" fields[14] "\t" fields[17] "\t" fields[19]
}' > sfs-dump-CSV.csv
echo "Done."
echo -n "5/6 : Cleaning up..."
for mtree in `cat mtree-list.txt`; do name=$(echo $mtree | cut -d/ -f4); rm -f sfs-dump-${name}.txt ; done
rm sfs-dump-noCSV.txt
rm mtree-list.txt
echo "Done."
echo -n "6/6 : Summary"
echo
n_files=$( wc -l sfs-dump-CSV.csv | cut -d" " -f1 )
echo
echo "Collecting whole FS sfs-dump data from ${HOSTNAME} completed"
echo "File includes output for ${n_mtrees} MTrees, with a combined $(( ${n_files} - 1 )) files across Active and Cloud Tiers (if applicable)"
echo "Start of file shown below for your convenience :"
echo "===================="
head -5 sfs-dump-CSV.csv
echo "===================="
echo
echo "Done."
exit 0
CSV以外の「sfs-dump」と「filesys report generate file-location」の出力を、上記のスクリプトと同じ情報(およびファイル階層と配置時間情報)を含むCSVファイルに結合するスクリプト
次のスクリプトは、Dellからユーザーに現状のまま(保証なしで)提供されており、 sfs_dump およびfilesys report generate file-locationコマンドの出力に付加価値を提供することが期待されています。出力CSVの各ファイル エントリーに階層の場所と配置時間の情報を追加することで、階層(Activeまたは構成済みCloud-Unit 2つのいずれか)に基づいてファイルをフィルタリングできます。これにより、階層ごとのファイル配布に関するより正確なインサイトが得られます。
スクリプトでは、sfs-dump( sfs_dump -cでない)の出力を最初のパラメーターとして、filesys report generate file-locationの出力を2番目のパラメーターとして処理します。出力はハードコードされたファイル名「sfs-dump-output-tiers.csv」に書き込まれますが、これはスクリプト内で変更できます。
出力は、上記で説明したのと同じ方法でExcelを使用して処理できます。
#!/bin/bash
#### WARNING
#### This script is provided to you by Dell Technologies with NO GUARANTEE, as best-effort sample code to match the output from commands :
#### * sfs-dump (in non CSV format)
#### * filesys report generate file-location
#### So that a new CSV with the file paths appearing on both is created for all the data in sfs-dump file with the added tier and placement time information from location report
####
#### This script is not part of Dell PowerProtect / Data Domain, and hence it is not supported
####
#### Usage : extend-sfs-dump-with-tier.sh sfs-dump-output.csv file-location-output.log
#### Output : static "sfs-dump-output-tiers.csv" file name (may be changed below)
#### Replace values below to suit your needs
OUTPUT_FILENAME="sfs-dump-output-tiers.csv"
#### NO CHANGES NEEDED BEYOND THIS POINT
clear
if [ ! $# == 2 ]; then
echo "Combine output from sfs-dump and tier location report into a CSV file with tier and placement time information"
echo
echo "Usage : $0 SFS-DUMP-OUTPUT-FILE REPORT-FILE-LOCATION-FILE"
echo "NOTE : SFS-DUMP-OUTPUT-FILE has to be in non-CSV format"
exit 1
fi
INPUT_SFSDUMP="$1"
INPUT_LOCATION="$2"
echo -n "1/6 : Sanity checking input files..."
if [ ! -s "${INPUT_SFSDUMP}" ]; then
echo "Input file ${INPUT_SFSDUMP} does not exist"
exit 1
fi
if [ ! -s "${INPUT_LOCATION}" ]; then
echo "Input file ${INPUT_LOCATION} does not exist"
exit 1
fi
n_files_sfsdump=`grep ^/ ${INPUT_SFSDUMP} | wc -l`
n_files_location=`grep ^/ ${INPUT_LOCATION} | wc -l`
if [ ${n_files_sfsdump} -eq ${n_files_location} ]; then
echo -n "both have the same amount of files (${n_files_location}). "
else
echo -n "sfs-dump has ${n_files_sfsdump} files whereas location report has ${n_files_location} files, this may be normal if the difference is small. "
fi
echo "Done."
echo -n "2/6 : Sanitize \"file-location\" input..."
cat ${INPUT_LOCATION} | awk 'BEGIN {rejected="temp-location-rejected.log"; accepted="temp-location-accepted.log"} { if ( $0 ~ "Missing -unit") { gsub(/Missing -unit/, "Missing-Cloud-Unit", $0); print $0 > rejected } else { if ($0 ~ "^/" ) print $0 > accepted } }'
if [ -s "temp-location-rejected.log" ]; then
REJECTS_EXIST="yes"
echo -n "Some files in location report sit in unavailable or deleted cloud units, you may need to re-run this script after fixing the issue and gathering a new location report. "
cat temp-location-rejected.log temp-location-accepted.log | sed -e 's/\t/:\t/' | sort > temp-location-report-sorted.log
rm temp-location-rejected.log
else
cat temp-location-accepted.log | sed -e 's/\t/:\t/' | sort > temp-location-report-sorted.log
REJECTS_EXIST="no"
fi
rm temp-location-accepted.log
echo "Done."
echo -n "3/6 : Sanitize \"sfs-dump\" input..."
cat ${INPUT_SFSDUMP} | grep ^/ | sort > temp-sfs-dump.log
echo "Done."
echo -n "4/6 : Merging information for sfs-dump and location report..."
join -1 1 -2 1 temp-sfs-dump.log temp-location-report-sorted.log > temp-merged-information.log
rm temp-sfs-dump.log
rm temp-location-report-sorted.log
n_files_combined=`grep ^/ temp-merged-information.log | wc -l`
if [ ${n_files_combined} -eq 0 ]; then
echo "No files matched from input files. sfs-dump output must NOT be in CSV format. Exiting."
rm temp-merged-information.log
exit 1
fi
echo -n "Input files matched on ${n_files_combined} files. "
echo "Done."
echo -n "5/6 : Converting merged sfs-dump / location-report output to CSV format..."
cat temp-merged-information.log | grep ^/ | grep -v ^$ | awk '
BEGIN {print "name\tmtime\tfileid\tsize\tseg_bytes\tseg_count\tredun_seg_count\tpre_lc_size\tpost_lc_size\ttier\tplacement_time"}
{
colon_index = index($0, ":")
filename = substr($0, 1, colon_index - 1)
gsub(/^[[:space:]]+|[[:space:]]+$/, "", filename)
n = split(substr($0, colon_index + 1), fields, " ")
print filename "\t" fields[2] "\t" fields[4] "\t" fields[6] "\t" fields[10] "\t" fields[12] "\t" fields[14] "\t" fields[17] "\t" fields[19] "\t" fields[27] \
"\t" fields[length(fields)-4] " " fields[length(fields)-3] " " fields[length(fields)-2] " " fields[length(fields)-1] " " fields[length(fields)]
}' > ${OUTPUT_FILENAME}
rm temp-merged-information.log
echo "Done."
echo -n "6/6 : Summary"
echo
echo
echo "Merging information from sfs-dump (${INPUT_SFSDUMP}) and location-report ${INPUT_LOCATION} output completed."
echo "Output file (${OUTPUT_FILENAME}) includes information for a total ${n_files_combined} files, out of ${n_files_sfsdump} in input sfs-dump, and ${n_files_location} in input location report."
if [ "${REJECTS_EXIST}" == "yes" ]; then
echo "Note there are some files in disconnected or deleted cloud units, for which the \"tier\" field has been replaced with \"Missing-Cloud-Unit\"."
fi
echo
echo "Start of file shown below for your convenience :"
echo "===================="
head -5 ${OUTPUT_FILENAME}
echo "===================="
echo
echo "You may follow the instructions in https://www.dell.com/support/kbdoc/000081345 to process this CSV file in an spreadhseet"
echo
echo "Done."
exit 0
Veritas NetBackupユーザーの場合:
Veritas NetBackup (NBU)は、ファイル名の一部としてコロン文字を使用してData Domainにファイルを作成することで知られています。例えば、Data DomainをNBUのバックエンド ストレージとして使用する場合の、有効なNBUファイル名のパスを次に示します。
/data/col1/MTREE_NAME/POLICY-NAME_1400502741_C1_F1:1400502741:VM_PRD-02:4:1:: /data/col1/MTREE_NAME/POLICY-NAME_1400502741_C1_F2:1400502741:VM_PRD-02:4:1:: /data/col1/MTREE_NAME/POLICY-NAME_1400502741_C1_HDR:1400502741:VM_PRD-02:4:1::
これは、コロン文字が sfs_dump コマンドを出力し、上記のスクリプトを実行すると、誤った結果が生成されます。
このような場合は、スクリプトを次のように編集する必要があります。
--- iterate-dd-for-fs-sfs-dump.sh 2024-01-23 06:32:16.521409000 -0500
+++ iterate-dd-for-fs-sfs-dump-NBU.sh 2024-02-27 03:26:42.808246000 -0500
@@ -55,11 +55,11 @@
cat sfs-dump-noCSV.txt | grep ^/ | grep -v ^$ | awk '
BEGIN {print "name\tmtime\tfileid\tsize\tseg_bytes\tseg_count\tredun_seg_count\tpre_lc_size\tpost_lc_size"}
{
- colon_index = index($0, ":")
- filename = substr($0, 1, colon_index - 1)
+ colon_index = index($0, ":::")
+ filename = substr($0, 1, colon_index + 1)
gsub(/^[[:space:]]+|[[:space:]]+$/, "", filename)
n = split(substr($0, colon_index + 1), fields, " ")
- print filename "\t" fields[2] "\t" fields[4] "\t" fields[6] "\t" fields[10] "\t" fields[12] "\t" fields[14] "\t" fields[17] "\t" fields[19]
+ print filename "\t" fields[3] "\t" fields[5] "\t" fields[7] "\t" fields[11] "\t" fields[13] "\t" fields[15] "\t" fields[18] "\t" fields[20] "\t"
}' > sfs-dump-CSV.csv
echo "Done."
Data Domain内のすべてのMTreeを反復処理して、MTreeごとに sfs_dump データをプルするように変更がスクリプトで共有されると、他のスクリプトでも同じように変更されます。ただし、スクリプト自体の場合と同様に、上記の変更は、役立つことを願って、Dellによって保証なしで提供されます。