rsyncでデータコピー

NFSサーバーのリプレースで別のNFSサーバーへデータ移行する時等に使用したrsyncを利用したデータコピーのやり方です。

1. コピーテスト

実際にデータを移行する前に--dry-runオプションを使用してコピーのテストを行います。

#!/bin/sh
DATETIME=`date +%Y%m%d-%H%M%S`

date |tee -a sync-logfile_${DATETIME}.log
rsync --progress -avz --delete --dry-run /src/testdir/ /dst/testdir/ 2>&1 | tee -a sync-logfile_${DATETIME}.log
date |tee -a sync-logfile_${DATETIME}.log

2. データコピー

--dry-runを外すだけですが実際にコピーを行います。

#!/bin/sh
DATETIME=`date +%Y%m%d-%H%M%S`

date |tee -a sync-logfile_${DATETIME}.log
rsync --progress -avz --delete /src/testdir/ /dst/testdir/ 2>&1 | tee -a sync-logfile_${DATETIME}.log
date |tee -a sync-logfile_${DATETIME}.log

3. 移行データの確認

確認は全研チェックしてると日が暮れるのでだいたい以下の項目を確認してた感じです。

lsによるファイル数、ファイルサイズ、パーミッション、タイムスタンプの確認		
	# ls -al <確認対象ディレクトリ>	
		
findコマンドによるファイル数の確認		
	# find <確認対象ディレクトリ> -type f | wc -l	
		
findコマンドによるディレクトリ数の確認		
	# find <確認対象ディレクトリ> -type d | wc -l	
		
duコマンドによる容量確認		
	# du -sk <確認対象ディレクトリ>	
	※容量については移行元と移行先のファイルシステム構成が異なるため完全一致しない可能性がある

4. rsyncオプション

rsyncのオプションはヘルプのとおりですが、昔調べたものを記載しておきます。

-h, --help rsync で利用できるオプションを記述したヘルプページを表示します。 

--version rsync のバージョンを表示して終了します。 

-v, --verbose 転送の間の情報を詳しく表示します。デフォルトでは rsync は何も表示しません。単一の -v で、転送されているファイルと転送の終了の概要を表示します。2つの -v フラッグでは、スキップされたファイルと転送終了の情報を表示します。2つ以上の -v は rsync のデバッグの時にだけ使われます。 

-q, --quiet リモートのサーバから送られる転送の情報を表示しないように、転送の間に表示される情報を抑制します。このフラッグはクーロンから rsync を起動する時に使われます。 

-I, --ignore-times 通常、rsync は同じファイル長、同じタイムスタンプのファイルをスキップします。このオプションはその機能を off にします。 

--size-only 通常、rsync は同じファイル長、同じタイムスタンプのファイルをスキップします。--size-only オプションでは、ファイルのサイズが同じ時にだけ、ファイルをスキップします。正確なタイムスタンプの必要がないような、ミラーリングのシステムの構築後の rsync で使われます。 

-c, --checksum 転送前に 128-bit MD4 のチェックサムを使って、送信側が全てのファイルをチェックサムするようにします。チェックサムはその時、受信側でチェックされます。そして、受信側で既に存在する、同じチェックサムとサイズを持つ同じ名前のファイルはスキップされます。このオプションを使うと非常に遅くなります。 

-a, --archive -rlptgoD と同じです。再帰的に全ての情報を維持する手っ取り早い方法です。 

-r, --recursive 再帰的にディレクトリをコピーします。このオプションを使わなければ、rsync はディレクトリのコピーをしません。 

-R, --relative 相対パスを使います。コマンドラインで指定されたフルパス名は、単なる最後の部分のファイル名ではなく、相対パスとしてサーバへ送信されます。これは特に、同時に異なるディレクトリに送信したいときに使われます。例えば、 

rsync foo/bar/foo.c remote:/tmp/

ここではリモートのマシンにある /tmp/ というディレクトリに foo.c というファイルを作ります。この代わりに 

rsync -R foo/bar/foo.c remote:/tmp/

とすると、リモートのマシンで /tmp/foo/bar/foo.c というファイルが作られます。フルパス名は維持されます。 

-b, --backup このオプションでは、既にファイルが受信側にあった場合に、受信側ファイル名に ~ のサフィックスを付けます。--suffix オプションで、バックアップのサフィックスを変更することができます。 

--backup-dir=DIR --backup オプションと組み合わせて、rsync が指定されたディレクトリにある全てをバックアップに保存するようにします。 

