【Linux】rsync入門: ローカル/リモートへのバックアップ

この記事では、Linux のバックアップに使える rsync の基本を紹介します。rsync は短いコマンドでローカルのデータをバックアップでき、SSH を使えばリモートサーバへのバックアップにも使えます。ローカル間のコピー、SSH 経由のコピー、よく使うオプションの順に、実行結果を見ながら確認します。

この記事でわかること
  1. rsync の基本の構文と、-a・-v の意味
  2. 送信元の末尾の / の有無で、コピー結果がどう変わるか
  3. SSH でリモートサーバにバックアップする方法(パスワード認証と公開鍵認証)
  4. --delete・--dry-run・--exclude・-z・-b の使いどころ
検証環境

バックアップ元のホスト名は hirotano、バックアップ先は hirotano2(IP アドレス 192.168.3.117)で、どちらもユーザー名は hirotano です。以降のコマンドと実行結果は、この環境のものです。

rsync の基本的な使い方

rsync は、ファイルを効率よくコピー・同期するコマンドです。名前は remote sync に由来しますが、ローカルのファイル同士のコピーやバックアップにも使えます。コピーの方法は、ローカル、SSH などのリモートシェル経由、rsync デーモン経由から選べます。

基本の構文は次のとおりです。

$ rsync [options] source destination
項目意味
options同期の動作を制御するオプション
sourceバックアップ元のファイルやディレクトリ
destinationバックアップ先のパス

source と destination のどちらかは、ローカルである必要があります。リモートホスト同士の間を、1回のコマンドで直接コピーすることはできません。

ローカルでのバックアップ

ホームディレクトリ配下のすべてを、別の場所(/home/hirotano/backup/)にバックアップします。バックアップ先の backup ディレクトリが存在しなければ、rsync が作成します。

画面イメージについて

この記事の画面は、実際の画面ではなく、実行時の画面から見るポイントを抜き出して描いたイメージです。長い出力は途中を省略しています。

rsync -av でコピーする

バックアップ元(hirotano)

$ rsync -av /home/hirotano/ /home/hirotano/backup/
オプション意味
-aarchive の略。ファイルの属性(権限、タイムスタンプなど)を保持して、ディレクトリを再帰的にコピーする。-rlptgoD をまとめて指定するショートカット
-vverbose の略。実行中に、コピーしたファイル名などの詳細な情報を表示する

-a に含まれるオプションは次のとおりです。

オプション意味
-rディレクトリを再帰的にコピーする
-lシンボリックリンクを、リンクのままコピーする
-pパーミッション(アクセス権)を保持する
-tタイムスタンプ(更新時刻)を保持する
-gグループ所有権を保持する
-oユーザー所有権を保持する
-Dデバイスファイルと特殊ファイル(--devices と --specials)をコピーする

-a には、ハードリンク(-H)、ACL(-A)、拡張属性(-X)の保持は含まれません。これらも保持したいときは、別にオプションを付けます。また、-o でコピー先の所有者を送信元に合わせられるのは、受信側の rsync がスーパーユーザーとして動いているときだけです。

ターミナル(バックアップ元)画面イメージ
1hirotano@hirotano:~$ rsync -av /home/hirotano/ /home/hirotano/backup/sending incremental file list2created directory /home/hirotano/backup./3.bash_history.bash_logout.bashrc.lesshst.profile.sudo_as_admin_successful.vboxclient-clipboard.pid.vboxclient-draganddrop.pid.vboxclient-seamless.pid.vboxclient-vmsvga-session-tty2.pid⋮ (以下省略)
図1 rsync -av の実行結果(実際の画面ではなく、表示内容のポイントを示したイメージです)
No.表示意味
1rsync -av /home/hirotano/ /home/hirotano/backup/実行したコマンド
2created directory /home/hirotano/backupバックアップ先のディレクトリがなかったため、rsync が作成した
3ファイル名の一覧-v を付けているため、コピーしたファイルが1行ずつ表示される

コピー結果を確認する

バックアップが正しくできているか、ファイルやディレクトリが存在するかを確認します。

