株式会社クイックのWebサービス開発blog

HAPPYなエンジニア&デザイナーのブログです

即実践できるBaculaの設定例【構築手順編その1】

社内サーバのバックアップは以前までARCserveを使ってたんですが、Backup対象も増えて限界が来たので最近Baculaにしました。
その時の備忘録として、最初のインストールからどんな運用をしてるかまでを
設定例含めて紹介します!!
今回は【構築手順編その1】です。


レッドブルよりライフガード派です。
matsBです。(๑•̀ㅂ•́)و✧


Baculaって何?って方も結構多いかと思いますが、ざっくり説明すると「統合管理バックアップソフト」でNetVaultやARCserveとかに近いオープンソースのソフトです。
※厳密には違いますが、統合管理バックアップってとこだけを取った意味です。
Baculaは「構築が面倒」とか「動くまでに時間がかかる」とか言われてますが、こんな感じに作れば簡単だよーって事を紹介します!

環境

CentOS 6.7
MySQL 5.6
Bacula 7.4.4

前提

前提環境

MySQLをインストール済。
iptables等のFirewallは一旦無視してます。

サーバ情報

役割 ホスト名 IPアドレス
Director quick-dir 10.0.0.1
Client quick-fd 10.0.0.2
Client(DR用) quick-dr 10.0.0.3
Storage quick-sd 10.0.0.10

下準備

リポジトリの追加

Baculaの7系を入れるためにBaculaのリポジトリを追加。

【CentOS6用】
[root@quick-dir ~]# wget https://copr.fedorainfracloud.org/coprs/slaanesh/Bacula/repo/epel-6/slaanesh-Bacula-epel-6.repo -O /etc/yum.repos.d/slaanesh-Bacula-epel-6.repo

bacula-dir(Bacula Director)の準備

yum でインストール

[root@quick-dir ~]# yum install -y bacula-client bacula-common bacula-console bacula-console-bat bacula-debuginfo bacula-devel bacula-director bacula-docs bacula-libs bacula-libs-sql bacula-traymonitor

※下記の2ファイル通りに実行すれば詰まるところは無いはずで、この記事も基本的に下記ファイルに則ってます。  
[root@quick-dir ~]# /usr/share/doc/bacula-common-7.4.4/README.Redhat
[root@quick-dir ~]# /usr/share/doc/bacula-common-7.4.4/quickstart_mysql.txt

BacualがMySQL使用するための準備

  • 使用DBの選択
今回はMySQLを使用するので、MySQLを選択します
[root@quick-dir ~]# alternatives --config libbaccats.so

3 プログラムがあり 'libbaccats.so' を提供します。

  選択       コマンド
-----------------------------------------------
   1           /usr/lib64/libbaccats-mysql.so
   2           /usr/lib64/libbaccats-sqlite3.so
*+ 3           /usr/lib64/libbaccats-postgresql.so

Enter を押して現在の選択 [+] を保持するか、選択番号を入力します:1
[root@quick-dir ~]#
  • DB/table/baculaユーザの作成
・DBの作成
[root@quick-dir ~]# /bin/sh /usr/libexec/bacula/create_mysql_database -u root -p
Enter password:        #←MySQLのパスワード(今回だったらrootのパスワード)
Creation of bacula database succeeded.

・tableの作成
[root@quick-dir ~]# /bin/sh /usr/libexec/bacula/make_mysql_tables -u root -p
Enter password:        #←MySQLのパスワード(今回だったらrootのパスワード)
Creation of Bacula MySQL tables succeeded.

