Data Domain:Data Domainファイル システム上のファイル(sfs-dump)を一覧表示する方法
Summary: この記事では、Data Domain CLIを使用して、個々のMTreeまたはファイル システム(FS)全体のファイルとディレクトリーのリストをダンプする方法について説明します。これにより、ユーザーはバックアップ アプリケーションからData Domainに保存されているファイルを見つけることができます。
Symptoms
取得されたプロトコルに関係なく、Data Domain FSには、MTreeに編成されたファイル(ディレクトリー内)のみが含まれます。すべてのファイル(Active内のファイルと任意のCloud-Unit内のファイルの両方)は、同じルートとネームスペースを共有します。単一のネームスペースが存在するため、ファイルとディレクトリーのリストには、ActiveとCloud-Unit内のファイルが区別なく含まれます。
詳細なファイル ダンプを取得すると、次のような理由で役立ちます。
- バックアップ アプリケーションによって管理されているファイルのリストと比較し、そのバックアップ アプリケーションから孤立したファイルを特定します。
- 特定の経過時間の閾値を超えるすべてのファイルを一覧表示して、バックアップ アプリケーションがバックアップの保存を正しく実施しているかを判断します。
- 7.13.0.0、7.10.1.15、7.7.5.25、6.2.1.110より前のDDOSの場合
se sfs_dump
- 7.13.0.0、7.10.1.15、7.7.5.25、6.2.1.110以降のDDOSの場合
filesys sfs-dump
Cause
sfs_dumpこの機能にアクセスするために必要だったSEモードは、「DSA-2023-412:複数のセキュリティ脆弱性に対応するDell Technologies PowerProtectセキュリティ アップデート(英語)」で説明されているように廃止されました。
暫定的に、旧
sfs_dump コマンドの一部の機能が使用できませんでしたが、後に再導入されました。したがって、このKBでは、それぞれのケースでのコマンド出力の違いと処理方法について説明します。Resolution
CLIからData Domain内のファイルの詳細リストを取得し、最終的にData Domainに格納されているファイルに関する情報を取得する方法は、実行されているDDOSリリースによって異なります。ファイルの詳細を含むテキスト出力ファイルが収集されたら、すべてのDDOSリリースの出力形式は同じであるため、その出力をより使いやすい形式に変換する処理は常に同じです(またはスクリプトを使用して共通の形式に変換できます)。
すべてのDDOSリリースに共通する要件として、管理者ユーザーとしてData Domainにログインする必要があります。これを行うには、クライアント側でコンソール出力をテキスト ファイルにログ記録できるSSHクライアントを使用します(これにはPuTTYが適しています)。ユーザーは、クライアント コンピューター上のテキスト ファイルに出力を記録するようにSSHクライアントを構成する必要があります(ログに記録される行数または個々の行の長さに制限がないことを確認します)。SSHセッション ログ ファイル(つまり、DDファイル リスト)は、Data Domainではなく、(通常は)SSH接続が開始されたデスクトップ コンピューターに書き込まれます。
SSHセッションの出力を収集する場合は、ファイルに意味のある名前を付け(ダンプするData Domainホスト名やMTree名を追加するなど)、ログ ファイルに十分なスペースがあることを確認します。これは、100万ファイルを含むシステムでは約200 MBになる場合があります。
ファイルのリストを収集するためにDD CLIから実行する正確なコマンドは、使用しているDDOSのバージョンによって異なります。以下にその概要を示します。
DDOSリリース7.13.0.0、7.10.1.15、7.7.5.25、6.2.1.110より前:
これらのリリースでは、se sfs_dump コマンドをサポートしています(および -c オプションでファイルの詳細をそのままCSVとして出力することもできます)。ただし、セキュリティ上の理由からSEモードに移行することは推奨されません。代わりに、利用可能な最新のLTS 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 を使用しない場合、この形式は以降のリリースでも上記に示したものと同じです。(CSV出力の場合)-cを使用した場合、形式は次のようになります(出力の最初の行として表示されるヘッダーを含む)。
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以降:
このリリースでは、SEモードから sfs_dump へのアクセスを提供していません(以下は使用できません)。
se sfs_dumpセキュリティの問題が見つかったため、SEモードは廃止されました。使用する代替コマンドは次のとおりです。コマンド名が若干異なることに注意してください。この場合、表示されるMTreeは「MTree」というキーワードの後に置かれます。
# filesys sfs-dump mtree <mtree-path>見出しのリリースの場合、このsfs-dumpコマンドは
se sfsa_dump)をリロードするには、次を実行します。
- 新しいコマンドは、ファイル情報をCSV(列)形式でダンプする
-cオプションをサポートしていません。 - 新しいコマンドでは、一度に1つのMTreeしか実行できません。1回の呼び出しでFS全体に対して実行することはできません
# mtree list次のコマンドの出力は、前の
se sfs_dump コマンドの出力と同じです( -c オプションなしで使用した場合)。
filesys sfs-dump出力をディスクに書き込むように構成された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以降:
お客様からの要望により、旧se sfs_dump コマンドの一部の機能が再導入され、 filesys sfs-dump コマンドで使用できるようになりました。その機能は次のとおりです。
- 出力をCSVに似た形式のバージョン(列で区切られたフィールド)で出力できる、
-cオプションを追加可能 - FS内のすべてのファイルのファイル ダンプ情報を一度に実行可能
#### 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」と呼ばれる)は、係数がx9.09(136,794から15,045バイト)です。
- ファイルのローカル圧縮(ローカル圧縮を指す「lcomp」と呼ばれる)は、係数が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を決定する(パスが特定のバックアップ サーバー、クライアント、ポリシー、ジョブなどに一致する場合)
- 特定の場所に保存されている一定期間より古いデータ量(事前圧縮)を計算する(孤立したデータの特定や、バックアップ アプリケーションが期限切れのバックアップを時間通りに失効しない問題のトラブルシューティングを行うため)
- その他のタイプの統計の用途
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ファイルからスプレッドシートを構築する、より単純な(ただし限定的な)アプローチを求めていると考えられます。
デル・テクノロジーズは、以下の手順が正しく、正常に機能し、ユーザーにとって有用であることを保証できるよう努めていますが、これらの手順がお客様に適していることは保証できず、サポート範囲外であるため、サポートは提供できません。
CSV形式の sfs_dump 出力をスプレッドシートにインポートする方法(Excelの例):
ファイルの詳細リストのCSVバージョンが入手できたら、データから情報を得る方法の1つとして、データをスプレッドシートソフトウェアにロードします。Microsoft Excelを例として使用しますが、他のソフトウェアでも同様の手順が必要です。CSVテキスト ファイルをCSVとしてExcelにインポートするには、次の手順に従います。
- Excelを開き、新しい空白のスプレッドシートを作成します。
- 上部の[データ]メニューに移動し、[テキストまたはCSVから]という名前のアイコンをクリックします。
- ダイアログを使用して、CSV形式のファイル データ(CSV以外の形式からの変換スクリプトの例にあるように
sfs-dump-CSV.csv)を参照し、それを選択して[インポート]をクリックします。 - 入力ファイルの形式が正しく、Excelが最初の200行から形式を描画できる場合(できるはずです)、ダイアログに生成されるスプレッドシートのプレビューが表示されます。情報を確認して、最初の行がヘッダーとして検出されていることを含め、問題がないことを確認します。
- プレビューですべて問題がなければ、ダイアログの下部にある[読み込み]ボタンをクリックすると、新しいスプレッドシートが適切なフォーマットで表示され、フィールド ヘッダーが検索およびフィルター対応に変わります。
適切にインポートされた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に貼り付け、スプレッドシートの残りの行の各セルにも貼り付けます。
- スプレッドシート全体の数式を計算し、設定された形式で日付と時刻の値を表示します。
- 列を既存の列としてフォーマットし、ヘッダーを日付フィルターを適用可能な日付として構成します。あとは、列の適切な名前(日付)を設定するだけです。
圧縮情報
- 次の数式をコピーし、[形式を選択して貼り付け]でテキストとしてセル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」をクリックします。
Additional Information
ファイルの場所(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はジョブに適していない可能性があります(遅すぎる)。
使用しているExcelのバージョンに対して
sfs_dump 出力のファイル数が多すぎる場合や、パフォーマンスのためにデータを小さなビットで処理したい場合は、MTreeごとに手順を1回実行して、システムに複数のスプレッドシートを作成することができます。
単一MTreeの
sfs_dump コマンドの出力がExcel対して大きすぎる場合でも、split Linuxコマンド(または大きなテキスト ファイルをオンラインでエンド境界に分割する他の同様のツール)を使用して、いくつかの小さな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.60.36.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によって保証なしで提供されています。