バックアップ元(hirotano)

$ ls /home/hirotano/backup/
ターミナル(バックアップ元)画面イメージ
hirotano@hirotano:~$ ls /home/hirotano/backup/1Desktop    Downloads     file1.txt  file3.txt  Music     Public     test_archive.tar.gzDocuments  extract_here  file2.txt  file4.txt  Pictures  Templates  Videos⋮ (以下省略)
図2 backup ディレクトリの中身(実際の画面ではなく、表示内容のポイントを示したイメージです)
No.表示意味
1Desktop、file1.txt など元のホームディレクトリの内容が、backup ディレクトリにもコピーされている

送信元の末尾の / で結果が変わる

STEP 1 では、送信元を /home/hirotano/ と、末尾に / を付けて指定しました。この場合は、ディレクトリの中身が、バックアップ先の直下にコピーされます。

末尾の / を付けない場合は、結果が変わります。

バックアップ元(hirotano)

$ rsync -av /home/hirotano /home/hirotano/backup/

実行後の結果です。backup ディレクトリの直下には、hirotano の中身ではなく、hirotano ディレクトリそのものがコピーされています。末尾に / を付けると、コピー先に余分なディレクトリの階層は作られません。

ターミナル(バックアップ元)画面イメージ
hirotano@hirotano:~$ ls /home/hirotano/backup/1hirotanohirotano@hirotano:~$ ls /home/hirotano/backup/hirotano/2Desktop    Downloads     file1.txt  file3.txt  Music     Public     test_archive.tar.gzDocuments  extract_here  file2.txt  file4.txt  Pictures  Templates  Videos
図3 末尾の / を付けずに実行した結果(実際の画面ではなく、表示内容のポイントを示したイメージです)
No.表示意味
1hirotanobackup の直下に、hirotano ディレクトリができている
2backup/hirotano/ の中身ホームディレクトリの内容が、hirotano ディレクトリの中に入っている
source の末尾に / がある場合source /home/hirotano//home/hirotano/backup/source の末尾に / がない場合source /home/hirotano/home/hirotano/backup/├ file1.txt├ Desktop/├ Documents/└ …(hirotano の中身)└ hirotano/├ file1.txt├ Desktop/└ …(hirotano の中身)
図4 送信元の末尾の / の有無によるコピー結果の違い
補足

この例では、バックアップ先の /home/hirotano/backup/ が、送信元の /home/hirotano/ の中にあります。そのため、backup ディレクトリ自体もバックアップの対象に含まれます。実際の運用では、バックアップ先を別のディスクやサーバに置くか、--exclude 'backup/' で除外してください。

リモートサーバへのバックアップ

ローカルのデータを別のマシンにバックアップするときは、SSH 経由で転送するのが一般的です。データは暗号化されて、ネットワーク上を通ります。リモートサーバへの構文は次のとおりです。

$ rsync [options] source [user@]host:destination
項目意味
userリモートサーバのユーザー名
hostリモートサーバのアドレス
destinationリモートサーバ上のバックアップ先のパス

ローカルの home ディレクトリを、リモートサーバ(192.168.3.117)の指定の場所にバックアップします。使用するユーザー(hirotano)が、バックアップ先のディレクトリに書き込める権限を持っていることを確認してください。

バックアップ元hirotanoバックアップ先192.168.3.117SSH で暗号化して転送rsync -avz /home/hirotano/ user@host:/home/hirotano/backup//home/hirotano//home/hirotano/backup/バックアップするディレクトリ
図5 SSH で暗号化して、バックアップ先へ rsync で転送する

パスワード認証でバックアップする

ローカルの home ディレクトリを、リモートサーバの /home/hirotano/backup/ にバックアップします。

バックアップ元(hirotano)

$ rsync -avz /home/hirotano/ hirotano@192.168.3.117:/home/hirotano/backup/
オプション意味
-z転送するデータを圧縮する。ネットワーク上のデータ転送量を減らせる

実行するとパスワードの入力を求められるので、リモートサーバの hirotano ユーザーのパスワードを入力します。

