rsync (日本語) - ArchWiki

# rsync (日本語)

関連記事

- rsync によるフルシステムバックアップ
- バックアッププログラム

rsync は高速な差分ファイル転送を行うオープンソースのユーティリティです。

## インストール

公式リポジトリから rsync をインストールしてください。

## 使用方法

さらに多くのサンプルを見たい場合は、Community Contributions や General Programming フォーラムを検索してください。

### cp の代わりとして使う

rsync は `cp` コマンドの上位互換として使うことができ、特に大きなファイルのコピーに役立ちます:

    $ rsync -P source destination

`-P` オプションは `--partial --progress` と同じで、一部ずつファイルを転送して、転送中にプログレスバーを表示します。

ディレクトリを再帰的にコピーしたいときは `-r --recursive` オプションを使用し、相対パス名を使いたい時は `-R` を使います (転送先のフォルダでフォルダ全体の階層を再生成します)。

### バックアップユーティリティとして使う

rsync プロトコルは簡単なバックアップ用途に使うことができ、最後にバックアップした時から変更が入ったファイルだけを転送します。このセクションでは rsync を使用するシンプルな定期バックアップスクリプトを説明します。基本的にリムーバルディスクへのコピーに利用します。もっと詳しいサンプルやシステムファイルを保持するために必要なオプションは、Full system backup with rsync を見て下さい。

#### 自動バックアップ

このサンプルを使うには、スクリプトを `/etc/cron.daily` ディレクトリに作成して、インストール・設定がされている cron デーモンによって定期的にスクリプトは実行されます。cron の設定や使用方法はこの記事では割愛します。

まず、適当なコマンドオプションを含んだスクリプトを作成:

    /etc/cron.daily/backup

    #!/bin/bash
    rsync -a --delete /folder/to/backup /location/of/backup &> /dev/null

`-a`
  ファイルをアーカイブする。ファイルの属性も保存 (ただし ACL やハードリンク、ケイパビリティなどの拡張属性は除外)
`--delete`
  バックアップ元で削除されたファイルはバックアップ先でも同じように削除する

ここで、`/folder/to/backup` はバックアップしたいものに (例えば `/home`)、`/location/to/backup` はバックアップの保存先に変更します (例えば `/media/disk`)。

最後に、スクリプトを実行可能にします:

    # chmod +x /etc/cron.daily/rsync.backup

#### SSH を使った自動バックアップ

SSH を使ってリモートホストにバックアップする場合、以下のスクリプトを使用:

    /etc/cron.daily/backup

    #!/bin/bash
    rsync -a --delete -e ssh /folder/to/backup remoteuser@remotehost:/location/to/backup &> /dev/null

`-e ssh`
  rsync に SSH を使うことを教える
`remoteuser`
  ホスト `remotehost` のユーザー
`-a`
  `-rlptgoD` オプションと同義 (recursive, links, perms, times, group, owner, devices)

#### NetworkManager を使った自動バックアップ

以下のスクリプトはケーブルを接続した時にバックアップを開始します。

まず、適当なコマンドオプションを含んだスクリプトを作成:

    /etc/NetworkManager/dispatcher.d/backup

    #!/bin/bash

    if [ x"$2" = "xup" ] ; then
            rsync --force --ignore-errors -a --delete --bwlimit=2000 --files-from=files.rsync /folder/to/backup /location/to/backup
    fi

`-a`
  `-rlptgoD` オプションと同義 (recursive, links, perms, times, group, owner, devices)
`--files-from`
  ファイルから /folder/to/backup の相対パスを読み込み
`--bwlimit`
  I/O 帯域を制限、キロバイト毎秒

#### systemd と inotify を使った自動バックアップ

Note:

- inotify と systemd の制限により (この質問と答え を参照)、再帰的なファイルシステムの監視は不可能です。ディレクトリとその中身を監視することはできますが、サブディレクトリにまで再帰的に実行してその中身を監視することはされません。監視するディレクトリは全て明示的に指定する必要があります (ディレクトリが既に指定した監視ディレクトリの下にあっても記述する必要がある)。
- このセットアップは systemd/User インスタンスをベースにしています。

