Linux管理・運用の基本
システム管理者のための実践ガイド
システム管理者のための実践ガイド
この記事では、システム管理者が日々の業務で直面するであろう、重要なファイルやディレクトリの同期、そして効率的なバックアップについて解説します。特に、強力なファイル同期ツールであるrsyncコマンドに焦点を当て、その基本的な使い方から、安全に利用するための応用例までを詳しく紹介します。
ファイルやデータを守ることは、システム運用の根幹をなす重要な作業です。データの破損や消失は、最悪の場合、サービス停止や信用失墜に繋がりかねません。手作業でのコピーやバックアップは時間も手間もかかりますし、ヒューマンエラーのリスクも伴います。そこで活躍するのが、rsyncコマンドです。
rsyncを使えば、ローカル環境はもちろん、ネットワーク越しにも効率的にファイルを同期できます。このコマンドは差分転送(すでに存在するファイルは変更部分のみを転送)を行うため、大量のデータを扱う際でも時間と帯域幅を大幅に節約できるのが大きなメリットです。この記事を通じて、あなたのバックアップ戦略にrsyncを組み込むヒントを見つけてください。
rsyncコマンドの基本的な使い方単にファイルをコピーするだけならcpコマンドでも事足りますが、rsyncを使うと、より柔軟なオプションでコピーができます。ディレクトリごと同期する場合は、-aオプション(アーカイブモード)が便利です。
rsync [オプション] [転送元] [転送先]
/home/user/dataの内容を/var/backupにバックアップする# SOURCE: /home/user/data/, DEST: /var/backup/
rsync -av /home/user/data/ /var/backup/
-a:アーカイブモード。 -rlptgoDとほぼ同義で、再帰的なコピー、シンボリックリンクの保持、パーミッション、タイムスタンプ、所有者、グループ、デバイスファイルなどをそのまま維持します。-v:詳細表示(verbose)。転送中のファイル名を表示します。ポイント💡: 転送元のパスの最後に/を付けるか付けないかで挙動が変わります。
/home/user/data/ (スラッシュあり):dataディレクトリの中身をコピーします。/home/user/data (スラッシュなし):dataディレクトリごとコピーします。rsyncはSSHと組み合わせることで、セキュアなリモート同期が可能です。宛先や転送元にユーザー名@ホスト名:パスの形式で指定します。
# SOURCE: /var/www/html/, DEST: user@remote-server:/var/www/html/
rsync -avz --delete /var/www/html/ user@remote-server:/var/www/html/
-z:圧縮(compress)モード。転送されるデータを圧縮することで、ネットワークの帯域幅を節約できます。--delete:転送元にないファイルを転送先から削除します。これにより、両者を完全に同期させることができます。このオプションは強力なので、使い方には十分注意しましょう。rsyncには非常に多くのオプションがあり、用途に応じて使い分けることで、より効率的で安全なファイル同期が実現できます。
| オプション | 意味 | 用途 |
|---|---|---|
-a |
アーカイブモード | ディレクトリやファイルの属性をすべて保持して同期したい場合 |
-v |
詳細表示 | どのファイルが転送されているか確認したい場合 |
-z |
圧縮 | ネットワーク帯域を節約したい場合(リモート同期) |
-h |
可読性のある出力 | ファイルサイズなどを人間が読みやすい形式で表示したい場合 |
--progress |
進捗表示 | 転送の進捗状況を確認したい場合 |
--delete |
削除 | 転送元と全く同じ状態に同期したい場合 |
--exclude |
除外 | 特定のファイルやディレクトリを同期対象から除外したい場合 |
--dry-run |
ドライラン | 実際に実行せずに、何が変更されるか確認したい場合 |
--excludeで特定のファイルを同期対象から外すログファイルやキャッシュファイルなど、バックアップの必要がないものを除外したい場合に便利です。
/home/user/をバックアップするが、.cacheディレクトリは除外するrsync -av --exclude '.cache' /home/user/ /mnt/backup/
複数のファイルを指定したい場合は、複数回--excludeを指定するか、ルールを記述したファイルを作成し--exclude-fromオプションを使います。
定期的なバックアップは、シェルスクリプトとcronを組み合わせるのが一般的です。以下のスクリプトは、実行日の日付をディレクトリ名にしてバックアップを作成する例です。
daily_backup.sh
#!/bin/bash
# バックアップ元ディレクトリ
SOURCE_DIR="/data/"
# バックアップ先ディレクトリ
DEST_DIR="/backup/"
# 日付を取得
DATE=$(date +%Y%m%d)
# 除外リストファイル
EXCLUDE_FILE="/etc/backup.exclude"
# rsyncコマンド実行
# 初回実行時は空のディレクトリを用意
rsync -av --delete --exclude-from="${EXCLUDE_FILE}" "${SOURCE_DIR}" "${DEST_DIR}${DATE}/"
このスクリプトを/etc/cron.dailyなどに配置するか、crontab -eで以下のように設定すれば、毎日午前2時に自動実行できます。
0 2 * * * /path/to/daily_backup.sh > /dev/null 2>&1
--bwlimitで帯域制限をかける
リモートサーバーへのバックアップ時、ネットワーク帯域を占有しないよう--bwlimitオプションで転送速度を制限できます。cronで夜間に実行する場合など、他の業務に影響が出ないように調整するのに便利です。
# 1000 KB/秒に制限して転送
rsync -avz --bwlimit=1000 /data/ user@remote:/backup/
--dry-runで実行前に安全確認--deleteなどの強力なオプションを使う前に、--dry-runを付けて実行することで、実際に何が同期・削除されるかを確認できます。これはrsyncを使う上での鉄則と言えるでしょう。
⚠️ 警告:--delete使用時は転送元と転送先を間違えないよう細心の注意を払いましょう。
バックアップ先を誤って転送元に指定すると、重要なデータが消去されるリスクがあります。
本番実行前には必ず--dry-runで確認する習慣をつけましょう。
リモートサーバーへの同期時にこのエラーが発生した場合、以下の原因が考えられます。
MaxStartupsなど)が制限されている可能性。ファイル数が多い場合は、--partialオプションで中断した転送を再開できるようにしたり、--bwlimitで帯域幅を制限したりする工夫が有効です。
rsyncでスマートなデータ管理をこの記事では、rsyncコマンドの基本的な使い方から、リモート同期、便利なオプション、そして自動化や事故防止のポイントまでを解説しました。
rsyncは、差分転送により効率的なファイル同期・バックアップを実現します。-a(アーカイブモード)と-v(詳細表示)の組み合わせが基本です。sshを介してセキュアに行えます。--deleteや--dry-runなどの強力なオプションを理解し、必ず実行前に確認することが安全な運用に繋がります。最後に、バックアップは「戻せて初めて意味がある」ということを忘れないでください。rsyncでバックアップしたデータは、転送元と転送先を逆に指定することで簡単に復元できます。
rsync -av /backup/20240806/ /data/
定期的なバックアップと同時に、復元テストも一度は必ず行うようにしましょう。この記事が、rsyncについての理解を深める一助となれば幸いです。ご覧いただきありがとうございました。次回は、シェルスクリプトでの繰り返し・条件分岐について解説します。