バックアップ(クライアントPCへ)

■ FC2~FC6 / Fedora7 / Fedora8 / Fedora9

A. クライアント側でのRsync によるバックアップ
(Linuxメインサーバー⇒Linux予備サーバー)

ここでは rsync を使用して、予備サーバーの起動時にメインサーバーのhtmlデータを予備サーバーに自動でバックアップする。rsync はアクセス権限や所有者情報もあわせてバックアップできる為、CGI等のパーミッションや所有者情報の設定をせずに即実行できる。また、rsync コマンドは、2回目以降は更新分のみバックアップしたり、バックアップ元から削除されたファイルをバックアップ先からも削除するなど同期を行うことも可能。データを同期させておけば、メインサーバーにトラブルが発生しても、すぐに予備のサーバーに切り替えることが出来る。
SSH を利用して予備サーバーからメインサーバーに対して rsync を自動実行するようにする。尚作業はメインサーバー、予備サーバーともrootで行う。
1.鍵の作成
先ずは、予備サーバーのほうで鍵の作成。Enterと書いてある部分は、何も入力せずにEnterキーを押せばOK。

[root@linux ~]# ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):   ←Enter
Enter passphrase (empty for no passphrase):   ←Enter
Enter same passphrase again:   ←Enter
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
16:68:99:ee:3a:4b:54:e3:29:e5:19:d2:9e:5c:06:7d root@linux.yokensaka.com

次にメインサーバーのほうのsshd_configを編集して、rootでのログインを許可。

[root@server ~]# vi /etc/ssh/sshd_config
PermitRootLogin no
↓
PermitRootLogin yes
この変更を終えたら、メインサーバーのSSHを再起動しておく。
[root@server ~]# service sshd restart

2.予備サーバーで作成した公開鍵の抜き取り

すでにsshでログインできる環境なら、scpコマンドで以下のようにコピーすることが出来る。

[root@linux ~]# scp /root/.ssh/id_rsa.pub 192.168.1.10:/root/.ssh/

メインサーバーの/rootにコピーしたid_rsa.pubをauthorized_keys2に登録。
続いて、authorized_keys2のパーミッションの変更。

[root@server ~]# mkdir .ssh
[root@server ~]# cat id_rsa.pub >> /root/.ssh/authorized_keys2    ←/rootで
[root@server ~]# chmod 600 /root/.ssh/authorized_keys2

以上で、予備サーバーからメインサーバーへのSSH接続は、パスワード等を入力することなく
接続できるようになっている。試しに予備サーバーから、メインサーバーにSSHで接続してみる。

[root@linux ~]# ssh 192.168.1.10
The authenticity of host '192.168.1.10 (192.168.1.10)' can't be established.
RSA key fingerprint is c5:df:b7:ec:8a:b4:68:dd:89:9d:ae:88:4b:33:4e:ae.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.1.10' (RSA) to the list of known hosts.
Last login: Sat Oct  7 11:53:15 2006 from linux.yokensaka.com
[root@server ~]#  ← SSHサーバーへパスワード応答なしでログインできた
[root@server ~]# exit ← SSHサーバーからログアウト
Connection to 192.168.1.10 closed.
[root@linux ~]# ← SSHサーバーからログアウトした

これでパスワードなどを入力することなく、メインサーバーに接続できる。
3.バックアップスクリプト作成(クライアント側)
すでに作成されてるサーバーのバックアップファイルと/var/www/html/にあるファイルを予備サーバーに rsync でダウンロードするスプリクト作成。

