
ディレクトリツリーのすべての一般的なファイルを所定の位置に書き換えるか、新しいinodeを作成して書き換えるために使用できるコマンドラインツールはありますか?
そして所定の位置にファイルを書き換える、私の言葉は、読み取りと書き込みのためにファイルを開き、適切なサイズのチャンクを読み取り、そのチャンクを同じ場所に書き込むことです。ファイル全体に対してこれを行います。デフォルトでは、このコマンドラインが実行する操作は次のとおりです。
find dir -type f -print0 | xargs -0 -n1 bash -c 'dd if="$1" of="$1" conv=notrunc bs=64M' -
逆に、新しい inode が生成されると、次のコマンドが実行するように、可能であればファイル属性を置き換える必要があります。
find dir -type f -print0 | xargs -0 -n1 bash -c 'echo "$1"; cp -a "$1" "$1~" && mv "$1~" "$1"' -
背景:
適切な場合は、ZFS重複排除を使用するための経験を積んでベストプラクティスを見つけようとしています。 ZFS重複排除の使用法DDT(重複排除テーブル) ファイルで指定されたサイズのブロックで動作します。レコードサイズこれは重複排除効率とメモリ使用量に影響します。作成したデータを移行してDDTの使用を中止したり、ファイルレコードサイズを変更したりする可能性を探しています。 ZFSは記録されたデータに対してこれらのパラメータを自動的に変更しないため、データを再構築する必要があります。
DDTを使用するかどうかを変更するには、その場所でデータを再作成するだけです(新しいファイルを作成する必要はありません)。ただし、ファイルのレコードサイズは作成時に決定されるため、変更するには新しいファイルを作成する必要があります。
答え1
私はこれを行うことができるツールを作成しました。
https://github.com/pjd/filerewrite
または、ZFSを使用してターゲットファイルシステムで重複排除が有効になっているzfs send / recvを使用することもできます。次に、ファイルシステムの名前を変更し、他のすべてのファイルシステムプロパティが移動されたことを確認する必要があります。
答え2
(この質問は、私がこの記事を書いた時点で1年が経過しましたが、私のコメントキューに表示されているので、他の人が同様の要件を検索している場合に答えます。)
そのようなツールが存在する可能性はほとんどありませんそしてさまざまなファイルシステムタイプ、特にシステムルートツリーのさまざまなポイントに複数のファイルシステムタイプをマウントできる*nixシステムで安定しています。その理由は、一部のファイルシステムが「後ろから」追加の操作を実行する可能性があり、ファイルデータの書き換えによって書き換えが同じ場所で行われるという保証がないためです(実際には、ZFSでこれを正確に実行するだけです)。 )。重複を削除するには! )ファイルシステム自体がすでにその機能をサポートしていない限り。
読み取り+書き込みモードでファイルを開き、ブロックを読み取り、ブロックの先頭に戻り、書き直す高速プログラムを作成できます。これがZFS重複排除に適用されるのか、それとも他のどのタイプの問題が発生するのかは不明です。たとえば、暗号化されたファイルシステムでは、ファイルを再暗号化するか、物理ストレージデバイスに物理的に保存されている場所に移動する必要があります。これは、特定の要件に従ってこれらのツールを直接作成する必要がある理由の一部です。
別の方法は、ファイルツリーをバックアップし、元のファイルからバックアップを復元することです。ただし、前述したように、これにはある種のバックアップストア(同じ物理ディスク上の別の場所にある単純なtarファイルかもしれません)が必要で、バックアップと復元のオプションを適切に選択する必要があります。
最後の手段として、ディレクトリツリーの名前を別の場所に変更し、一度に1つのファイルをコピーして再作成することができます(新しいファイルが安全にコピーされたことを確認したら、古いファイルを削除してスペースを解放します)。最大の単一ファイルのコピーを作成するには、まだ十分な追加の記憶領域が必要です。ほとんどの場合、これは簡単に避けられません。特に、ファイルシステムドライバがデータが実際に変更されていないことを認識するのに十分効率的であることを試み(ブロックハッシュ/チェックサムを維持)、不要な書き込みを単に削除する場合は、 。コンピュータの場合、メモリ間動作はメモリ間動作よりもはるかに高速です。