web-dev-qa-db-ja.com

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

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

89
Juggler

よく使う

> cp -ax / /mnt

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

-xはそれを1つのファイルシステムに保存します。

もちろんこれはrootまたはSudoを使って行う必要があります。

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

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

32
WolfmanJM

欲しいのは 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のデルタ転送アルゴリズムの本当の利点はネットワーク使用量を減らすことであるため、これはソースと宛先の両方がローカルパスとして指定されている場合のデフォルトです。

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

182

Michael Aaron Safyanの答えはスパースファイルを説明するものではありません。 -Sオプションはそれを修正します。

また、この亜種は進行中の各ファイルをスパムすることはなく、ネットワーク以外の場合にパフォーマンスを低下させるデルタ同期も行いません。

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

rsync -axHAWXS --numeric-ids --info=progress2
34
Ilia Sidorenko

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

たとえば、ローカルバックアップやリモートバックアップのような大きな作業の場合は、rsyncが最適です。

もちろん、rsyncの使用はかなり複雑です。

なぜrsync:

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

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

  • そして最後に大事なことを言い忘れたが、rsyncはssh接続を使うので、これはあなたが遠隔同期化された安全な「コピー」を達成することを可能にする。いくつかの例については、 のマニュアルページを参照してください 。 。

6
hornetbzz

Michael Safyanが上記で示唆したように、私はこの目的のためにrsyncを使いました。おそらくコピーしたくないディレクトリを除外するために、いくつかの追加オプションを使用することをお勧めします。

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

最後の行は 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
3
Dan

rsync

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

から:

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

マニュアルページ こちら

2
Mauro Colella

スレッドに2つの有用なビットを追加してください:暗号の変更と--updateの使用:

Wolfmanの投稿によれば、cp -axはエレガントで、地元のものにはぴったりです。

しかし、rsyncも素晴らしいです。 Michaelの答えに加えて(-W)、暗号を変更することもスピードを上げることができます(ただし、セキュリティへの影響についてはお読みください)。

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

遅いCPUが実際のボトルネックになっていることについては、 議論(およびベンチマーク) がありますが、machineがロードされたときには役に立ちます。同時に他のことをする。

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

(--updateと--whole-fileを一緒にした場合の影響がどのようなものであるかはわかりませんが、このようなタスクでは、それらは常に賢明に機能するようです)。

私はこれがrsyncの機能に関するスレッドではないことを理解していますが、私がこれに使用する最も一般的なもののいくつかは以下のとおりです。

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

ちなみに、私がwindowsを使わなければならないのなら、私はcygwinのrsyncを使って大きな再帰的なコピーを作成します。(エクスプローラはOS Xでさえもっと悪いとは思いますが)

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
2

'dd'はすごいですが、ddrescue(apt install gddrescue)の方がさらに良いです。 ddが中断された場合、再起動する方法はありません(rsyncを使用するもう1つの良い理由)。ログファイルと一緒にddrescueを使用すると、どのブロックがコピーされたかが追跡されます。

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

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

誰かがddrescueのためのntfsclone「特別な画像フォーマット」を考え出してください...

1
ECJB

rsyncは上で説明したように完璧な解決策です。

Docker devicemapperボリュームなどがコピーされる場合は、「スパースファイルを効率的に処理する」に-Sを追加するだけです。

0
Jürgen Weigert

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

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

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

  1. パーティションのクローン(使用部分のみ)
  2. ファイルシステムがo.kであることを確認してください。 (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をインストールします(Debianベースのシステムではapt-get install partclone)。

0
Thawn