トップ  > サーバ設定:運用  > 運用  > サーバのファイルを自動的にバックアップする

サーバのファイルを自動的にバックアップする  (最終更新日:2011/04/14)

サーバ内のデータのバックアップを実施します。

バックアップ対象のリストを作成し、バックアップディレクトリへ圧縮保存。ファイルは世代管理し1週間まで日付順に保存可能とします。

保存したファイルはクライアントよりrsyncコマンドで、Windows起動時に自動で取得出来るようにします。

この方法はリアルタイムバックアップで無いことが欠点です。

サーバのバックアップ設定

1.バックアップスクリプト作成
[root@sv ~]# vi backup.sh ← バックアップスクリプト作成
ここから----------
#!/bin/bash

#
# ローカル内でバックアップ
#

LANG=C

#
# 設定開始
#

# バックアップ対象リスト名
# ※バックアップ対象を絶対パスで記述したリスト
BACKUPLIST=/root/backuplist
[ ! -s $BACKUPLIST ] && echo "$BACKUPLIST is not found" && error_exit

# バックアップ対象外リスト名
# ※バックアップ対象外を絶対パスで記述したリスト
BACKUPNOLIST=/root/backupnolist

# バックアップ先ディレクトリ名
BACKUPDIR=/backup
mkdir -p $BACKUPDIR

# バックアップ保存世代数
# ※当日分を含めた過去分バックアップを保存する世代数
# ※過去分バックアップを保存しない場合は1を指定する
BACKUPGEN=8

# バックアップログファイル名
BACKUPLOG=/var/log/backup.log

#
# 設定終了
#

# 異常終了処理関数定義
error_exit () {
    rm -f $TMPBACKUPNOLIST
    exit 1
}

# バックアップファイルをバックアップ対象外リストに追加
# ※バックアップ先ファイルをバックアップしないようにする
TMPBACKUPNOLIST=`mktemp`
[ -s $BACKUPNOLIST ] && cat $BACKUPNOLIST > $TMPBACKUPNOLIST
echo "$BACKUPDIR/*backup.tar.bz2" >> $TMPBACKUPNOLIST

# 前回バックアップをリネーム
cd $BACKUPDIR
OLDBACKUPFILE=`ls backup.tar.bz2* 2>/dev/null`
if [ -f $OLDBACKUPFILE ]; then
    TIMESTAMP=`ls --full-time $OLDBACKUPFILE|awk '{print $6}'|tr -d -`
    mv $BACKUPDIR/$OLDBACKUPFILE $BACKUPDIR/${TIMESTAMP}$OLDBACKUPFILE > /dev/null 2>&1
fi

# バックアップログファイル作成
rm -f $BACKUPLOG
touch $BACKUPLOG
chmod 400 $BACKUPLOG

# バックアップ実行
echo "`date` backup start" >> $BACKUPLOG
tar cjvfP $BACKUPDIR/backup.tar.bz2 -T $BACKUPLIST -X $TMPBACKUPNOLIST >> $BACKUPLOG 2>&1
code=$?
if [ $code -ne 0 ]; then
    cat $BACKUPLOG | mail -s "BACKUP NG CODE IS $code" root
    rm -f $BACKUPDIR/backup.tar.bz2
    error_exit
fi
echo "`date` backup end" >> $BACKUPLOG