ターミナル(バックアップ元)画面イメージ
1hirotano@hirotano:~$ rsync -avz /home/hirotano/ hirotano@192.168.3.117:/home/hirotano/backup/2hirotano@192.168.3.117's password:sending incremental file list./file1.txtfile2.txtfile3.txtfile4.txttest_archive.tar.gzDesktop/Documents/Downloads/⋮ (以下省略)
図6 パスワード認証で rsync を実行(実際の画面ではなく、表示内容のポイントを示したイメージです)
No.表示意味
1rsync -avz …送信先を hirotano@192.168.3.117:… と指定して実行している
2…'s password:リモートサーバのユーザーのパスワード入力を求められている

リモートサーバ側で、バックアップできていることを確認します。

ターミナル(バックアップ先)画面イメージ
hirotano@hirotano2:~$ ls /home/hirotano/backup/1backup     extract_here  file4.txt  TemplatesDesktop    file1.txt     Music      test_archive.tar.gzDocuments  file2.txt     Pictures   VideosDownloads  file3.txt     Public
図7 バックアップ先での確認(実際の画面ではなく、表示内容のポイントを示したイメージです)
No.表示意味
1file1.txt、Desktop などバックアップ元の home の内容が届いている。backup も一覧にあるのは、バックアップ元の home の中にも backup ディレクトリがあるため

公開鍵と秘密鍵のペアを作る

SSH の公開鍵認証を使うと、パスワードを入力せずにリモートサーバへ接続できます。バックアップを自動で実行するときに必要になります。公開鍵認証の流れは、次の図のとおりです。

バックアップ元バックアップ先② ssh-copy-id で公開鍵をコピー(初回はパスワードを入力)③ rsync(パスワードなしで接続)~/.ssh/id_rsa(秘密鍵)~/.ssh/id_rsa.pub(公開鍵)① ssh-keygen -t rsa で作成~/.ssh/authorized_keysに公開鍵が追加される公開鍵だけを渡す
図8 公開鍵認証の準備から、パスワードなしの rsync まで

まず、バックアップ元で次のコマンドを実行して、公開鍵と秘密鍵のペアを作ります。-t で鍵の種類を指定します。この例では RSA です。

バックアップ元(hirotano)

$ ssh-keygen -t rsa
ターミナル(バックアップ元)画面イメージ
1hirotano@hirotano:~$ ssh-keygen -t rsaGenerating public/private rsa key pair.Enter file in which to save the key (/home/hirotano/.ssh/id_rsa):2Enter passphrase (empty for no passphrase):Enter same passphrase again:3Your identification has been saved in /home/hirotano/.ssh/id_rsaYour public key has been saved in /home/hirotano/.ssh/id_rsa.pubThe key fingerprint is:SHA256:(伏せています) hirotano@hirotanoThe key's randomart image is:⋮ (以下省略)
図9 ssh-keygen の実行(実際の画面ではなく、表示内容のポイントを示したイメージです)
No.表示意味
1ssh-keygen -t rsaRSA の鍵ペアを作成するコマンド
2Enter passphrase …鍵を保護するパスフレーズの入力。何も入力せずに Enter を押すと、パスフレーズなしで作成される
3id_rsa / id_rsa.pub秘密鍵と公開鍵の保存先

実行すると、.ssh ディレクトリの中に、id_rsa(秘密鍵)と id_rsa.pub(公開鍵)の2つのファイルが作られます。

ターミナル(バックアップ元)画面イメージ
hirotano@hirotano:~$ ls /home/hirotano/.ssh/1authorized_keys  id_rsa  id_rsa.pub  known_hosts  known_hosts.old⋮ (以下省略)
図10 .ssh ディレクトリの中身(実際の画面ではなく、表示内容のポイントを示したイメージです)
No.表示意味
1id_rsa、id_rsa.pub作成された秘密鍵と公開鍵
補足

パスフレーズなしで作った秘密鍵は、ファイルを手に入れた人がそのまま接続に使えます。id_rsa は他の人が読めない場所とパーミッションで管理してください。