・MySQLのbaculaユーザの作成
※デフォルトだとパスワードなしになってしまいます。
[root@quick-dir ~]# /bin/sh /usr/libexec/bacula/grant_mysql_privileges -u root -p
Enter password:        #←MySQLのパスワード(今回だったらrootのパスワード)
Created MySQL database user: bacula
Enter password:        #←MySQLのパスワード(今回だったらrootのパスワード)
Host    User    Select_priv     Insert_priv     Update_priv     Delete_priv     Create_priv     Drop_priv       Reload_priv     Shutdown_priv   Process_priv    File_priv       Grant_priv      References_priv Index_priv      Alter_priv      Show_db_priv    Super_priv      Create_tmp_table_priv   Lock_tables_priv    Execute_priv     Repl_slave_priv Repl_client_priv        Create_view_priv        Show_view_priv  Create_routine_priv     Alter_routine_priv      Create_user_priv        Event_priv      Trigger_priv    Create_tablespace_priv  ssl_type        ssl_cipher      x509_issuer     x509_subject    max_questions   max_updates max_connections  max_user_connections    plugin  authentication_string   password_expired        password_last_changed   password_lifetime       account_locked
localhost       root    Y       Y       Y       Y       Y       Y       Y       Y       Y       Y       Y       Y       Y       Y       Y       Y       Y       Y       Y       Y       Y       Y       Y       Y       Y       Y       Y       Y       Y                                       0       0       0       0   mysql_native_password    *81F5E21E35407D884A6CD4A731AEBFB6AF209E1B       N       2016-08-04 18:26:57     NULL    N
%       bacula     N       N       N       N       N       N       N       N       N       N       N       N       N       N       N       N       N       N       N       N       N       N       N       N       N       N       N       N       N                                       0       0       0       0   mysql_native_password    *94BDCEBE19083CE2A1F959FD02F964C7AF4CFC29       N       2017-04-06 17:57:51     NULL    N
localhost       bacula     N       N       N       N       N       N       N       N       N       N       N       N       N       N       N       N       N       N       N       N       N       N       N       N       N       N       N       N       N                                       0       0       0   0mysql_native_password   *94BDCEBE19083CE2A1F959FD02F964C7AF4CFC29       N       2017-04-06 17:57:51     NULL    N
Privileges for user bacula granted on database bacula.

grant_mysql_privilegesをそのまま使うと、baculaユーザはパスワード無しです。
パスワードをちゃんと掛けたい場合は、MySQLで直接パスワード付けるか、grant_mysql_privileges内の「db_password=」にパスワードを入れてやってください。

#!/bin/sh
#
# shell script to grant privileges to the bacula database
#
# Copyright (C) 2000-2016 Kern Sibbald
# License: BSD 2-Clause; see file LICENSE-FOSS
#
db_user=${db_user:-bacula}
bindir=/usr/bin
db_name=${db_name:-bacula}
db_password=bacula_quick        #bacula_quickってパスワードを付けたい場合
if [ "$db_password" != "" ]; then
   pass="identified by '$db_password'"
fi

BacualのConfigの準備

  • 権限周りを適切なのに変更していきます。
[root@quick-dir ~]# chown -R root:root /etc/bacula
[root@quick-dir ~]# chmod 755 /etc/bacula
[root@quick-dir ~]# chmod 640 /etc/bacula/*
[root@quick-dir ~]# chgrp bacula /etc/bacula/bacula-dir.conf /etc/bacula/query.sql
  • config内のBacula間で使用するパスワードを一括で置換します。
