「scpで毎回全ファイルをコピーしていて、転送に時間がかかりすぎる...」
Linuxでファイルやディレクトリを効率的に同期・転送するなら、
rsync コマンドが最適です。差分だけを転送するため、scpやcpと比べて圧倒的に高速で、バックアップの定番ツールとして現場で広く使われています。この記事では、
rsync コマンド の実践的な使い方を解説します。基本的なローカルコピーからリモートサーバーへのファイル転送、
--delete の安全な使い方、cronと組み合わせた自動バックアップまで、現場で使えるテクニックをまとめました。rsyncとは?(差分転送で高速にファイルを同期するコマンド)
rsync は「remote sync」の略で、ファイルやディレクトリを同期するためのコマンドです。最大の特徴は差分転送です。転送元と転送先を比較して、変更があったファイルだけを転送します。そのため、2回目以降のコピーが劇的に速くなります。
# rsyncの基本構文 rsync [オプション] 転送元 転送先
cp コマンドとの最大の違いは、rsync が「変更されたファイルだけ」を転送する点です。数GBのディレクトリでも、変更が数ファイルだけなら一瞬で同期が完了します。基本的な使い方(ローカルでのファイルコピー・同期)
まずはローカル環境でのコピーから見ていきましょう。rsyncはリモート転送だけでなく、ローカルのファイルコピーにも使えます。1. ファイルを1つコピーする
# ファイルを別のディレクトリにコピーする $ rsync access.log /backup/
cp コマンドとほぼ同じ動作です。rsyncの真価は、ディレクトリ単位の同期で発揮されます。2. ディレクトリを同期する(-aオプション)
ディレクトリごと同期する場合は、-a(archive)オプションを使います。パーミッション・所有者・タイムスタンプを保持したまま再帰的にコピーします。# ディレクトリを丸ごと同期する(パーミッションやタイムスタンプも保持) $ rsync -a /var/www/html/ /backup/html/
-a は -rlptgoD の省略形で、以下をまとめて指定しています。・-r:再帰的にコピー(サブディレクトリを含む)
・-l:シンボリックリンクをリンクのままコピー
・-p:パーミッションを保持
・-t:タイムスタンプを保持
・-g:グループを保持
・-o:所有者を保持(root権限が必要)
・-D:デバイスファイル・特殊ファイルを保持
実務では
rsync -a をベースに、必要なオプションを追加していくのが定番です。3. 進捗を表示する(-vと--progress)
転送状況を確認したい場合は、-v(verbose)や --progress を追加します。# 転送ファイル名と進捗を表示する $ rsync -av --progress /var/www/html/ /backup/html/ sending incremental file list index.html 12,845 100% 11.29MB/s 0:00:00 (xfr#1, to-chk=23/25) style.css 3,421 100% 3.26MB/s 0:00:00 (xfr#2, to-chk=22/25) sent 16,890 bytes received 54 bytes 33,888.00 bytes/sec total size is 16,266 speedup is 0.96
4. 末尾のスラッシュに注意(重要な落とし穴)
rsyncでは、転送元パスの末尾にスラッシュがあるかどうかで動作が変わります。これを知らないと意図しないディレクトリ構造になります。# スラッシュあり: htmlの「中身」を /backup/html/ に同期 $ rsync -a /var/www/html/ /backup/html/ # スラッシュなし: htmlディレクトリ自体を /backup/html/ 配下にコピー # 結果: /backup/html/html/ というディレクトリができる $ rsync -a /var/www/html /backup/html/
リモートサーバーへの転送(SSH経由のrsync)
rsyncの本領はリモートサーバーとのファイル同期です。SSH経由で安全にファイルを転送できます。1. ローカルからリモートへ転送する
# ローカルのディレクトリをリモートサーバーに転送する $ rsync -avz /var/www/html/ user@192.168.1.100:/backup/html/
-z オプションは転送データを圧縮します。ネットワーク越しの転送では、帯域の節約になるため付けるのが一般的です。2. リモートからローカルへ取得する
# リモートサーバーからファイルを取得する $ rsync -avz user@192.168.1.100:/var/log/httpd/ /backup/httpd-logs/
3. SSHポートを指定する(-eオプション)
SSHのポート番号がデフォルトの22以外の場合は、-e オプションで指定します。# SSHポート2222を使ってリモートに転送する $ rsync -avz -e "ssh -p 2222" /var/www/html/ user@192.168.1.100:/backup/html/
実務で使うオプション一覧
rsyncのオプションは非常に多いですが、実務で使うものは限られています。よく使うオプションをまとめます。・-a:アーカイブモード(パーミッション・所有者・タイムスタンプ保持)
・-v:転送ファイル名を表示する
・-z:転送データを圧縮する(リモート転送時に有効)
・--progress:転送の進捗を表示する
・--delete:転送元にないファイルを転送先から削除する
・--exclude:指定したパターンのファイルを除外する
・--dry-run(-n):実際には転送せず、何が起こるかだけ表示する
・--backup:上書きされるファイルのバックアップを作成する
・-e:リモートシェルを指定する(SSHポート変更時など)
特に
--delete と --dry-run は使い方を間違えるとデータを失う可能性があるため、次のセクションで詳しく解説します。--deleteの安全な使い方(転送先の不要ファイルを削除する)
--delete オプションは、転送元に存在しないファイルを転送先から削除します。完全なミラーリングを行いたい場合に使いますが、使い方を誤ると転送先のファイルが消えます。1. まず--dry-runで確認する(鉄則)
--delete を使う前に、必ず --dry-run(または -n)で何が削除されるか確認してください。# 実際には実行せず、何が起きるかだけ表示する $ rsync -avn --delete /var/www/html/ /backup/html/ sending incremental file list deleting old-page.html deleting temp/debug.log sent 245 bytes received 12 bytes 514.00 bytes/sec
2. --deleteを実行する
--dry-run で問題がなければ、-n を外して実行します。# 転送元にないファイルを転送先からも削除する(完全同期) $ rsync -av --delete /var/www/html/ /backup/html/
【重要】--deleteの危険性
--delete で転送元のパスを間違えると、転送先のファイルが全て削除される可能性があります。# 危険な例: 空ディレクトリを転送元にすると、転送先が全削除される $ rsync -av --delete /tmp/empty/ /backup/html/
/backup/html/ 内の全ファイルが削除されます。--delete は必ず --dry-run とセットで使うことを習慣にしてください。除外設定(--excludeで特定ファイルをスキップする)
ログファイルやキャッシュなど、同期不要なファイルを除外する方法です。1. パターンで除外する
# .logファイルを除外して同期する $ rsync -av --exclude="*.log" /var/www/html/ /backup/html/ # 複数のパターンを除外する $ rsync -av --exclude="*.log" --exclude="*.tmp" --exclude="cache/" /var/www/html/ /backup/html/
2. 除外リストをファイルで管理する(--exclude-from)
除外パターンが多い場合は、ファイルにまとめて管理すると便利です。# 除外リストファイルを作成する $ cat /etc/rsync-exclude.txt *.log *.tmp cache/ .git/ # 除外リストを指定して同期する $ rsync -av --exclude-from="/etc/rsync-exclude.txt" /var/www/html/ /backup/html/
cronと組み合わせた自動バックアップ(定期実行の設定方法)
rsyncの真価は、cronと組み合わせて自動バックアップを構築したときに発揮されます。手動で毎回コマンドを打つ必要がなくなり、深夜帯に差分だけを転送する運用が実現できます。1. バックアップスクリプトを作成する
まず、rsyncコマンドをシェルスクリプトにまとめます。直接crontabにコマンドを書くより、スクリプト化しておく方が管理しやすく、ログ出力も柔軟に設定できます。# バックアップスクリプトを作成する $ vi /usr/local/bin/backup-web.sh #!/bin/bash # Webサーバーのバックアップスクリプト LOG="/var/log/rsync-backup.log" echo "--- $(date) ---" >> "$LOG" rsync -avz --delete /var/www/html/ user@192.168.1.100:/backup/html/ >> "$LOG" 2>&1 # 実行権限を付与する $ chmod 755 /usr/local/bin/backup-web.sh
2. crontabに登録する
スクリプトが動作することを確認したら、crontabに登録して定期実行を設定します。# crontabを編集する $ crontab -e # 毎日午前3時にバックアップを実行する 0 3 * * * /usr/local/bin/backup-web.sh
3. SSH鍵認証を設定する(パスワード入力なしで接続)
cronで自動実行する場合、パスワード入力ができません。SSH鍵認証を事前に設定しておく必要があります。# SSH鍵を生成する(パスフレーズなし) $ ssh-keygen -t rsa -b 4096 -f ~/.ssh/id_rsa_backup -N "" # 公開鍵をリモートサーバーに登録する $ ssh-copy-id -i ~/.ssh/id_rsa_backup.pub user@192.168.1.100
-e オプションを使います。# スクリプト内で鍵ファイルを指定する場合 rsync -avz -e "ssh -i /root/.ssh/id_rsa_backup" --delete /var/www/html/ user@192.168.1.100:/backup/html/
【重要】cron実行時の注意点
cronで実行する場合、ログイン時とは環境変数が異なります。以下の点に注意してください。・PATHが通っていない:rsyncのフルパス(
/usr/bin/rsync)を使うか、スクリプト冒頭でPATHを明示する・ログを必ず残す:cronはデフォルトで標準出力を捨てるため、スクリプト内でログファイルに出力する
・動作確認を先にする:crontabに登録する前に、手動でスクリプトを実行して正常に動くことを確認する
トラブルシュート・エラー対処
rsyncで遭遇しやすいエラーと対処法をまとめます。「Permission denied」が出た時の対処法
リモートサーバーへの転送時に権限エラーが出る場合は、以下を確認してください。# SSH鍵の権限を確認する $ ls -l ~/.ssh/id_rsa -rw-------. 1 user user 1675 3月 15 10:00 /home/user/.ssh/id_rsa # 権限が正しくない場合は修正する $ chmod 600 ~/.ssh/id_rsa
・転送先ディレクトリへの書き込み権限があるか
・
-a オプションで所有者を保持する場合はroot権限が必要「rsync: connection unexpectedly closed」の対処法
転送中に接続が切れる場合は、以下が原因であることが多いです。・リモートサーバーにrsyncがインストールされていない
・ファイアウォールでSSHポートがブロックされている
・転送先のディスク容量が不足している
# リモートサーバーにrsyncがあるか確認する $ ssh user@192.168.1.100 "which rsync" /usr/bin/rsync # ディスク容量を確認する $ ssh user@192.168.1.100 "df -h /backup"
「rsync error: some files could not be transferred」の対処法
一部のファイルだけ転送に失敗する場合は、読み取り権限がないファイルが含まれている可能性があります。# sudoを付けて全ファイルにアクセスする $ sudo rsync -av /var/www/html/ /backup/html/
本記事のまとめ
| やりたいこと | コマンド |
|---|---|
| ディレクトリを同期する(基本) | rsync -av 転送元/ 転送先/ |
| リモートサーバーに転送する | rsync -avz 転送元/ user@host:転送先/ |
| リモートからファイルを取得する | rsync -avz user@host:転送元/ 転送先/ |
| 転送先の不要ファイルを削除する | rsync -av --delete 転送元/ 転送先/ |
| 実行前に確認する(ドライラン) | rsync -avn --delete 転送元/ 転送先/ |
| 特定ファイルを除外する | rsync -av --exclude="*.log" 転送元/ 転送先/ |
| SSHポートを指定して転送する | rsync -avz -e "ssh -p 2222" 転送元/ user@host:転送先/ |
| cronで毎日自動バックアップする | 0 3 * * * /usr/local/bin/backup-web.sh |
rsyncでバックアップ運用を始めたいあなたへ
rsyncはバックアップや移行作業の基本ツールですが、コマンド単体を覚えるだけでは現場で通用しません。パーミッション、ユーザー管理、ログ確認といったLinuxの基礎を体系的に押さえることで、初めてrsyncも安全に使いこなせるようになります。
ネットの切れ端の情報をコピペするだけでなく、現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、『Linuxサーバー構築入門マニュアル(図解60P)』を完全無料でプレゼントしています。
「独学の時間がもったいない」「プロから直接、現場の技術を最短で学びたい」という本気の方には、2日で実務レベルのスキルが身につく【初心者向けハンズオンセミナー】も開催しています。
登録10秒/自動返信でDL/合わなければ解除3秒
