Skip to content

Bacula 設定編① bacula-dir

2018/3/23

設定編① bacula-dir
今回はbacula-dirのみを対象とし、bacula-sd、bacula-fd、bconsoleは別途記載する。
環境については以下の通りとする。

環境

  • バックアップ対象サイズ:約1TB
  • FullBackup:毎月1回、最初の月曜日
  • DifferentialBackup(差分バックアップ):週1回、月曜日(FullBackup時は除く)
  • IncrementalBackup(増分バックアップ):毎日(Full,DiffBackup時は除く)
  • バックアップ実行時間は4:05とする。
  • Backup用Storageのサイズ:3TB
  • Backup用Storageは別のサーバからNFSマウントしている

フルバックアップが毎月1回実行しての2世代保存とする。
ただし1ヶ月前の状態まで戻せることを目標とする。
2世代としている理由としては、フルバックアップ処理時に失敗した時、前回分のフルバックアップデータを消さないために2世代保管としている。

bacula-dirの設定

バックアップ方式の設定は主に以下のファイルで行う。

/etc/bacula/bacula-dir.conf

各リソースについて、順に説明する。
リソースとは{}で囲まれた区画のことを指す。

バックアップ対象はowncloudが入ったファイルサーバとしている。
owncloudの名前が設定に出てくるが、バックアップ対象を識別する名前となっている。

Director

Director {
  Name = bacula-dir
  DIRport = 9101 
  QueryFile = "/etc/bacula/query.sql"
  WorkingDirectory = "/var/spool/bacula"
  PidDirectory = "/var/run"
  Maximum Concurrent Jobs = 20
  Password = "パスワード"
  Messages = Daemon
}

基本的にデフォルトの設定で良い。ただしパスワードを設定する必要がある。
bacula-dirのサービスで使用する通信ポートを変えたければDIRportを変更する。

Job

バックアップジョブの取りまとめを行っているのがこのリソース。

JobDefs で全Job共通のデフォルト設定を記載する。
Job の箇所にバックアップジョブごとの別々の設定を記載する。
Job での設定値はJobDefs に上書きされる。
こうすることで、Job に全部のパラメータの記載をする手間を省くことができるようになっている。

JobDefs {
  Name = "DefaultJob"
  Type = Backup
  Level = Incremental
  Client = bacula-fd
  FileSet = "Full Set"
  Schedule = "WeeklyCycle"
  Storage = File1
  Messages = Standard
  Pool = File1
  Write Bootstrap = "/var/spool/bacula/%c.bsr"
}

Job {
  Name = "owncloud"
  Type = Backup
  Client = owncloud
  FileSet = "owncloud"
  Schedule = "owncloudCycle"
  Storage = owncloud
  Messages = Standard
  Full Backup Pool = owncloud-Full
  Incremental Backup Pool = owncloud-Inc
  Differential Backup Pool = owncloud-Diff
  Pool = File1
  SpoolAttributes = yes
  Priority = 10
  Write Bootstrap = "/var/spool/bacula/%c.bsr"
}

Client,FileSet,Schedule,Storage 等のリソース設定が後に出てくるが、そこのName部分とこのJobリソースに記載しているNameを同じにする必要がある。
したがってNameはバックアップ対象で共通化しておいたほうがわかりやすい。
今回の例でいえばowncloud で共通化している。

リストアの設定もJobリソースにて行う。

Job {
  Name = "Restoreowncloud"
  Type = Restore
  Client=owncloud
  Storage = owncloud
  FileSet="owncloud"
  Full Backup Pool = owncloud-Full
  Incremental Backup Pool = owncloud-Inc
  Differential Backup Pool = owncloud-Diff
  Pool = File1
  Messages = Standard
  Where = /tmp/bacula-restores
}

Type = Restore はリストアの設定となる。

リストア操作はbconsoleで行う。(操作編に手順を記載)
Client,Storage,Pool等、バックアップJobと共通の設定を行う。
Where はリストアを行う先のパスの指定となる。
リストアを行った場合、クライアント上(上記の例だと/tmp/bacula-restores)にリストアされる。

FileSet