cron の実装など、スケジュールによって適宜バックアップを実行するのではなく、バックアップするファイルに変更があった度にバックアップを実行することが可能です。`systemd.path` ユニットは `inotify` を使ってファイルシステムを監視し、`systemd.service` と一緒に使うことでファイルシステムのイベントに合わせてあらゆるプロセスを開始することができます (この場合は rsync のバックアップ)。

まず、バックアップするファイルを監視する `systemd.path` ファイルを作成:

    ~/.config/systemd/user/backup.path

    [Unit]
    Description=Checks if paths that are currently being backed up have changed

    [Path]
    PathChanged=%h/documents
    PathChanged=%h/music

    [Install]
    WantedBy=default.target

そして変更を検出した時に実行される `systemd.service` ファイルを作成します。デフォルトで、パスユニット (ここでは `backup.path`) と同じ名前の、拡張子が `.path` ではなく `.service` のサービスファイルが実行されます (ここでは `backup.service`)。

Note: rsync コマンドを複数実行する必要がある場合は、`Type=oneshot` を使って下さい。実行する rsync ごとに、複数の `ExecStart=` パラメータを指定することができます。もしくは、cron スクリプトなど、バックアップ作業を全て実行するスクリプトを書いても良いでしょう。

    ~/.config/systemd/user/backup.service

    [Unit]
    Description=Backs up files

    [Service]
    ExecStart=/usr/bin/rsync %h/./documents %h/./music -CERrltm --delete ubuntu:

これで後は通常の systemd サービスと同じように `backup.path` を起動・有効化するだけです。ファイルの変更の監視を始めて `backup.service` を自動的に起動します:

    systemctl --user start backup.path
    systemctl --user enable backup.path

#### 一週間ごとに差分バックアップ

完全なバックアップを作成して一週間ごとに差分バックアップを行う rsync のオプションです。

まず、適当なコマンドオプションを含むスクリプトを作成:

    /etc/cron.daily/backup

    #!/bin/bash

    DAY=$(date +%A)

    if [ -e /location/to/backup/incr/$DAY ] ; then
      rm -fr /location/to/backup/incr/$DAY
    fi

    rsync -a --delete --inplace --backup --backup-dir=/location/to/backup/incr/$DAY /folder/to/backup/ /location/to/backup/full/ &> /dev/null

`--inplace`
  `--partial` で指定先のファイルを直接更新

#### スナップショットバックアップ

同じアイデアを使ってファイルのスナップショットのツリーを作ることができます。言い換えれば、ファイルのコピーが含まれる日付順のディレクトリです。コピーはハードリンクで作られ、変更があったファイルだけが場所を取ります。これは Apple の TimeMachine で使われているアイデアです。

シンプルに実装したのが以下のスクリプトになります:

    /usr/local/bin/rsnapshot.sh

    #!/bin/bash

    ## my own rsync-based snapshot-style backup procedure
    ## (cc) marcio rps AT gmail.com

    # config vars

    SRC="/home/username/files/" #dont forget trailing slash!
    SNAP="/snapshots/username"
    OPTS="-rltgoi --delay-updates --delete --chmod=a-w"
    MINCHANGES=20

    # run this process with real low priority

    ionice -c 3 -p $$
    renice +12  -p $$

    # sync

    rsync $OPTS $SRC $SNAP/latest >> $SNAP/rsync.log

    # check if enough has changed and if so
    # make a hardlinked copy named as the date

    COUNT=$( wc -l $SNAP/rsync.log|cut -d" " -f1 )
    if [ $COUNT -gt $MINCHANGES ] ; then
            DATETAG=$(date +%Y-%m-%d)
            if [ ! -e $SNAP/$DATETAG ] ; then
                    cp -al $SNAP/latest $SNAP/$DATETAG
                    chmod u+w $SNAP/$DATETAG
                    mv $SNAP/rsync.log $SNAP/$DATETAG
                   chmod u-w $SNAP/$DATETAG
             fi
    fi

このスクリプトを systemd ユニットから実行することで、ぐっとシンプルにできます。

## グラフィカルフロントエンド

公式リポジトリから grsync をインストールしてください。

Categories:

- Data compression and archiving (日本語)
- System recovery (日本語)