[root@linux ~]# vi backuprsync.sh
#!/bin/sh
RSYNC='rsync -avz -e ssh --delete'
$RSYNC 192.168.1.10:/var/www/html/ /var/www/html/ >> /var/log/backup.log
$RSYNC 192.168.1.10:/backup/backup.tar.bz2 /root/backup.tar.bz2 >> /var/log/backup.log
$RSYNC 192.168.1.10:/backup/fcdump.sql /root/fcdump.sql >> /var/log/backup.log
$RSYNC 192.168.1.10:/backup/ss1129dump.sql /root/ss1129dump.sql >> /var/log/backup.log
$RSYNC 192.168.1.10:/backup/nucleusdump.sql /root/nucleusdump.sql >> /var/log/backup.log
$RSYNC 192.168.1.10:/backup/takadump.sql /root/takadump.sql >> /var/log/backup.log
※サーバー側の/var/www/html/にあるファイルを、クライアント側の/var/www/html/へ上書きコピー
※サーバー側の/backup/の中にある個別のファイルをクライアント側の/root/にバックアップ
[root@linux ~]# chmod +x backuprsync.sh ← 作成したバックアップスクリプトへ実行権限付加

※mysqldump.sqlについてはメインサーバーの情報等が入っているのでクライアント側にリストアするとトラブルになる。mysqldump.sqlはクライアント側にはバックアップしない。あくまで個別のデータのみバックアップする。
4.バックアップスクリプト確認(クライアント側)

[root@linux ~]# /root/backuprsync.sh ← バックアップスクリプト実行
[root@linux ~]# ll /var/www/html/ ← バックアップ結果確認
※メインサーバーと同じ物がバックアップされてるはず
[root@linux ~]# ll /root/ ← バックアップ結果確認
合計 836080
drwxr-xr-x 2 root root      4096 10月 28 01:23 Desktop
-rw------- 1 root root      1183 10月 28 01:17 anaconda-ks.cfg
-rwx------ 1 root root      1983 10月 28 07:50 backup.sh
-rw-r--r-- 1 root root 843245840 10月 28 05:18 backup.tar.bz2 ← htmlバックアップファイル
-rw-r--r-- 1 root root        14 10月 28 07:50 backuplist
-rwxr-xr-x 1 root root       536 10月 28 08:02 backuprsync.sh
-rwx------ 1 root root       150 10月 28 06:33 chkrootkit.sh
-rwx------ 1 root root       253 10月 28 06:42 clamav.sh
-rwxr-xr-x 1 root root      2248 10月 28 06:23 conv_weblog_to_utf8.pl
-rw-r--r-- 1 root root     89327 10月 28 05:00 fcdump.sql ← fcバックアップファイル
-rw-r--r-- 1 root root     41402 10月 28 01:17 install.log
-rw-r--r-- 1 root root      3867 10月 27 06:58 install.log.syslog
-rw-r--r-- 1 root root    152446 10月 28 05:00 ss1129dump.sql ← ss1129バックアップファイル
-rwx------ 1 root root       337 10月 28 07:46 mysqldump.sh
-rw-r--r-- 1 root root  11451638 10月 28 05:00 nucleusdump.sql ← nucleusバックアップファイル
-rw-r--r-- 1 root root    239655 10月 28 05:00 takadump.sql ← takaバックアップファイル

※メインサーバーのバックアップファイルが/root/にバックアップされている
5.バックアップスクリプト自動実行設定

[root@linux ~]# vi /etc/rc.local ← システム起動時実行コマンド定義ファイル編集
/root/backuprsync.sh ← 最終行へ追加

これで、linuxクライアント起動時に自動でサーバーのhtmlファイルとデータベースファイルがバックアップされるようになる。
※ メインサーバーが再起動した時など、誤って予備サーバーのデーターをメインサーバーに上書きする可能性があるのでメインサーバーにはこの設定はしないこと!!
6.データベースを予備サーバーへ復元
htmlファイルは直に上書きしているが、データベースファイルは予備サーバー側で以下のコマンドを実行すれば各データベースが復元される

[root@linux ~]# mysql -uroot -pパスワード fc < /root/fcdump.sql
[root@linux ~]# mysql -uroot -pパスワード ss1129 < /root/ss1129dump.sql
[root@linux ~]# mysql -uroot -pパスワード nucleus < /root/nucleusdump.sql
[root@linux ~]# mysql -uroot -pパスワード taka < /root/takadump.sql