バックアップ対象を記載する。

FileSet {
  Name = "owncloud"
  Include {
    Options {
      signature = MD5
      compression = GZIP
    }
    File = /exstorage/owncloud
    File = /var/lib/pgsql/9.4/basebackup
    File = /var/lib/pgsql/9.4/wal
    File = /exstorage2/samba
  }
}
  • Name はJobリソースのFileSetと同じにする必要がある。
  • Include{} にて、バックアップファイルの指定を行う。
  • File = "バックアップ対象のパス"を書けば良い。

バックアップを除外したい場合はExclude{}の中に、File = "バックアップを除外したいパス"を書けば良い。

  • Optionsについてはバックアップ取得時の圧縮方式等を指定することができる。
    上記の例ではGZIP圧縮している。

Schedule

バックアップ実行スケジュールの設定。
NameはJobリソースで設定したものと同じものを設定する。
フル、差分、増分のバックアップ日程をここで設定できる。

Schedule {
  Name = "owncloudCycle"
  Run = Full 1st mon at 04:05
  Run = Differential 2nd-5th mon at 04:05
  Run = Incremental tue-sun at 04:05
}

上記の設定は以下の通り

  • Full 1st mon at 04:05
    • 毎月最初の月曜日4:05からバックアップ開始
    • フルバックアップ
  • Differential 2nd-5th mon at 04:05
    • 毎月2~5週目の月曜日、4:05からバックアップ開始
    • 差分バックアップ
  • Incremental tue-sun at 04:05
    • 毎週火曜日〜日曜日、4:05からバックアップ開始
    • 増分バックアップ

1st,2nd,3rd,4th,5thで毎月の何週目にやるかを指定できる。
sun,mon,tue,wed,thu,fri,sat で曜日が指定できる。

Client

バックアップ先情報を記載する。

Client {
  Name = owncloud
  Address = 192.168.1.10  # クライアントのIPアドレス
  FDPort = 9102
  Catalog = MyCatalog
  Password = "パスワード"
  File Retention = 35 days
  Job Retention = 6 months
  AutoPrune = yes   
}
  • NameはJobリソースと同じものを記載する必要がある。
  • Addressはクライアント(バックアップ対象サーバ)のIPアドレスを記載するか、名前解決できればホスト名、FQDNで良い。
  • Catalogはバックアップ実行情報等を記録するバックアップカタログを指定する設定。デフォルトで良い。
  • Passwordはパスワード。
  • File RetentionCatalogのデータベース保持期間であり、上記で35日間は保持する設定となっている。
  • Job Retentionはジョブの実行記録であり、上記だと6ヶ月前までのジョブ実行履歴が確認できる。
  • AutoPruneは保持期間を過ぎたものを自動的に削除す家の設定でyesだと削除される。Clientリソースの場合、Catalogの情報を自動削除、となる。

Storage

バックアップ保存先のストレージ設定を行う。

Storage {
  Name = owncloud
  Address = 192.168.1.5  # bacula-sdの入っているサーバのIPアドレス
  SDPort = 9103
  Password = "パスワード"
  Device = owncloud
  Media Type = File
  Maximum Concurrent Jobs = 10
}

NameはJobで記載したものと同一とする必要がある。

  • Addressの設定は注意。
    Addresslocalhostと指定してはならない。
    クライアント側から見たときの接続先をここに書く必要がある。
    (クライアントが接続先情報としてこの設定値を使うため)
    localhostと書いてしまうと、クライアントがサーバに接続しようとした時に、 接続先はlocalhost=クライアント自身となってしまい、バックアップデータを送ることができない。
    バックアップサーバのIPアドレスを記載するか、クライアントが名前解決できればホスト名等でも良い。
    なお、bacula-sdはbacula-dirのサーバとは分散できる。
    今回は同一サーバなため、バックアップサーバのIPアドレスとしている。

  • SDPortはbacula-sdのポート番号で9103。これはデフォルトのままで良い。

  • Deviceの設定はbacula-sd.confの設定に関わる。
    bacula-sd.confのDeviceリソースと名前を同一にする必要がある。
    bacula-sd.confの説明は別途行う。
  • Media TypeはFileとしている。HDD等のストレージ上(ファイルシステム上)にファイルを生成し、バックアップを行う。
    テープバックアップなどにも対応しており、その場合はTapeと記載する。

  • Maximum Concurrent Jobsはバックアップ処理の最大同時実行数となる。
    あまり同時に動かすものもないのでデフォルトで問題ない。

