Linuxのバックアップと復元|rsync・tar・cronで実現する自動バックアップ

kento_morota 17分で読めます

サーバーのハードウェア障害、誤操作によるデータ削除、ランサムウェアによる暗号化――データ消失のリスクは常に存在します。定期的なバックアップは、こうしたリスクからビジネスを守る最も確実な方法です。

本記事では、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セットアップガイドもおすすめです。

#Linux#バックアップ#rsync
共有:
無料メルマガ

週1回、最新の技術記事をお届け

AI・クラウド・開発の最新記事を毎週月曜にメールでお届けします。登録は無料、いつでも解除できます。

プライバシーポリシーに基づき管理します

AI活用のヒントをお探しですか?お気軽にご相談ください。

まずは話だけ聞いてもらう