--suffix=SUFFIX -b オプションで使われるデフォルトのバックアップのサフィックスを変更します。デフォルトでは ~ です。 

-u, --update 受信側に既にファイルが存在していて、送信側のファイルよりも新しかった場合にはそのファイルをスキップします。 

-l, --links ローカルのシステムと同じように、リモートのシステムでシンボリック・リンクを再作成します。このオプションがない場合には、シンボリック・リンクはスキップされます。 

-L, --copy-links シンボリックリンクを通常のファイルのように扱います。 

--copy-unsafe-links 送信側のツリーの外部にポイントしているシンボリック・リンクを通常のファイルのように扱います。絶対シムリンクも通常のファイルのように扱われて、--relative オプションが使われると送信側のパス自身でシムリンクになります。 

--safe-links 受信側のツリーの外部にポイントしているシンボリック・リンクを無視します。絶対シムリンクもすべて無視されます。--relative オプションと組み合わせて使うと、思いがけない結果を生じます。 

-H, --hard-links ローカルのシステムと同じように、リモートのシステムにハードリンクを再作成します。このオプションがなければ、ハードリンクは通常のファイルのように扱われます。 

リンクの両方の部分が送信されたファイルの一覧にあると、rsync はハードリンクだけを検出することに注意して下さい。 

このオプションを使うと非常に遅くなるので、本当に必要な時にだけ使って下さい。 


-W, --whole-file ファイルの成長に対応した rsync アルゴリズムを使わないで、全ファイルが送信されます。ローカルのマシーンで rsync を使う時に役立つでしょう。 

-p, --perms ローカルのパーミッションと同じようにリモートのパーミッションを rsync に更新させます。 

-o, --owner ローカルのオーナーと同じようにリモートのオーナーを rsync に更新させます。このオプションを使えるのはスーパー・ユーザだけです。もし送信側のシステムが chroot を使ったデーモンなら、送信側のシステムがユーザ名にアクセスできないせいで --numeric-ids オプションが割り当てられます。 

-g, --group ローカルのグループと同じようにリモートのグループを rsync に更新させます。受信側のシステムでスーパー・ユーザとして走っていなければ、受信側のメンバーのグループだけが維持されます(グループ id ではなく、グループ名によって)。 

-D, --devices デバイスを再作成するために、リモートのシステムにキャラクタ・デバイスとブロック・デバイスの情報を転送します。このオプションを使えるのはスーパー・ユーザだけです。 

-t, --times ファイルのタイムスタンプを転送して、リモートのシステムにあるファイルを更新します。このオプションが使われていない場合には、変更されていないファイルを除外する機能が作動しません;言い換えると、-t や -a がないと次回の転送は -I オプションを使ったときのような挙動を示します。つまり、全てのファイルでチェックサムの比較が行われて、ファイルが変更されていなくてもログメッセージを表示します。 

-n, --dry-run ファイル転送を全く行わないで、代わりに実行時の動作だけを表示します。 

-S, --sparse 密度の低いファイルを効率的に扱って、受信側のスペースを節約しようとします。 

注:受信側が Solaris の "tmpfs" ファイルシステムなら、このオプションを使わないで下さい。シークオーバー null の領域を扱わないようなので、ファイルが壊れてしまいます。 


-x, --one-file-system 再帰的に実行された時にファイルシステムの境界を横断しないようにします。一つのファイルシステムでだけ、コンテンツを転送するのに使います。 

--existing 新しいファイルを作成しません - つまり、受信側に既に存在するファイルだけを更新します。 

--max-delete=NUM NUM 以上のファイルやディレクトリを削除しないようにします。トラブルを避ける必要のあるような、巨大なツリーのミラー時に使います。 

--delete 送信側に存在しない、受信側にあるファイルを削除します。転送から除外されたファイルは --delete-excluded を使わない限り削除から除外されます。 

ディレクトリで再帰的に実行されていなければ、このオプションは効果がありません。 

正しく使わないと非常にキケンです!どのファイルが削除されるのか、実行前に dry run のオプション(-n) を使って確認すると良いでしょう。 

送信側でなんらかの IO エラーを検出すると、受信側にあるファイルの削除は自動的に行わなくなります。受信側での過度のファイル削除のせいで、送信側で一時的にファイルシステムがおかしくなる(NFS エラーのように)のを避けるためです。 

--delete-excluded 送信側には存在しないが受信側には存在するファイルを削除するのとは別に、受信側で除外されたファイルも削除します(--exclude を参照)。 

