あるドライブから別のドライブにファイルシステム階層全体をコピーする


95

あるドライブから別のドライブにファイルシステム階層全体をコピーしたいのです。つまり、各ディレクトリの内容とLinuxプラットフォームの通常のファイルです。おそらくLinuxの組み込み関数を使用してそれを行うための最良の方法を知ることに感謝します。ファイルシステムはextファミリです。


1
うーん...どこへの愛はありddますか?dd if=/dev/sda1 of=/dev/sdb1 bs=4096
juniorRubyist

@juniorRubyist ddの+1。私はいつもそれを使います。しかし、どのフラグを使用するのでしょうか?を使用しますconv=notrunc,noerror,sync
ベニベラ

-1のためのdd2つの理由のために:まず、それは(のためのケースである実装されているファイルシステムのブロックレベルのコピーを実行するために悪い考えだ/)と第二ddのようなファイルシステム内に取り付けられたソースからデータをコピーしないであろう/boot/home
エリック

回答:


33

よく使う

> cp -ax / /mnt

/ mntが/ mntにマウントされた新しいディスクであり、/に他のマウントがないと仮定します。

-xは、1つのファイルシステムに保持します。

もちろん、これはルートとして、またはsudoを使用して行う必要があります。

このリンクには、上記のものを含むいくつかの選択肢があります

http://linuxdocs.org/HOWTOs/mini/Hard-Disk-Upgrade/copy.html


これは死んだ古い答えがある一方、まだあなたが通常、すべてのものがで提示コピーしたくないことは注目に値する/除く、すなわち/dev/sys/procなどしたがってことを発行する前にcp、私は(もrsyncのを使用して)、より良いアプローチを探してお勧め
マルチンOrlowski

2
@MarcinOrlowski WolfJMの-xフラグの使用は、言及した合成ファイルシステムがコピーされないことを意味します。
ジムL.

192

必要なのはrsyncです。

このコマンドを使用して、フォルダーを同期し、途中で中断されたときにコピーを再開することもできます。1つのディスクをコピーするコマンドは次のとおりです。

rsync -avxHAX --progress / /new-disk/

オプションは次のとおりです。

-a  : all files, with permissions, etc..
-v  : verbose, mention files
-x  : stay on one file system
-H  : preserve hard links (not included with -a)
-A  : preserve ACLs/permissions (not included with -a)
-X  : preserve extended attributes (not included with -a)

コピー速度を改善するには、ファイルのデルタ/差分の計算を避けるために-W--whole-file)を追加します。これは、ソースと宛先の両方がローカルパスとして指定されている場合のデフォルトです。rsyncのデルタ転送アルゴリズムの本当の利点は、ネットワークの使用量が削減されるためです。

また--numeric-ids、ユーザー/グループ名によるuid / gid値のマッピングを避けるために追加することを検討してください。


1
天才、ありがとう。ところで、私は使用することになったrsync -avxHAWX --numeric-ids --progress / mnt/が、私はやるべきだったrsync -avxHAWX --numeric-ids --progress / mnt/ > ~/rsync.out。ターミナルに出力を注ぐと、プロセスが遅くなったと思われます。:D
クリスK 14年

28
--info=progress2代わりに、--progress個々のファイル(数百万行)の代わりに全体的な進捗状況を提供するため、大規模な転送に役立ちます。
フロリアン

3
Mac では拡張属性とACLがカバーされているためXAとを置き換える必要がありました。テスト済み:EErsync version 2.6.9 protocol version 29
ジョナサンコマー

1
に加えて> ~/rsync.out2> ~/rsync.errエラーを別のファイルに保存します。
アニール

2
あなたには、いくつかの他のフォルダからコピーする場合よりも、/最後のスラッシュを持つ(またはしない)ことに注意し、ソースディレクトリに違います:rsync source/ dest/内部のコピーのすべてsource/にしdest/ながら、rsync source dest/コピーしたフォルダsourceおよび内部へのすべてのものdest/

45

Michael Aaron Safyanの答えは、スパースファイルを考慮していません。-Sオプションはそれを修正します。

