自宅環境のバックアップにBaculaを導入

今まで自宅環境のバックアップは

でやっていました。
バックアップにssh(1)を使うのは小学生までという記事を見つけ、
いつも「もっといいやり方は無いものか?」と思っていたので
勉強がてらやってみることに。
個人的には対応するOSがとても多かったのが非常にポイント高かったです。
以下、自分的なまとめ。

Baculaとは?

ネットワーク越しにUnix系OSからWindowsまで
バックアップ出来るソフトウェア。バックアップ対象の
サーバ、データ保管サーバ、管理・制御サーバの
3つで連携しバックアップを行います。

バックアップの対象

バックアップを置く環境

RAID?なにそれ?状態です。
同時にクラッシュさえしなければ良いです。

ダウンロード

yumだと2.4.4と古かったので3.0.1を直接DLしました。(2009/06/06現在)

% wget http://ncu.dl.sourceforge.net/sourceforge/bacula/bacula-3.0.1.tar.gz

インストール

その後、通常通りmakeしてmake installします。
Baculaではカタログとよばれるものでデータを管理するので、
DBが必要になります。今回はMySQLを利用しましたので、
以下のRPMに含まれるヘッダファイルが必要となります。

% sudo yum install mysql-devel libz-devel

また、利用するDBを指定します。(今回はMySQLを利用しました)
利用できるのは以下の3種類。

実行したconfigureオプション (MySQL使用)

% ./configure \
--prefix=/path/to/bacula-3.0.1 \
--with-mysql \ <= 利用するDBを指定
--with-db-name=<DB名> \
--with-db-user=<ユーザー名> \
% make
% make install

これでとりあえず完了です。次にMySQLの設定。

DB設定

インストールしたPREFIX以下のetcディレクトリに、
初期化用スクリプトがあるのでそれぞれ実行します。

% sudo PREFIX/etc/create_bacula_database
% sudo PREFIX/etc/grant_bacula_privileges
% sudo PREFIX/etc/make_bacula_tables

DB、ユーザー、テーブルを作ります。
コマンドでいうと以下の感じ。

mysql> CREATE DATABASE bacula;
mysql> USE mysql
mysql> GRANT ALL PRIVILEGES ON bacula.* TO bacula@LOCALHOST;
mysql> GRANT ALL PRIVILEGES ON bacula.* TO bacula@"%";
mysql> FLUSH PRIVILEGES;

そのまま実行するとセキュリティ的にひどいので、
4行目を以下の用に変更しました。

mysql> GRANT ALL PRIVILEGES ON bacula.* TO bacula@"%";

mysql> GRANT ALL PRIVILEGES ON bacula.* TO bacula@"192.168.1.0/24"

としました。192.168.1.0/24は自宅ネットワークのセグメントなので、
こちらも適宜あわせてみて下さい。

テーブルは長すぎるので割愛します。

起動設定

PREFIX/etc ディレクトリに、各デーモンに
対応したスクリプトがあります。

bacula-ctl-dir ディレクターデーモン
bacula-ctl-fd ファイル(クライアント)デーモン
bacula-ctl-sd ストレージデーモン

これを/etc/init.d以下に置きます。yumで入れた場合は
既に置いてあるのかな?

 % sudo ln -sf PREFIX/etc/bacula-ctl-{dir,fd,sd} /etc/init.d

chkconfigで起動する用コメントを追加します

% sudo vim /etc/init.d/bacula-ctl-dir
 # chkconfig:    - 80 20

初回起動設定

% sudo chkconfig bacula-ctl-dir on

何かあった時は

PREFIX/var/bacula/working/log

に色々出ています

ディレクター設定ファイル

これは実際の設定を次回掲載します。
公式サイトのマニュアルが非常に充実しているので
参考にして下さい。

正常接続

Baculaデーモンを起動したあと、ディレクターデーモンに
接続します。

% sudo PREFIX/etc/bconsole

Connecting to Director guinness:9101
1000 OK: guinness-dir Version: 3.0.1 (30 April 2009)
Enter a period to cancel a command.
 *

ディレクタデーモン状態を確認します。
guinness-dirはディレクター名ですので、適宜読み替えて下さい。

 * status dir

guinness-dir Version: 3.0.1 (30 April 2009) i686-pc-linux-gnu redhat
Daemon started 08- 6&#63729;&#63731;2009 00:55, 0 Jobs run since started.
 Heap: heap=147,456 smbytes=39,619 max_bytes=40,172 bufs=168 max_bufs=176

Scheduled Jobs:
Level          Type     Pri  Scheduled          Name               Volume
===================================================================================
Incremental    Backup    10  08- 6&#63729;&#63731;2009 04:25  Client1            *unknown*

Running Jobs:
Console connected at 08- 6&#63729;&#63731;2009 01:01
No Jobs running.
No Terminated Jobs.

次にストレージデーモンの状態確認です。

 * status storage

Automatically selected Storage: File
Connecting to Storage daemon File at guinness:9103

guinness-sd Version: 3.0.1 (30 April 2009) i686-pc-linux-gnu redhat
Daemon started 08- 6&#63729;&#63731;2009 00:23, 0 Jobs run since started.
 Heap: heap=118,784 smbytes=11,534 max_bytes=74,689 bufs=51 max_bufs=53