[root@quick-dir ~]# sed -i -e 's/@@DIR_PASSWORD@@/dir-password/g' \
        -e 's/@@FD_PASSWORD@@/fd-password/g' \
        -e 's/@@SD_PASSWORD@@/sd-password/g' \
        -e 's/@@MON_DIR_PASSWORD@@/mon-dir-password/g' \
        -e 's/@@MON_FD_PASSWORD@@/mon-fd-password/g' \
        -e 's/@@MON_SD_PASSWORD@@/mon-sd-password/g' \
        /etc/bacula/*.conf
  • bconsoleを設定します。
[root@quick-dir ~]# cat /etc/bacula/bconsole.conf
Director {
  Name = quick-dir          # Director名
  DIRport = 9101            # Directorポート
  address = 10.0.0.1        # DirectorのIPアドレス
  Password = "dir-password" # Directorのパスワード
}
  • 記述に問題無いかConfigをコマンドで確認します。
[root@quick-dir ~]# bconsole -t -c /etc/bacula/bconsole.conf
[root@quick-dir ~]# bacula-dir -t -c /etc/bacula/bacula-dir.conf
  • 問題なけば再起動して、bconsoleでstatusを取れるか確認します。
[root@quick-dir ~]# /etc/init.d/bacula-dir restart
Stopping bacula-dir:                                       [  OK  ]
Starting bacula-dir:                                       [  OK  ]
[root@quick-dir ~]# echo status dir=quick-dir | bconsole
Connecting to Director localhost:9101
1000 OK: 102 bacula-dir Version: 7.4.4 (20 September 2016)
Enter a period to cancel a command.
status dir=quick-dir
bacula-dir Version: 7.4.4 (20 September 2016) x86_64-redhat-linux-gnu redhat
Daemon started 05-Apr-17 18:15, conf reloaded 05-Apr-2017 18:15:06
 Jobs: run=13, running=0 mode=0
 Heap: heap=385,024 smbytes=345,677 max_bytes=393,653 bufs=947 max_bufs=1,202

Scheduled Jobs:
Level          Type     Pri  Scheduled          Job Name           Volume
===================================================================================

bacula-dir(Bacula Director)の設定

弊社ではDirectorの設定やテンプレートと、バックアップ対象のクライアントでConfigファイルを分割させて記述しています。って言うのも、作成経験のある方は分かると思いますが、バックアップクライアントが多くなるとbacula-dir.confの行が無限に増えてってConfigの上に行ったり下に行ったり、、、メンテナンスが凄くやりにくいです。

/etc/bacula/bacula-dir.conf

基本的に下記を設定してしまえば、その後そんなに困らずにクライアントを追加できるようになるはずです。
ちょいちょい必要な事は修正してますが、ほとんどがデフォルトのままで使用しています。

[root@quick-dir ~]# cat /etc/bacula/bacula-dir.conf

########################################################################
#
# Director Information
#
########################################################################
Director {
  Name = quick-dir
  DIRport = 9101
  QueryFile = "/etc/bacula/query.sql"
  WorkingDirectory = "/var/spool/bacula"
  PidDirectory = "/var/run"
  Maximum Concurrent Jobs = 20
  Password = "dir-password"
  Messages = Daemon
}

########################################################################
#
# Job Template
#
########################################################################
JobDefs {
  Name = "DefaultJob"
  Type = Backup
  Level = Differential
  Client = localhost
  Schedule = "WeeklyCycle"
  Storage = backup-server
  Messages = Standard
  Pool = Default
  SpoolAttributes = yes
  Priority = 10
  Write Bootstrap = "/var/spool/bacula/%c.bsr"
}

########################################################################
#
# Schedule
#
########################################################################

Schedule {
  Name = "WeeklyCycle"
  Run = Full sun at 2:05
  Run = Differential mon-sat at 2:05
}

########################################################################
#
# bacula-sd Information
#
########################################################################
Storage {
  Name = quick-sd
  Address = 10.0.0.10
  SDPort = 9103
  Password = "sd-password"
  Device = FileChgr1
  Media Type = FileStorage
  Maximum Concurrent Jobs = 10
}

########################################################################
#
# Messages Information
#
########################################################################
Messages {
  Name = Standard
  mailcommand = "/usr/sbin/bsmtp -h localhost -f \"\(Bacula\) \<%r\>\" -s \"Bacula: %t %e of %c %l\" %r"
  operatorcommand = "/usr/sbin/bsmtp -h localhost -f \"\(Bacula\) \<%r\>\" -s \"Bacula: Intervention needed for %j\" %r"
  mail = root@localhost = all, !skipped
  operator = root@localhost = mount
  console = all, !skipped, !saved
  append = "/var/log/bacula/bacula.log" = all, !skipped
  catalog = all
}

#
# Message delivery for daemon messages (no job).
Messages {
  Name = Daemon
  mailcommand = "/usr/sbin/bsmtp -h localhost -f \"\(Bacula\) \<%r\>\" -s \"Bacula daemon message\" %r"
  mail = root@localhost = all, !skipped
  console = all, !skipped, !saved
  append = "/var/log/bacula/bacula.log" = all, !skipped
}

########################################################################
#
# Pool Template
#
########################################################################
Pool {
  Name = Default
  Pool Type = Backup
  Recycle = no
  AutoPrune = yes
  Volume Retention = 28 days
  Maximum Volume Jobs = 1
  Maximum Volumes = 100
  Label Format = "${Client}-${Level}Vol-${Year}-${Month:p/2/0/r}-${Day:p/2/0/r}_${JobId}"
}
Pool {
  Name = etc-Pool     # ※1
  Pool Type = Backup
  Recycle = no
  AutoPrune = yes
  Volume Retention = 1 days
  Maximum Volume Jobs = 1
  Maximum Volumes = 10
  Label Format = "${Client}-${Level}Vol-${Year}-${Month:p/2/0/r}-${Day:p/2/0/r}_${JobId}"
}

########################################################################
#
# Console Information
#
########################################################################
Console {
  Name = bacula-mon
  Password = "mon-dir-password"
  CommandACL = status, .status
}

########################################################################
#
# Catalog Information
#
########################################################################
Client {
  Name = localhost
  Address = localhost
  FDPort = 9102
  Catalog = MyCatalog
  Password = "fd-password"
  File Retention = 30 days
  Job Retention = 1 months
  AutoPrune = yes
}

Job {
  Name = "BackupCatalog"
  JobDefs = "DefaultJob"
  Level = Full
  FileSet="Catalog"
  Schedule = "WeeklyCycleAfterBackup"
  RunBeforeJob = "/usr/libexec/bacula/make_catalog_backup.pl MyCatalog"
  RunAfterJob  = "/usr/libexec/bacula/delete_catalog_backup"
  Write Bootstrap = "/var/spool/bacula/%n.bsr"
  Priority = 12     # ※2
}

Schedule {
  Name = "WeeklyCycleAfterBackup"
  Run = Full sun-sat at 2:10
}

FileSet {
  Name = "Catalog"
  Include {
    Options {
      signature = MD5
    }
    File = "/var/spool/bacula/bacula.sql"
  }
}

Catalog {
  Name = MyCatalog
  dbname = "bacula"; dbuser = "bacula"; dbpassword = "bacula_quick"
}

########################################################################
#
# Bacula Clients
#
########################################################################
@/etc/bacula/client/quick-fd.conf

※1【運用手順編】で説明しますが、空のバックアップJobのVolumeを保存する為にPoolを作成してます。
※2 デフォルトのPriorityは「11」ですが、【運用手順編】に出てくる空のバックアップJobの関係で「12」にしています。
※3 DR(disaster recovery)を目的としたクライアントです。

各バックアップクライアントのconfig

bacula-dir.confには外部ファイルとして読み込ませていますが、各クライアント毎にconfigを分けて運用するようにしました。 新しいバックアップクライアントを追加する場合、quick-fdを他のホスト名に一括置換すれば、すぐにクライアントが追加できるようになります。

[root@quick-dir ~]# cat /etc/bacula/client/quick-fd.conf

############################
# Job Information
############################
Job {
  Name = "quick-fd-job"
  Client = quick-fd
  JobDefs = "DefaultJob"
  FileSet= "quick-fd File Set"
  Full Backup Pool = quick-fd-Pool-Full    # FullとDiffでPoolを分けてます
  Differential Backup Pool = quick-fd-Pool
  ClientRunBeforeJob = "/var/spool/bacula/mysql_backup.sh"    # MySQLを使用してる想定で、
  ClientRunAfterJob = "/var/spool/bacula/mysql_backup_del.sh" # Before/Afterでスクリプトをセット
}

############################
# FileSet
############################
FileSet {
  Name = "quick-fd File Set"
  Include {
    Options {
      signature = MD5
      Compression = GZIP
    }
    Options {
      wildfile = "*.log"    # logやtmpをバックアップ対象から除外
      wilddir = "*/logs"
      wilddir = "*/tmp"
      exclude = yes
    }
    File = /var/www/quick-fd    # バックアップ対象
    File = /etc
    File = /var/spool/cron
    File = /var/spool/bacula
    Options {
      Compression = GZIP    # 上のOptionsでGZIPが効かなかったのでここでもセットしてます
    }
  }
}