また、この亜種は、各ファイルの進行に伴ってスパムを送信せず、ネットワーク以外の場合のパフォーマンスを低下させるデルタ同期を行いません。

あるローカルドライブから別のローカルドライブにファイルシステムをコピーするのに最適です。

rsync -axHAWXS --numeric-ids --info=progress2

1
すごい。これは本当に良い仕事をしている
ジルダ

1
これは受け入れられた答えであるはずで、うまくいきます。例55,431,669,792 57% 97.47MB/s 0:06:56 xfr#2888, ir-chk=5593/8534)
ドリュー

1
<3これは完璧です
ティムストライドホルスト

6

あるドライブから別のドライブへのワンショットローカルコピーの場合、上記のWolfmannで説明されているようにcpで十分だと思います

たとえば、ローカルまたはリモートバックアップなどの大規模な作業の場合、最適なのはrsyncです。

もちろん、rsyncの使用は非常に複雑です。

なぜrsync:

  • これにより、ドライブAのすべてまたは一部をドライブBにコピー(同期コピー)できます。コピーからいくつかのディレクトリを除外する(たとえば、/ procを除外する)など、多くのオプションがあります。

  • もう1つの大きな利点は、このネイティブツールがファイル転送を監視することです。たとえば、大量の転送の場合、接続が中断された場合、ブレークポイントから続行されます。

  • 最後に重要なことですが、rsyncはssh接続を使用するため、リモートで同期された安全な「コピー」を実現できます。いくつかの例については、manページこちらをご覧ください


4

マイケル・サフィアンが上で提案したように、私はrsyncこの目的に使用しました。おそらくコピーしたくないディレクトリを除外するために、いくつかの追加オプションを使用することをお勧めします。

このバージョンには、Gnomeに固有のユーザーのホームディレクトリのサブディレクトリとAPTパッケージキャッシュが含まれているため、GnomeおよびDebian / Ubuntuベースのシステムにかなり固有です。

最後の行は、cache / Cache / .cacheという名前のディレクトリを除外します。これは、用途によっては攻撃的すぎる場合があります。

rsync -WavxHAX --delete-excluded --progress \
  /mnt/from/ /mnt/to/
  --exclude='/home/*/.gvfs' \
  --exclude='/home/*/.local/share/Trash' \
  --exclude='/var/run/*' \
  --exclude='/var/lock/*' \
  --exclude='/lib/modules/*/volatile/.mounted' \
  --exclude='/var/cache/apt/archives/*' \
  --exclude='/home/*/.mozilla/firefox/*/Cache' \
  --exclude='/home/*/.cache/chromium'
  --exclude='home/*/.thumbnails' \
  --exclude=.cache --exclude Cache --exclude cache

2

スレッドre rsyncに2つの有用なビットを追加します:暗号の変更と使用--update

ウルフマンの投稿によるcp -axと、エレガントであり、地元のスタッフにとってはクールです。

しかし、rsyncまた素晴らしいです。Michaelの答えre -Wに加えて、暗号変更することで速度を上げることもできます(ただし、セキュリティへの影響を調べてください)。

rsync --progress --rsh="ssh -c blowfish" / /mnt/dest -auvx

遅いCPUが実際のボトルネックであるという点については、いくつかの議論(およびベンチマーク)がありますが、他の並行処理を行っているマシンがロードされると、助けになるようです。

このような大きな再帰コピーでrsyncを使用する他の大きな理由の1つは、-uスイッチ(または--update)によるものです。コピー中に問題が発生した場合、それを修正することができ、rsyncは中断したところから再開します(scpにこれがあるとは思わない)。ローカルで実行する場合、cpには-uスイッチもあります。

(--updateと--- whole-fileの意味が何であるかは定かではありませんが、このタイプのタスクでは常に賢明に動作するようです)

これはrsyncの機能に関するスレッドではありませんが、これに使用する最も一般的なものは次のとおりです。

  • --delete-afterなど(フォローアップでMichaelが言及したように)、新しいシステムを元の場所などに同期したい場合。そして、
  • --exclude-ディレクトリ/ファイルをスキップします。たとえば、ユーザーのホームディレクトリなどをスキップしながら新しいシステムを新しい場所にコピー/作成します(他の場所からホームをマウントするか、新しいユーザーを作成するなど)。

