バックグラウンド
私はスペースを使い果たしたの/home/data
と移す必要/home/data/repo
に/home/data2
。
/home/data/repo
1Mのdirsが含まれ、それぞれに11のdirsと10のファイルが含まれます。合計2TBです。
/home/data
dir_indexが有効なext3にあります。
/home/data2
ext4にあります。CentOS 6.4の実行。
これらのアプローチは、repo/
その直下に100万個のdirsがあるという事実のために遅いと思います。
試行1:mv
高速ですが、中断されます
これが終わっていれば、私はできました:
/home/data> mv repo ../data2
しかし、1.5TBが転送された後に中断されました。約1GB / minで書き込みを行っていました。
試行2:rsync
ファイルリストを作成してから8時間後にクロールする
/home/data> rsync --ignore-existing -rv repo ../data2
「増分ファイルリスト」を作成するのに数時間かかり、100MB /分で転送しました。
より高速なアプローチを試すためにキャンセルします。
試行3a:mv
文句を言う
サブディレクトリでテストする:
/home/data/repo> mv -f foobar ../../data2/repo/
mv: inter-device move failed: '(foobar)' to '../../data2/repo/foobar'; unable to remove target: Is a directory
私はこれが何についてのエラーであるかcp
わかりませんが、多分私を救うことができます。
試行3b:cp
8時間後に何も得られない
/home/data> cp -nr repo ../data2
ディスクを8時間読み取り、キャンセルしてrsyncに戻ることにしました。
試行4:rsync
ファイルリストを作成してから8時間後にクロールする
/home/data> rsync --ignore-existing --remove-source-files -rv repo ../data2
--remove-source-files
今すぐクリーンアップを開始すると、それが速くなるかもしれないと考えて使用しました。
ファイルリストの作成には少なくとも6時間かかり、100〜200MB /分で転送します。
しかし、サーバーには一晩で負担がかかり、接続は閉じられました。
試行5:移動するのに300GBしか残っていない理由
/home/data> rsync --ignore-existing --remove-source-files -rvW repo ../data2
再び中断されました。これ-W
により、「増分ファイルリストの送信」が高速化されたように見えましたが、これは理にかなっていないはずです。とにかく、転送はひどく遅く、私はこれをあきらめています。
試行6: tar
/home/data> nohup tar cf - . |(cd ../data2; tar xvfk -)
基本的に、すべてを再コピーしようとしますが、既存のファイルは無視します。1.7TBの既存のファイルを処理する必要がありますが、少なくとも1.2GB / minで読み取りを行っています。
これまでのところ、これは即座に満足を与える唯一のコマンドです。
更新:nohupでさえ、何らかの形で再び中断されました。
試行7:ハラキリ
まだこれを議論しています
試行8:スクリプト化された「マージ」 mv
宛先ディレクトリには約120kの空のディレクトリがあったので、実行しました
/home/data2/repo> find . -type d -empty -exec rmdir {} \;
Rubyスクリプト:
SRC = "/home/data/repo"
DEST = "/home/data2/repo"
`ls #{SRC} --color=never > lst1.tmp`
`ls #{DEST} --color=never > lst2.tmp`
`diff lst1.tmp lst2.tmp | grep '<' > /home/data/missing.tmp`
t = `cat /home/data/missing.tmp | wc -l`.to_i
puts "Todo: #{t}"
# Manually `mv` each missing directory
File.open('missing.tmp').each do |line|
dir = line.strip.gsub('< ', '')
puts `mv #{SRC}/#{dir} #{DEST}/`
end
できました。
mv
もう一度しませんか?理論的にはmv
、それはので、先のファイルが完全にコピーされた場合にのみ、ソースファイルを削除しますする必要があり、[OK]を動作します。また、マシンに物理的にアクセスできますか、またはこれはssh
接続を介して行われますか?
mv
寛容ではありません。切断され続けると、データを失い、それを知ることさえできません。あなたがこれをやっていると言ったようにssh
、私は使用screen
して切り離すことを強くお勧めします。ロギングを有効にして、その方法を追跡します。冗長を使用している場合は、さらに時間がかかります。また、試してくださいiotop
screen
。詳細については疑問に思っていましたが、tar
今すぐ再起動するには遅すぎます。そして、iotop
最後の数日間:)のために私の好きなユーティリティとなっている