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