reflink
使用できないファイルシステム(ext4)には、同じブロックを持つ多くのファイルを含むフォルダがあります。
このディレクトリの重複排除中にXFSファイルシステムに移動/コピーしたいと思います。 (つまり、コピーされたファイルのブロックがすでに別のファイルに存在する場合は、実際にコピーしたくないので、2番目のブロック参照ポイントは新しいファイルのブロックを指します。)
もちろん、1つのオプションは、最初にすべてのファイルをXFSファイルシステムにコピーし、そこで実行して後でduperemove
重複エントリを削除することです。小さな問題:ターゲットファイルシステムへのランダムアクセスがそれほど高速ではないため、時間がかかることがあります。
したがって、ファイルをコピーするプロセスは、すでにカーネルに、このブロックがすでに存在する他のブロックのコピーであることを知らせる役割を担うと予想されます。
そのようなことは可能ですか?
答え1
より多くのスペースを確保するためにコメントを回答に移動します。
コピーする方法があるかどうかはわかりません。私は多くのドライブを同期し、参照リンクファイルのコピーをたくさん作成するので、そうなることを願っています。 Btrfsは重複排除を実行すると仮定する「転送」メカニズムをサポートします。それでも私はほとんどの場合XFSを使います。
私が見た重複排除ユーティリティは遅いです。遅いだけでなく、とても遅い。少なくとも機械式ドライブではほとんど使用できません。その理由は、ジョブが完全に同期しているため、ディスクが完全に破損しているためです。
私はキャッシュを使用するユーティリティを作成したかったです(カーネルパッチが必要な場合があります)。それほど安全ではありませんが、より高速なので、実際に使用できます。私は誰かがこれを行うのを待っていますが、そのようなユーティリティが存在する場合はこれについて聞きたいと思います。
まだ試していない別のオプションは、ドライブを仮想マシンに接続し、そこで重複排除を実行することです。その後、バックエンドで強制的に「安全でない」キャッシュを有効にできます。もちろんこれは安全ではありませんが、より速いことを願っています。
答え2
編集:これは質問に対する答えではなく、質問されていない質問に対する答えです(重複ファイルを検出して割り当てをキャンセルする方法)。
私のアプローチは、各ファイルのハッシュであるhadlinkを含むディレクトリを作成することです。
ハッシュがすでに存在する場合は、ファイルをハッシュのハードリンクに置き換え、ハッシュファイルがない場合は、ハッシュディレクトリのファイルから新しいハードリンクを作成します。
このような:
#!/bin/bash
dupes=/mnt/xfs/.dupes_dir
for x in "$@"
do
sha=$( sha1sum "$x" | cut -d\ -f1 )
if [ -e $dupes/$sha ]
then
ln -f $dupes/$sha "$x"
else
ln "$x" $dupes/$sha
fi
done