週次バックアップの自動化:簡単なLinux Cronジョブチュートリアル

cron、rsync、tarを使用して週次Linuxバックアップを自動化。安全なスクリプト、スケジューリング例、復元確認を含みます。

週次バックアップの自動化:シンプルなLinux Cronジョブチュートリアル

定期的なバックアップは、堅牢なシステム管理の基盤です。ハードウェア障害、誤削除、セキュリティインシデントによる重要なデータの損失は壊滅的です。幸いなことに、Linuxには強力な組み込みツールが用意されており、cronスケジューラーと組み合わせることで、信頼性の高い自動化された週次バックアップを実現できます。このチュートリアルでは、cronで管理されるrsynctarなどの標準的なLinuxユーティリティを使用して、シンプルかつ効果的な週次バックアップシステムをセットアップする方法を説明します。

このガイドは、自動化されたバックアップ戦略を実装したいLinuxユーザーやシステム管理者を対象としています。このチュートリアルを終えると、重要なディレクトリの週次バックアップを実行するcronジョブを構成し、データの安全性と復元可能性を確保する方法を理解できます。

なぜバックアップを自動化するのか?

手動バックアップはヒューマンエラーが発生しやすく、特に忙しいスケジュールでは軽視されがちです。自動化によりこれらのリスクが排除されます。週次バックアップ用のcronジョブを設定することで、以下が保証されます:

  • 一貫性: バックアップが設定された時間に確実に実行されます。
  • 信頼性: ヒューマンエラーや忘れっぽさの可能性を減らします。
  • 効率性: システム管理者が他の重要なタスクに集中できる貴重な時間を生み出します。
  • データ復旧: データ損失に対するセーフティネットを提供し、事業継続に不可欠です。

バックアップツールの選択:rsync vs. tar

Linuxにはバックアップ作成のためのいくつかのツールがあります。このチュートリアルでは、2つの一般的で強力なユーティリティ、rsynctarに焦点を当てます。

rsync

rsync(リモート同期)は、増分バックアップに優れています。2つの場所間でファイルとディレクトリを効率的に同期し、差分のみを転送します。そのため、特に2回目以降のバックアップでは非常に高速で帯域幅に優しいです。

主な利点:

  • 増分バックアップに効率的。
  • ローカルとリモートの場所を同期可能。
  • ファイルのパーミッション、所有者、タイムスタンプを保持。

tar

tar(テープアーカイブ)は、汎用性の高いアーカイブユーティリティです。複数のファイルやディレクトリを1つのアーカイブファイルにまとめることができ、多くの場合圧縮されます。データの完全なスナップショットを作成するのに理想的です。

主な利点:

  • 単一のアーカイブファイルを作成し、管理を簡素化。
  • さまざまな圧縮方法(gzip、bzip2、xz)をサポート。
  • ファイルのパーミッションと所有者を保持。

バックアップディレクトリの設定

始める前に、バックアップを保存するための特定のディレクトリを指定することをお勧めします。これにより、バックアップが整理され、ライブデータから分離されます。この例では、バックアップは /mnt/backups/weekly/ に保存されるものとします。

このディレクトリが存在し、適切なパーミッションがあることを確認してください。災害復旧を強化するために、バックアップを別の物理ドライブやネットワーク接続ストレージ(NAS)に保存することも検討してください。

sudo mkdir -p /mnt/backups/weekly
sudo chown root:root /mnt/backups/weekly # または専用のバックアップユーザー

方法1:rsyncを使用した増分バックアップ

rsyncは、変更履歴を効率的に維持したいディレクトリのバックアップに最適です。週次バックアップの場合、ディレクトリ全体をバックアップし、rsyncが変更されたファイルのみを処理します。

例として、/home ディレクトリと /etc ディレクトリをバックアップするとします。

1. バックアップスクリプトの作成:

まず、バックアップを実行するシェルスクリプトを作成します。これにより、コマンドの管理が容易になり、必要に応じてより複雑なロジックが可能になります。

/usr/local/bin/ などの場所に weekly_backup.sh という名前のファイルを作成します。

#!/bin/bash

# --- 設定 ---
SOURCE_DIRS=("/home" "/etc")
BACKUP_DEST="/mnt/backups/weekly/"
TIMESTAMP=$(date +"%Y%m%d_%H%M%S")
LOG_FILE="${BACKUP_DEST}backup_log_${TIMESTAMP}.log"

# --- 保存先が存在することを確認 ---
mkdir -p "${BACKUP_DEST}"

# --- ログ記録開始 ---
echo "週次バックアップを開始します: $(date)" >> "${LOG_FILE}"

# --- rsyncの実行 ---
for dir in "${SOURCE_DIRS[@]}"; do
    echo "${dir} をバックアップ中..." >> "${LOG_FILE}"
    rsync -a --delete "${dir}/" "${BACKUP_DEST}${dir##*/}/" >> "${LOG_FILE}" 2>&1
    if [ $? -eq 0 ]; then
        echo "${dir} のバックアップに成功しました。" >> "${LOG_FILE}"
    else
        echo "${dir} のバックアップ中にエラーが発生しました。" >> "${LOG_FILE}"
    fi
done

# --- ログ記録終了 ---
echo "週次バックアップが終了しました: $(date)" >> "${LOG_FILE}"
echo "---------------------------" >> "${LOG_FILE}"

exit 0