Pool

このPoolの設定がバックアップ世代の管理の肝となる。
PoolはStorage上に生成される。
なお、StorageリソースのDeviceでbacula-sd.confの設定を参照しており、 実際のファイル配置先はbacula-sd.confに記載することになる。(bacula-sd編で記載)

# owncloudがフルバックアップ時に使うPool
Pool {
  Name = owncloud-Full
  Pool Type = Backup
  Recycle = yes
  AutoPrune = yes
  Volume Retention = 1 months
  Label Format = "owncloud-Full-"
  Maximum Volume Bytes = 800G
  Maximum Volumes = 3
}

# owncloudが差分バックアップ時に使うPool
Pool {
  Name = owncloud-Diff
  Pool Type = Backup
  Recycle = yes
  AutoPrune = yes
  Volume Retention = 62 days
  Label Format = "owncloud-Diff-"
  Maximum Volume Bytes = 200G
  Maximum Volumes = 5
}

# owncloudが増分バックアップ時に使うPool
Pool {
  Name = owncloud-Inc
  Pool Type = Backup
  Recycle = yes
  AutoPrune = yes
  Volume Retention = 62 days
  Label Format = "owncloud-Inc-"
  Maximum Volume Bytes = 50G
  Maximum Volumes = 10
}
  • NameはJobのものと同一に設定する必要がある。

上記は3つのPoolをバックアップ方式ごとに分散している。
もちろん一つのPoolのみで済ませることもできる。
自身の場合、分けたほうが管理しやすいと考え分けることにした。

  • Recycle、AutoPruneは名前の通りリサイクルをする、自動削除をする設定となる。
    どちらもyesに設定されると、古いデータを削除してくれるようになる。
    その削除対象となるのはVolume Retentionで指定した日付を超えたものとなる。
  • Label Formatはバックアップ用のファイルを生成するときのファイルの命名ルールとなる。
    ファイル生成時、勝手に番号を追記してくれる。
  • Maximum Volume Bytesはバックアップ用ファイルの1ファイルの最大容量となる。
    1つファイルを生成し、そこにバックアップデータを追記していくのだが、この設定値を超えると新しいバックアップ用ファイルを生成する。
  • Maximum Volumesは最大何個のバックアップ用ファイルを生成するか、の設定となる。
    この値を超えると古いものが削除される。

上記の例でいえばowncloud-Fullについて、以下の通りとなる。

  • 1ヶ月を超えた古いバックアップ用ファイルは削除する
  • バックアップ用ファイルの1ファイルは最大800GBとする
  • バックアップ用ファイルは最大3つまで生成する

実際にバックアップを運用すると以下のようにファイルが生成される(2018/3/22時点)

合計 2.1T
-rw-r-----. 1 bacula tape  55G  3月 19 04:06 owncloud-Diff-0007
-rw-r-----. 1 bacula tape 800G  3月  5 12:03 owncloud-Full-0020
-rw-r-----. 1 bacula tape 425G  3月  5 17:36 owncloud-Full-0021
-rw-r-----. 1 bacula tape 800G  2月  5 12:58 owncloud-Full-0022
-rw-r-----. 1 bacula tape  15G  3月 22 04:05 owncloud-Inc-0005

フルバックアップを行うと1TB以上あるため、毎回800GBを超えて新しいファイルが生成される。
次回のフルバックアップ時(上記の例だと4月)、まずは800GBに達していない"owncloud-Full-0021"にデータを追記し、800GBを超えると保存期間を過ぎた"owncloud-Full-0022"を削除し、新しいバックアップ用ファイルを生成し、そこにバックアップを行っていく。
4月のバックアップでは3月バックアップデータを残しつつ2月のデータを削除する。
バックアップストレージサイズが3TBしかなかったため、このようにバックアップを回していくとうまく動かすことができた。