7.データベースを予備サーバーへ復元するスプリクトを作成

[root@linux ~]# vi restore.sh
#!/bin/bash
mysql -uroot -pパスワード fc < /root/fcdump.sql
mysql -uroot -pパスワード ss1129 < /root/ss1129dump.sql
mysql -uroot -pパスワード nucleus < /root/nucleusdump.sql
mysql -uroot -pパスワード taka < /root/takadump.sql
作成したリストアスクリプトへ実行権限付加
[root@linux ~]# chmod 700 restore.sh
リストアスクリプトを実行してみる
[root@linux ~]# ./restore.sh

※ 誤って古いデーターを上書きする可能性があるのでメインサーバーにはこの設定はしないこと!!

B. クライアント側でのFTP によるバックアップ設定
(Linuxメインサーバー⇒Linux予備サーバー)

基本的には(A)の Rsync によるバックアップを行なっているが Rsync によるバックアップがうまくいかない場合とか、自宅サーバーで自分しかアクセスしないような環境ならば FTP によるバックアップでも問題ないので FTP によるバックアップ設定も一応構築しておく。
1.FTP でダウンロードするスプリクト作成
すでに作成されてるサーバーのバックアップファイルと/var/www/html/にあるファイルを予備サーバーに FTP でダウンロードするスプリクト作成。

[root@linux ~]# vi backupftp.sh
#!/bin/sh
#cd /usr/bin
ftp -n 192.168.1.10 << "EOD"
user higo パスワード
binary
cd /backup
get backup.tar.bz2
get fcdump.sql
get ss1129dump.sql
get nucleusdump.sql
get takadump.sql
bye
EOD

※mysqldump.sqlについてはメインサーバーの情報等が入っているのでクライアント側にリストアするとトラブルになる。なので、mysqldump.sqlはクライアント側にはバックアップしない。あくまで個別のデータのみバックアップする。
2.作成したバックアップスクリプトへ実行権限付加

[root@linux ~]# chmod 700 backupftp.sh

3.クライアント(linux)でのFTPによるバックアップスクリプトを実行してみる

[root@linux ~]# ./backupftp.sh

4.バックアップ結果確認

[root@linux ~]# ll /root/
合計 483288
drwxr-xr-x 2 root root      4096  9月 28 07:06 Desktop
-rw------- 1 root root      1256  9月 28 07:01 anaconda-ks.cfg
-rwx------ 1 root root      1983 10月  1 19:10 backup.sh
-rw-r--r-- 1 root root 486301589 10月  7 08:05 backup.tar.bz2 ← htmlファイル
-rwx------ 1 root root       252 10月  1 07:17 backupget.sh
-rw-r--r-- 1 root root        14 10月  1 19:10 backuplist
-rwxr-xr-x 1 root root       118 10月  7 10:10 backuprsync.sh
-rwx------ 1 root root       151  9月 29 23:50 chkrootkit.sh
-rwxr-xr-x 1 root root      2248  9月 29 23:46 conv_weblog_to_utf8.pl
-rwx------ 1 root root        80 10月  1 22:50 ddo.jpIP_upgrade.sh
drwxr-xr-x 2 1341 1000     20480  9月 14 05:36 docs
-rw-r--r-- 1 root root     89327 10月  7 08:05 fcdump.sql ← fcデータベースファイル
-rw-r--r-- 1 root root     41604  9月 28 06:57 install.log
-rw-r--r-- 1 root root      3975  9月 28 06:50 install.log.syslog
-rw-r--r-- 1 root root    150847 10月  7 08:05 ss1129dump.sql ← ss1129データベースファイル
-rw-r--r-- 1 root root  10591330 10月  7 08:05 nucleusdump.sql ← nucleusデータベースファイル
-rwx------ 1 root root       306  9月 30 01:55 snortsnarf.sh
-rw-r--r-- 1 root root    238771 10月  7 08:05 takadump.sql ← takaデータベースファイル
-rwx------ 1 root root       618  9月 30 03:14 tripwire.sh

