この記事では、Linux のバックアップに使える rsync の基本を紹介します。rsync は短いコマンドでローカルのデータをバックアップでき、SSH を使えばリモートサーバへのバックアップにも使えます。ローカル間のコピー、SSH 経由のコピー、よく使うオプションの順に、実行結果を見ながら確認します。
- rsync の基本の構文と、
-a・-vの意味 - 送信元の末尾の
/の有無で、コピー結果がどう変わるか - SSH でリモートサーバにバックアップする方法(パスワード認証と公開鍵認証)
--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/
| オプション | 意味 |
|---|---|
| -a | archive の略。ファイルの属性(権限、タイムスタンプなど)を保持して、ディレクトリを再帰的にコピーする。-rlptgoD をまとめて指定するショートカット |
| -v | verbose の略。実行中に、コピーしたファイル名などの詳細な情報を表示する |
-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⋮ (以下省略)
| No. | 表示 | 意味 |
|---|---|---|
| 1 | rsync -av /home/hirotano/ /home/hirotano/backup/ | 実行したコマンド |
| 2 | created 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⋮ (以下省略)
| No. | 表示 | 意味 |
|---|---|---|
| 1 | Desktop、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
| No. | 表示 | 意味 |
|---|---|---|
| 1 | hirotano | backup の直下に、hirotano ディレクトリができている |
| 2 | backup/hirotano/ の中身 | ホームディレクトリの内容が、hirotano ディレクトリの中に入っている |
この例では、バックアップ先の /home/hirotano/backup/ が、送信元の /home/hirotano/ の中にあります。そのため、backup ディレクトリ自体もバックアップの対象に含まれます。実際の運用では、バックアップ先を別のディスクやサーバに置くか、--exclude 'backup/' で除外してください。
リモートサーバへのバックアップ
ローカルのデータを別のマシンにバックアップするときは、SSH 経由で転送するのが一般的です。データは暗号化されて、ネットワーク上を通ります。リモートサーバへの構文は次のとおりです。
$ rsync [options] source [user@]host:destination
| 項目 | 意味 |
|---|---|
| user | リモートサーバのユーザー名 |
| host | リモートサーバのアドレス |
| destination | リモートサーバ上のバックアップ先のパス |
ローカルの home ディレクトリを、リモートサーバ(192.168.3.117)の指定の場所にバックアップします。使用するユーザー(hirotano)が、バックアップ先のディレクトリに書き込める権限を持っていることを確認してください。
パスワード認証でバックアップする
ローカルの 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/⋮ (以下省略)
| No. | 表示 | 意味 |
|---|---|---|
| 1 | rsync -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
| No. | 表示 | 意味 |
|---|---|---|
| 1 | file1.txt、Desktop など | バックアップ元の home の内容が届いている。backup も一覧にあるのは、バックアップ元の home の中にも backup ディレクトリがあるため |
公開鍵と秘密鍵のペアを作る
SSH の公開鍵認証を使うと、パスワードを入力せずにリモートサーバへ接続できます。バックアップを自動で実行するときに必要になります。公開鍵認証の流れは、次の図のとおりです。
まず、バックアップ元で次のコマンドを実行して、公開鍵と秘密鍵のペアを作ります。-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:⋮ (以下省略)
| No. | 表示 | 意味 |
|---|---|---|
| 1 | ssh-keygen -t rsa | RSA の鍵ペアを作成するコマンド |
| 2 | Enter passphrase … | 鍵を保護するパスフレーズの入力。何も入力せずに Enter を押すと、パスフレーズなしで作成される |
| 3 | id_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⋮ (以下省略)
| No. | 表示 | 意味 |
|---|---|---|
| 1 | id_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.
| No. | 表示 | 意味 |
|---|---|---|
| 1 | ssh-copy-id -i … hirotano@192.168.3.117 | -i で公開鍵のファイルを指定し、コピー先のユーザーとホストを指定している |
| 2 | …'s password: | 公開鍵を登録するために、この1回だけパスワードを入力する |
| 3 | Number of key(s) added: 1 | 公開鍵が1つ、バックアップ先に追加された |
これで、公開鍵がバックアップ先のサーバの ~/.ssh/authorized_keys ファイルに追加されます。
hirotano@hirotano2:~$ ls /home/hirotano/.ssh/1authorized_keys
| No. | 表示 | 意味 |
|---|---|---|
| 1 | authorized_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⋮ (以下省略)
| No. | 表示 | 意味 |
|---|---|---|
| 1 | rsync -av … | STEP 1 と同じ形のコマンド(ここでは -z を付けていない) |
| 2 | sending 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)
| 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
| No. | 表示 | 意味 |
|---|---|---|
| 1 | file1.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 で消えるファイルも残る |
コメント