--delete-after デフォルトで rsync は、受信側のファイルシステムに十分なスペースを確実に確保するために、ファイル転送前にファイルを削除します。もし転送後にファイルを削除したければ、--delete-after スイッチを使って下さい。 

--force ディレクトリが空でなくても削除します。--delete オプションに適用される他、通常のファイルをコピーしようとしたら受信側に同じ名前のディレクトリがあった場合に適用されます。 

このオプションが追加されると削除は depth-first されるように再実行されるので、あいまいな場合を除いてほとんど必要ありません。 

-B , --block_size=BLOCKSIZE rsync のアルゴリズムで使われるブロックサイズを制御します。詳しくは技術報告書を見て下さい。 

-e, --rsh=COMMAND rsync のローカル、リモート間の通信で使われるリモートのシェルプログラムを選択できます。デフォルトでは rsh を使いますが、セキュリティに配慮するなら ssh を使うと良いでしょう。 

RSYNC_RSH 環境変数を使ったリモート・シェルプログラムを使うこともできます。 

--rsync-path=PATH リモートのマシーンで rsync のコピーへのパスを指定します。パスが通っていない時に使います。これはバイナリーへのフルパスで、バイナリーのあるディレクトリではダメです。 

--exclude=PATTERN 転送されるファイルのリストから、特定のファイルを選択的に除外します。再帰的な転送と組み合わせてよく使われます。 

--exclude オプションをコマンドラインから多用すると、除外ファイルリストを作りたくなるかもしれません。 

このシンタックスについては除外パターン(exclude patterns)のセクションを見て下さい。 

--exclude-from=FILE --exclude オプションと似ていますが、代わりに FILE に除外するファイルのリストを記述します。FILE の空行と、';' または '#' で始まる行は無視されます。 

--include=PATTERN 指定されたファイル名のパターンを除外しないようにします。複雑な exclude/include で構築を行う時に使います。 

このオプションのシンタックスについては除外パターン(exclude patterns)のセクションを見て下さい。 

--include-from=FILE ファイルから含むパターンのリストを指定します。 

-C, --cvs-exclude システム間で転送したくない広範囲のファイルを除外する簡略法です。CVS が、ファイルを無視するかどうかを決めるのと同じアルゴリズムです。 

除外リストの初期化は: 
RCS SCCS CVS CVS.adm RCSLOG cvslog.* tags TAGS .make.state .nse_depinfo *~ #* .#* ,* *.old *.bak *.BAK *.orig *.rej .del-* *.a *.o *.obj *.so *.Z *.elc *.ln core

$HOME/.cvsignore に記述されたファイルはリストと CVSIGNORE 環境変数で表示されるファイルに追加されます(スペース区切り)。 

最後にそれぞれのディレクトリで、そのディレクトリの .cvsignore ファイルに記述してあるファイルがリストに追加されます。 

--csum-length=LENGTH デフォルトでは、rsync で使われる本来のチェックサムは強力な 16 byte MD4 のチェックサムです。ほとんどの場合見つかるのは、このチェックサムをトランケートした効率的なもので、リンクを送信するチェックサム・データのサイズを小さくして高速化しています。 

--csum-length オプションを使えばトランケートしたチェックサムのバイト数を選択できます。有効な値は 16 以下です。 

このオプションを使うと、間違ったターゲットファイルになってしまう危険性があります。16 という値でこの危険は微細なものになり、それは無視できる程安全ですが、それより小さい値では危険が増します。 

rsync の最新版では、デフォルトで、2回目で更に長いブロックのチェックサムが必要かどうかを決定するために、16 バイトのファイルチェックサムを使って、最適なチェックサム長を使います。ソースコードを読むか、何をしているのかを把握するときにだけ、このオプションを使います。 

-T, --temp-dir=DIR 受信側で転送されたファイルのテンポラリーのコピーを作る時の temp ディレクトリとして DIR を使うようにします。デフォルトでは受信側のディレクトリでテンポラリーのファイルを作成します。 

--compare-dest=DIR 転送時に受信側のファイルと比較するための追加ディレクトリとして DIR を作成します。存在するファイルを無傷で残して新しい受信先へ転送するのに使います。全てのファイル転送が完了したら flash-cutover します(例えばディレクトリを移動したり、古いディレクトリを除去することにより、変更されていないファイルをスキップしないようにする -I オプションでの転送を必要とします)。このオプションは --partial オプションを使いやすくします。部分的に転送されたファイルは、完全になる機会があるまで新しいテンポラリの受信側に留まるからです。もし DIR が相対パスなら、受信側のディレクトリに対する相対パスです。 

