cp -aのより高速な代替手段


9

/ homeを別のディスクに単純に転送するにはcp -a、非常に遅い方法のように思えます。タスクを完了するためのより効率的な方法を知っている必要があります。/ homeを論理ボリュームとしてマウントしていますが、ターゲットディスクはLVMシステムではありません


4
cpが遅い場合、他の方法も遅くなります。ファイル指向のコピーでない限り
デイジー2013年

特定の設定に応じて、ボトルネックを診断してください。noatimeマウントオプションを試して、特にソースファイルシステムへの不要な書き込みを減らすことができます。
エリアストーレスアロヨ2013年

回答:


16

試してみてくださいtarpaxcpio、何かをバッファリングしています。

(cd /home && bsdtar cf - .) |
  pv -trab -B 500M |
  (cd /dest && bsdtar xpSf -)

bsdtar代わりにtar、少なくとも一部のLinuxディストリビューションでtarはGNU tarを使用しているので、bsdtar(からlibarchive)は、拡張属性、ACL、またはLinux属性の保持を処理しないため、代わりに提案します。

pvは最大500Mのデータをバッファリングするため、2つのファイルシステムでの読み取り速度と書き込み速度の変動に適切に対応できます(ただし、実際には、もう1つのディスクより遅いディスクがあり、OSのライトバックメカニズムがそのバッファリングを実行します)まあそれはおそらく多くの違いはありません)。古いバージョンはpvサポートしていません-a(平均速度レポート用)pv -B 200M。そこで単独で使用できます。

いずれの場合cpも、読み取り書き込みを順番に実行するという制限はありません。ここでは2つがtar同時に動作しているので、一方が他方のFSが書き込みを完了するのを待っている間にもう一方が1つのFSを読み取ることができます。

ext4の場合、少なくともソースと同じ大きさのパーティションにコピーする場合は、のclone2fsようntfscloneに機能することも確認してください。つまり、割り当てられたブロックのみを順次コピーするため、回転ストレージがおそらく最も効率的です。

partcloneは、それをいくつかの異なるファイルシステムに一般化します。

ここで、ファイルシステムのクローンを作成するときに考慮すべき点をいくつか紹介します。

複製とは、すべてのディレクトリ、ファイル、およびそれらの内容をコピーすることです...その他すべて。すべてはファイルシステムごとに異なります。従来のUnixファイルシステムの一般的な機能のみを考慮した場合でも、次の点を考慮する必要があります。

  • リンク:シンボリックリンクとハードリンク。場合によっては、絶対シンボリックリンク、またはクローンするファイルシステム/ディレクトリの外を指すシンボリックリンクの処理方法を検討する必要があります
  • 最後の変更、アクセス、変更時間:ファイルシステムAPI(cp、tar、rsync ...)を使用してコピーできるのは最初の2つだけです。
  • スパース性:3GBのディスク容量しか必要としないVMディスクイメージである2TBのスパースファイルがあり、残りはスパースであり、単純なコピーを実行すると宛先ドライブがいっぱいになります。

次にext4、ほとんどのLinuxファイルシステムを検討する場合は、以下を検討する必要があります。

  • ACLおよびその他の拡張属性(に使用されるものなどSELinux
  • 不変または追加専用フラグなどのLinux属性

すべてのツールがそれらのすべてをサポートしているわけではありません。または、サポートしている場合は--sparse--acls...のオプションのように明示的に有効にする必要があります。別のファイルシステムにコピーする場合はrsync、それらがサポートしtarていない場合を考慮する必要があります。同じ機能セットをサポートします。

また、UUID、ルート用に予約されているスペース、fsckの頻度、ジャーナリングの動作、ディレクトリの形式など、ファイルシステム自体の属性を考慮する必要がある場合もあります。

次に、より複雑なファイルシステムがあり、ファイルをコピーして実際にデータをコピーすることはできません。たとえば、zfsまたはbtrfsサブボリュームのスナップショットを作成してそれらを分岐できる場合を考えてみてください...データをコピーするための専用のツールがあります。

すべてを確実にコピーしたい場合は、ブロックデバイス(または可能な場合は少なくとも割り当てられたブロック)のバイト間コピーが最も安全です。ただし、UUIDの衝突の問題に注意してください。これは、より大きなものにコピーすることを意味します(ただし、コピーする前にソースのスナップショットコピーのサイズを変更できます)。


1
GNU tarには、--aclsACLをアーカイブに保存するオプションがあります。そして、(ある種の)エイリアンツールbsdtarが(本質的に)ネイティブなツールよりもうまく処理できるとしたら驚きます...
フォンブランド

@vonbrand。最新バージョンのGNU tarはそのようなオプションをサポートしていないため、tarはそのためにパッチが適用されている必要があります(RedHatにはACL用のGNU tarのパッチがあると思います)。実装が数多く存在するtar(Linux用のstarbsdtartar)、私はGNUのtarは、任意のより良い他のものよりであることを認識していませんよ。GNUツールの選択は、一般的に技術よりも政治的です(たとえばを参照bash)。
ステファンChazelas

1
GNUツールの使用は政治的な選択かもしれませんが、それでもデフォルトの選択です。また、他の選択肢よりもはるかに人気があるため、背後には開発者(およびその他)の人材もいます。
フォンブランド2013年

おかげで、次回はcpではなくpvとtarを使用します
Yurij73

@StéphaneChazelas現在、GNU tar はサポートしています--acls
Ploni 2018

4

たとえば、rsyncをお勧めします。

rsync -av --progress --stats dest orig

または、圧縮して転送するには:

rsync -avz --progress --stats dest orig

1
rsyncより一般的に多くの遅いcptar|tar
ステファンChazelas

この情報をありがとう:)しかし、これら2つを比較したことはありません...
VictorAurélioMar


私はその記事をあまり信用しません。私は頻繁にrsyncを使用しており、定期的に130〜170 MB /秒のコピーを使用しています。
laebshade 2013年

9
rsyncほとんどが効率的です。欠落している/変更されたデータのみが転送されるため、宛先ボリュームでソースデータをすでに部分的に利用できます。高速の「最初のコピー」には使用しません。
2013
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.