Bashプログラミング
 Computer >> コンピューター >  >> プログラミング >> Bashプログラミング

【保存版】rsyncでLinuxバックアップを完璧に!覚えておきたい必須コマンド15選

【保存版】rsyncでLinuxバックアップを完璧に!覚えておきたい必須コマンド15選rsyncは「remote sync」の略称で、UNIX/Linux環境におけるバックアップ作業の定番ツールです。

rsyncは、ファイルやディレクトリをある場所から別の場所へ効率的に同期するためのユーティリティです。バックアップ先はローカルサーバーでもリモートサーバーでも構いません。システム管理者なら必ず押さえておきたい、実用的なコマンド例を15個紹介します。

rsyncの主な特徴

  • 高速性:初回実行時はソースとコピー先の間で全コンテンツを複製しますが、2回目以降は変更されたブロックやバイトだけを転送します。これにより、転送速度が大幅に向上します。
  • セキュリティ:転送中のデータをSSHプロトコルで暗号化できます。
  • 帯域幅の節約:送信側・受信側それぞれでデータブロックを逐次圧縮・展開するため、他のファイル転送プロトコルと比べて常に少ない帯域幅で済みます。
  • 特権不要:rsyncのインストールや実行に特別な権限は必要ありません。

基本構文

$ rsync options source destination

ソースとコピー先は、どちらもローカルでもリモートでも指定可能です。リモートの場合は、ログイン名・リモートサーバー名・場所を指定します。

例1:ローカルサーバー上の2つのディレクトリを同期する

同一マシン内の2つのディレクトリを同期するには、rsync -zvrコマンドを使用します。

$ rsync -zvr /var/opt/installation/inventory/ /root/temp
building file list ... done
sva.xml
svB.xml
.
sent 26385 bytes received 1098 bytes 54966.00 bytes/sec
total size is 44867 speedup is 1.63
$

上記の例で使われているオプションの意味は以下の通りです。

  • -z:圧縮を有効にする
  • -v:詳細表示(verbose)
  • -r:再帰的に処理する

次に、コピーされたファイルのタイムスタンプを確認してみましょう。下記のように、このオプション構成では同期時にタイムスタンプが保持されていません。

$ ls -l /var/opt/installation/inventory/sva.xml /root/temp/sva.xml
-r--r--r-- 1 bin bin 949 Jun 18 2009 /var/opt/installation/inventory/sva.xml
-r--r--r-- 1 root bin 949 Sep 2 2009 /root/temp/sva.xml

例2:rsync -aでタイムスタンプを保持して同期する

rsyncの-aオプションはアーカイブモードを意味し、以下の動作を行います。

  • 再帰モードでの処理
  • シンボリックリンクの保持
  • パーミッションの保持
  • タイムスタンプの保持
  • 所有者とグループの保持

例1と同じコマンドに-aオプションを付けて実行してみます。

$ rsync -azv /var/opt/installation/inventory/ /root/temp/
building file list ... done
./
sva.xml
svB.xml
.
sent 26499 bytes received 1104 bytes 55206.00 bytes/sec
total size is 44867 speedup is 1.63
$

今度は、同期後もタイムスタンプが正しく保持されていることが確認できます。

$ ls -l /var/opt/installation/inventory/sva.xml /root/temp/sva.xml
-r--r--r-- 1 root bin 949 Jun 18 2009 /var/opt/installation/inventory/sva.xml
-r--r--r-- 1 root bin 949 Jun 18 2009 /root/temp/sva.xml

例3:単一ファイルのみを同期する

1つのファイルだけをコピーしたい場合は、ファイル名を明示的に指定します。

$ rsync -v /var/lib/rpm/Pubkeys /root/temp/
Pubkeys
sent 42 bytes received 12380 bytes 3549.14 bytes/sec
total size is 12288 speedup is 0.99

例4:ローカルからリモートへファイルを同期する

rsyncを使えば、ローカルとリモートシステム間でファイルやディレクトリを同期できます。

$ rsync -avz /root/temp/ thegeekstuff@192.168.200.10:/home/thegeekstuff/temp/
Password:
building file list ... done
./
rpm/
rpm/Basenames
rpm/Conflictname
sent 15810261 bytes received 412 bytes 2432411.23 bytes/sec
total size is 45305958 speedup is 2.87

リモートサーバーと同期する際は、ユーザー名とIPアドレス、そしてリモート側のコピー先ディレクトリを指定します。書式は「username@machinename:path」です。

上記のように、ローカルからリモートへのrsync実行時にはパスワード入力を求められます。

しかし、バックアップ用のシェルスクリプトなどで自動化する場合は、パスワード入力なしでrsyncを実行できると便利です。そのような場合は、事前にSSHのパスワード不要ログイン(公開鍵認証)を設定しておきましょう。

例5:リモートからローカルへファイルを同期する

リモートからローカルへ同期する場合は、ソースにリモートパス、ターゲットにローカルパスを指定します。

$ rsync -avz thegeekstuff@192.168.200.10:/var/lib/rpm /root/temp
Password:
receiving file list ... done
rpm/
rpm/Basenames
.
sent 406 bytes received 15810230 bytes 2432405.54 bytes/sec
total size is 45305958 speedup is 2.87