-z, --compress 受信側に送信されるファイルのデータを圧縮します。遅いリンクでこのオプションを使います。圧縮は gzip と同じ方法です。 

このオプションは、リモートのシェルの圧縮を使うか、一致するデータブロックに関して情報を送る利点のある、圧縮転送を使うことによる圧縮率を実現します。 

--numeric-ids ユーザ名とグループ名ではなく、ユーザとグループの id 番号を転送して、転送後にマッピングします。 

デフォルトで rsync はファイルのオーナーを決定するためにユーザ名とグループ名を使います。ユーザ id の 0 とグループ id の 0 は --numeric-ids オプションを指定しないとユーザ・グループ名がマップされません。 

送信側のシステムが chroot を使ったデーモンか、ユーザ・グループ名が受信側に存在しなければ、代わりに送信側の id 番号を使います。 

--timeout=TIMEOUT IO がタイムアウトになる最大秒数を設定します。指定された時間の間に転送がなければ、rsync は終了します。デフォルトでは 0 で、タイムアウトはありません。 

--daemon rsync をデーモンとして走らせます。標準入力がソケットなら、rsync は inetd 経由を前提にしますが、そうでなければカレントのターミナルから離れて、バックグラウンドのデーモンになります。デーモンはクライアントの接続毎に設定ファイル(/etc/rsyncd.conf)を読んで、それに対応したリクエストに対して作動します。詳しくは rsyncd.conf(5) の man ページを見て下さい。 

--address デフォルトで --daemon でデーモンとして走っているときか、rsync サーバに接続するときには、ワイルドカードのアドレスにバインドします。--address オプションは、バインドする特定の IP アドレス(またはホスト名)を指定するために使います。--config オプションとの組み合わせで、バーチャルホストが可能になります。 

--config=FILE 設定ファイルを指定します。デフォルトでは /etc/rsyncd.conf です。--daemon が指定されたときにだけ使います。 

--port=PORT  TCP のポート番号を指定します。デフォルトでは 873 です。 

--log-format=FORMAT rsync のクライアントのファイル毎の標準出力ログを指定できます。ログフォーマットは rsyncd.conf にあるログフォーマットのオプションとして、同じフォーマットにするために使います。 

--stats ファイル転送時の統計情報を表示するようにして、rsync アルゴリズムの転送効率を表示します。 

--partial デフォルトでは転送が中断したら、部分的に転送されたファイルを削除します。環境によっては部分的に転送されたファイルを保存しておく方がよいことがあります。--partial オプションを使うと、後の転送時にファイルの残り分を転送して高速化するように、部分的なファイルを保存します。 

--progress 転送中の情報を表示します。退屈しのぎになります。 

このオプションは普通、-v と組み合わせて使います。-v オプションなしで使うと、ディスプレイの表示がヒドイことになります。 

-P -P オプションは --partial --progress と同じです。この組み合わせは頻繁に使われそうなので、-P オプションは簡便のためのものです。 

--password-file リモートの rsync サーバに接続するために、ファイルにパスワードを書くことができます。このオプションは転送する rsync サーバに接続する時にだけ使います。転送にリモートシェルを使う時には使いません。ファイルは他の人が読めないようにします。また、パスワードは一行ずつ記述します。

5. rsync exit code

これも昔調べたもの。まだリンクも生きてますね。
http://wpkg.org/Rsync_exit_codes

# rsync exit code

      0      Success
      1      Syntax or usage error
      2      Protocol incompatibility
      3      Errors selecting input/output files, dirs
      4      Requested  action not supported: an attempt was made to manipulate 64-bit files on a platform 
             that cannot support them; or an option was specified that is supported by the client and not by the server.
      5      Error starting client-server protocol
      6      Daemon unable to append to log-file
      10     Error in socket I/O
      11     Error in file I/O
      12     Error in rsync protocol data stream
      13     Errors with program diagnostics
      14     Error in IPC code
      20     Received SIGUSR1 or SIGINT
      21     Some error returned by waitpid()
      22     Error allocating core memory buffers
      23     Partial transfer due to error
      24     Partial transfer due to vanished source files
      25     The --max-delete limit stopped deletions
      30     Timeout in data send/receive
      35     Timeout waiting for daemon connection

以上。

この記事が気に入ったらサポートをしてみませんか?