rsync を活用した Linux 環境での遠隔データ同期設定手順

rsync ツールの概要と特徴

rsync(Remote Sync)は、Linux および Unix 系システム上で広く利用されている高速なデータ同期およびバックアップユーティリティです。ネットワークを介して異なるホスト間でディレクトリツリー全体をミラーリングする際に優位性を発揮します。

主な機能として、変更された部分のみを転送する増分バックアップに対応しており、シンボリックリンクやファイルの権限属性、タイムスタンプも維持することができます。転送前の圧縮処理やアルゴリズムの最適化により、帯域幅の節約と転送速度の向上を図ることが可能です。遠隔地のバックアップサーバー構築や、複数サーバー間のデータ複製などにおいて強力な役割を果たします。

rsync デーモンモードによるソースサーバ設定

同期タスクを実行する際、データの提供元となるサーバーを「ソース(同期元)」と呼びます。クライアント側から要求を受け取り、データを提供する役割を担います。ここでは rsync のデーモンプロセス(rsyncd)を起動し、専用の設定ファイルで共有モジュールを定義する方法について解説します。

1. 基本設定ファイルの作成

多くの Linux ディストリビューションでは標準パッケージに含まれていますが、確認後に設定を進めます。設定ファイル /etc/rsyncd.conf を編集し、以下のようなパラメータを記述します。

# rsyncd.conf の例
uid = nobody
gid = nogroup
use chroot = true
address = 10.20.30.40
port = 873
log file = /var/log/rsyncd.log
pid file = /var/run/rsyncd.pid
hosts allow = 192.168.1.0/24
dont compress = *.gz *.zip *.xz

[app_data]
    path = /srv/application/data
    comment = Application Shared Data
    read only = false
    auth users = sync_admin
    secrets file = /etc/rsyncd.passwd
  • hosts allow: アクセスを許可するネットワーク範囲を指定します。
  • [app_data]: 公開するモジュール名(任意の名称)です。
  • auth users: 接続時に必要なユーザー名を定義します。

2. 認証情報の準備

アクセス権限を持たせるユーザー情報を作成します。パスワードファイルには「ユーザー:パスワード」の形式で記述します。

# パスワードファイルの作成
echo "sync_admin:SecurePass123" > /etc/rsyncd.passwd
chmod 600 /etc/rsyncd.passwd

3. サービスの起動と状態確認

ファイアウォールと SELinux の設定を調整した後、rsync デーモンを起動します。

# ポート開放とセキュリティ設定の一時無効化(開発環境向け)
systemctl stop firewalld
setenforce 0

# rsync サービス開始
rsync --daemon --config=/etc/rsyncd.conf

# リッスンポートの確認
ss -lntp | grep 873

クライアントからの同期操作方法

同期クライアントからは、ソースサーバーに対して読み取りまたは書き込み操作を行います。コマンドラインでの基本書式は以下の通りです。

rsync [オプション] ソースパス 宛先パス

頻繁に使用される主要オプションについては、以下を参照してください。

  • -a: アーカイブモード。再帰処理を行い、属性や権限を保持します。
  • -v: 詳細ログ出力。
  • -z: 転送中の圧縮有効化。
  • --delete: 送信先に存在し、元の場所にないファイルを削除することで一致させます。
  • -e: 別のトランスポートプロトコルを使用する指定。

同期の実行例

ローカルディレクトリへデータを取得する場合(下行同步):

mkdir -p /mnt/backup_target
rsync -avz --delete --password-file=/etc/rsync_passwd \
  sync_admin@10.20.30.40::app_data /mnt/backup_target/

パスワードファイルを用いない場合は、インタラクティブに入力する必要があります。また、URI 形式を利用することも可能です。

rsync -avz --delete \
  rsync://sync_admin@10.20.30.40/app_data /mnt/backup_target/

SSH トンネルを使用した認証方式

rsync デーモンを別途設定したくない場合や、既存の SSH 基盤を利用したい場合は、SSH プロトコル経由での通信が可能です。この方法は、rsyncd.conf のような独自の構成ファイルが不要であり、SSH鍵認証との親和性が高いため、柔軟性が必要に応じて採用されます。

クライアント側から直接指定するコマンド例:

rsync -avz -e 'ssh -p 22' root@10.20.30.40:/srv/files/public /local/storage/

SSH パスワード入力を自動化する場合は、sshpassツールを組み合わせて利用することが一般的ですが、セキュリティ上好ましくなければ非対称鍵认证を推奨します。

リアルタイム同期の実装(inotify + rsync)

定期的なバッチ処理だけでなく、ファイルシステムの変更を即座に検知して同期的に反映させる仕組みが必要です。Linux カーネルが提供する inotify イベント監視機構と rsync を組み合わせることで、トリガー型の即時同期を実現できます。

1. インフラ前提条件

監査対象のファイル数が多い場合、カーネルパラメータの調整が必要です。/proc/sys/fs/inotify/配下の値を確認・拡張します。

vim /etc/sysctl.conf
fs.inotify.max_user_watches = 524288
fs.inotify.max_user_instances = 128
sysctl -p

必要なユーティリティセットである inotify-tools をビルドインストールします。

2. モニタリングスクリプトの作成

ファイル変更イベントを検知し、rsync 実行を制御するバッシュスクリプトを作成します。重複実行を防ぐためにプロセス管理ロジックを組み込みます。

#!/bin/bash
TARGET_DIR="/home/project/src/"
REMOTE_HOST="10.20.30.40"
REMOTE_USER="deployer"
REMOTE_PORT="22"
PASS_FILE="/etc/secure_pass.txt"

# inotifywait で継続的に監視
/usr/bin/inotifywait -m -r -q -e modify,create,delete,moved_to "$TARGET_DIR" |
while read dir event filename; do
    # 既に rsync が動作している場合はスキップ
    if pgrep -x "rsync" > /dev/null; then
        continue
    fi

    echo "$(date): $event detected - syncing..."
    /usr/bin/rsync -az --delete \
        -e "sshpass -f $PASS_FILE ssh -p $REMOTE_PORT" \
        "$TARGET_DIR" ${REMOTE_USER}@${REMOTE_HOST}:/var/www/html/
done

このスクリプトを実行すると、指定ディレクトリ内の活動に対して rsync 処理が自動的に発動します。

大容量データの削除効率化

通常の rm コマンドでは、多数の小さなファイルを含むディレクトリの空解には時間がかかる場合があります。rsync の機能を利用することで、より高速に削除を行うテクニックが存在します。

これは、空のディレクトリを対象ディレクトリに対して --delete フラグと共に転送することで、差分解析により不足ファイルを削除させる手法です。

# 空ディレクトリの用意
mkdir /tmp/empty_space

# rsync による強制削除
rsync -av --delete-before --stats \
    /tmp/empty_space/ /target/folder/to/clear/

この方法では、転送プロトコルの特性上、大量のファイルリスト処理において rm 命令よりも優れたパフォーマンスを発揮することがあります。

タグ: rsync linux DataSync BackupAutomation inotify-tools

7月31日 05:51 投稿