こんにちは!Linuxシステムを管理していると、「バックアップ」は宿命とも言える作業です。最初に学ぶコマンドは間違いなくcpですよね。直感的で簡単ですから。しかし、定期的なバックアップスクリプトにcpを使って、予期せぬ問題に戸惑った経験はありませんか?🤔
「確かにバックアップしたのに、なぜディレクトリ構造がおかしくなるんだ?」
今日は、このよくある落とし穴と、それに対する明確な解決策をお伝えしようと思います。なぜ単純なコピーではなく同期が必要なのか、そしてなぜrsyncがバックアップ作業の標準と呼ばれるのか、その理由をすっきりと解き明かしていきます!

1. cpコマンドの隠れた落とし穴:「あれ?なぜまたフォルダが生成されるの?」
バックアップスクリプトに以下のようなcpコマンドを入れたと仮定してみましょう。
Bash
# /var/www/ ディレクトリを /opt/www-backup/ にバックアップする
cp -a /var/www/ /opt/www-backup/
このスクリプトを初めて実行すると、/opt/www-backupフォルダの中に/var/wwwの内容物が問題なくコピーされます。しかし、2回目の実行から問題が発生します。/opt/www-backupの中にwwwというフォルダがまた生成されてしまうのです!
- 1回目: /opt/www-backup/[…wwwの内容物…] 👍
- 2回目: /opt/www-backup/www/[…wwwの内容物…] 👎
- 3回目: /opt/www-backup/www/www/[…wwwの内容物…] 😱
これは、cpが対象フォルダの存在有無によって動作を変えるためです。
- 対象がない場合: 対象フォルダを作成し、その中に内容物をコピーします。
- 対象がある場合: 対象フォルダの中に元のフォルダ自体をコピーします。
まるで空の箱に物を整理するのと、すでに物が入っている箱の中に別の箱を丸ごと入れることの違いと同じです。
2. cpで問題を解決する「原始的な」方法
もちろん、cpだけでこの問題を解決することは可能です。それは、コピーする前に既存のバックアップをすべて削除してしまうことです。
Bash
# 1. まず、既存のバックアップをきれいに削除する。
rm -rf /opt/www-backup/
# 2. そして、再度コピーする。
cp -a /var/www/ /opt/www-backup/
毎回バックアップフォルダを削除して、cpが常に「初回実行」のように振る舞うようにする原始的な方法です。動作はしますが、この方法はなぜ私たちがcpをバックアップに使用すべきではないのかを明確に示す欠点を含んでいます。
3. なぜcp + rm方式が最悪の選択なのか?
🐢 極度の非効率性
これが最大の問題です。元のファイルで1KBのテキストファイルが1つ修正されただけでも、このスクリプトは何十GBものバックアップ全体を削除し、最初から再度コピーします。これは膨大な時間の浪費とシステムI/O負荷を引き起こします。額縁を1つ変えるために家全体をリフォームするようなものです。
💣 バックアップの空白時間
rmでバックアップを削除した瞬間からcpが完了するまで、あなたのサーバーにはバックアップが存在しない危険な時間が発生します。もしこの間にシステムに問題が発生したら?想像したくもありません。
🗑️ 削除ファイルが反映されない
もしrmなしでcp -u(アップデート)オプションを使用すると、元のファイルから削除したファイルがバックアップフォルダにはそのまま残ってしまいます。時間が経つにつれて、バックアップフォルダは幽霊ファイルでいっぱいになります。
4. 専門家の選択: rsync (The Right Tool for the Job)
これらすべての問題を解決するコマンドがrsyncです。rsyncは「Remote Sync」の略で、名前の通り2つのディレクトリを「同期」することに特化したツールです。
rsyncは単にすべてをコピーするのではなく、2つのディレクトリを比較して変更された部分(Delta)だけを賢く転送します。
完璧なバックアップのためのrsyncコマンド
rsync -avh --delete /var/www/ /opt/www-backup/
- -a (archive): 権限、所有者などすべての属性を保持して再帰的にコピーします。
- -v (verbose): 進行状況を詳細に表示します。
- -h (human-readable): ファイルサイズをM、Gなどの読みやすい単位で表示します。
- –delete: これが重要なオプションです。 元のファイルから削除されたファイルはバックアップからも同様に削除され、2つのディレクトリを完璧なミラー状態にします。
⚠️ rsyncの絶対ルール: パス末尾のスラッシュ(/)
rsyncを使用する際、これだけは必ず覚えてください。元の(Source)パスの末尾に/を付けると「その中の内容物」を意味し、付けないと「ディレクトリ自体」を意味します。cpで経験した問題を避けるためには、必ず元のパスの末尾に/を付けてください!
- /var/www/ ➡️ /var/wwwの内容物を意味する (O)
- /var/www ➡️ /var/wwwディレクトリ自体を意味する (X)
結論: ハンマーと電動ドライバー
cpとrsyncの関係は、ハンマー(🔨)と電動ドライバー(🔩)に例えることができます。釘を1本打つときはハンマーが速くて便利です。しかし、何十本ものネジで家具を組み立てる必要があるときは、電動ドライバーが圧倒的に効率的で正確です。
単純な一回限りのコピーにはcpを、反復的で安定性が重要なバックアップと同期作業には必ずrsyncを使用してください。正しいツールを選択することが、あなたの時間とシステムの安定を守る第一歩です。
タグ:
Linux, バックアップ, 同期, cp, rsync, シェルスクリプト, システム管理, DevOps, Linuxヒント
コメントを残す