必要な設定は以上となる。

bacula-dir全体の設定例

最後にまるまる設定ファイルを貼り付けておく。

# パスワード以外はデフォルトのままで基本良い。
Director {
  Name = bacula-dir
  DIRport = 9101
  QueryFile = "/etc/bacula/query.sql"
  WorkingDirectory = "/var/spool/bacula"
  PidDirectory = "/var/run"
  Maximum Concurrent Jobs = 20
  Password = "パスワード"
  Messages = Daemon
}

# デフォルトのジョブ設定★
# 下記のJobリソースで設定を入れないものはこのDefsの設定が適用される
JobDefs {
  Name = "DefaultJob"
  Type = Backup
  Level = Incremental
  Client = bacula-fd
  FileSet = "Full Set"
  Schedule = "WeeklyCycle"
  Storage = File1
  Messages = Standard
  Pool = File1
  Write Bootstrap = "/var/spool/bacula/%c.bsr"
}

# ジョブごとのバックアップ設定★
# owncloudのバックアップ設定
# バックアップ対象ごとに設定する。
Job {
  Name = "owncloud"
  Type = Backup
  Client = owncloud
  FileSet = "owncloud"
  Schedule = "owncloudCycle"
  Storage = owncloud
  Messages = Standard
  Full Backup Pool = owncloud-Full
  Incremental Backup Pool = owncloud-Inc
  Differential Backup Pool = owncloud-Diff
  Pool = File1
  SpoolAttributes = yes
  Priority = 10
  Write Bootstrap = "/var/spool/bacula/%c.bsr"
}

# バックアップカタログのバックアップ。
# 基本デフォルトのままで良い
# バックアップカタログとは、バックアップの実行記録等を保存しているデータベース。
# リストア時にこちらも必要となる。
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 = 11
}

# リストアのための設定
# こちらは最初から記載されているもので変更する必要は特に無い
Job {
  Name = "RestoreFiles"
  Type = Restore
  Client=bacula-fd
  Storage = File1
  FileSet="Full Set"
  Pool = File1
  Messages = Standard
  Where = /tmp/bacula-restores
}

# owncloudのバックアップのリストア設定★
Job {
  Name = "Restoreowncloud"
  Type = Restore
  Client=owncloud
  Storage = owncloud
  FileSet="owncloud"
  Full Backup Pool = owncloud-Full
  Incremental Backup Pool = owncloud-Inc
  Differential Backup Pool = owncloud-Diff
  Pool = File1
  Messages = Standard
  Where = /tmp/bacula-restores
}

# バックアップ対象の指定
# こちらはデフォルトの設定
FileSet {
  Name = "Full Set"
  Include {
    Options {
      signature = MD5
    }
    File = /
  }
  Exclude {
    File = /var/spool/bacula
    File = /tmp
    File = /proc
    File = /sys
    File = /.journal
    File = /.fsck
  }
}

# owncloudのバックアップ対象の指定★
FileSet {
  Name = "owncloud"
  Include {
    Options {
      signature = MD5
      compression = GZIP
    }
    File = /exstorage/owncloud
    File = /var/lib/pgsql/9.4/basebackup
    File = /var/lib/pgsql/9.4/wal
    File = /exstorage2/samba
  }
}

# バックアップカタログのバックアップ対象の指定
FileSet {
  Name = "Catalog"
  Include {
    Options {
      signature = MD5
    }
    File = "/var/spool/bacula/bacula.sql"
  }
}

# ジョブ実行スケジュール
Schedule {
  Name = "WeeklyCycle"
  Run = Full 1st sun at 23:05
  Run = Differential 2nd-5th sun at 23:05
  Run = Incremental mon-sat at 23:05
}

# owncloudのバックアップジョブの実行スケジュール★
Schedule {
  Name = "owncloudCycle"
  Run = Full 1st mon at 04:05
  Run = Differential 2nd-5th mon at 04:05
  Run = Incremental tue-sat at 04:05
}

# バックアップカタログのバックアップのジョブ実行スケジュール
Schedule {
  Name = "WeeklyCycleAfterBackup"
  Run = Full sun-sat at 23:10
}