rsync オプションの説明:

  • -a(アーカイブモード):-rlptgoD の組み合わせで、再帰的にコピーし、シンボリックリンク、パーミッション、変更時間、グループ、所有者、デバイス/スペシャルファイルを保持します。
  • --delete:保存先ディレクトリから余分なファイルを削除します。これにより、バックアップがソースの完全なミラーになります。注意して使用してください!
  • ${dir}/:ソースディレクトリの末尾のスラッシュは重要です。これは「このディレクトリの内容をコピーする」ことを意味します。これがないと、ディレクトリ自体が保存先にコピーされます。
  • ${BACKUP_DEST}${dir##*/}/:これは保存先のパスを構築します。${dir##*/} はディレクトリのベース名を抽出します(例:'/home' から 'home')。

スクリプトを実行可能にする:

sudo chmod +x /usr/local/bin/weekly_backup.sh

2. スクリプトのテスト:

スクリプトを手動で実行して、期待通りに動作することを確認します。

sudo /usr/local/bin/weekly_backup.sh

/mnt/backups/weekly/ ディレクトリとログファイルを確認して、バックアップを検証します。

方法2:tarを使用した完全アーカイブバックアップ

tarは、データの単一の圧縮アーカイブを作成するのに理想的です。この方法は、特定の時点での完全なスナップショットが必要な場合に適しています。

例として、/home/etc を圧縮されたtarballにバックアップするとします。

1. バックアップスクリプトの作成:

/usr/local/bin/weekly_tar_backup.sh という名前のファイルを作成します。

#!/bin/bash

# --- 設定 ---
SOURCE_DIRS=("/home" "/etc")
BACKUP_DEST="/mnt/backups/weekly/"
TIMESTAMP=$(date +"%Y%m%d_%H%M%S")
ARCHIVE_NAME="backup_${TIMESTAMP}.tar.gz"
LOG_FILE="${BACKUP_DEST}backup_log_${TIMESTAMP}.log"

# --- 保存先が存在することを確認 ---
mkdir -p "${BACKUP_DEST}"

# --- ログ記録開始 ---
echo "週次tarバックアップを開始します: $(date)" >> "${LOG_FILE}"

# --- tarバックアップの実行 ---
echo "アーカイブ ${ARCHIVE_NAME} を作成中..." >> "${LOG_FILE}"
tar -czvf "${BACKUP_DEST}${ARCHIVE_NAME}" "${SOURCE_DIRS[@]}" >> "${LOG_FILE}" 2>&1

if [ $? -eq 0 ]; then
    echo "アーカイブ ${ARCHIVE_NAME} の作成に成功しました。" >> "${LOG_FILE}"
else
    echo "アーカイブ ${ARCHIVE_NAME} の作成中にエラーが発生しました。" >> "${LOG_FILE}"
fi

# --- ログ記録終了 ---
echo "週次tarバックアップが終了しました: $(date)" >> "${LOG_FILE}"
echo "---------------------------" >> "${LOG_FILE}"

exit 0

tar オプションの説明:

  • -c:新しいアーカイブを作成します。
  • -z:圧縮のためにアーカイブをgzipでフィルタリングします。
  • -v:処理されたファイルを詳細にリスト表示します。
  • -f:アーカイブファイルまたはデバイスFILENAMEを使用します。
  • "${SOURCE_DIRS[@]}":各ソースディレクトリを個別の引数として渡します。

スクリプトを実行可能にしてテストします:

sudo chmod +x /usr/local/bin/weekly_tar_backup.sh
sudo /usr/local/bin/weekly_tar_backup.sh

週次Cronジョブのスケジュール設定

スクリプトが手動で動作することを確認したら、cronでスケジュールします。スクリプトが /etc や他のユーザーのホームディレクトリなどのシステムディレクトリを読み取る権限を必要とする場合は、rootのcrontabを使用します。

sudo crontab -e

以下のエントリのいずれかを追加します:

# 毎週日曜日の午前2:00にrsyncバックアップを実行
0 2 * * 0 /usr/local/bin/weekly_backup.sh

# または毎週日曜日の午前2:30にtarバックアップを実行
30 2 * * 0 /usr/local/bin/weekly_tar_backup.sh

Cronは次のフィールド順序を使用します:

分 時 日 月 曜日 コマンド

ほとんどのLinuxシステムでは、曜日フィールドで 0 または 7 は日曜日を意味します。ディストリビューションのドキュメントで一方の形式のみが記載されている場合は、そのcronマニュアルに従ってください。

バックアップの確認と維持

バックアップは、復元できて初めて有用です。以下のチェックをルーチンに追加してください:

  • 最初のスケジュール実行後、最新のログファイルを確認します。
  • 小さなテストファイルを一時ディレクトリに復元します。
  • バックアップ先に十分な空き容量があることを確認します。
  • データが重要な場合は、少なくとも1つのコピーを元のサーバー外に保存します。
  • バックアップディレクトリ自体をバックアップしないようにします。

rsync の場合、--delete はソースからの削除をミラーリングすることに注意してください。これはクリーンな現在のコピーには便利ですが、バージョン管理されたバックアップの代わりにはなりません。tar の場合は、後で保持ポリシーを追加して、古いアーカイブがディスクを満たさないようにします。

まとめ

テストして復元できる最もシンプルな週次cronジョブから始めてください。現在のミラーが必要な場合は rsync を、日付指定のスナップショットが必要な場合は tar を使用し、バックアップに依存する前にサンプルファイルを復元して常に確認してください。