anopara

Linuxで他のマシンに大量のファイルを同期・移動させる

よくやるのでメモ。

お手軽な方法

1ファイルだけ、とかいう場合はscpがもっとも直感的だ。

scp -r source/dir dest-server:dest/dir

ちゃんと同期させたい場合

rsyncが第一選択肢になるはず。

rsync -avz source/dir/ dest-server:dest/dir/

大量のファイルがある場合

今回のメインのお話はここ。

rsyncはファイルが大量にある場合だとかなり遅い。また、rootでしか読めない権限のファイルを送る場合、安易にsudoなどを打ってしまうといつも使っているであろう .ssh/config を読んでくれないので面倒くさいことになる。

こういう場合はもうtarアーカイブにするのが経験上、最も早いし楽だしコマンドも覚えやすい。ただ、tarを作ってそれをscpで送って…とするとストレージの読み書きを直列で経由してしまうので遅くなってしまう。なので、netcatで作ったそばから送って解凍するのが一番早い。さらに、圧縮も早くて圧縮率の高いzstdを並列で使う(pzstd)とさらに良いと思う。多分。

要するに、こうすればよい。

ファイルを受け取る側で以下を実行:

nc -l 8000 | pzstd -d | tar xvf -

ファイルを送る側で以下を実行:

tar cvf - dir1 dir2 dir3 | pzstd | nc dest-server 8000

こうすると、一番早く、ディスク容量を必要とせず転送できると思う。

もし、途中で失敗してしまったり、ちゃんと同期できたか不安な場合はもう一度rsyncをかければよい。

なお、経験上zstdの圧縮レベルはデフォルトが一番良い。高くしても時間がかかる割にそこまで圧縮率が変わらない。なんか経験上の話ばっかりですが以上です。

トップページに戻る