Sizes: boffset_t=8 size_t=4 int32_t=4 int64_t=8

Running Jobs:
No Jobs running.

Jobs waiting to reserve a drive:

Terminated Jobs:

Device status:
Device "FileStorage" (/mnt/exhdd/bacula) is not open.

Used Volume status:

同様にファイルデーモンの状態を確認します。

 * status client

Automatically selected Client: guinness-fd
Connecting to Client guinness-fd at guinness:9102

guinness-fd Version: 3.0.1 (30 April 2009)  i686-pc-linux-gnu redhat
Daemon started 08- 6&#63729;&#63731;2009 00:23, 0 Jobs run since started.
 Heap: heap=0 smbytes=8,724 max_bytes=8,846 bufs=44 max_bufs=45
 Sizeof: boffset_t=8 size_t=4 debug=0 trace=0

Running Jobs:
Director connected at: 08- 6&#63729;&#63731;2009 01:04
No Jobs running.

Terminated Jobs:

ここまでで、すこしハマった箇所をメモ。

  • ストレージ、ファイルデーモンともSdAddress、FdAddressがないと駄目でした。
  • Pool Type は Backupのみで他は未実装。

バックアップ実行

ここで手動で初回バックアップします。
先ほどと同様にbconsoleからログインします。

 * run

Automatically selected Catalog: MyCatalog
Using Catalog "MyCatalog"
A job name must be specified.
Automatically selected Job: Client1
Run Backup job
JobName:  Client1
Level:    Incremental
Client:   guinness-fd
FileSet:  Full Set
Pool:     Default (From Job resource)
Storage:  File (From Job resource)
When:     2009-06-08 01:05:10
Priority: 10
OK to run? (yes/mod/no):

カタログとジョブが1つしか無かったので、自動的に
選択されています。他にも接続するファイルデーモンや
Poolなどの設定が確認され、問題無ければyesをタイプします。

OK to run? (yes/mod/no): yes
Job queued. JobId=1
You have messages.

Jobの実行結果次第でメッセージが届きます。bconsole上で
messagesコマンドを打つと、メッセージを読むことができます。

リストア

これまで同様bconsoleからrestoreコマンドを実行します。

 * restore

Automatically selected Catalog: MyCatalog
Using Catalog "MyCatalog"

First you select one or more JobIds that contain files
to be restored. You will be presented several methods
of specifying the JobIds. Then you will be allowed to
select which files from those JobIds are to be restored.

To select the JobIds, you have the following choices:
     1: List last 20 Jobs run
     2: List Jobs where a given File is saved
     3: Enter list of comma separated JobIds to select
     4: Enter SQL list command
     5: Select the most recent backup for a client
     6: Select backup for a client before a specified time
     7: Enter a list of files to restore
     8: Enter a list of files to restore before a specified time
     9: Find the JobIds of the most recent backup for a client
    10: Find the JobIds for a backup for a client before a specified time
    11: Enter a list of directories to restore for found JobIds
    12: Cancel
Select item:  (1-12):

実行番号を探してどのジョブでリストアするか決定します。
通常は[5]で直近のバックアップから復旧させます。

Select item:  (1-12): 5
Automatically selected Client: guinness-fd
Automatically selected FileSet: Full Set
+-------+-------+----------+----------------+---------------------+------------+
| JobId | Level | JobFiles | JobBytes       | StartTime           | VolumeName |
+-------+-------+----------+----------------+---------------------+------------+
|     2 | F     |  131,808 | 27,191,517,448 | 2009-06-08 04:54:51 | Full-0002  |
+-------+-------+----------+----------------+---------------------+------------+
You have selected the following JobId: 2

Building directory tree for JobId(s) 2 ...  ++++++++++++++++++++++++++++++++++++++++++++
116,679 files inserted into the tree.

You are now entering file selection mode where you add (mark) and
remove (unmark) files to be restored. No files are initially added, unless
you used the "all" keyword on the command line.
Enter "done" to leave this mode.

cwd is: /
$

ここで、バックアップしたファイル群にコンソールから
移動できるので、リストアしたいファイルを指定します。
cdコマンドでディレクトリを移動し、markコマンドで指定します。
指定が終わったら、doneコマンドでリストアが実行されます。

$ cd /home/yuki/www
cwd is: /home/yuki/www/
$ ls
wiki/
$ mark *
888 files marked.
$ done
Bootstrap records written to /path/to/bacula-3.0.1/var/bacula/working/guinness-dir.restore.1.bsr

The job will require the following
   Volume(s)                 Storage(s)                SD Device(s)
===========================================================================

   Full-0002                 File                      FileStorage


888 files selected to be restored.

Run Restore job
JobName:         NormalRestoreFiles
Bootstrap:       /path/to/bacula-3.0.1/var/bacula/working/guinness-dir.restore.1.bsr
Where:           /bacula-restores
Replace:         always
FileSet:         Full Set
Backup Client:   guinness-fd
Restore Client:  guinness-fd
Storage:         File
When:            2009-06-08 12:25:03
Catalog:         MyCatalog
Priority:        10
Plugin Options:  *None*
OK to run? (yes/mod/no):yes
Job queued. JobId=3
 * 

以上でざっとした流れは以上です。
ディレクターデーモンなど設定に関しては次回公開します。