9

ZFS を実行する NAS を取得したばかりで、ファイルをそこに転送するときに作成時間を保持したいと考えています。linux/ext4 (データが現在ある場所) と zfs ストアの作成時間または誕生時間の両方。zfs の場合、stat コマンドによっても報告されます。しかし、元のファイル システムの作成時刻を反映するように、ファイルの作成時刻を設定する方法がわかりませんでした。ファイル作成時間を設定するスクリプトを debugfs にフィードできる ext4->ext4 転送とは異なります。

ZFS の debugfs に似たツールはありますか?

PS。よりよく説明するには:

  • Ubuntu 14.04 ラップトップに接続された USB ドライブがあります。個々のファイルの作成日 (生年月日) を気にするファイル システムを保持しています。これらの作成タイムスタンプは、debugfs に基づくスクリプトを使用して頻繁に参照し、crtime として報告します。

  • ZFS を実行している NAS ボックスにデータを移動したいのですが、私が知っている方法 (scp -p -r、rsync -a、および tar など、私が試したもの) では変更時刻は保持されますが、作成時刻は保持されません。

  • 別の ext4 ファイル システムに移行する場合は、すばらしいツールを使用して問題を解決しますdebugfs。具体的には、ソース fs (ファイル システム) で (filename, crtime) ペアのリストを作成debugfs -wし、ターゲット fs で使用して、次の形式の行でスクリプトを読み取ることができます。

    set_inode_field filename crtime <value>

私はこれをテストしましたが、問題なく動作します。

  • しかし、私のターゲット fs は ext4 ではなく ZFS でありdebugfs、ターゲット マシンで実行されますが、そこではまったく役に立ちません。fsさえ認識しません。inode を直接編集してタイムスタンプを変更できるもう 1 つのデバッグ ツールは fsdb です。それもターゲットマシンで実行されますが、ZFSファイルシステムを認識できないようです。

  • NAS ボックスを売ってくれた人たちから、debugfs と fsdb は ZFS ファイルシステム向けではないと言われましたが、同等のものを見つけることができませんでした。それで、多くのグーグルと物事を試した後、誰かが答えを持っていることを期待して、今日ここに質問を投稿することにしました.

これがどれだけ大変なことになっているかに驚いています。すべてのタイムスタンプが同一になるようにデータセットを複製する方法の問題は、アーカイブの観点からは非常に自然なことのように思えます。

4

1 に答える 1

5

実際、どちらfsdbdebugfsZFS での使用に適していない可能性があります。crtime代わりに、おそらくファイルサーバー上のファイルに既に設定されている保存フィールドになるアーカイブ形式を見つける必要があるかもしれません。のバージョンpaxまたはシステム用の別のアーカイブ ツールがある場合、これを実行できる可能性があります ( cf.現在のバージョンで表示される「すべて-peを保存する」フラグは、「すべてを保存しない」-つまり、保存しません/出生時間)。「paxcrtimecrtime基本的なツールである可能性が高いものを使用して、ZFS ベースの FreeBSD システムをハッキングして作成時間を設定しようとするよりも、

IllumosSmartOSなどのOpenSolarisベースのシステムでは、より高度なツールを見つけることができる場合があります(例: )。これらのプラットフォームのいずれかでデータを ZFS データセットに転送し、それらのツールを組み合わせて、たとえばフィールドを書き換えることができるかどうかは、より理論的な問題です。それが機能する場合は、プールとそのデータセットを FreeBSD にエクスポートできます。プールをエクスポートすると、タイムスタンプが保持されるようです。ext4 ファイルシステムを同じホスト上のZFSonLinuxデータセットにダンプする際保存できる場合( nb mdbdtracecrtimecrtimecrtimezfs send: これはテストしていません)ファイルシステム全体を NAS に転送するために使用できます。

このコア utils バグ レポートは、Linux のユーザーおよびオペレーティング システム レベルのツールの状態を明らかにする可能性があります。おそらく、crtimeinode のファイルシステム レベル フィールドは変更が難しいはずです。FreeBSD 上のZFSは「サポート」しcrtimeていますが、FreeBSD 上の低レベルのファイルシステム デバッグ ツールの状態は、以前のリリースでは追いついていない可能性があります (マニュアルページzdbを参照)。i ノードの作成時間を「設定」(またはリセット) しますか? それとも、すでにサポートされているシステムに設定した後、それらを保持しますか?