backuprsync.shを自動実行させているので/backupftp.shは自動実行させないで何かあったら手動で実行させるようにしている。

C. Winクライアント側でのFTP によるバックアップ設定
(Linuxメインサーバー⇒Winクライアント)

サイトのデータはクライアント(Win)のC:\Documents and Settings\ユーザー名\My Documents\www\yokensakaというフォルダにて管理しているのでサーバーのバックアップファイルも(Win)の同じところにバックアップしておく。
バックアップファイル格納フォルダをC:\Documents and Settings\ユーザー名\My Documents\www\yokensakaに作成しておく。
(C:\Documents and Settings\ユーザー名\My Documents\www\yokensaka\backup)
1.バックアップファイル取得コマンドの作成
以下の内容でC:\Documents and Settings\ユーザー名\My Documents\www\yokensaka\backup\backupget.txtを作成

open 192.168.1.10
ユーザー名 ← FTPでサーバーへ接続するためのユーザー名
******** ← FTPでサーバーへ接続するためのパスワード
binary
get /backup/backup.tar.bz2
get /backup/mysqldump.sql
get /backup/fcdump.sql
get /backup/ss1129dump.sql
get /backup/nucleusdump.sql
get /backup/takadump.sql
quit

2.バッチファイルの作成
以下の内容でC:\Documents and Settings\ユーザー名\My Documents\www\yokensaka\backup\backupget.batを作成

ftp -s:backupget.txt > backupget.log

FTP処理を行い、結果をbackupget.logに出力するbackupget.batというバッチファイル
3.バッチファイル(backupget.bat)を実行
C:\Documents and Settings\ユーザー名\My Documents\www\yokensaka\backup\backupget.batをダブルクリックで実行し、 C:\Documents and Settings\ユーザー名\My Documents\www\yokensaka\backupフォルダにbackup.tar.bz2及び各dump.sqlが転送されてきていることを確認。また、C:\Documents and Settings\ユーザー名\My Documents\www\yokensaka\backupフォルダにbackupget.logが作成されていることを確認。
4.バックアップファイル取得自動実行
backupget.batファイルをスタートアップに登録して、クライアント(Windows)を起動したときに自動でバックアップを行うようにする。

D. バックアップファイルをLinuxメインサーバーへ復元
(クライアントPC⇒Linuxメインサーバー⇒復元)

バックアップファイルをLinuxメインサーバーへ復元する必要が出てきた場合は、クライアントPCからLinuxメインサーバーへバックアップファイルを戻してからLinuxメインサーバー側で以下のコマンドを実行することで、パーミッション、所有者も含めて元のメインサーバーにリストア出来る。

[root@server ~]# tar jxvfP /backup/backup.tar.bz2
個別にパーミッション、所有者も含めて復元する場合
[root@server ~]# tar jxvfP /backup/backup.tar.bz2 /var/www/html/ファイル名

mysqldumpでバックアップしたファイルを使って元のメインサーバーにリストアするにはmysqlコマンドを使う。

全てをバックアップした場合のリストア
[root@server ~]# mysql -uroot -pパスワード < /backup/alldump.sql
個別のデータベースをバックアップした場合のリストア
[root@server ~]# mysql -uroot -pパスワード mysql < /backup/mysqldump.sql
[root@server ~]# mysql -uroot -pパスワード fc < /backup/fcdump.sql
[root@server ~]# mysql -uroot -pパスワード ss1129 < /backup/ss1129dump.sql
[root@server ~]# mysql -uroot -pパスワード nucleus < /backup/nucleusdump.sql
[root@server ~]# mysql -uroot -pパスワード taka < /backup/takadump.sql
mysqlをリストアした場合や全てをリストアした場合はmysqlの再起動が必要
[root@server ~]# /etc/init.d/mysql restart