ちなみに、エクスプローラーが少し頭がおかしいので、最初から開始したいので、ウィンドウを使用する必要がある場合、cygwinのrsyncを使用して大規模な再帰コピーを実行します(ただし、FinderはOS Xの方がさらに悪いです)


2

rsync

「このアプローチは、異なるサイズ、パーティションテーブル、ファイルシステムを使用できるため、ddを使用したディスククローン作成よりも優れていると考えられます。また、cp -aを使用したコピーよりも優れています。 、アクセス制御リスト(ACL)および拡張属性。」

から:

https://wiki.archlinux.org/index.php/Full_system_backup_with_rsync

マニュアルページはこちら


2

juniorRubyistのコメントで述べたように、ここで推奨されるアプローチはを使用することddです。主な理由はパフォーマンスです。ファイルごとではなくブロックごとのコピーです。

パーティションの複製

# dd if=/dev/sda1 of=/dev/sdb1 bs=64K conv=noerror,sync status=progress

ディスク全体のクローン作成

# dd if=/dev/sdX of=/dev/sdY bs=64K conv=noerror,sync status=progress

参照資料

  1. https://wiki.archlinux.org/index.php/disk_cloning

dd2つの理由から非常に悪い考えです。まず、マウントされているファイルシステムのブロックレベルのコピーを実行すると(これは/)、ターゲットファイルシステムエラーが発生する可能性が高く、次にddマウントされたソースからデータをコピーしません/bootやなどのファイルシステム/home。リンクは、「ファイル階層」のクローン作成ではなく、ディスクのクローン作成に有効です
Eric

1

「dd」は素晴らしいですが、ddrescue(apt install gddrescue)はさらに優れています。ddが中断された場合、再起動する方法はありません(rsyncを使用するもう1つの正当な理由)。ログファイルでddrescueを使用すると、コピーされたブロックを追跡します。

デュアルブートWindows / Linuxシステムをバックアップするとき、Windowsパーティションにはntfscloneを、Linuxパーティションにはddrescueを、MBRにはddrescueを使用します。(GPT / UEFIを使用してデュアルブートシステムをバックアップしようとしませんでした。)

私が見たいのは、未割り当て領域が制御文字でマークされているntfscloneなどのファイルを作成できるddrescueツールです。これにより、イメージは直接マウントできなくなりますが、含まれるデータと同じ大きさになるだけです。

誰かがddfscloneのddrescue用の「特別な画像形式」を考え出してください...


0

rsync 上で説明したように完璧なソリューションです。

コピーするdocker devicemapperボリュームなどが存在する場合に備えて、「スパースファイルの効率的な処理-S」に追加します


0

ここで提案したrsyncコマンドを試してみましたが、最終的には、よりきれいで高速な結果が得られましたpartclone。ソースパーティションとターゲットパーティションをアンマウントしてから、次を実行します。

partclone.ext4 -b -s /dev/sd(source) -o /dev/sd(target)
e2fsck -f /dev/sd(target)
resize2fs /dev/sd(target)

これにより、次の手順が実行されます。

  1. パーティションのクローン(使用部分のみ)
  2. ファイルシステムが正常であることを確認してください(resize2fsはこのステップを強制します)
  3. パーティションのサイズを新しいファイルシステムに変更します

上記は、ターゲットパーティションがソースと同じサイズまたはそれより大きい場合に機能します。ターゲットがソースより小さい(ただし、すべてのデータに適合する)場合は、次を実行します。

e2fsck -f /dev/sd(target)
resize2fs -M /dev/sd(target)
partclone.ext4 -b -s /dev/sd(source) -o /dev/sd(target)
resize2fs /dev/sd(target)

resize2fs -M データを複製する前に、ファイルシステムを最小サイズに縮小します。

partcloneほとんどのシステムにはデフォルトでインストールされていないことに注意してください。clonezillaなどのライブディストリビューションを使用するか、ディストリビューションパケットマネージャーからpartcloneをインストールします(apt-get install partcloneDebianベースのシステムで)。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.