「Rsync」の版間の差分
細 (文字列「[[zh-CN:」を「[[zh-hans:」に置換) |
|||
4行目: | 4行目: | ||
[[en:Rsync]] |
[[en:Rsync]] |
||
[[es:Rsync]] |
[[es:Rsync]] |
||
− | [[zh- |
+ | [[zh-hans:Rsync]] |
{{Related articles start}} |
{{Related articles start}} |
||
{{Related|rsync によるフルシステムバックアップ}} |
{{Related|rsync によるフルシステムバックアップ}} |
2017年1月29日 (日) 00:36時点における版
rsync は高速な差分ファイル転送を行うオープンソースのユーティリティです。
目次
インストール
公式リポジトリから rsync をインストールしてください。
使用方法
さらに多くのサンプルを見たい場合は、Community Contributions や General Programming フォーラムを検索してください。
cp の代わりとして使う
rsync は cp
コマンドの上位互換として使うことができ、特に大きなファイルのコピーに役立ちます:
$ rsync -P source destination
-P
オプションは --partial --progress
と同じで、一部ずつファイルを転送して、転送中にプログレスバーを表示します。
ディレクトリを再帰的にコピーしたいときは -r --recursive
オプションを使用し、相対パス名を使いたい時は -R
を使います (転送先のフォルダでフォルダ全体の階層を再生成します)。
バックアップユーティリティとして使う
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 を使った自動バックアップ
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
)。
~/.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 のタイマーユニットから実行することで、ぐっとシンプルにできます。