Linux rsyncコマンド入門
ファイルを効率的に同期・転送する
rsyncは、ファイルやディレクトリを効率的に同期・転送するコマンドです。変更があった部分だけを転送する差分同期により、高速なバックアップやデプロイが可能です。
こんな人向けの記事です
- サーバー間でファイルを効率的に同期したい人
- 定期バックアップの仕組みを構築したい人
- 大量のファイルを高速に転送したい人
Step 1rsyncの基本的な使い方
rsyncの基本構文は rsync [オプション] 送信元 送信先 です。
ターミナル
# ローカルのディレクトリ同期
rsync -av /source/ /destination/
# 進捗表示付き
rsync -av --progress /source/ /destination/
末尾のスラッシュに注意
/source/(スラッシュあり)はディレクトリの中身を転送します。/source(スラッシュなし)はディレクトリ自体を転送します。結果が大きく変わるので注意してください。
Step 2よく使うオプション
rsyncの主要なオプション一覧です。
| オプション | 説明 |
|---|---|
-a | アーカイブモード(パーミッション・所有者等を保持) |
-v | 詳細表示(転送ファイル名を表示) |
-z | 転送データを圧縮 |
-n | ドライラン(実際には実行しない) |
--delete | 送信元にないファイルを送信先から削除 |
--progress | 転送の進捗を表示 |
--exclude | 特定のファイル・ディレクトリを除外 |
-e ssh | SSH経由で転送(デフォルト) |
-av はお決まりの組み合わせ
rsync -av(archive + verbose)は、ファイル属性を保持しつつ転送状況を表示する、最も基本的で頻繁に使われる組み合わせです。
Step 3リモートサーバーとの同期
rsyncはSSH経由でリモートサーバーとファイルを同期できます。
ターミナル
# ローカル → リモート(アップロード)
rsync -avz ./project/ username@hostname:/var/www/html/
# リモート → ローカル(ダウンロード)
rsync -avz username@hostname:/var/log/ ./logs/
# ポートを指定
rsync -avz -e "ssh -p 2222" ./data/ username@hostname:/backup/
# SSH configの名前で接続
rsync -avz ./deploy/ myserver:/var/www/html/
Step 4除外パターンの指定
不要なファイルを転送対象から除外できます。
ターミナル
# 特定のファイル・ディレクトリを除外
rsync -av --exclude='node_modules' --exclude='.git' ./project/ /backup/
# 除外パターンをファイルから読み込み
rsync -av --exclude-from='exclude.txt' ./project/ /backup/
# exclude.txt の例:
# node_modules/
# .git/
# *.log
# .env
Step 5バックアップへの活用
rsyncの差分転送を活かしたバックアップ設定です。
ターミナル
# 完全ミラーリング(送信元と完全に一致させる)
rsync -av --delete /source/ /backup/
# ドライランで確認してから実行
rsync -avn --delete /source/ /backup/ # 確認
rsync -av --delete /source/ /backup/ # 実行
# cronで定期バックアップ
# crontab -e で以下を追加
# 0 2 * * * rsync -av --delete /data/ /backup/data/
--delete は必ずドライランで確認
--delete オプションは送信先のファイルを削除します。必ず -n(ドライラン)で削除対象を確認してから実行しましょう。
Step 6実践的な活用例
実務でよく使うrsyncのパターンです。
ターミナル
# Webサイトのデプロイ
rsync -avz --delete --exclude='.env' ./dist/ myserver:/var/www/html/
# サーバーのログ収集
rsync -avz myserver:/var/log/nginx/ ./logs/nginx/
# 大量のファイルを帯域制限付きで転送
rsync -avz --bwlimit=10000 ./data/ myserver:/backup/
# 転送後にパーミッションを設定
rsync -avz --chmod=D755,F644 ./web/ myserver:/var/www/
rsync vs scp
rsync:差分転送、除外パターン、--deleteなど高機能。大量ファイル向きscp:シンプルな転送。少数ファイルの単発転送向き
定期的な同期やデプロイには rsync を使いましょう。