rsync でバックアップ
rsync コマンドを利用すれば簡単にバックアップが取れる。そこで今回は rsync コマンドにいて説明します。
rsync コマンドの基本
rsync コマンドの使い方は次の通りです。
rsync version 3.2.3 protocol version 31
Copyright (C) 1996-2020 by Andrew Tridgell, Wayne Davison, and others.
Web site: https://rsync.samba.org/
Usage: rsync [OPTION]... SRC [SRC]... DEST
or rsync [OPTION]... SRC [SRC]... [USER@]HOST:DEST
or rsync [OPTION]... SRC [SRC]... [USER@]HOST::DEST
or rsync [OPTION]... SRC [SRC]... rsync://[USER@]HOST[:PORT]/DEST
or rsync [OPTION]... [USER@]HOST:SRC [DEST]
or rsync [OPTION]... [USER@]HOST::SRC [DEST]
or rsync [OPTION]... rsync://[USER@]HOST[:PORT]/SRC [DEST]
':' はリモートシェルによる接続
'::' と 'rsync://' は rsync デーモンに接続
SRC と DEST は rsync デーモンに接続する場合は URI に準ずる
リモートシェルに接続する場合は相対または絶対パス
Options
--verbose, -v 冗長表示
--info=FLAGS きめ細かい情報の表示
--debug=FLAGS きめ細かいデバッグ情報の表示
--stderr=e|a|c 標準エラー出力モード (デフォルト: エラー表示)
--quiet, -q エラーメッセージ以外を最小限にする
--no-motd 静かなデーモンモード MOTD
--checksum, -c 更新日とサイズではなく、チェックサムで
変更の有無をチェックする
--archive, -a アーカイブモード 同等:-rlptgoD (除外 -H,-A,-X)
--no-OPTION 暗黙のオプションを無効 (例: --no-D)
--recursive, -r ディレクトリを再帰的に処理する
--relative, -R 相対パス名を使用する
--no-implied-dirs 暗黙的なディレクトリの送信を抑止 --relative と併用
--backup, -b バップアップファイルを作成する
(参照 --suffix & --backup-dir)
--backup-dir=DIR バックアップファイルを配置するディレクトリを指定
--suffix=SUFFIX バックアップファイルの拡張子 (デフォルト ~)
--update, -u 更新されたファイルだけを対象にする
--inplace ファイルを上書きする
--append 短いファイルに内容を追記する
--append-verify 追記時、ファイルチェックサムに 書き込み/旧情報 を記入
--dirs, -d ディレクトリを再帰しない
--mkpath 強制的にリンク先のディレクトリを作成
--links, -l シンボリックリンクはシンボリックリンクとして送信
--copy-links, -L シンボリックリンクを対象にする
--copy-unsafe-links リンク先が自分の配下にないものだけを対象にする
--safe-links リンク先が自分の配下にあるものだけを対象にする
--munge-links ディレクトリまたはディレクトリへのシンボリックリンクは拒否
--copy-dirlinks, -k ディレクトリへのリンクの場合もリンク先を転送する
--keep-dirlinks, -K ディレクトリへのリンクをたどらない
--hard-links, -H ハードリンクを保持する
--perms, -p パーミッションを保持する
--executability, -E 実行可能属性を保持する
--chmod=CHMOD パーミッションを指定する
--acls, -A アクセス制御リストを保持する(-p が指定状態)
--xattrs, -X 拡張属性を保持する
--owner, -o 所有者をそのまま保持する(スーパーユーザーのみ)
--group, -g 所有グループをそのまま保持する
--devices デバイスファイルを保持する (スーパーユーザーのみ)
--copy-devices デバイスファイルを通常ファイルとしてコピー
--specials 特殊ファイルを保持する
-D 同等: --devices --specials
--times, -t タイムスタンプを保持する
--atimes, -U アクセスタイムを保持する
--open-noatime 転送元のアクセスタイムを変更しない
--crtimes, -N 作成日付を保持する
--omit-dir-times, -O 「--times」オプション指定時、ディレクトリは除外する
--omit-link-times, -J 「--times」オプション指定時、シンボリックリンクは除外する
--super 受信側がスーパーユーザーかのように振る舞う
--fake-super ファイル属性を拡張属性から提供する
--sparse, -S 穴あきファイルを効率よく転送する
--preallocate 書き込み前のファイル割り当て(バグ対応)
--write-devices デバイスファイルをファイルとして書き込む(上書き)
--dry-run, -n 試験モード。実際には動作せず動作内容だけ表示する
--whole-file, -W rsync アルゴリズムを使用せず、ファイル全体を転送する
--checksum-choice=STR チェックサムアルゴリズムを指定する
--one-file-system, -x ファイルシステムの境界を越さずに同期
--block-size=SIZE, -B チェックサムブロックサイズを強制指定
--rsh=COMMAND, -e rsh が使用するコマンド
--rsync-path=PROGRAM rsync がリモートマシンで実行する
--existing 同期先に新規ファイルを作成しない
--ignore-existing 同期先にファイルがあったらスキップする
--remove-source-files 同期後にファイルを削除する
--del 同等: --delete-during
--delete 同期元にないファイルを同期先から削除する
--delete-before 同期先にないファイルを同期前に削除する
--delete-during 同期先にないファイルを同期中に削除する
--delete-delay 同期中に削除すべきファイルを見つけて、後で削除する
--delete-after 同期先にないファイルを同期終了後に削除する
--delete-excluded 同期から除外したファイルも削除する
--ignore-missing-args --files-from などで指定されたファイルが無い
場合は無視する
--delete-missing-args 同期元にない空ではないディレクトリを同期先から削除する
--ignore-errors I/Oエラーがあっても削除する
--force ディレクトリが空ではない場合も削除する
--max-delete=NUM 指定した数以上のファイルは削除しない
--max-size=SIZE 指定したサイズより大きなファイルは削除しない
--min-size=SIZE 指定したサイズより小さなファイルは削除しない
--max-alloc=SIZE メモリ割り当ての限界サイズ(RSYNC_MAX_ALLOC)
--partial 転送を中断したファイルを保持する
--partial-dir=DIR 転送を中断したファイルを保存するディレクトリ
--delay-updates 別の場所に全ての変更ファイルを保存して終了後にコピーする
--prune-empty-dirs, -m ファイルが転送されないディレクトリは転送しない
--numeric-ids ユーザーIDとグループIDを保持する
--usermap=STRING 同期先のユーザを設定する
--groupmap=STRING 同期先のグループを設定する
--chown=USER:GROUP 同期先のユーザ・グループを設定する
--timeout=SECONDS I/Oタイムアウトの秒数
--contimeout=SECONDS 接続タイムアウトの秒数
--ignore-times, -I サイズとタイムスタンプが同じファイルも処理する
--size-only サイズが同じファイルは処理しない
--modify-window=NUM, -@ 更新時刻の許容秒数(Windows関連ドライブ用)
Windows のドライブは更新時刻が正確ではない
--temp-dir=DIR, -T 指定したディレクトリに一時ディレクトリを作成する
--fuzzy, -y ファイル名が同じ場合は、送信側に転送しない
--compare-dest=DIR DIR との差分コピーを行う
--copy-dest=DIR 世代バックアップを行う場合などに前世代ディレクトリと
比較して変化があったファイルのみコピー、変化のない
ファイルは DIR 内からコピーを行う
世代バックアップ: ディレクトリ名を日付などで指定
--link-dest=DIR 世代バックアップを行う場合などに前世代ディレクトリと
比較して変化があったファイルのみコピー、変化のない
ファイルは DIR 内からハードリンクを行う
世代バックアップ: ディレクトリ名を日付などで指定
ハードリンク : ファイル名のみの複製
--compress, -z 転送中のデータを圧縮する
--compress-choice=STR 圧縮アルゴリズムを選択する
--compress-level=NUM データの圧縮レベルを指定する
--skip-compress=LIST リストファイルに書かれたファイルは圧縮しない
--filter=RULE, -f フィルタリングルールの追加
-F 同等: --filter='dir-merge /.rsync-filter'
繰り返し: --filter='- .rsync-filter'
--exclude=PATTERN 指定したパターンにマッチしたファイルは処理しない
--exclude-from=FILE 除外パターンを指定したファイルから読み込む
--include=PATTERN 指定したパターンにマッチしたファイルを処理する
--include-from=FILE 対象パターンを指定したファイルから読み込む
--files-from=FILE 同期元ファイルのリストを指定したファイルから読み込む
--from0, -0 対象リストなどのファイルを改行ではなく
ヌル文字(\0)で区切る
--protect-args, -s ワイルドカードでスペースで分けられるのを防ぐ
--copy-as=USER[:GROUP] コピーするユーザーとグループを指定する
--address=ADDRESS デーモンに接続するアドレスを指定する
--port=PORT デーモンに接続するポート番号を指定する
--sockopts=OPTIONS TCPオプションを指定する
--blocking-io リモートシェルでブロック I/O を使用する
--outbuf=N|L|B 出力バッファリングモードを設定する
モードは、None(別名Unbuffered)、Line、
またはBlock(別名Full)
巨大なファイルが含まれる場合に使用
--stats ファイル数や転送サイズを表示する
--8-bit-output, -8 8ビット以上の文字をエスケープしない
--human-readable, -h 数字を読みやすい単位で表示する
--progress 転送の進行状況を表示する
-P 同等: --partial --progress
--itemize-changes, -i 全ての更新履歴
--remote-option=OPT, -M リモート側のオプションを指定
--out-format=FORMAT 更新情報のフォーマットを指定する
--log-file=FILE ログファイルを指定する
--log-file-format=FMT ログファイルフォーマットを指定する
--password-file=FILE パスワードをファイルから読み込む
--early-input=FILE デーモンの初期化スクリプト(5K未満を標準入力から)
--list-only コピーする代わりにファイルのリストを作成する
--bwlimit=RATE 帯域制御を行い、指定の速度以下で転送を行う
--stop-after=MINS 指定の分だけ実行後に停止する(中断)
--stop-at=y-m-dTh:m 指定の時刻に停止する(中断)
--write-batch=FILE 更新したファイルをバッチファイルとして記録
--only-write-batch=FILE 更新があるファイルをバッチファイルとして記録
(DRY-RUNで記録)
--read-batch=FILE 記録されたバッチファイルを用いて更新する
--protocol=NUM 古い rsync に接続する時に古いプロトコル番号を指定する
--iconv=CONVERT_SPEC ファイル名の変換方法を指定する(文字セットを指定)
--checksum-seed=NUM チェックサム SEED を指定
--ipv4, -4 IPv4を使用する
--ipv6, -6 IPv6を使用する
--version, -V バージョンと情報を表示して終了
--help, -h (*) ヘルプを表示
アーカイブモード : tar アーカイブのようなイメージ
世代バックアップ : ディレクトリに「2022-02-07」などと指定する
ハードリンク : Linux / UNIX などのファイルシステムでは1つのファイルが
複数のファイル名を持つ事が出来る。(Windowsには存在しない概念)
DRY-RUN : 実際に実行するのではなく、動作だけを確認する
Use "rsync --daemon --help" to see the daemon-mode command-line options.
Please see the rsync(1) and rsyncd.conf(5) man pages for full documentation.
See https://rsync.samba.org/ for updates, bug reports, and answers
同一マシン内でのバックアップ
rsync -au SRC_PATH/ DEST_PATH
- 「a」
アーカイブモードで行う(ファイル属性などを保持する) - 「u」
更新分のみコピーを行う - SRC_PATH
コピー元のディレクトリ(絶対または相対パス)
末尾に「/」を付ける - DEST_PATH
コピー先のディレクトリ(絶対または相対パス)
末尾に「/」を付けない
マシン間でのバックアップ
rsync -auz SRC_PATH/ user@host:DEST_PATH
rsync -auz user@host:SRC_PATH/ DEST_PATH
- 「a」
アーカイブモードで行う(ファイル属性などを保持する) - 「u」
更新分のみコピーを行う - 「z」
マシン間での転送は圧縮して行う - 「user」
マシンに接続するユーザーアカウント - 「host」
接続するマシン名称または IP アドレス - SRC_PATH
コピー元のディレクトリ(絶対または相対パス)
末尾に「/」を付ける - DEST_PATH
コピー先のディレクトリ(絶対または相対パス)
末尾に「/」を付けない
「user@host:PATH」では host マシンの user にログインした状態ですので、続くパス(PATH)は相対パスまたは絶対パスになります。
基本的に「ssh」接続になりますので、「~/.ssh/known_hosts」に対象マシンがあるかどうかで挙動が変わります。
マシン間でのバックアップを自動化
異なるマシン間でバックアップを取る時、通常はパスワードが聞かれます。
この時、パスワード入力はキーボード入力で行われるので、通常のバッチファイルで行う場合は一工夫必要です。
パスワードファイルを作成して行う
パスワード記載したファイルを「FILE」として保存し、「–password-file=FILE」を使用する
rsync -auz --password-file=FILE SRC_PATH/ user@host:DEST_PATH
rsync -auz --password-file=FILE user@host:SRC_PATH/ DEST_PATH
expect コマンドを使用して行う
expect -c 'spawn rsync -auz --password-file=FILE SRC_PATH/ user@host:DEST_PATH ; expect "password:" ; send "PASSWORD\n" ; expect wait'
expect -c 'spawn rsync -auz --password-file=FILE user@host:SRC_PATH/ DEST_PATH ; expect "password:" ; send "PASSWORD\n" ; expect wait'
「PASSWORD」の部分にパスワードを指定
sshpass コマンドを使用して行う
sshpass -p "PASSWORD" rsync -auz --password-file=FILE SRC_PATH/ user@host:DEST_PATH
sshpass -p "PASSWORD" rsync -auz --password-file=FILE user@host:SRC_PATH/ DEST_PATH
「PASSWORD」の部分にパスワードを指定