rsync 技術情報 - ダメ出し Blog

[rsync][ssh] [更新履歴]

概要

あとで書く。いつか書く。

rsync(1), rsyncd.conf(5), ssh(1), authorized_keys(5)

インストール

Debian / Ubuntu の場合:

# apt-get install rsync openssh-client

RHEL の場合:

# yum install rsync openssh-clients

よく利用するオプション

rsyncd over SSH によるプッシュ方式のバックアップ

rsyncd over SSH (rsync server over SSH) 環境を構築し、 バックアップ対象のファイル群が存在するホストでスクリプトを実行し、 バックアップ先ホストへ転送する手順です。 (「バックアップ」と称していますが、それ以外の用途にも利用できます)

次の条件とします。

バックアップ対象ホスト target-host での環境構築

バックアップ対象ホスト target-host で SSH 鍵ペア /srv/etc/backup/id_rsa* を作成します。 SSH 接続を無人で行なえるようにするため、パスフレーズなしにします。

# mkdir -p /srv/etc/backup
# ssh-keygen -t rsa -N '' -f /srv/etc/backup/id_rsa

バックアップ対象ホスト target-host でバックアップスクリプト /srv/sbin/backup-target-host を作成します。 ssh(1) のオプションや rsync の --exclude オプション (除外ファイル) は適宜調整してください

#!/bin/bash

set -u
set -e

## ======================================================================

ssh_id="/srv/etc/backup/id_rsa"
ssh_opts="-o 'ServerAliveInterval 60'"

src_paths=(
  /etc
  /var/lib
  /home
)

dst="backup-user@backup-host::target-host"

## ======================================================================

## 以下の rsync オプションの使用も検討すること:
##  * --acls
##    POSIX ACL を利用している場合
##  * --xattrs
##    拡張属性を利用している場合
##  * --hard-links
##    ハードリンクを利用している場合

rsync \
  --rsh "ssh -i '$ssh_id' $ssh_opts" \
  --archive \
  --relative \
  --omit-dir-times \
  --delete \
  --delete-excluded \
  --exclude '.sw?' \
  --exclude '.*.sw?' \
  --exclude '.libs' \
  --exclude '*~' \
  --exclude '*.tmp' \
  --exclude '*.bak' \
  --exclude '*.old' \
  --exclude '*.[oa]' \
  --exclude '*.l[oa]' \
  --exclude '*.pyc' \
  --exclude 'tmp/*' \
  --exclude '**/log/*' \
  --exclude '/var/lib/apt/lists/*' \
  --exclude '/var/lib/clamav/*' \
  --exclude '/var/lib/dpkg/info/*' \
  --exclude '/var/lib/mecab/dic/*' \
  --exclude '/var/lib/mlocate/mlocate.db' \
  --exclude '/var/lib/dkms/*' \
  --exclude '/var/lib/dropbox/*' \
  --exclude '/var/lib/groonga/db/*' \
  --exclude '/var/lib/gems/*' \
  "$@" \
  "${src_paths[@]}" \
  "$dst" \
  ;

バックアップ先ホスト backup-host での環境構築

バックアップ先ホスト backup-host にバックアップ実行ユーザー backup-user を作成します。

# useradd --system --create-home backup-user

バックアップ先ホスト backup-host のバックアップ実行ユーザーの SSH 認可ファイル ~backup-user/.ssh/authorized_keys に SSH 公開鍵を登録します。 公開鍵の前に各種オプションを記述することで rsync 以外の実行や各種オプション機能を無効にして、 バックアップ以外の用途に利用されないようにします。 実行優先度を調整したい場合は rsync ... の前にnice を、 IO 優先度を調整したい場合は ionice -n3 などを追加してもいいでしょう。

restrict,command="rsync --server --daemon --config=/srv/etc/backup/rsyncd.conf ." <target-host:/srv/etc/backup/id_rsa.pub の内容>

設定ファイルとバックアップデータ保存先のディレクトリを作成します。

# mkdir -m 0755 -p /srv/etc/backup
# mkdir -m 0755 -p /srv/var/backup/target-host
# chown backup-user: /srv/var/backup/target-host

バックアップ先ホスト backup-host で rsync デーモンの設定ファイル /srv/etc/backup/rsyncd.conf を用意します。

[global]
## バックアップ先ホストで root 権限で実行しない場合
use chroot = no
## バックアップ先ホストで root 権限で実行しない場合、かつ
## バックアップ対象に複数のユーザー/グループ所有ファイルなどが含まれる場合
fake super = yes

## バックアップ先ホストで root 権限で実行する場合、かつ
## バックアップ対象ホストとユーザー/グループ構成・UID/GID 値が異なる場合
#numeric ids = yes

[target-host]
path = /srv/var/backup/target-host
read only = no
## バックアップ先を書き込み専用にする場合
#write only = yes

動作確認と自動化

動作確認のため、バックアップスクリプトを冗長モード (--verbose) かつ実際の転送なし (--dry-run) で実行し、 想定通りのファイルが転送されることを確認します。

# /srv/sbin/backup-target-host --verbose --dry-run
…

問題なければ cron などで実行を自動化します。

/etc/crontab ファイルにより毎日午前 4時に実行するための記述例を示します。 この例では、実行優先度を調整するために nice(1) を、 IO 優先度を調整するために ionice(1) を、 rsync で圧縮転送を利用するために --compress オプションを指定しています。

00 04 * * * root nice ionice -n7 /srv/sbin/backup --compress

リストアの例

必要に応じて rsync に --acls, --xattrs, --hard-links オプションを指定すること。

# rsync \
  --rsh 'ssh -i /srv/etc/backup/id_rsa' \
  --archive \
  --relative \
  backup-user@backup-host::'target-host/etc target-host/var target-host/home' \
  /path/to/restore \
  ;