web-dev-qa-db-ja.com

同じファイルへのbash強制コピー

私たちのシステム管理者は、ハードドライブのスナップショットを作成するバックアップシステムを作成しました。

スナップショットから古いバージョンを復元しようとすると、次のようになります。

cp /path/to/snapshots/foo.bar /path/to/folder/foo.bar

エラーが発生します:

cp: `/path/to/snapshots/foo.bar' and  `/path/to/folder/foo.bar' are the same file. 

ファイルを削除してコピーすることはできますが、cpでこれを行う方法があるかどうか知りたいと思いました。

次の理由により、ファイルがリンクされていないことがわかります。

  1. ソースのコンテンツを変更でき、スナップショットは変更されません(テスト済み)
  2. ソースを削除でき、スナップショットは復元するためにあります(テスト済み)
  3. ファイルは大学の計算クラスタに保存されています。もしそのようなことが真実なら、誰かはすでに解雇されたでしょう(または少なくとも叫びました)。

それにもかかわらず、inodeファイルの数は同じです

クラスターはRed Hat Linux上で実装されており、ファイルシステムが何であるかわかりません

df結果:

Filesystem           1K-blocks      Used Available Use% Mounted on
<ipadress>:/vol/hpc/storage
                      67633152  67633152         0 100% /storage
<ipadress>:/vol/hpc/storage
                     2186805248 982498048 1204307200  45% /storage

統計結果:

  File: `/path/to/snapshots/foo.bar'
  Size: 404         Blocks: 8          IO Block: 4096   regular file
Device: 17h/23d Inode: 19750461    Links: 1
Access: (0644/-rw-r--r--)  Uid: (<num1>/  yotama9)   Gid: ( <num2>/ <groupname>)
Access: 2012-01-22 00:03:27.246852000 +0200
Modify: 2012-01-19 23:10:32.746397000 +0200
Change: 2012-01-19 23:10:32.746397000 +0200
  File: `/path/to/folder/foo.bar'
  Size: 404         Blocks: 8          IO Block: 4096   regular file
Device: 17h/23d Inode: 26335134    Links: 1
Access: (0644/-rw-r--r--)  Uid: (<num1>/  yotama9)   Gid: ( <num2>/ <groupname>)
Access: 2012-01-24 16:03:48.732453000 +0200
Modify: 2012-01-24 16:03:30.728900000 +0200
Change: 2012-01-24 16:03:30.728900000 +0200
7
Yotam

通常、ファイルシステムの実装は、特定のマシンの任意の時点で、各ファイルがデバイスID( stat構造体のst_devフィールドの組み合わせ)によって一意に識別できることをアプリケーションプログラムに保証することになっています。 )とそのiノード(st_inoフィールド)。デバイスIDは、ファイルがマウントされているファイルシステムを示し、iノードは特定のファイルシステム内の1つのファイルを特徴付けます。 cpは、2つのファイルが同じデバイスIDと同じiノードを持っている場合、それらが同一であると見なします。

LocalhostへのNFSマウントなどのさまざまな方法でアクセスされる場合、ファイルに複数の(デバイスID、iノード)ペアを設定することができます(このようなシナリオはエキゾチックな傾向があります)。

異なるファイルが同じ(デバイスID、iノード)ペアを持つことはできません。ただし、これはファイルシステムの実装次第です。スナップショットを変更せずにソースのコンテンツを変更できる場合、スナップショットはソースとは異なるデバイスIDを示すと思いますが、一部の実装ではこれが行われない可能性があります。

ファイルを変更する以外は、テストでは何も証明されないことに注意してください。 1つのハードリンクを削除しても、ファイルの他の名前は削除されません。スナップショットではオンデマンドでのみファイルをコピーするのが一般的であるため、スナップショット内のファイルがスナップショット外のファイルとまったく同じであれば、ファイルの内容が同じである限り異常ではありません。通常、iノード番号は同じままです。

ファイルを変更するときは、1つのファイルを削除せずに、同じ名前で別のファイルを作成した直後に、同じファイルに書き込んでいることを確認してください。

同じデバイスIDと同じiノードで内容が異なる2つの異なるファイル(スナップショットとソース)がある場合、ほとんどのアプリケーションはそれらが同じであると信じます。スナップショットテクノロジーに依存するファイルの等価性をテストする方法を見つける必要があります。それ以外の場合は、両側のコンテンツをチェックサムするか、ターゲットを体系的に削除する必要があります。