# バックアップ保存世代を超えた古いバックアップを削除
if [ $(ls $BACKUPDIR/*backup.tar.bz2*|wc -l) -gt $BACKUPGEN ]; then
    OLDBACKUPCNT=`expr $(ls $BACKUPDIR/*backup.tar.bz2*|wc -l) - $BACKUPGEN`
    for file in `ls -t $BACKUPDIR/*backup.tar.bz2*|tail -n $OLDBACKUPCNT`
    do
        rm -f $file
    done
fi

# バックアップ対象外リスト削除
rm -f $TMPBACKUPNOLIST
----------ここまで

[root@sv ~]# chmod 700 backup.sh ← バックアップスクリプトへ実行権限付加
2.バックアップ対象リスト作成

バックアップ対象のディレクト・ファイルのリストを作成する。

[root@sv ~]# vi backuplist ← バックアップリスト作成
/home ← バックアップ対象に/homeディレクトリを指定
/root ← バックアップ対象に/rootディレクトリを指定
/var/www ← バックアップ対象に/var/wwwディレクトリを指定
3.バックアップ対象外リスト作成

バックアップ対象に登録したディレクトリやファイルで、対象外ししたいものを個別に登録します。

バックアップ対象外にするものがない場合は作成する必要はありません。

[root@sv ~]# vi backupnolist ← バックアップ対象外リスト作成
/var/www/error ← バックアップ対象外に/var/www/errorを指定
/var/www/icons ← バックアップ対象外に/var/www/iconsを指定

対象リストと組み合わせて使用します。今回の場合、/home・/root・/var/wwwがバックアップ対象になり、/var/wwwディレクトリ内の/error・/iconsをバックアップの対象外にします。
4.バックアップ動作確認
[root@sv ~]# ./backup.sh ← バックアップスクリプト実行

[root@sv ~]# ll /backup ← バックアップ先確認
合計 9288
-rw-r--r-- 1 root root 9490371 11月  1 16:29 backup.tar.bz2

バックアップはスクリプト設定により7世代分を保持しており、backup.shが実行されるたびに前日のbackup.tar.bz2がyyyymmddbackup.tar.bz2の様にリネームされます。

5.バックアップ内容確認
[root@sv ~]# tar tjvf /backup/backup.tar.bz2 ← バックアップディレクトリ、ファイル確認
バックアップしたディレクトリ、ファイルが一覧表示される
6.バックアップ定期実行設定
[root@sv ~]# echo "0 5 * * * root /root/backup.sh" > /etc/cron.d/backup ← バックアップ定期自動実行設定追加
※毎日5:00にバックアップを実行する
7.データベースバックアップとの連携
[root@sv ~]# echo "/backup/mysql" >> backuplist ← バックアップ対象リストに/backup/mysqlディレクトリを追加

[root@sv ~]# echo "0 5 * * * root /root/mysql-backup.sh ; /root/backup.sh" > /etc/cron.d/backup ← バックアップ定期自動実行設定追加
※毎日5:00にデータベースバックアップ、バックアップの順に実行する

クライアントのバックアップ設定

Windowsの起動時、rsyncコマンドでサーバからバックアップを取得します。

rsyncコマンドのファイル転送は差分のみの為、2回目以降(クライアントを再起動した時など)は取得せず即終了します。

1.cwRsyncインストール

Windowsで動作する、cwRsyncをダウンロードします。

※最新版はこちらで確認。(2011/04/12時点。cwRsync_4.1.0_Installer.zip)

ダウンロードしたファイルを解凍しインストーラに従ってインストールをします。(設定値はすべてデフォルトでOK)

2.鍵作成

cwRsyncでサーバへログインする際に使用する鍵を作成します。

なお、サーバへログインする際のパスワード入力を省略するために、パスフレーズ無しの鍵を作成します。

C:\>md C:\Users\ユーザ名\.ssh ← 鍵を保存するためのディレクトリを作成。4.系では事前に作成しないと鍵作成に失敗します

C:\>cd C:\Program Files (x86)\cwRsync\bin ← cwRsyncインストールフォルダへ移動

C:\Program Files (x86)\cwRsync\bin>ssh-keygen -t rsa -N "" ← パスフレーズなし鍵ペア作成
Generating public/private rsa key pair.
Enter file in which to save the key (/home/ユーザ名/.ssh/id_rsa):/cygdrive/c/Users/ユーザ名/.ssh/id_rsa ← 鍵を保存するディレクトリを指定
Your identification has been saved in /cygdrive/c/Users/ユーザ名/.ssh/id_rsa.
Your public key has been saved in /cygdrive/c/Users/ユーザ名/.ssh/id_rsa.pub.
The key fingerprint is:
00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00 ユーザ名@ホスト名
The key's randomart image is:
+--[ RSA 2048]----+
|                 |
|                 |
|                 |
|                 |
|                 |
|                 |
|                 |
|                 |
|                 |
+-----------------+

公開鍵がC:\Users\ユーザ名\.ssh\id_rsa.pub、秘密鍵がC:\Users\ユーザ名\.ssh\id_rsaとして作成される。

3.公開鍵設定

サーバへ公開鍵の設定をします。

また秘密鍵を奪われると誰でもログインできてしまう為、ログインできるホストを制限します。

今回は、サーバへ接続できるホストを「windows7/192.168.0.2」とし、ログインできるユーザをuser_mとします。

[root@sv ~]# mkdir -p /home/user_m/.ssh ← 公開鍵格納ディレクトリ作成(すでにある場合は不要)

[root@sv ~]# chmod 700 /home/user_m/.ssh/ ← パーミッションを変更(すでにある場合は不要)

[root@sv ~]# vi /home/user_m/.ssh/authorized_keys2 ← 公開鍵をauthorized_keys2で保存(番号なしは他で使用中)
from="windows7" ssh-rsa xxxxx・・・ ← 行頭に接続を許可するホスト名を指定し、続けてクライアント側で作成したid_rsa.pubの中身を全て貼り付ける
当サイト通りにPoderosaを設定している場合はテキストよりコピーし右クリックで貼り付け

[root@sv ~]# chmod 600 /home/user_m/.ssh/authorized_keys2 ← パーミッションを変更

[root@sv ~]# chown -R user_m:user_m /home/user_m/.ssh/ ← 公開鍵格納ディレクトリの所有者を変更(すでにフォルダがある場合、作成したファイルの所有者変更)

[root@sv ~]# echo "192.168.0.2 windows7" >> /etc/hosts ← ログイン許可ホストのIPアドレスとホスト名を/etc/hostsに追加
4.cwRsyncの設定

C:\Program Files (x86)\cwRsysnc\cwrsync.cmd(デフォルトでインストールした場合)を任意の場所にコピーしテキストエディタで開く。(直接編集でもOK)

REM ** CUSTOMIZE ** Specify where to find rsync and related files (C:\CWRSYNC)
SET CWRSYNCHOME=%PROGRAMFILES%\CWRSYNC
↓
SET CWRSYNCHOME=C:\Program Files (x86)\cwRsync ← 変更

REM Set HOME variable to your windows home directory. That makes sure 
REM that ssh command creates known_hosts in a directory you have access.
SET HOME=%HOMEDRIVE%%HOMEPATH%
↓
SET HOME=C:\Users\ユーザ名 ← 変更

以下に追加
REM ** CUSTOMIZE ** Enter your rsync command(s) here
rsync -avz -e ssh --exclude 'mysql/' user_m@sv.rx-93dff.net:/backup/ /cygdrive/d/backup/rx-93dff.net_backup> cwrsync.log ← backupフォルダ内のファイルを全て指定したディレクトへ同期
sshでポートを変更している場合
rsync -avz -e "ssh -p ポート番号" --exclude 'mysql/' user_m@sv.rx-93dff.net:/backup/ /cygdrive/d/backup/rx-93dff.net_backup> cwrsync.log
サーバのフォルダ内と完全同期させたい場合は「--delete」オプションをつけます。一度オプション無しで意図したディレクトへコピー出来るか確認することを推奨します。

上記コマンドでは、sv.rx-93dff.netへuser_mでssh接続をし、/backup/配下のmysql/フォルダ以外のファイルをD:\/backup/rx-93dff.net_backupフォルダへアーカイブモードでデータを圧縮して受信し、その際の転送情報を詳しく表示し結果をcwrsync.logへ書き込むという内容になります。

5.cwRsync動作確認

作成したcwrsync.cmdをダブルクリック又はコマンドプロンプトより実行します。

c:\>cwrsync.cmd ← バックアップ取得コマンド実行
The authenticity of host '[sv.rx-93dff.net]:ポート番号 ([192.168.0.100]:ポート番号)' can't be established.
RSA key fingerprint is 00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00.
Are you sure you want to continue connecting (yes/no)?yes ← 初回のみ
Warning: Permanently added '[sv.rx-93dff.net]:ポート番号,[192.168.0.100]:ポート番号' (RSA) to the list of known hosts.
6.cwRsync自動実行設定

作成したcwrsync.cmdを「すべてのプログラム」-「スタートアップ」へコピーする