# バックアップ先の設定
# サーバ自身のバックアップカタログのバックアップも行うので
# こちらはサーバ自身の接続先の設定となる。基本デフォルトで良い。
Client {
  Name = bacula-fd
  Address = localhost
  FDPort = 9102
  Catalog = MyCatalog
  Password = "パスワード"
  File Retention = 60 days
  Job Retention = 6 months
  AutoPrune = yes
}

# owncloudのバックアップ先情報★
Client {
  Name = owncloud
  Address = 192.168.1.10 # クライアントのIPアドレス
  FDPort = 9102
  Catalog = MyCatalog
  Password = "パスワード"
  File Retention = 30 days
  Job Retention = 6 months
  AutoPrune = yes   
}

# bacula-sdの動いているサーバの情報
# 今回はbacula-dirとbacula-sdは同じサーバとなる。
# Addressにlocalhostを指定してはならない(ここポイント)
Storage {
  Name = File1
  Address = 192.168.1.5 # bacula-sdの動いているサーバのIPアドレス
  SDPort = 9103
  Password = "パスワード"
  Device = File1
  Media Type = File
  Maximum Concurrent Jobs = 10
}

# owncloudのジョブのストレージ情報★
Storage {
  Name = owncloud
  Address = 192.168.1.5 #bacula-sdの入っているサーバのIPアドレス
  SDPort = 9103
  Password = "パスワード"
  Device = owncloud
  Media Type = File
  Maximum Concurrent Jobs = 10
}

# カタログに関する情報。デフォルトのままで良い。
Catalog {
  Name = MyCatalog
  dbname = "bacula"; dbuser = "bacula"; dbpassword = "パスワード"
}

# ログ出力先に関する設定。基本デフォルトのままで良い。
# ログ出力先を変えたり、メール送信設定を変えるならここ。
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
}

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情報。
# バックアップ世代管理等はこちらに設定する
# 今回だとDefaultのPoolは使用していないが、
# こちらの設定は消さずに残してある。(特に理由はない)
Pool {
  Name = Default
  Pool Type = Backup
  Recycle = yes
  AutoPrune = yes
  Volume Retention = 365 days
  Maximum Volume Bytes = 50G
  Maximum Volumes = 100
}

# バックアップカタログが使用しているPool
Pool {
  Name = File1
  Pool Type = Backup
  Recycle = yes
  AutoPrune = yes
  Volume Retention = 365 days
  Maximum Volume Bytes = 50G
  Maximum Volumes = 10
  Label Format = "Vol-"
}

# owncloudが使用しているPool★
# こちらはFullBackupが使用
# Full,Diff,IncでPoolを分ける必要もないが、理由あって分けている(後述)
# こちらのほうがPool管理しやすいので個人的には分けたほうがいいと考えている。
Pool {
  Name = owncloud-Full
  Pool Type = Backup
  Recycle = yes
  AutoPrune = yes
  Volume Retention = 1 months
  Label Format = "owncloud-Full-"
  Maximum Volume Bytes = 800G
  Maximum Volumes = 3
}

# owncloudが差分バックアップ時に使うPool★
Pool {
  Name = owncloud-Diff
  Pool Type = Backup
  Recycle = yes
  AutoPrune = yes
  Volume Retention = 62 days
  Label Format = "owncloud-Diff-"
  Maximum Volume Bytes = 200G
  Maximum Volumes = 5
}

# owncloudが増分バックアップ時に使うPool★
Pool {
  Name = owncloud-Inc
  Pool Type = Backup
  Recycle = yes
  AutoPrune = yes
  Volume Retention = 62 days
  Label Format = "owncloud-Inc-"
  Maximum Volume Bytes = 50G
  Maximum Volumes = 10
}

# デフォルトのままで良い設定
Pool {
  Name = Scratch
  Pool Type = Backup
}

# Consoleに関する設定と思われるが、パスワードを設定する以外は
# デフォルトのままで良い。
Console {
  Name = bacula-mon
  Password = "パスワード"
  CommandACL = status, .status
}