週次バックアップの自動化:簡単なLinux Cronジョブチュートリアル
定期的なバックアップは、堅牢なシステム管理の要石です。ハードウェア障害、誤操作による削除、またはセキュリティインシデントによって重要なデータが失われると、壊滅的な事態になりかねません。幸いにも、Linuxには強力な組み込みツールが用意されており、これらをcronスケジューラと組み合わせることで、信頼性の高い自動化された週次バックアップが可能になります。このチュートリアルでは、標準的なLinuxユーティリティであるrsyncやtarを使い、cronで管理するシンプルかつ効果的な週次バックアップシステムのセットアップ方法を案内します。
このガイドは、自動化されたバックアップ戦略を導入したいLinuxユーザーやシステム管理者を対象としています。このチュートリアルを終えるまでに、重要なディレクトリの週次バックアップを実行するためのcronジョブの設定方法を理解し、データが安全で復旧可能であることを保証できるようになります。
なぜバックアップを自動化するのか?
手動でのバックアップはヒューマンエラーが発生しやすく、特に多忙なスケジュールではしばしば怠られがちです。自動化はこれらのリスクを排除します。週次バックアップにcronジョブを設定することで、以下が保証されます。
- 一貫性(Consistency): 設定された時間に、確実にバックアップが実行されます。
- 信頼性(Reliability): 人為的な見落としや忘れを防ぎます。
- 効率性(Efficiency): システム管理者が他の重要なタスクに集中するための貴重な時間を解放します。
- データ復旧(Data Recovery): データの損失に対するセーフティネットを提供し、事業継続に不可欠です。
バックアップツールの選択:rsync 対 tar
Linuxはバックアップを作成するためのいくつかのツールを提供しています。このチュートリアルでは、一般的で強力な2つのユーティリティ、rsyncとtarに焦点を当てます。
rsync
rsync(リモート同期)は増分バックアップに優れています。2つの場所の間でファイルとディレクトリを効率的に同期し、差分のみを転送します。これにより、特に2回目以降のバックアップにおいて、非常に高速で帯域幅効率が高くなります。
主な利点:
* 増分バックアップに効率的です。
* ローカルとリモートの場所を同期できます。
* ファイル権限、所有者、およびタイムスタンプを保持します。
tar
tar(テープアーカイブ)は多目的なアーカイブユーティリティです。複数のファイルやディレクトリを、多くの場合圧縮された単一のアーカイブファイルにまとめることができます。データの完全なスナップショットを作成するのに理想的です。
主な利点:
* 単一のアーカイブファイルを作成し、管理を簡素化します。
* さまざまな圧縮方法(gzip、bzip2、xz)をサポートしています。
* ファイル権限と所有者を保持します。
バックアップディレクトリのセットアップ
開始する前に、バックアップを保存するための特定のディレクトリを指定するのが良い習慣です。これにより、バックアップが整理され、ライブデータとは別に保管されます。この例では、バックアップを/mnt/backups/weekly/に保存することを想定します。
このディレクトリが存在し、適切な権限が設定されていることを確認してください。より良い災害復旧のために、バックアップを別の物理ドライブまたはネットワーク接続ストレージ(NAS)に保存することも検討してください。
sudo mkdir -p /mnt/backups/weekly
sudo chown root:root /mnt/backups/weekly # Or a dedicated backup user
方法1:rsyncを使用した増分バックアップ
rsyncは、変更履歴を効率的に保持したいディレクトリのバックアップに優れています。週次バックアップの場合、ディレクトリ全体をバックアップするかもしれませんが、rsyncは変更されたファイルのみを処理します。
ここでは、/homeディレクトリと/etcディレクトリをバックアップしたいと仮定します。
1. バックアップスクリプトの作成:
まず、バックアップを実行するシェルスクリプトを作成します。これにより、コマンドの管理が容易になり、必要に応じてより複雑なロジックを組み込めるようになります。
/usr/local/bin/などの場所に、weekly_backup.shという名前のファイルを作成します。
#!/bin/bash
# --- Configuration ---
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"
# --- Ensure destination exists ---
mkdir -p "${BACKUP_DEST}"
# --- Start Logging ---
echo "Starting weekly backup at $(date)" >> "${LOG_FILE}"
# --- Perform rsync ---
for dir in "${SOURCE_DIRS[@]}"; do
echo "Backing up ${dir}..." >> "${LOG_FILE}"
rsync -avz --delete "${dir}/" "${BACKUP_DEST}${dir##*/}/" >> "${LOG_FILE}" 2>&1
if [ $? -eq 0 ]; then
echo "Successfully backed up ${dir}." >> "${LOG_FILE}"
else
echo "Error backing up ${dir}." >> "${LOG_FILE}"
fi
done
# --- End Logging ---
echo "Weekly backup finished at $(date)" >> "${LOG_FILE}"
echo "---------------------------" >> "${LOG_FILE}"
exit 0
rsyncオプションの説明:
* -a (アーカイブモード): -rlptgoDの組み合わせであり、ファイルを再帰的にコピーし、シンボリックリンク、権限、変更時刻、グループ、所有者、およびデバイス/特殊ファイルを保持します。
* -v (詳細表示): 転送されているファイルを表示します。
* -z (圧縮): 転送中にファイルデータを圧縮します(ネットワーク経由でバックアップする場合に役立ちます。低速なメディアに保存する場合を除き、ローカルバックアップではそれほど重要ではありません)。
* --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を圧縮されたターボールにバックアップしたいと仮定します。
1. バックアップスクリプトの作成:
/usr/local/bin/にweekly_tar_backup.shという名前のファイルを作成します。
#!/bin/bash
# --- Configuration ---
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"
# --- Ensure destination exists ---
mkdir -p "${BACKUP_DEST}"
# --- Start Logging ---
echo "Starting weekly tar backup at $(date)" >> "${LOG_FILE}"
# --- Perform tar backup ---
echo "Creating archive ${ARCHIVE_NAME}..." >> "${LOG_FILE}"
tar -czvf "${BACKUP_DEST}${ARCHIVE_NAME}" "${SOURCE_DIRS[@]}" >> "${LOG_FILE}" 2>&1
if [ $? -eq 0 ]; then
echo "Successfully created archive ${ARCHIVE_NAME}." >> "${LOG_FILE}"
else
echo "Error creating archive ${ARCHIVE_NAME}." >> "${LOG_FILE}"
fi
# --- End Logging ---
echo "Weekly tar backup finished at $(date)" >> "${LOG_FILE}"
echo "---------------------------" >> "${LOG_FILE}"
exit 0
tarオプションの説明:
* -c: 新しいアーカイブを作成します。
* -z: 圧縮のためにgzipを通してアーカイブをフィルタリングします。
* -v: 処理されたファイルを詳細にリスト表示します。
* -f: アーカイブファイルまたはデバイス FILENAME を使用します。
* `