############################
# quick-fd Information
############################
Client {
  Name = quick-fd
  Address = 10.0.0.2
  FDPort = 9102
  Catalog = MyCatalog
  Password = "fd-password"
  File Retention = 30 days
  Job Retention = 1 months
  AutoPrune = yes
}

############################
# Pool Information
############################
Pool {
  Name = quick-fd-Pool-Full
  Pool Type = Backup
  Recycle = no                # Volumeの再利用はさせないように
  AutoPrune = yes             # 保管期間が終わったらPurgedになるように
  Volume Retention = 28 days  # 保管期間を4週間に
  Maximum Volume Jobs = 1     # 1Volumeに1Jobしか入らないように
  Maximum Volumes = 100
  Label Format = "${Client}-${Level}Vol-${Year}-${Month:p/2/0/r}-${Day:p/2/0/r}_${JobId}"
  # ↑のフォーマットはパット見で分かりやすいようにしました。
  # 上記の例で動かすとボリューム名は↓のようになります。
  # Fullの場合:quick-fd-FullVol-2017-04-05_954
  # Diffの場合:quick-fd-DifferentialVol-2017-04-05_954
  # お尻に付けてるJobIDは、ボリューム名が被らないようにって理由で付けてます。
}

Pool {
  Name = quick-fd-Pool
  Pool Type = Backup
  Recycle = no
  AutoPrune = yes
  Volume Retention = 28 days
  Maximum Volume Jobs = 1
  Maximum Volumes = 100
  Label Format = "${Client}-${Level}Vol-${Year}-${Month:p/2/0/r}-${Day:p/2/0/r}_${JobId}"
}

とりあえずこれで、Director単体の設定は完了です。 次回は【構築手順編その2】 として、bacula-sd(Storage Daemon)とbacula-fd(Backup Client)の設定例と疎通確認方法を書きたいと思います。