例6:同期に使うリモートシェルを指定する

rsyncでは、使用するリモートシェルを指定できます。rsync -e sshとすることで、暗号化された安全なリモート接続を実現できます。

$ rsync -avz -e ssh thegeekstuff@192.168.200.10:/var/lib/rpm /root/temp
Password:
receiving file list ... done
rpm/
rpm/Basenames
sent 406 bytes received 15810230 bytes 2432405.54 bytes/sec
total size is 45305958 speedup is 2.87

例7:コピー先で修正済みのファイルを上書きしない

通常の同期では、コピー先で既に更新されたファイルを、古いソース側のファイルで上書きしたくないケースがあります。

そんなときはrsync -uオプション(update)を使います。これは「コピー先で更新済みのファイルは上書きしない」という動作になります。以下の例では、Basenamesというファイルがコピー先で既に修正されているため、-u付きでは上書きされません。

$ ls -l /root/temp/Basenames
total 39088
-rwxr-xr-x 1 root root 4096 Sep 2 11:35 Basenames
$ rsync -avzu thegeekstuff@192.168.200.10:/var/lib/rpm /root/temp
Password:
receiving file list ... done
rpm/
sent 122 bytes received 505 bytes 114.00 bytes/sec
total size is 45305958 speedup is 72258.31
$ ls -lrt
total 39088
-rwxr-xr-x 1 root root 4096 Sep 2 11:35 Basenames

例8:ディレクトリツリー構造のみを同期する(ファイルは対象外)

rsync -dオプションを使うと、ソースからコピー先へディレクトリツリー構造だけを同期できます。ファイル自体は転送せず、ディレクトリ階層のみを再帰的に複製します。

$ rsync -v -d thegeekstuff@192.168.200.10:/var/lib/ .
Password:
receiving file list ... done
logrotate.status
CAM/
YaST2/
acpi/
sent 240 bytes received 1830 bytes 318.46 bytes/sec
total size is 956 speedup is 0.46

例9:転送中の進捗状況を確認する

rsyncでバックアップを行う際、「現在何個のファイルがコピーされたのか」「どのくらいの速度で転送されているのか」などを知りたいことがあります。

--progressオプションを付けると、rsync実行中の詳細な進捗状況をリアルタイムで表示できます。