FreeBSD システムでは、ファイルが ZFS データセットに保存されている場合、ファイルのフィールドがフィールドと同じ時刻に設定されているstatことに気付くことがよくあります。これは、ファイルを書き込んだアプリケーションが、ファイルが「生成」され、その i ノード エントリが作成された時点で設定が必要なライブラリおよびカーネル関数にアクセスできなかったためと考えられます。(参照: )などのアプリケーション レベルで保持しようとするアプリケーション/ライブラリの例があり、フィールドをサポートしないファイルシステムでアーカイブが復元された場合に inode の作成を適切に処理します。しかし、それはあなたの場合には関係ないかもしれません。 crtimectimecrtimecrtimelibarchive(3)archive_entry_atime(3)crtime

ご想像のとおり、ファイルシステムにファイルを書き込むアプリケーションはたくさんあります...特に「すべてがファイル」である Unix/POSIX システムでは。これらのフィールドをサポートするために古いアプリケーションを変更または再コンパイルする必要があるかどうか、またはホスト システムの C ライブラリから透過的に取得するかどうかはわかりません。たとえば、古い FreeBSD リリースまたは ext4 を使用しない Linux システムで使用されているアプリケーションは、最新の OS で互換モードで実行することができますが、時間フィールドを適切に処理できるかどうかは問題です。

私にとって、この小さなスクリプトを実行sh birthtime_testして、FreeBSD システムでファイル作成時間が「オン」になっていることを確認します (これらはすべて ZFS ポスト、v28 つまり機能フラグを使用します)。

#!/bin/sh
#birthtime_test
uname -r 
if [ -f new_born ] ; then rm -f new_born ; fi

touch new_born 
sleep 3 
touch -a new_born
sleep 3 
echo "Hello from new_born at:" >> new_born 
echo `date` >> new_born
sleep 3 
chmod o+w new_born

stat -f "Name:%t%N
Born:%t%SB
Access:%t%Sa
Modify:%t%Sm 
Change:%t%Sc" new_born

cat new_born

出力:

9.2-RELEASE-p10
Name:   new_born
Born:   May  7 12:38:35 2015
Access: May  7 12:38:38 2015
Modify: May  7 12:38:41 2015 
Change: May  7 12:38:44 2015
Hello from new_born at:
Thu May 7 12:38:41 EDT 2015

(注: このchmod操作はファイルの内容を「変更」しますが、「変更」しません。これは、echoコマンドがファイルに内容を追加することによって行われることです。および フラグtouchの説明については、マニュアル ページを参照してください)。-m-a

これは、私が現在アクセスできる最も古い FreeBSD リリースです。FreeBSD が (ZFS または UFS2 ファイルシステムで) これを処理できるのはリリースサイクルのどれくらい前か知りたいです。これはかなり長い間機能していると確信しています。この機能に関して知っておくと役立つ ZFS の OSX および Linux バージョンもあります。

あともう一つだけ ...

これは、単純な「フォレンジック」にとって特に優れた機能です。new_born時間が始まったとき、決して起こらなかった閏秒、そして時を超越した時間の瞬間に Unix が生まれたときまでファイルを送り返したいとします... :-) 1 . を使用して日付を変更するだけtouch -dで、誰もnew_bornが古くて賢明だと思いますよね?

いいえ:

~/ % touch -d "1970-01-01T00:00:01" new_born                
~/ % stat -f "Name:%t%N   
Born:%t%SB
Access:%t%Sa
Modify:%t%Sm
Change:%t%Sc" new_born
Name:   new_born
Born:   May  7 12:38:35 2015
Access: Jan  1 00:00:01 1970
Modify: Jan  1 00:00:01 1970 
Change: May  7 13:29:37 2015

実際見た目と同じくらい若い方が常に正直です:-)

時間と Unix - 実用的かつ詩的な主題: 結局のところ、「変化」とは何か。何かを「変更する」または「作成する」とはどういう意味ですか? Silvio さん、すばらしい投稿をありがとうございました。


ファイルのタイムスタンプ フィールドの保存、設定、アーカイブの要件についてより具体的に説明できれば、質問を改善して一般化できます。誤解しないでほしいのですが、これは非常に良い質問であり、今後も長い間投票が続くでしょう。

Dylan Leigh のプレゼンテーションForensic Timestamp Analysis of ZFSを参照するか、Dylan に連絡して情報にアクセスする方法の手がかりを得ることができcrftimeます。


date -u -j -f "%Y-%m-%d:%T" "1970-01-01:00:00:01" "+%s"[1] 最初に主張された伝説がありました。長い (SSL) 前からの秒数は、うるう秒のせいで決して少なくはありません...

于 2015-05-05T21:32:14.693 に答える