trombik さんのエントリーをみて、たしかに ssh + tar のバックアップは 20 世紀までだと思ったので、おすすめさせれていた Bacula を試してみた。ONLamp.com の記事もおすすめそうなので、概要を把握したら英文を読む訓練に読んでみるといいと思います。
今回は、僕が管理しているサーバで今は ssh+ tar などで MySQL や SVN リポジトリなど重要なデータをバックアップしているが、これを Bacula で置き換えるように検討してみた。
OS は、CentOS 5.1 x86_64。
まずは、インストールは、Bacula 公式サイトで SRPM が提供されているので、これを使うことにする。いくつか rpm があるが、今回の OS にある RPM がないので、ビルドしてみる。
bacula-2.4.2-2.src.rpm をダウンロードして、まずは RPM を作ってみる。
$ rpm -i bacula-2.4.2-2.src.rpm
$ rpmbuild -ba ~/rpm/SPECS/bacula.spec
ここで、次のエラーがでた。
error: You must specify a platform. Please examine the spec file.
error: line 164: Unknown tag: exit 1
spec ファイルをみると、それぞれの OS ごとに define が定義されていて、どれも定義されていないときにエラーみたなので、CentOS で定義したが、条件のところもおかしかったのでなおした。
ビルドするために、必要なパッケージをインストールした。
$ sudo yum install pango-devel atk-devel gtk2-devel libgnomeui-devel ORBit2-devel libbonobo-devel libbonoboui-devel bonobo-activation-devel GConf2-devel linc-devel
再度ビルドすると、linc-devel がまだ必要と言われて調べてみると、たしかに CentOS ではパッケージが見つからない。どうやら、linc は、CentOS4 でパッケージから削除されてしまったらしい。めんどくさい。
SPEC ファイルをよくてみると、同じ条件がおかしいことが分かったので再修正した。
bacula.spec の diff は、次のとおり。本家にフィードバックする予定。
ビルドしてできた RPM は、次のとおり。
~/rpm/RPMS/x86_64/bacula-client-2.4.2-2.x86_64.rpm
~/rpm/RPMS/x86_64/bacula-debuginfo-2.4.2-2.x86_64.rpm
~/rpm/RPMS/x86_64/bacula-mtx-2.4.2-2.x86_64.rpm
~/rpm/RPMS/x86_64/bacula-mysql-2.4.2-2.x86_64.rpm
~/rpm/RPMS/x86_64/bacula-updatedb-2.4.2-2.x86_64.rpm
それぞれの rpm を qilp オプションでインストールされるファイルの一覧を調べてみた。
bacula-client: バックアップ対象のサーバにインストールする、クライアントデーモンのみインストールされる
bacula-debuginfo: ビルドしたときのデバッグ情報を含むソースコード
bacula-mtx: mtx テープデバイス用のユーティリティ
bacula-mysql: bacula のカタログデータベースに MySQL を使うためのパッケージ、サーバとクライアントのすべて含まれている、このパッケージをインストールするには bacula-mtx が必要
bacula-updatedb: bacula の過去のカタログデータベース用のアップデートユーティリティ
デフォルトだと、–with-openssl オプションが指定されて、TLS 通信を行うようになっている。
さっそく、インストールと設定をしてみる。
$ sudo rpm -ivh ~/rpm/RPMS/x86_64/bacula-mysql-2.4.2-2.x86_64.rpm ~/rpm/RPMS/x86_64/bacula-mtx-2.4.2-2.x86_64.rpm
あと、デフォルトだとインストール後に bacula の MySQL データベースを作成するようになっていたので、コメントにしておいた。なぜなら、今回はデータベースサーバと bacula のサーバは、別のサーバでやりたいから。bacula の MySQL データベースは、次のプログラムを順番に実行するだけでいい。ただし、次のプログラムは、ローカルホストを前提としていたり、MySQL 接続ユーザのパスワードが空だったり、無制限に接続を許可していたりと、そのまま使うにはセキュリティリスクが大きすぎると思ったので、1 と 2 は使わずに手動で行い、3 は変更して使った。
1. /usr/lib64/bacula/grant_mysql_privileges
2. /usr/lib64/bacula/create_mysql_database
3. /usr/lib64/bacula/make_mysql_tables
なので、僕は手動で bacula のデータベース設定をした。MySQL に接続してから、次のコマンドを実行して、データベースと接続ユーザの作成、権限の設定をした。
mysql> grant all on bacula.* to bacula@’接続を許可するサーバ’ identified by ‘パスワード’;
mysql> create database bacula;
あとは、bacula のテーブルを作成する、これは make_mysql_tables を変更して実行した。
さっそく設定をしてみる。bacula-mysql パッケージをインストールすると、次の3種類の init.d スクリプトがインストールされる。
- bacula-dir: bacula ディレクターデーモン、bacula のサーバで起動させるデーモン、カタログデータベースにアクセスしてファイルデーモンに命令を送る
- bacula-fd: bacula ファイルデーモン、バックアップ対象のサーバで起動させるデーモン、ストレージデーモンに命令を送ってバックアップする
- bacula-sd: bacula ストレージデーモン、バックアップするストレージがあるサーバで起動させるデーモン
それで、まずはどんなバックアップをしたいかというと、毎晩、とあるサーバの普通のファイルが入っているとあるディレクトリをフルバックアップと MySQL のデータ(マスターとスレーブ、それぞれ)を物理的に違うサーバにバックアップをしたい。
まずは、bacula-dir の設定から、設定ファイルは /etc/bacula/bacula.conf で行う。設定ファイルのリファレンスは、本家のドキュメントを参考しながら設定してみる。設定パラメータ名がなかなか分かりやすく、ドキュメントもしっかりとしていていい。日本語版があるとうれしいかもしれない。
まず、Directory リソースタイプの設定。これは基本的にデフォルトのままでよいが、Name だけ別の名前に切り替えた。
Director {
Name = hoge-dir
# where we listen for UA connections
DIRport = 9101
QueryFile = "/usr/lib64/bacula/query.sql"
WorkingDirectory = "/var/lib/bacula"
PidDirectory = "/var/run"
Maximum Concurrent Jobs = 1
# Console password
Password = "ランダムなパスワード、このパスワードは bconsole 用に使われる"
Messages = Daemon
}
次に JobDefs リソースタイプの設定。これは、Job リソースタイプで省略されたときのデフォルト設定をするための任意の設定。Job リソースタイプは、複数設定することが多いので、JobDefs リソースタイプは設定した方が便利。
変更したのは、Client は各 Job で定義した方がよさそうなので削除、Message も各 Job でユニークな設定にしたいので削除した。バックアップするファイルを設定する FileSet リソースタイプと Write Bootstrap というジョブを実行しているときに作られるファイルは汎用的に設定した。Storage は、実際にバックアップしたファイルを置くストレージを定義する。
JobDefs {
Name = "DefaultJob"
Type = Backup
Level = Incremental
FileSet="Full Set"
Messages = Daemon
Schedule = "DailyCycle"
Storage = hoge-sd
Pool = Default
Priority = 10
Write Bootstrap = "/var/lib/bacula/%c_%n.bsr"
}
次に Job リソースタイプ。スケジューラから実行させたいので、Enabled = Yes を定義して、hoge-fd というクライアントをバックアップ対象に設定した。
Job {
Name = "BackupTest"
JobDefs = "DefaultJob"
Enabled = Yes
Client = hoge-fd
}
次のクライアントでバックアップするファイルの対象を設定する FileSet リソースタイプ。/home/hoge というディレクトリをバックアップするという設定をした。FileSet では、バックアップからはずしたいファイルやディレクトリも設定できるので、とても便利。
FileSet {
Name = "Full Set"
Include {
Options {
signature = MD5
}
File = /home/hoge
}
次にスケジュール。毎晩バックアップしたので、DailyCycle というスケジュールを設定した。
Schedule {
Name = "DailyCycle"
Run = Full at daily 3:33
}
次にバックアップ対象のクライアントを設定する。Address に実際に接続するバックアップ対象のクライアントを設定する。
Client {
Name = hoge-fd
Address = hoge
FDPort = 9102
Catalog = MyCatalog
# password for FileDaemon
Password = "ファイルデーモンにアクセスするためのパスワード"
File Retention = 30 days # 30 days
Job Retention = 6 months # six months
AutoPrune = yes # Prune expired Jobs/Files
}
次のバックアップするストレージを設定する。
Storage {
Name = hoge-sd
# N.B. Use a fully qualified name here
# Do not use "localhost" here
Address = hoge
SDPort = 9103
Password = "ストレージデーモンにアクセスするためのパスワード"
Device = FileStorage
Media Type = File
}
次のカタログデータベースの設定。今回は、別のデータベースサーバに設定した。
Catalog {
Name = MyCatalog
dbname = "bacula"
dbuser = "bacula"
dbpassword = "パスワード"
DB Address = データベースサーバのホスト名
}
あとは、デフォルトの設定ファイルのまま。設定したら、起動してみる。
$ sudo /etc/init.d/bacula_dir start
もし失敗すると、設定ファイルのどこがおかしいか親切に表示してくれるので、メッセージをみながら設定ファイルを直すことができる。
ディレクターデーモンが起動したら、次はファイルデーモンの設定をする。設定ファイルは、/etc/bacula/bacula-fd.conf。
まず、ディレクターの設定。Name は、bacula-dir.conf の Director リソースタイプの Name と同じものを設定して、Password は、bacula-dir.conf の Client リソースタイプで設定した Password とまったく同じものを設定すること。
Director {
Name = hoge-dir
Password = "ファイルデーモンにアクセスするためのパスワード"
}
次にファイルデーモンの設定。Name を変更した。
FileDaemon { # this is me
Name = hoge-fd
FDport = 9102 # where we listen for the director
WorkingDirectory = /var/lib/bacula
Pid Directory = /var/run
Maximum Concurrent Jobs = 20
}
あとは Messages リソースタイプは、デフォルトのままで問題なし。設定したら、ファイルデーモンも起動してみる。
$ sudo /etc/init.d/bacula-fd start
最後にストレージデーモンの設定。設定ファイルは、/etc/bacula/bacula-sd.conf。
まず、ストレージの設定。Name は、必ず bacula-dir.conf の Storage リソースタイプと同じ Name を設定する。
Storage { # definition of myself
Name = hoge-sd
SDPort = 9103 # Director's port
WorkingDirectory = "/var/lib/bacula"
Pid Directory = "/var/run"
Maximum Concurrent Jobs = 20
}
次に、ディレクターの設定。Name は、bacula-dir.conf の Director リソースタイプと同じ Name を設定、Password は bacula-dir.conf の Storage リソースタイプと同じ Password を設定する。このあたりは、少々混乱しやすいので注意する。
Director {
Name = hoge-dir
Password = "ストレージデーモンにアクセスするためのパスワード"
}
次にストレージの設定。今回は、ディレクトリを普通に使うので次のように設定した。/var/backup/hoge にファイルとしてバックアップする。事前にこのディレクトリは bacula ユーザが書き込めるようにしておく必要がある。
Device {
Name = FileStorage
Media Type = File
Archive Device = /var/backup/hoge
LabelMedia = yes; # lets Bacula label unlabeled media
Random Access = yes;
AutomaticMount = yes; # when device opened, read it
RemovableMedia = no;
AlwaysOpen = no;
}
最後に Message リソースタイプも必要だが、これはデフォルトのままで問題ない。さっそう、ストレージデーモンも起動してみる。
$ sudo /etc/init.d/bacula-sd start
さあ、これで準備が整った。あとは、動作テストをする。動作テストをするには、bacula に付属している bconsole というプログラムを使うと便利。bconsole を使う前に、設定ファイル /etc/bacula/bconsole.conf を変更する必要がある。
設定は、Directory リソースタイプだけだが、Name に bacula-dir.conf の Director リソースタイプの Name と同じ設定、Address はディレクターデーモンが起動しているホスト名、Password には bacula-dir.conf の Director リソースタイプの Password と同じパスワードを設定する。
Director {
Name = hoge-dir
DIRport = 9101
address = hoge
Password = "ランダムなパスワード、このパスワードは bconsole 用に使われる"
}
設定したら、さっそく bconsole を起動してみる。bsonsole は root でしか実行できない。
Connecting to Director hoge:9101
1000 OK: hoge-dir Version: 2.4.2 (26 July 2008)
Enter a period to cancel a command.
*
上の表示されば、ディレクターデーモンに接続できたことになる。さらにストレージ、ファイルデーモンに接続できるか確認するには、status コマンドを使う。
Connecting to Director hoge:9101
1000 OK: hoge-dir Version: 2.4.2 (26 July 2008)
Enter a period to cancel a command.
*status all
hoge-dir Version: 2.4.2 (26 July 2008) x86_64-redhat-linux-gnu redhat
Daemon started 29-Aug-08 23:51, 0 Jobs run since started.
Heap: heap=135,168 smbytes=30,882 max_bytes=30,882 bufs=148 max_bufs=148
Scheduled Jobs:
Level Type Pri Scheduled Name Volume
===================================================================================
Full Backup 10 30-Aug-08 03:33 BackupTest test1
====
...
こんな感じで、それぞれのステータスが表示できれば問題なし。もちろん、個別のステータスも確認できる。ディレクターデーモンは status dir、ファイルデーモンは status file、ストレージデーモンは status storage コマンドを使う。help コマンドを実行すると、利用可能なコマンド一覧が表示される。
次に実際のバックアップジョブが正しく動作するかどうか調べる。バックアップジョブを動作させるには、run コマンドを使えばいいが、事前に label コマンドでバックアップボリュームの設定が必要になる。
1000 OK: backup-dir Version: 2.4.2 (26 July 2008)
Enter a period to cancel a command.
*label
Automatically selected Catalog: MyCatalog
Using Catalog "MyCatalog"
Automatically selected Storage: hoge-sd
Enter new Volume name: test
Defined Pools:
1: Default
2: Scratch
Select the Pool (1-2): 1
Connecting to Storage daemon hoge-sd at hoge:9103 ...
Sending label command for Volume "test" Slot 0 ...
3000 OK label. VolBytes=200 DVD=0 Volume="test" Device="FileStorage" (/var/backup/hoge)
Catalog record for Volume "test", Slot 0 successfully created.
Requesting to mount FileStorage ...
3906 File device "FileStorage" (/home/hoge) is always mounted.
*run
A job name must be specified.
Automatically selected Job: BackupTest
Run Backup job
JobName: BackupTest
Level: Incremental
Client: hoge-fd
FileSet: Full Set
Pool: Default (From Job resource)
Storage: hoge-sd (From Job resource)
When: 2008-08-29 23:59:22
Priority: 10
OK to run? (yes/mod/no): yes
Job queued. JobId=1
こんな感じでバックアップジョブを実行することができる。実行結果を知るには、status dir コマンドを実行すればいい。あとは、バックアップ先のディレクトリをみてみると、なんかバイナリのデータでバックアップがとれている。restore もできるようだが、バイナリではなくてファイルそのものをバックアップしたい。
おそらく、FileSet か Pool リソースタイプあたりに設定があるはずなので、引き続き調べて結果をブログにアップしたいと思います。
bacula をテキストで設定するのはめんどうだという人は、QT で書かれた bat という GUI プログラムがあるので、bat を使うといいと思います。
bacula、とてもよくできていてシステムのバックアップツールとしては自分の中でデファクトスタンダードになりそうです。
Tags: bacula
![Software Design (ソフトウエア デザイン) 2007年 12月号 [雑誌]](http://ecx.images-amazon.com/images/I/51xY3z%2Bjv1L._SL160_.jpg)