公開鍵をバックアップ先にコピーする

バックアップ元で次のコマンドを実行して、公開鍵をバックアップ先のサーバにコピーします。

バックアップ元(hirotano)

$ ssh-copy-id -i ~/.ssh/id_rsa.pub hirotano@192.168.3.117

初回はパスワードの入力を求められるので、バックアップ先ユーザーのパスワードを入力します。

ターミナル(バックアップ元)画面イメージ
1hirotano@hirotano:~$ ssh-copy-id -i ~/.ssh/id_rsa.pub hirotano@192.168.3.117/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/home/hirotano/.ssh/id_rsa.pub"/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys2hirotano@192.168.3.117's password: 3Number of key(s) added: 1 Now try logging into the machine, with:   "ssh 'hirotano@192.168.3.117'"and check to make sure that only the key(s) you wanted were added.
図11 ssh-copy-id の実行(実際の画面ではなく、表示内容のポイントを示したイメージです)
No.表示意味
1ssh-copy-id -i … hirotano@192.168.3.117-i で公開鍵のファイルを指定し、コピー先のユーザーとホストを指定している
2…'s password:公開鍵を登録するために、この1回だけパスワードを入力する
3Number of key(s) added: 1公開鍵が1つ、バックアップ先に追加された

これで、公開鍵がバックアップ先のサーバの ~/.ssh/authorized_keys ファイルに追加されます。

ターミナル(バックアップ先)画面イメージ
hirotano@hirotano2:~$ ls /home/hirotano/.ssh/1authorized_keys
図12 バックアップ先の .ssh ディレクトリ(実際の画面ではなく、表示内容のポイントを示したイメージです)
No.表示意味
1authorized_keys登録した公開鍵の保存先ファイル

パスワードなしでバックアップする

公開鍵認証の設定が終われば、rsync でローカルの home ディレクトリを、パスワードなしでリモートサーバにバックアップできます。

バックアップ元(hirotano)

$ rsync -av /home/hirotano/ hirotano@192.168.3.117:/home/hirotano/backup/
ターミナル(バックアップ元)画面イメージ
1hirotano@hirotano:~$ rsync -av /home/hirotano/ hirotano@192.168.3.117:/home/hirotano/backup/2sending incremental file list./file1.txtfile2.txtfile3.txtfile4.txttest_archive.tar.gz.cache/mesa_shader_cache/index.cache/mesa_shader_cache/bb/.cache/mesa_shader_cache/bb/b89d6d0d0966e3801533b4e08d2b52071aa50b⋮ (以下省略)
図13 パスワードなしで rsync を実行(実際の画面ではなく、表示内容のポイントを示したイメージです)
No.表示意味
1rsync -av …STEP 1 と同じ形のコマンド(ここでは -z を付けていない)
2sending incremental file listパスワードを聞かれずに、そのままファイル一覧の転送が始まっている

追加オプション

rsync にはたくさんのオプションがあります。ここでは、よく使うものを紹介します。

–delete:バックアップ先の不要なファイルを削除する

バックアップ先にはあるが、バックアップ元にはもうないファイルを、バックアップ先から削除します。このオプションがないと、バックアップ元で削除したファイルが、バックアップ先に残り続けます。--delete を使うと、バックアップ先がバックアップ元と同じ内容になり、不要なファイルでディスク容量を使うこともなくなります。

ただし、バックアップ先のファイルが実際に消えます。送信元のパスを間違えたまま実行すると、必要なファイルまで消えるため、次の --dry-run で先に確認します。

–dry-run:実行内容だけを確認する

実際にはデータを転送せず、どのような処理が行われるかだけを確認できます。ファイルを移動・削除する前の確認として使います。重要なファイルを扱うときや、新しい設定を試すときに向いています。

次のように --delete と組み合わせると、何がバックアップされ、何が削除されるかを、事前に確認できます。

バックアップ元(hirotano)

$ rsync -av --delete --dry-run /home/hirotano/ hirotano@192.168.3.117:/home/hirotano/backup/

