「Rsync」の版間の差分
(末尾のスラッシュに関する注意事項を翻訳して追加) |
(→使用方法: 英語版と同期してフルシステムバックアップを翻訳して追加) |
||
225行目: | 225行目: | ||
このスクリプトを systemd の[[systemd/タイマー|タイマー]]ユニットから実行することで、ぐっとシンプルにできます。 |
このスクリプトを systemd の[[systemd/タイマー|タイマー]]ユニットから実行することで、ぐっとシンプルにできます。 |
||
+ | |||
+ | === フルシステムバックアップ === |
||
+ | |||
+ | このセクションでは、 ''rsync'' を使用して、選択したいくつかのディレクトリを除く {{ic|/}} ツリー全体のコピーを転送する方法について説明します。 このアプローチは、 {{ic|dd}} を使用した [[ディスクのクローン]] よりも優れていると考えられます。これは、異なるサイズ、パーティションテーブル、およびファイルシステムを使用できるため、 {{ic|cp-aを使用したコピーよりも優れているためです}} も同様です。これにより、ファイルのアクセス許可、属性、 [[アクセス制御リスト]] および [https://wiki.archlinux.jp/index.php/%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%AE%E3%83%91%E3%83%BC%E3%83%9F%E3%83%83%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%A8%E5%B1%9E%E6%80%A7#.E6.8B.A1.E5.BC.B5.E5.B1.9E.E6.80.A7 拡張属性] をより細かく制御できるようになります。 |
||
+ | |||
+ | ''rsync'' はシステムの実行中でも機能しますが、転送中に変更されたファイルは転送される場合とされない場合があり、転送されたファイルを使用する一部のプログラムの未定義の動作を引き起こす可能性があります。 |
||
+ | |||
+ | このアプローチは、既存のインストールを新しい HDD または [[SSD]] に移行する場合に適しています。 |
||
+ | |||
+ | rootとして次のコマンドを実行して、rsyncがすべてのシステムファイルにアクセスし、所有権を保持できることを確認します: |
||
+ | |||
+ | # rsync -aAXHv --exclude={"/dev/*","/proc/*","/sys/*","/tmp/*","/run/*","/mnt/*","/media/*","/lost+found"} / ''/path/to/backup'' |
||
+ | |||
+ | {{ic|-aAX}} のオプションセットを使用することにより、ファイルはアーカイブモードで転送され、シンボリックリンク、デバイス、アクセス許可、所有権、変更時間、 [[ACL]]、 および拡張属性が保持されます。 ターゲット [[ファイルシステム]] がこの機能をサポートしていると仮定します。 オプション {{ic|-H}} はハードリンクを保持しますが、より多くのメモリを使用します。 |
||
+ | |||
+ | {{ic|--exclude}} オプションを指定すると、指定したパターンに一致するファイルが除外されます。ディレクトリ {{ic|/dev}}}、 {{ic|/proc}}、 {{ic|/sys}}、 {{ic|/tmp}}、 {{ic|/run}} は上記のコマンドに含まれますが、これらのディレクトリの ''内容'' は除外されます。これは、起動時にはディレクトリが作成されますが、ディレクトリ自体は作成されないためです。{{ic|/lost+found}}はファイルシステム固有です。上記のコマンドは、 [https://www.gnu.org/software/bash/manual/html_node/Brace-Expansion.html bash]および [http://zsh.sourceforge.net/Doc/Release/Expansion.html#Brace-Expansion zsh] シェルの両方で使用できるブレース展開に依存します。別の [[シェル]] を使用する場合は、 {{ic|--exclude}} パターンを手動で繰り返す必要があります。除外パターンを引用符で囲むと、 [[シェル]] による展開が回避されます。これは、たとえば [[SSH]] のバックアップ時に必要です。除外パスの最後に {{ic|*}} を指定すると、ディレクトリ自体がまだ存在しない場合でも作成されます。 |
||
+ | |||
+ | {{Note| |
||
+ | * {{ic|/mnt}} または {{ic|/media}} 以外の場所でシステムをバックアップする場合は、無限ループを回避するために、除外パターンのリストにシステムを追加することを忘れないでください。 |
||
+ | *システムにバインドマウントがある場合は、それらも除外して、バインドマウントされたコンテンツが1回だけコピーされるようにする必要があります。 |
||
+ | ※[[スワップファイル]] を使用する場合は、必ず除外してください。 |
||
+ | * {{ic|/home/}} ディレクトリをバックアップするかどうかを検討してください。 データが含まれている場合は、システムよりもかなり大きくなる可能性があります。 それ以外の場合は、 {{ic|/home/*/.thumbnails/*}}, {{ic|/home/*/.cache/mozilla/*}}, {{ic|/home/*/.cache/chromium/*}}, と {{ic|/home/*/.local/share/Trash/*}} などの重要でないサブディレクトリを除外することを検討してください。 {{ic|/home/*/.local/share/Trash/*}} は、システムにインストールされているソフトウェアによって異なります。 |
||
+ | * [[GVFS]] がインストールされている場合、 rsync エラーを防ぐために、 {{ic|/home/*/.gvfs}} を除外する必要があります。 |
||
+ | * [[Dhcpcd]] ≥9.0.0 がインストールされている場合は、 {{ic|/var/lib/dhcpcd/*}} ディレクトリを除外します。これは、いくつかのシステムディレクトリをサブディレクトリとしてマウントするためです。 |
||
+ | }} |
||
+ | |||
+ | 追加の [[rsync]] オプションを含めるか、次のようないくつかを削除することをお勧めします。 完全なリストについては、 {{man|1|rsync}} を参照してください。 |
||
+ | |||
+ | *メモリが非常に少ないシステムで実行している場合は、 {{ic|-H}} オプションを削除することを検討してください。ただし、最近のほとんどのマシンでは問題ありません。使用するソフトウェアによっては、ファイルシステムに多くのハードリンクが存在する可能性があります(たとえば、 [[Flatpak]] を使用している場合)。多くのハードリンクは {{ic|/usr/}} ディレクトリの下にあります。 |
||
+ | *これを同じバックアップディレクトリで複数回実行している場合は、rsync の {{ic|--delete}} オプションを追加することをお勧めします。この場合、ソースパスが {{ic|/*}} で終わっていないことを確認してください。そうでない場合、このオプションはソースディレクトリのサブディレクトリ内のファイルにのみ影響しますが、存在するファイルには影響しません。ソースディレクトリ内に直接。 |
||
+ | *仮想ディスク、 [[Docker]] イメージなどのスパースファイルを使用する場合は、 {{ic|-S}} オプションを追加する必要があります。 |
||
+ | * {{ic|--numeric-ids}} オプションは、ユーザー名とグループ名のマッピングを無効にします。代わりに、数値のグループ ID とユーザー ID が転送されます。これは、 [[SSH]] を介してバックアップする場合、またはライブシステムを使用して別のシステムディスクをバックアップする場合に役立ちます。 |
||
+ | * {{ic|-v}} の代わりに {{ic|1=-info=progress2}} オプションを選択すると、転送されるファイルのリストではなく、全体的な進行状況情報と転送速度が表示されます。 |
||
+ | *再帰時にファイルシステムの境界を越えないようにするには、オプション {{ic|-x}}/{{ic|--one-file-system}} を追加します。これにより、階層内のマウントポイントをバックアップできなくなります。 |
||
== グラフィカルフロントエンド == |
== グラフィカルフロントエンド == |
2020年11月22日 (日) 18:55時点における版
rsync は高速な差分ファイル転送を行うオープンソースのユーティリティです。
目次
インストール
公式リポジトリから rsync をインストールしてください。
rsync をソースマシンと転送先マシンの両方にインストールする必要があります。
フロントエンド
- Grsync — GTK フロントエンド
- gutback — シェルで書かれた rsync ラッパー
- JotaSync — スケジューラ内蔵の rsync 用 Java Swing GUI
- luckyBackup — C++ で書かれた Qt フロントエンド
その他のツールは以下の通りです。 rdiff-backup 、 osyncAUR
使用方法
さらに多くのサンプルを見たい場合は、Community Contributions や General 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 を使った自動バックアップ
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 のタイマーユニットから実行することで、ぐっとシンプルにできます。
フルシステムバックアップ
このセクションでは、 rsync を使用して、選択したいくつかのディレクトリを除く /
ツリー全体のコピーを転送する方法について説明します。 このアプローチは、 dd
を使用した ディスクのクローン よりも優れていると考えられます。これは、異なるサイズ、パーティションテーブル、およびファイルシステムを使用できるため、 cp-aを使用したコピーよりも優れているためです
も同様です。これにより、ファイルのアクセス許可、属性、 アクセス制御リスト および 拡張属性 をより細かく制御できるようになります。
rsync はシステムの実行中でも機能しますが、転送中に変更されたファイルは転送される場合とされない場合があり、転送されたファイルを使用する一部のプログラムの未定義の動作を引き起こす可能性があります。
このアプローチは、既存のインストールを新しい HDD または SSD に移行する場合に適しています。
rootとして次のコマンドを実行して、rsyncがすべてのシステムファイルにアクセスし、所有権を保持できることを確認します:
# rsync -aAXHv --exclude={"/dev/*","/proc/*","/sys/*","/tmp/*","/run/*","/mnt/*","/media/*","/lost+found"} / /path/to/backup
-aAX
のオプションセットを使用することにより、ファイルはアーカイブモードで転送され、シンボリックリンク、デバイス、アクセス許可、所有権、変更時間、 ACL、 および拡張属性が保持されます。 ターゲット ファイルシステム がこの機能をサポートしていると仮定します。 オプション -H
はハードリンクを保持しますが、より多くのメモリを使用します。
--exclude
オプションを指定すると、指定したパターンに一致するファイルが除外されます。ディレクトリ /dev
}、 /proc
、 /sys
、 /tmp
、 /run
は上記のコマンドに含まれますが、これらのディレクトリの 内容 は除外されます。これは、起動時にはディレクトリが作成されますが、ディレクトリ自体は作成されないためです。/lost+found
はファイルシステム固有です。上記のコマンドは、 bashおよび zsh シェルの両方で使用できるブレース展開に依存します。別の シェル を使用する場合は、 --exclude
パターンを手動で繰り返す必要があります。除外パターンを引用符で囲むと、 シェル による展開が回避されます。これは、たとえば SSH のバックアップ時に必要です。除外パスの最後に *
を指定すると、ディレクトリ自体がまだ存在しない場合でも作成されます。
追加の rsync オプションを含めるか、次のようないくつかを削除することをお勧めします。 完全なリストについては、 rsync(1) を参照してください。
- メモリが非常に少ないシステムで実行している場合は、
-H
オプションを削除することを検討してください。ただし、最近のほとんどのマシンでは問題ありません。使用するソフトウェアによっては、ファイルシステムに多くのハードリンクが存在する可能性があります(たとえば、 Flatpak を使用している場合)。多くのハードリンクは/usr/
ディレクトリの下にあります。 - これを同じバックアップディレクトリで複数回実行している場合は、rsync の
--delete
オプションを追加することをお勧めします。この場合、ソースパスが/*
で終わっていないことを確認してください。そうでない場合、このオプションはソースディレクトリのサブディレクトリ内のファイルにのみ影響しますが、存在するファイルには影響しません。ソースディレクトリ内に直接。 - 仮想ディスク、 Docker イメージなどのスパースファイルを使用する場合は、
-S
オプションを追加する必要があります。 --numeric-ids
オプションは、ユーザー名とグループ名のマッピングを無効にします。代わりに、数値のグループ ID とユーザー ID が転送されます。これは、 SSH を介してバックアップする場合、またはライブシステムを使用して別のシステムディスクをバックアップする場合に役立ちます。-v
の代わりに-info=progress2
オプションを選択すると、転送されるファイルのリストではなく、全体的な進行状況情報と転送速度が表示されます。- 再帰時にファイルシステムの境界を越えないようにするには、オプション
-x
/--one-file-system
を追加します。これにより、階層内のマウントポイントをバックアップできなくなります。