$ rsync -avz --progress thegeekstuff@192.168.200.10:/var/lib/rpm/ /root/temp/
Password:
receiving file list ...
19 files to consider
./
Basenames
 5357568 100% 14.98MB/s 0:00:00 (xfer#1, to-check=17/19)
Conflictname
 12288 100% 35.09kB/s 0:00:00 (xfer#2, to-check=16/19)
.
.
.
sent 406 bytes received 15810211 bytes 2108082.27 bytes/sec
total size is 45305958 speedup is 2.87

また、rsyncを内部で利用している「rsnapshot」というユーティリティを使えば、ローカルLinuxサーバーのバックアップやリモートLinuxサーバーのバックアップも簡単に行えます。

例10:ターゲット側に作成された余分なファイルを削除する

ソース側に存在しないのにターゲット側だけに残っているファイルを、同期時に削除したい場合があります。

そのようなケースでは--deleteオプションを使用します。このオプションを付けると、ソースディレクトリに存在しないファイルがターゲットから削除されます。

# ソースとターゲットは同期済み。ここでターゲット側に新規ファイルを作成する。
$ > new-file.txt
$ rsync -avz --delete thegeekstuff@192.168.200.10:/var/lib/rpm/ .
Password:
receiving file list ... done
deleting new-file.txt
./
sent 26 bytes received 390 bytes 48.94 bytes/sec
total size is 45305958 speedup is 108908.55

ターゲット側にあったnew-file.txtは、--deleteオプションを付けて同期したことで削除されました。

例11:ターゲット側に新しいファイルを作成しない

ターゲット側に既に存在するファイルだけを更新(同期)したい場合もあります。ソース側に新しく追加されたファイルを、ターゲット側に作りたくないときは、--existingオプションを使用します。

まず、ソース側にnew-file.txtを追加します。

[/var/lib/rpm ]$ > new-file.txt

次に、ターゲット側からrsyncを実行します。

$ rsync -avz --existing root@192.168.1.2:/var/lib/rpm/ .
root@192.168.1.2's password:
receiving file list ... done
./
sent 26 bytes received 419 bytes 46.84 bytes/sec
total size is 88551424 speedup is 198991.96

出力結果を見ると、新規ファイルのnew-file.txtは受信されていないことがわかります。

例12:ソースとコピー先の差分を確認する

-iオプション(itemize-changes)を使うと、ソースとコピー先のファイルやディレクトリの違いを一覧で確認できて非常に便利です。

まず、ソース側の状態:

$ ls -l /var/lib/rpm
-rw-r--r-- 1 root root 5357568 2010-06-24 08:57 Basenames
-rw-r--r-- 1 root root 12288 2008-05-28 22:03 Conflictname
-rw-r--r-- 1 root root 1179648 2010-06-24 08:57 Dirnames

コピー先の状態:

$ ls -l /root/temp
-rw-r--r-- 1 root root 12288 May 28 2008 Conflictname
-rw-r--r-- 1 bin bin 1179648 Jun 24 05:27 Dirnames
-rw-r--r-- 1 root root 0 Sep 3 06:39 Basenames

この例では、ソースとコピー先の間に2つの違いがあります。1つ目はDirnamesの所有者とグループの違い、2つ目はBasenamesのサイズの違いです。

それでは、rsyncがこの差分をどう表示するか見てみましょう。-iオプションを付けると項目ごとの変更内容が出力されます。

$ rsync -avzi thegeekstuff@192.168.200.10:/var/lib/rpm/ /root/temp/
Password:
receiving file list ... done
>f.st.... Basenames
.f....og. Dirnames
sent 48 bytes received 2182544 bytes 291012.27 bytes/sec
total size is 45305958 speedup is 20.76

出力では、ファイル名やディレクトリ名の前に9文字のフラグが表示され、何が変更されたのかを示します。

今回の例でBasenamesやDirnamesの前についている文字の意味は以下の通りです。

> ローカルホストへファイルが転送されることを示す
f ファイルであることを表す
s サイズに変更があることを表す
t タイムスタンプに変更があることを表す
o 所有者が変更されたことを表す
g グループが変更されたことを表す

例13:転送時に含める/除外するパターンを指定する

rsyncでは、同期時に含めたいファイルやディレクトリ、除外したいファイルやディレクトリをパターンで指定できます。

$ rsync -avz --include 'P*' --exclude '*' thegeekstuff@192.168.200.10:/var/lib/rpm/ /root/temp/
Password:
receiving file list ... done
./
Packages
Providename
Provideversion
Pubkeys
sent 129 bytes received 10286798 bytes 2285983.78 bytes/sec
total size is 32768000 speedup is 3.19

上記の例では、--include 'P*'により「P」で始まるファイルやディレクトリだけを含め、--exclude '*'によってその他すべてのファイルを除外しています。

例14:大きなサイズのファイルを転送しない

--max-sizeオプションを使えば、指定サイズより大きいファイルの転送を防げます。

$ rsync -avz --max-size='100K' thegeekstuff@192.168.200.10:/var/lib/rpm/ /root/temp/
Password:
receiving file list ... done
./
Conflictname
Group
Installtid
Name
Sha1header
Sigmd5
Triggername
sent 252 bytes received 123081 bytes 18974.31 bytes/sec
total size is 45305958 speedup is 367.35

max-size='100K'と指定すると、100Kバイト以下のファイルのみが転送されます。サイズ単位はM(メガバイト)やG(ギガバイト)でも指定可能です。

例15:ファイル全体を転送する

rsyncの最大の特徴の1つは、ファイル全体ではなく変更されたブロックだけをコピー先へ転送する点です。

ただし、ネットワーク帯域幅に余裕がありCPU負荷の方が懸念される場合は、-W(whole-file)オプションでファイル全体を転送できます。チェックサム計算が不要になるため、rsync処理が高速化されます。

# rsync -avzW thegeekstuff@192.168.200.10:/var/lib/rpm/ /root/temp
Password:
receiving file list ... done
./
Basenames
Conflictname
Dirnames
Filemd5s
Group
Installtid
Name
sent 406 bytes received 15810211 bytes 2874657.64 bytes/sec
total size is 45305958 speedup is 2.87

関連記事

  • UNIX/LinuxでrsyncとSSHを組み合わせる方法(パスワードなしのrsync設定)
  • --exclude-fromを使って複数のファイルやディレクトリを除外するrsync活用例6選
  1. PCの暇な時間を有効活用!生産性アップと娯楽を両立する30のアイデア

    by Ramesh Natarajan(2010年3月1日) パソコンの前に座っているのに、何をしていいかわからない――そんな経験はありませんか?実は、ちょっとした空き時間でも有意義に使えることはたくさんあります。この記事では、生産性を高める実用的なタスクから、純タスクから、純粋に楽しめる娯楽まで、30のアイデアを厳選してご紹介します。 技術系ブログを読む – 毎日質の高い記事を発信している技術ブログは数多く存在します。かつてTechnoratiには9,600件以上のテクノロジー系ブログが登録されていました。興味のあるブログを探して読んでみましょう。当ブログのアーカイブには、見逃したかもし

  2. Linuxターミナルでの計算をマスターしよう:覚えておきたい5つの必須テクニック

    この記事では、Linuxターミナル上で算術計算を行うためのさまざまな便利な方法を紹介します。最後まで読めば、コマンドラインで数学的な計算を実行するための実践的な手法をいくつも習得できるでしょう。 それでは始めましょう! 1. Bashシェルの二重括弧を使う Linuxのコマンドライン(CLI)で基本的な計算を行う最も手軽な方法が、二重括弧 $(( )) を使う方法です。以下は、変数に格納された値を使った例です。 $ ADD=$(( 1 + 2 )) $ echo $ADD $ MUL=$(( $ADD * 5 )) $ echo $MUL $ SUB=$(( $MUL - 5 )) $ ech