「Rsync」の版間の差分

提供: ArchWiki
ナビゲーションに移動 検索に移動
(→‎cp の代わりとして使う: 英語版と同期して情報を翻訳して追加)
(末尾のスラッシュに関する注意事項を翻訳して追加)
40行目: 40行目:
   
 
ディレクトリを再帰的にコピーしたいときは {{ic|-r --recursive}} オプションを使用し、相対パス名を使いたい時は {{ic|-R}} を使います (転送先のフォルダでフォルダ全体の階層を再生成します)。
 
ディレクトリを再帰的にコピーしたいときは {{ic|-r --recursive}} オプションを使用し、相対パス名を使いたい時は {{ic|-R}} を使います (転送先のフォルダでフォルダ全体の階層を再生成します)。
  +
  +
=== ​末尾のスラッシュに関する注意事項 ===
  +
  +
Arch はデフォルトで GNUcp (GNU {{Pkg|coreutils}} の一部) を使用します。 ただし、rsync は BSD cp の規則に従います。これは、末尾にスラッシュ 「/」 が付いたソースディレクトリに特別な処理を与えます。 しかし
  +
  +
$ rsync -r source destination
  +
  +
ディレクトリ "転送先/source" を "source" の内容で作成します。
  +
  +
$ rsync -r source/ destination
  +
  +
​は "source/" 内のすべてのファイルを "転送先" に直接コピーするが、その間にサブディレクトリは置かない。
  +
  +
$ rsync -r source/. destination
  +
  +
​この動作は GNU cp の動作とは異なります。GNU cp は "source" と "source/" を同じように扱います( "source/" ではありません)。​また、シェルによっては、タブを補完するディレクトリ名の末尾にスラッシュを自動的に付加するものもあります。​これらの要因のために、 rsync を初めて使う、あるいは時々使うユーザの間では、 rsync の異なる動作を忘れてしまい、コマンドラインの最後にあるスラッシュを忘れてしまうことで、混乱を招いたり、重要なファイルを上書きしたりする傾向があります。
  +
  +
  +
したがって、rsync を呼び出す前に、ラッパースクリプトを使用して、末尾のスラッシュを自動的に削除することをお勧めします:
  +
  +
#!/bin/zsh
  +
new_args=();
  +
for i in "$@"; do
  +
case $i in /) i=/;; */) i=${i%/};; esac
  +
new_args+=$i;
  +
done
  +
exec rsync "${(@)new_args}"
  +
  +
このスクリプトをパスの通った場所に置き、シェルの init ファイル内で rsync というエイリアスが付けられます。
   
 
=== バックアップユーティリティとして使う ===
 
=== バックアップユーティリティとして使う ===

2020年11月22日 (日) 18:14時点における版

関連記事

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

インストール

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

rsync をソースマシンと転送先マシンの両方にインストールする必要があります。

フロントエンド

  • Grsync — GTK フロントエンド
http://www.opbyte.it/grsync/ || grsync
  • gutback — シェルで書かれた rsync ラッパー
https://github.com/gutenye/gutbackup || gutbackupAUR
  • JotaSync — ​スケジューラ内蔵の rsync 用 Java Swing GUI
https://trixon.se/projects/jotasync/ || jotasyncAUR
  • luckyBackup — ​C++ で書かれた Qt フロントエンド
http://luckybackup.sourceforge.net/index.html || luckybackupAUR

​その他のツールは以下の通りです。 rdiff-backuposyncAUR

使用方法

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

cp/mv の代わりとして使う

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

$ rsync -P source destination

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

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

​末尾のスラッシュに関する注意事項

Arch はデフォルトで GNUcp (GNU coreutils の一部) を使用します。 ただし、rsync は BSD cp の規則に従います。これは、末尾にスラッシュ 「/」 が付いたソースディレクトリに特別な処理を与えます。 しかし

$ rsync -r source destination

ディレクトリ "転送先/source" を "source" の内容で作成します。

$ rsync -r source/ destination

​は "source/" 内のすべてのファイルを "転送先" に直接コピーするが、その間にサブディレクトリは置かない。

$ rsync -r source/. destination

​この動作は GNU cp の動作とは異なります。GNU cp は "source" と "source/" を同じように扱います( "source/" ではありません)。​また、シェルによっては、タブを補完するディレクトリ名の末尾にスラッシュを自動的に付加するものもあります。​これらの要因のために、 rsync を初めて使う、あるいは時々使うユーザの間では、 rsync の異なる動作を忘れてしまい、コマンドラインの最後にあるスラッシュを忘れてしまうことで、混乱を招いたり、重要なファイルを上書きしたりする傾向があります。


したがって、rsync を呼び出す前に、ラッパースクリプトを使用して、末尾のスラッシュを自動的に削除することをお勧めします:

#!/bin/zsh
new_args=();
for i in "$@"; do
    case $i in /) i=/;; */) i=${i%/};; esac
    new_args+=$i;
done
exec rsync "${(@)new_args}"

このスクリプトをパスの通った場所に置き、シェルの init ファイル内で rsync というエイリアスが付けられます。

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

rsync プロトコルは簡単なバックアップ用途に使うことができ、最後にバックアップした時から変更が入ったファイルだけを転送します。このセクションでは rsync を使用するシンプルな定期バックアップスクリプトを説明します。基本的にリムーバブルディスクへのコピーに利用します。もっと詳しいサンプルやシステムファイルを保持するために必要なオプションは、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/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 帯域を制限、キロバイト毎秒

また、書き込み権限は所有者 (root) だけに制限して下さい (詳しくは NetworkManager dispatcher を参照)。

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

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

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)。

ノート: 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インストールしてください。