ファイルシステム階層全体を1つのドライブから別のドライブにコピーする
私は、あるドライブから別のドライブにファイルシステム階層全体をコピーしたいと思います。Linuxプラットフォームの通常のファイルだけでなく、各ディレクトリの内容をコピーしたいのですが、おそらくLinuxの内蔵関数を使用してそれを行うための最良の方法を知っているとありがたいです。ファイルシステムはextファミリーです。
私は、あるドライブから別のドライブにファイルシステム階層全体をコピーしたいと思います。Linuxプラットフォームの通常のファイルだけでなく、各ディレクトリの内容をコピーしたいのですが、おそらくLinuxの内蔵関数を使用してそれを行うための最良の方法を知っているとありがたいです。ファイルシステムはextファミリーです。
欲しいのは 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
を追加することも検討してください。
Michael Aaron Safyanの答えは疎なファイルを考慮していません。-S
オプションはこれを修正しています。
また、このバリアントは各ファイルのプログレスでスパムを発生させず、ネットワーク以外の場合にパフォーマンスを低下させるデルタ同期を行わないようにしています。
ファイルシステムをあるローカルドライブから別のローカルドライブにコピーするのに最適です。
rsync -axHAWXS --numeric-ids --info=progress2
> cp -ax / /mnt
私はよく
0x1&
/mntが/mntにマウントされた新しいディスクで、/には他にマウントされていないと仮定しています。
これはもちろんrootで行うか、sudoを使って行う必要があります。
このリンクには、上記のものを含むいくつかの代替案があります http://linuxdocs.org/HOWTOs/mini/Hard-Disk-Upgrade/copy.html
あるドライブから別のドライブへのワンショットのローカルコピーであれば、ウルフマンが上で説明しているように cp で十分だと思います。
例えばローカルやリモートバックアップのような大規模な作業には rsync が最適です。
もちろん、rsync は使用するにはかなり複雑です。
なぜ rsync を使うのか :
A ドライブの全部または一部を B ドライブにコピー(同期コピー)することができます。
もう一つの大きな利点は、このネイティブツールがファイル転送を監視することです。
そして最後になりますが、rsync は ssh 接続を使用します。これにより、リモートで同期されたセキュアな「コピー」を実現することができます。
上の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
rsync に関するスレッドに 2 つの有用なビットを追加しました: cypher の変更と --update
の使用です。
Wolfman の投稿にあるように、cp -ax
はエレガントでローカルなものにはクールだ。
しかし、rsync
も素晴らしい。-W
に関するMichaelの回答に加えて、cypherを変更することでも高速化することができる(セキュリティ上の意味合いについてはよく読んでおくこと)。
このような大規模で再帰的なコピーでrsyncを使用する他の大きな理由の1つは、-uスイッチ(または–update)のためです。コピー中に問題があった場合、それを修正することができ、rsync はそれが終わったところから再開します (scp にはこれがないと思います)。ローカルで行う場合、cp には -u スイッチもあります。
(–update と –whole-file を一緒にすることの意味が何なのかよくわかりませんが、この種のタスクでは常に賢明に動作するようです)
これは rsync の機能についてのスレッドではないことは理解していますが、私がこのために使っている最も一般的なものは以下の通りです。
ちなみに、もしwindowsを使わなければならない時は、cygwinのrsyncを使って大規模な再帰的コピーをしています。
**この方法は、異なるサイズ、パーティションテーブル、ファイルシステムを使用することができるので、dd を使用したディスククローニングよりも優れていると考えられています。
From: https://wiki.archlinux.org/index.php/Fullsystembackupbackupwith_rsync
Man Page Here
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
参考文献
‘dd'も素晴らしいが、ddrescue (apt install gddrescue)はもっと良い。ddが中断された場合、再起動する方法がありません(rsyncを使うもう一つの良い理由)。ddrescueをログファイルと一緒に使うと、どのブロックがコピーされたかを記録してくれます。
Windows/Linuxのデュアルブートシステムをバックアップする場合、Windowsパーティションにはntfsclone、Linuxパーティションにはddrescue、MBRにはddを使っています。(GPT/UEFI を使ったデュアルブートシステムのバックアップは試したことがありません。)
私が期待しているのは、ntfsclone のように、未割り当ての領域を制御文字でマークしたファイルを作成できる ddrescue ツールです。これにより、イメージは直接マウントできないが、含まれているデータと同じ大きさにしかならないようになる。
誰かddrescue用のntfscloneの「特殊なイメージフォーマット」を考えてくれないかな…。
ここで提案されている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
は、データをクローンする前にファイルシステムを最小サイズまで縮小します。
0x1&
partclone
はほとんどのシステムでデフォルトではインストールされていないことに注意してください。clonezilla ](https://clonezilla.org/) のようなライブのディストロを使うか、ディストロのパケットマネージャから partclone をインストールしてください (debian ベースのシステムでは apt-get install partclone
)。
rsync
は上で説明した通りの完璧な解決策です。
私なら、コピーするdocker devicemapperボリュームなどがある場合に備えて「handle sparse files efficiently」に-S
を追加するだけです。