-v を付けているので、実行結果の最後に (DRY RUN) と表示されます。

ターミナル(バックアップ元)画面イメージ
sent 29,579 bytes  received 2,961 bytes  65,080.00 bytes/sec1total size is 33,055,717  speedup is 1,015.85 (DRY RUN)
図14 –dry-run の実行結果(実際の画面ではなく、表示内容のポイントを示したイメージです)
No.表示意味
1(DRY RUN)試行として実行しただけで、実際の転送や削除は行われていない

表示された内容を確認して問題がなければ、--dry-run を外して実行します。

–exclude:特定のファイルやディレクトリを除外する

特定のファイルやディレクトリを、バックアップの対象から外します。一時ファイルやキャッシュ、個人のデータなど、バックアップしなくてよいものがあるときに使います。

次の例では、Downloads ディレクトリと、拡張子が .tmp のファイルを、バックアップから除外しています。

バックアップ元(hirotano)

$ rsync -av --exclude 'Downloads/' --exclude '*.tmp' /home/hirotano/ hirotano@192.168.3.117:/home/hirotano/backup/
パターン除外されるもの
‘Downloads/’Downloads ディレクトリ。末尾が / のパターンは、ディレクトリにだけ一致する
‘*.tmp’拡張子が .tmp のファイル

-z:転送するデータを圧縮する

リモートサーバへ転送するときに、データを圧縮します。転送するデータ量が多いときや、ネットワークの速度が遅いときに役立ちます。

バックアップ元(hirotano)

$ rsync -azv /home/hirotano/ hirotano@192.168.3.117:/home/hirotano/backup/

-b:上書き前のファイルを残す

バックアップ先の既存のファイルを上書きする前に、そのファイルの名前を変えて残します。バックアップ元のファイルが壊れたり失われたりした場合でも、1つ前の内容に戻せます。

初回のバックアップのあと、home ディレクトリにあった file1.txt を更新したとします。もう一度、-b を付けてバックアップを取ります。

バックアップ元(hirotano)

$ rsync -avb /home/hirotano/ hirotano@192.168.3.117:/home/hirotano/backup/

バックアップ先では、更新した file1.txt が転送される前に、既存の file1.txt が file1.txt~ という名前に変わります。名前の末尾に付く ~ が、既定の接尾辞です。--delete と組み合わせたときは、削除されるファイルも同じように名前が変わって残ります。

ターミナル(バックアップ先)画面イメージ
hirotano@hirotano2:~/backup$ lsbackup     extract_here  file3.txt  Public1Desktop    file1.txt     file4.txt  TemplatesDocuments  file1.txt~    Music      test_archive.tar.gzDownloads  file2.txt     Pictures   Videos
図15 -b を付けて実行した後のバックアップ先(実際の画面ではなく、表示内容のポイントを示したイメージです)
No.表示意味
1file1.txt と file1.txt~転送された新しい file1.txt のほかに、上書き前の内容が file1.txt~ として残っている

まとめ

rsync は、1つのコマンドでデータをコピー・同期できるツールです。ローカル間のコピーも、SSH を使ったリモートへのバックアップもできます。リモートへの接続は、パスワード認証と公開鍵認証のどちらでも行えます。ここで紹介したオプションは次のとおりです。

オプション役割使うときの注意
-aファイルの属性を保持して、再帰的にコピーする(-rlptgoD)ハードリンク(-H)、ACL(-A)、拡張属性(-X)は含まれない
-v実行時の詳細な情報を表示する--dry-run と組み合わせると、最後に (DRY RUN) が表示される
–deleteバックアップ先にだけあるファイルを削除する先に --dry-run で確認する
–dry-run実際には転送せず、実行内容だけを確認する確認後に外して実行する
–exclude特定のファイルやディレクトリを除外する末尾が / のパターンはディレクトリにだけ一致する
-z転送するデータを圧縮する転送量が多いときやネットワークが遅いときに使う
-b上書き前のファイルを ~ 付きの名前で残す--delete で消えるファイルも残る

コメント