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」の部分にパスワードを指定

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です