サーバーのハードウェア障害、誤操作によるデータ削除、ランサムウェアによる暗号化――データ消失のリスクは常に存在します。定期的なバックアップは、こうしたリスクからビジネスを守る最も確実な方法です。
本記事では、Linuxの標準ツールであるrsync・tar・cronを使って、コストをかけずに信頼性の高いバックアップ体制を構築する方法を解説します。Linuxの基本操作についてはLinuxとは?の入門記事を、コマンドの基礎はLinuxコマンド実践ガイドをご参照ください。
バックアップ戦略の基本:何を・どこに・どのくらいの頻度で
バックアップを始める前に、まず戦略を明確にしましょう。場当たり的なバックアップは、いざというときに役に立たないことがあります。
3-2-1ルールを基本にする
バックアップの基本方針として、3-2-1ルールが広く推奨されています。
- 3つのコピーを持つ(元データ+2つのバックアップ)
- 2種類の異なるメディアに保存する(ローカルディスク+外部ストレージなど)
- 1つは遠隔地に保管する(別拠点やクラウドストレージ)
中小企業では完全な実施が難しい場合もありますが、最低でもローカルバックアップ+リモートバックアップの2箇所保管は実現しましょう。
バックアップ対象を明確にする
サーバー上のすべてのデータをバックアップする必要はありません。優先度に応じて対象を分類しましょう。
| 優先度 | 対象 | 具体例 | 推奨頻度 |
|---|---|---|---|
| 最高 | 業務データ | データベース、顧客情報、売上データ | 毎日(または更新の都度) |
| 高 | 設定ファイル | /etc/以下の設定、アプリケーション設定 | 変更時+週次 |
| 中 | アプリケーション | Webアプリケーション、社内ツール | デプロイ時+週次 |
| 低 | ログファイル | /var/log/以下 | 月次(必要に応じて) |
フルバックアップと差分バックアップの使い分け
フルバックアップは、対象データのすべてをコピーする方法です。復元が簡単ですが、時間と容量を多く消費します。
差分バックアップ(増分バックアップ)は、前回のバックアップから変更があったファイルだけをコピーする方法です。高速で容量も節約できますが、復元時にはフルバックアップ+差分データが必要です。
中小企業の一般的な運用では、週1回のフルバックアップ+毎日の差分バックアップが現実的なバランスです。
tarコマンドでアーカイブバックアップを作成する
tarコマンドは、複数のファイルやディレクトリを1つのアーカイブファイルにまとめるLinuxの基本ツールです。
tarの基本操作
# ディレクトリをgzip圧縮でアーカイブ
tar -czf backup_$(date +%Y%m%d).tar.gz /var/www/html/
# bzip2圧縮でアーカイブ(より高圧縮率)
tar -cjf backup_$(date +%Y%m%d).tar.bz2 /var/www/html/
# xz圧縮でアーカイブ(最高圧縮率だが時間がかかる)
tar -cJf backup_$(date +%Y%m%d).tar.xz /var/www/html/
# アーカイブの内容を確認(展開せずに中身を見る)
tar -tzf backup_20260322.tar.gz
# アーカイブの展開
tar -xzf backup_20260322.tar.gz -C /tmp/restore/
除外パターンを指定してバックアップする
ログファイルや一時ファイルなど、バックアップ不要なファイルを除外できます。
# 除外パターンを指定してバックアップ
tar -czf backup_$(date +%Y%m%d).tar.gz \
--exclude='*.log' \
--exclude='*.tmp' \
--exclude='node_modules' \
--exclude='.git' \
/var/www/html/
# 除外リストファイルを使う方法
# /etc/backup-exclude.txt に除外パターンを記載
tar -czf backup_$(date +%Y%m%d).tar.gz \
--exclude-from=/etc/backup-exclude.txt \
/var/www/html/
システム設定ファイルのバックアップ
# /etcディレクトリのバックアップ(サーバー設定の保全)
sudo tar -czf etc_backup_$(date +%Y%m%d).tar.gz /etc/
# 重要な設定ファイルだけを選択的にバックアップ
sudo tar -czf config_backup_$(date +%Y%m%d).tar.gz \
/etc/nginx/ \
/etc/mysql/ \
/etc/ssh/sshd_config \
/etc/crontab \
/etc/fstab
ディレクトリ構造についてはLinuxのディレクトリ構造ガイドを参照してください。
rsyncで効率的な差分バックアップを実現する
rsyncは、ファイルの差分だけを転送する高機能な同期ツールです。ネットワーク帯域の節約と高速なバックアップを両立できます。
rsyncの基本操作
# ローカルのディレクトリ間で同期
rsync -avz /var/www/html/ /backup/www/
# オプションの意味
# -a : アーカイブモード(パーミッション、所有者、タイムスタンプなどを保持)
# -v : 詳細な出力
# -z : 転送時にデータを圧縮
# 削除されたファイルもバックアップ先に反映する場合
rsync -avz --delete /var/www/html/ /backup/www/
# ドライラン(実際には実行せず、何が行われるか確認)
rsync -avzn /var/www/html/ /backup/www/
重要:rsyncのパス指定では、末尾のスラッシュ(/)の有無で動作が変わります。/var/www/html/は「htmlディレクトリの中身」を同期し、/var/www/htmlは「htmlディレクトリごと」同期します。
SSH経由でリモートサーバーにバックアップする
rsyncはSSHを利用してリモートサーバーにバックアップを転送できます。SSH接続の基本を押さえておくとスムーズです。
# リモートサーバーにバックアップ
rsync -avz -e "ssh -p 22" /var/www/html/ user@backup-server:/backup/www/
# SSH鍵認証を使用する場合(パスワード入力なし)
rsync -avz -e "ssh -i /home/user/.ssh/backup_key" /var/www/html/ user@backup-server:/backup/www/
# 帯域制限をかける(業務時間中のバックアップに有用)
rsync -avz --bwlimit=5000 /var/www/html/ user@backup-server:/backup/www/
# --bwlimit=5000 は 5000KB/s(約5MB/s)に制限
世代管理付きバックアップ
rsyncのハードリンク機能を活用すれば、フルバックアップのように見えて実際は差分のみ保存する、容量効率の良い世代管理が実現できます。
#!/bin/bash
# /usr/local/bin/generation-backup.sh
BACKUP_DIR="/backup"
SOURCE_DIR="/var/www/html"
DATE=$(date +%Y%m%d_%H%M%S)
LATEST_LINK="$BACKUP_DIR/latest"
# 前回のバックアップへのハードリンクを活用した差分バックアップ
rsync -avz --delete \
--link-dest="$LATEST_LINK" \
"$SOURCE_DIR/" \
"$BACKUP_DIR/$DATE/"
# latestシンボリックリンクの更新
rm -f "$LATEST_LINK"
ln -s "$BACKUP_DIR/$DATE" "$LATEST_LINK"
# 30日以上前のバックアップを削除
find "$BACKUP_DIR" -maxdepth 1 -type d -mtime +30 -exec rm -rf {} \;
echo "バックアップ完了: $BACKUP_DIR/$DATE"
この方式では、変更のないファイルはハードリンクで共有されるため、ディスク容量を節約しながら各世代のフルリストアが可能です。
cronで自動バックアップを設定する
手動でバックアップを実行し続けるのは現実的ではありません。cronを使って自動化しましょう。cronの詳細はLinuxのcronとスケジュールタスクで解説しています。
バックアップスクリプトの作成
まず、実行するバックアップ処理をスクリプトにまとめます。
#!/bin/bash
# /usr/local/bin/daily-backup.sh
# 日次バックアップスクリプト
# 設定
BACKUP_BASE="/backup"
LOG_FILE="/var/log/backup.log"
DATE=$(date +%Y%m%d)
RETENTION_DAYS=30
# ログ出力関数
log() {
echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" >> "$LOG_FILE"
}
log "=== バックアップ開始 ==="
# Webアプリケーションのバックアップ
log "Webデータのバックアップを開始..."
rsync -az --delete /var/www/html/ "$BACKUP_BASE/www/$DATE/"
if [ $? -eq 0 ]; then
log "Webデータのバックアップ完了"
else
log "エラー: Webデータのバックアップ失敗"
fi
# 設定ファイルのバックアップ
log "設定ファイルのバックアップを開始..."
tar -czf "$BACKUP_BASE/config/etc_$DATE.tar.gz" /etc/ 2>/dev/null
if [ $? -eq 0 ]; then
log "設定ファイルのバックアップ完了"
else
log "エラー: 設定ファイルのバックアップ失敗"
fi
# データベースのバックアップ(MySQL/MariaDBの場合)
log "データベースのバックアップを開始..."
mysqldump -u backup_user -p'password' --all-databases | gzip > "$BACKUP_BASE/db/all_databases_$DATE.sql.gz"
if [ $? -eq 0 ]; then
log "データベースのバックアップ完了"
else
log "エラー: データベースのバックアップ失敗"
fi
# 古いバックアップの削除
log "古いバックアップの削除..."
find "$BACKUP_BASE/www" -maxdepth 1 -type d -mtime +$RETENTION_DAYS -exec rm -rf {} \;
find "$BACKUP_BASE/config" -name "*.tar.gz" -mtime +$RETENTION_DAYS -delete
find "$BACKUP_BASE/db" -name "*.sql.gz" -mtime +$RETENTION_DAYS -delete
log "=== バックアップ完了 ==="
cronへの登録
# スクリプトに実行権限を付与
sudo chmod +x /usr/local/bin/daily-backup.sh
# バックアップ用ディレクトリの作成
sudo mkdir -p /backup/{www,config,db}
# cronに登録(毎日午前3時に実行)
sudo crontab -e
# 以下の行を追加
# 0 3 * * * /usr/local/bin/daily-backup.sh
# 週次のフルバックアップも追加する場合
# 0 2 * * 0 /usr/local/bin/weekly-full-backup.sh
バックアップの実行結果を通知する
バックアップが失敗していても気づかないのでは意味がありません。結果を通知する仕組みを加えましょう。
# スクリプトの末尾に追加
# メール通知(mailコマンドが使える場合)
if grep -q "エラー" "$LOG_FILE"; then
tail -20 "$LOG_FILE" | mail -s "[警告] バックアップにエラーが発生" admin@example.com
fi
シェルスクリプトの詳しい書き方は、シェルスクリプト入門を参照してください。
バックアップからの復元手順
バックアップは取得するだけでなく、確実に復元できることが重要です。定期的に復元テストを行いましょう。
tarアーカイブからの復元
# アーカイブの中身を確認(展開前に必ず実施)
tar -tzf etc_backup_20260322.tar.gz | head -20
# 指定したディレクトリに展開
sudo tar -xzf etc_backup_20260322.tar.gz -C /tmp/restore/
# 特定のファイルだけを復元
sudo tar -xzf etc_backup_20260322.tar.gz -C /tmp/restore/ etc/nginx/nginx.conf
# 復元先を確認してから本番に反映
diff /tmp/restore/etc/nginx/nginx.conf /etc/nginx/nginx.conf
sudo cp /tmp/restore/etc/nginx/nginx.conf /etc/nginx/nginx.conf
rsyncバックアップからの復元
# バックアップから特定の日のデータを復元
rsync -avz /backup/www/20260322/ /var/www/html/
# リモートバックアップサーバーから復元
rsync -avz -e ssh user@backup-server:/backup/www/20260322/ /var/www/html/
# ドライランで確認してから実行
rsync -avzn /backup/www/20260322/ /var/www/html/
データベースの復元
# MySQLデータベースの復元
gunzip < /backup/db/all_databases_20260322.sql.gz | mysql -u root -p
# 特定のデータベースのみ復元
gunzip < /backup/db/all_databases_20260322.sql.gz | mysql -u root -p specific_database
復元テストの重要性
バックアップが正常に取れていても、復元できなければ意味がありません。以下を定期的にテストしましょう。
- 月1回:バックアップファイルの整合性確認(アーカイブが壊れていないか)
- 四半期に1回:テスト環境への実際の復元テスト
- 年1回:災害復旧(DR)訓練としてのフル復元テスト
クラウドストレージへのバックアップ
ローカルバックアップだけでは、サーバー自体の物理的な障害に対応できません。クラウドストレージへの遠隔バックアップも組み合わせましょう。
AWS S3へのバックアップ
# AWS CLIのインストール
sudo apt install -y awscli
# S3へのバックアップ
aws s3 sync /backup/www/ s3://my-backup-bucket/www/ --delete
# S3へのアーカイブアップロード
aws s3 cp /backup/db/all_databases_20260322.sql.gz s3://my-backup-bucket/db/
# ライフサイクルポリシーで古いデータを自動削除(AWS Console推奨)
AWSの詳細についてはLinuxクラウドサーバーとAWSガイドを参照してください。
rcloneを使った汎用クラウドバックアップ
rcloneは、AWS S3、Google Drive、Dropboxなど多くのクラウドストレージに対応したツールです。
# rcloneのインストール
curl https://rclone.org/install.sh | sudo bash
# 初期設定(対話形式で設定)
rclone config
# クラウドストレージへの同期
rclone sync /backup/ remote:my-backup/ --progress
# 暗号化してバックアップ(機密データの場合)
rclone sync /backup/ remote-crypt:my-backup/ --progress
バックアップ運用のベストプラクティス
最後に、バックアップ運用で押さえておくべきベストプラクティスをまとめます。
セキュリティの考慮事項
- バックアップデータを暗号化する:特に機密情報を含む場合は必須。gpgやopensslで暗号化
- バックアップサーバーのアクセス制限:SSH鍵認証のみ許可し、パスワード認証は無効にする
- バックアップ用ユーザーの権限を最小限にする:必要なディレクトリのみ読み取り可能にする
# バックアップファイルの暗号化
tar -czf - /var/www/html/ | gpg --symmetric --cipher-algo AES256 -o backup_20260322.tar.gz.gpg
# 暗号化ファイルの復号
gpg -d backup_20260322.tar.gz.gpg | tar -xzf - -C /tmp/restore/
サーバーのセキュリティ全般についてはLinuxサーバーのセキュリティ強化を、パーミッション管理はLinuxのファイルパーミッションを参照してください。
運用チェックリスト
- バックアップスクリプトのログを定期的に確認している
- バックアップの容量が十分であることを監視している
- 復元手順書を作成し、最新の状態に保っている
- 定期的に復元テストを実施している
- バックアップデータの暗号化が適切に行われている
- バックアップの保持期間が適切に設定されている
- 遠隔地バックアップが正常に動作している
まとめ:信頼性の高いバックアップ体制を構築しよう
本記事では、Linuxのrsync・tar・cronを使った自動バックアップの構築方法を解説しました。
- 3-2-1ルールを基本に、バックアップ戦略を策定する
- tarでアーカイブバックアップ、rsyncで効率的な差分バックアップを実現する
- cronで自動化し、人手に頼らないバックアップ体制を構築する
- 定期的な復元テストでバックアップの信頼性を検証する
- クラウドストレージへの遠隔バックアップで災害対策も考慮する
バックアップ体制の構築は、一度設定すれば日常的な手間はほとんどかかりません。「まだバックアップを取っていない」という方は、今日からでもrsyncによる簡易バックアップを始めましょう。
サーバーの安定運用に関連して、パフォーマンス監視やログ管理の記事も参考にしてください。また、開発効率を上げるAIツールに興味がある方は、Claude Codeセットアップガイドもおすすめです。
関連記事
AWS CloudFrontでサイト高速化|CDN設定からキャッシュ戦略まで実践解説
AWS CloudWatchで監視・アラート設定|運用担当者のための実践ガイド
AWS CodePipelineでCI/CD構築|コード変更から本番デプロイまでの自動化
AWS Cost Explorerでコスト可視化|ムダを見つけて月額費用を削減する実践術
AWS ECS/Fargateでコンテナ運用|Docker→本番デプロイの実践ガイド
AWS IAMのベストプラクティス|最小権限の原則を実務で実装する方法
AWS RDSの実務ガイド|データベース構築・バックアップ・パフォーマンスチューニング
AWS S3の実務活用ガイド|バケット設計・アクセス制御・コスト最適化の実践