Backupオープンソースソフトウェア Bacula 設定編

オープンソースソフトウェアのBaculaを設定

前回、インストールしたBaculaの設定を行っていきます。設定後には簡単なバックアップとリストアの確認まで実施します。

設定は公式サイトの情報を参考にして実施しています。
https://www.bacula.jp/server-setting

バックアップの基本

前回、バックアップの考え方は多くのソフトウェアで同じようなものであると書きました。製品が違ってもバックアップ方法(種類)の基本的な考え方はほぼ同じです。基本的なバックアップは次の3種類があります。

フルバックアップ

フルバックアップは、その言葉通りの動きで、バックアップ対象としているデータの全てをバックアップします。
例えば、/homeをバックアップ対象とした場合、/home以下にある全てのデータをバックアップします。/homeのデータサイズが100GBだとしたら、毎回100GBのデータがバックアップされることになります。
また、/home以下には日々データが10GB増加していくならば、次のようになります。

バックアップデータサイズ
1日目 100GB
2日目 110GB
3日目 120GB
4日目 130GB
5日目 140GB
6日目 150GB
7日目 160GB

上記のように日々増加していくことになります。何日間のデータを保存しておくかによりますが、上記の例で1週間分のバックアップデートを保存しておくのであれば、910GBのバックアップデータを保存するためのストレージ容量が必要になります。この方法のメリットは、復元(以下リストア)する際の対象データがどのバックアップデータにあるかが判り易く、ディスク破損などで全てデータをリストアする場合、いつのデータをリストアするのかを決めれば1回で済むため、手順が簡単であるということになります。

差分バックアップ

差分バックアップは、フルバックアップ後に作成されたデータをバックアップします。
前項のバックアップイメージをサンプルにすると次のようになります。

バックアップデータサイズ
1日目 100GB
2日目 10GB
3日目 20GB
4日目 30GB
5日目 40GB
6日目 50GB
7日目 60GB

毎回、対象データ全てをバックアップするフルバックアップとの違いは、フルバックアップをからフルバックアップまでの間の期間は、フルバックアップを起点として、増えたデータ(例では日々10GB増加する)をバックアップします。フルバックアップ以降の日々増加するデータをバックアップ対象とするため、2日目は10GB、3日目は20GB、4日目30GBのようにバックアップデータが増加していきます。しかし、毎回フルバックアップを行うよりもバックアップ時間と必要なバックアップデータ保存用のストレージサイズは少なく済みます。
また、データのリストアは、フルバックアップのデータを戻した後に、戻したい日のデータを使用してリストアすることで復旧できます。

増分バックアップ

増分バックアップは、フルバックアップ後に作成されたデータをバックアップします。差分バックアップとの違いは、日々増えたデータのみをバックアップすることになります。
バックアップイメージをサンプルにすると次のようになります。

バックアップデータサイズ
1日目 100GB
2日目 10GB
3日目 10GB
4日目 10GB
5日目 10GB
6日目 10GB
7日目 10GB

バックアップされるデータは、日々増加する10GB分のみです。従ってバックアップに掛かる時間と必要なバックアップデータ保存用のストレージサイズは差分バックアップよりも、更に少なく済みます。
リストア手順は、フルバックアップデータを戻した後に、戻したい日までのバックアップをリストアしなくてはならないため、リストア手順が複雑、もしくは何度もリストアを実行するて工数が増えることになります。

差分と増分のサンプルは簡単に日々10GB増加するとしていますが、バックアップの対象となるのは新しく作成されたデータと更新されたデータが対象になるという点は覚えておいた方がいいでしょう。

Baculaサーバの構成

Baculaサーバの主要なコンポーネントは以下の3つです。

  • ディレクターデーモン
    Bacula全体の動作を制御するメインコンポーネントで履歴を管理する内部データベースが含まれる
  • ストレージデーモン
    バックアップデータの保存先を管理する
  • ファイルデーモン
    バックアップ対象のサーバやPCで動作して、データの読み出しを管理する
    リストア時にはデータの読み込むや書き込みを行う

これらのデーモンは分散されていても同じサーバ上にあってもいいです。ファイルデーモンのみバックアップ対象のサーバ、PCで動作が必要です。

firewallの設定追加

7の場合は、firewallの設定を追加しておきます。

# firewall-cmd --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: enp0s3
  sources: 
  services: dhcpv6-client ssh http https
  ports: 
  protocols: 
  masquerade: no
  forward-ports: 
  source-ports: 
  icmp-blocks: 
  rich rules: 
    
# firewall-cmd --add-service= --zone=public --permanent
success

# firewall-cmd --reload
success

# firewall-cmd --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: enp0s3
  sources: 
  services: dhcpv6-client ssh http https 
  ports: 
  protocols: 
  masquerade: no
  forward-ports: 
  source-ports: 
  icmp-blocks: 
  rich rules: 

Baculaサーバの設定

Baculaサーバの設定は次のファイルに対して実施します。

  • /etc/bacula/bacula-dir.conf
  • /etc/bacula/bacula-fd.conf
  • /etc/bacula/bacula-sd.conf
  • /etc/bacula/bconsole.conf

/etc/bacula以下には次のファイルが存在していました。

# ls -l /etc/bacula/
合計 36
-rw-r----- 1 root bacula 9178  3月  4 19:16 bacula-dir.conf
-rw-r----- 1 root root   1067  1月 29 21:38 bacula-fd.conf
-rw-r----- 1 root root   9814  1月 29 21:38 bacula-sd.conf
-rw-r----- 1 root root    249  1月 29 21:38 bconsole.conf
-rw-r----- 1 root bacula  312  1月 29 21:38 query.sql

/etc/bacula/bacula-dir.conf

Baculaのバックアップはディレクターデーモンが制御します。bacula-dir.confには使用するすべてのリソース情報が記載されています。記述はリソース単位に分かれています。リソースは xxxx { } の間に記述されています。また、デフォルトの設定がすでに記述されています。

# vi /etc/bacula/bacula-dir.conf 

以下に記述しているのは記述例です。

Directorリソース

ここではディレクトリやコンソールパスワードなどを設定しています。Password 以外の箇所はデフォルトで進めます。PasswordはDirectorと通信するためのパスワードなので、環境に合わせて設定します。

Director {                            # define myself
  Name = bacula-dir
  DIRport = 9101                # where we listen for UA connections
  QueryFile = "/etc/bacula/query.sql"
  WorkingDirectory = "/var/spool/bacula"
  PidDirectory = "/var/run"
  Maximum Concurrent Jobs = 20
  Password = "Password"         # Console password
  Messages = Daemon
}

JobDefsリソース

JobDefsリソースはJobリソースのテンプレートとなるデフォルト値を定義するリソースで設定は必須ではないようです。

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

Jobリソース

、およびリストアのジョブを定義します。各ジョブに関係するクライアント、ファイルセット、スケジュールリリースを結びつけます。バックアップ対象サーバやPCごとに異なる名前のジョブを定義することが一般的でしょうか。
デフォルトで記載されているものを流用して作成することがいいかと思います。Levelの記述でフルバックアップ、差分バックアップ、増分バックアップを定義します。

# backup jo for centos7-101
Job {
  Name = "BackupCentOS7-101"
  Type = Backup
  Level = Full
  Client = bacula-fd
  FileSet = "FullBK"
  Storage = File1
  Messages = Standard
  Pool = File
  Priority = 10
}

Filesetリソース

どのディレクトリをバックアップ対象にするのか?などを設定します。個々のジョブはどれか1つだけを参照します。
下記は例です。

# List of files to be backup
FileSet {
  Name = "FullBK"
  Include {
    Options {
     signature = MD5
    }
  File = /home
}

Clientリソース

バックアップ対象となるクライアントを定義します。Password 以外の箇所はデフォルトで進めています。PasswordはDirectorリソースで設定しているものを入力します。

# Client (File Services) to backup
Client {
  Name = bacula-fd
  Address = localhost
  FDPort = 9102
  Catalog = MyCatalog
  Password = "Password"               # password for FileDaemon
  File Retention = 60 days            # 60 days
  Job Retention = 6 months            # six months
  AutoPrune = yes                     # Prune expired Jobs/Files
}

Storageリソース

ボリュームをどの物理デバイスにマウントするかを定義します。任意の数のストレージを定義できます。
仮想デバイスをマウントして使用します。Storageリソースと書いていますがリソース名がAutochangerになっています。

Autochanger {
  Name = File1
# Do not use "localhost" here
  Address = 192.168.0.101             # N.B. Use a fully qualified name here
  SDPort = 9103
  Password = "mampv056"
  Device = FileChgr1
  Media Type = File1
  Maximum Concurrent Jobs = 10        # run up to 10 jobs a the same time
  Autochanger = File1                 # point to ourself
}

Catalogリソース

バックアップしたファイルのリストやバックアップ先ボリュームなどの情報を格納するデータベースを定義します。
dbpassword = “”には、MySQLで設定したbaculaユーザのパスワードを記述します。

# Generic catalog service
Catalog {
  Name = MyCatalog
  dbname = "bacula"; dbuser = "bacula"; dbpassword = "dbpassword"
}

Consoleリソース

コンソールへのアクセス用設定を定義します。Password 以外の箇所はデフォルトで進めています。PasswordはDirectorリソースで設定しているものを入力します。

Console {
  Name = bacula-mon
  Password = "Passsword"
  CommandACL = status, .status
}

/etc/bacula/bacula-sd.conf

bacula-sd.confの設定をbacula-dir.confに合わせて編集します。

# vi /etc/bacula/bacula-sd.conf 

次の箇所を変更します。Password 以外の箇所はデフォルトで進めています。PasswordはDirectorリソースで設定しているものを入力します。

#
# List Directors who are permitted to contact Storage daemon
#
Director {
  Name = bacula-dir
  Password = "Password"
}

#
# Restricted Director, used by tray-monitor to get the
#   status of the storage daemon
#
Director {
  Name = bacula-mon
  Password = "Password"
  Monitor = yes
}

/etc/bacula/bacula-fd.conf

bacula-fd.confの設定をbacula-dir.confに合わせて編集します。

# vi /etc/bacula/bacula-fd.conf

次の箇所を変更します。Password 以外の箇所はデフォルトで進めています。PasswordはDirectorリソースで設定しているものを入力します。

# List Directors who are permitted to contact this File daemon
#
Director {
  Name = bacula-dir
  Password = "Password"
}

#
# Restricted Director, used by tray-monitor to get the
#   status of the file daemon
#
Director {
  Name = bacula-mon
  Password = "Password"
  Monitor = yes
}

/etc/bacula/bconsole.conf

bconsole.confの設定をbacula-dir.confに合わせて編集します。

# vi /etc/bacula/bconsole.conf

次の箇所を変更します。Password 以外の箇所はデフォルトで進めています。PasswordはDirectorリソースで設定しているものを入力します。

Director {
  Name = bacula-dir
  DIRport = 9101
  address = localhost
  Password = "@@DIR_PASSWORD@@"
}

今回の設定は必要最低限の設定のみを実施しています。またPasswordは判り易く、同じPasswordを使用しています。

バックアップを実行してみましょう

ほぼデフォルトで設定を行いました。確認を含め、バックアップを実行してみましょう。
今回のバックアップはlocalhostの/homeをバックアップする設定です。

  1. Baculaサービスを起動します
  2. # systemctl start bacula-dir
    # systemctl start bacula-sd
    # systemctl start bacula-fd
    # systemctl status bacula-dir
    ● bacula-dir.service - Bacula-Director, the Backup-server
       Loaded: loaded (/usr/lib/systemd/system/bacula-dir.service; disabled; vendor preset: disabled)
       Active: active (running) since 日 2018-03-11 16:56:43 JST; 32s ago
         Docs: man:bacula-dir(8)
     Main PID: 1847 (bacula-dir)
       CGroup: /system.slice/bacula-dir.service
               └─1847 /usr/sbin/bacula-dir -f -c /etc/bacula/bacula-dir.conf -u bacula -g bacula
    
     3月 11 16:56:43 centos7-101 systemd[1]: Started Bacula-Director, the Backup-server.
     3月 11 16:56:43 centos7-101 systemd[1]: Starting Bacula-Director, the Backup-server...
    # systemctl status bacula-sd
    ● bacula-sd.service - Bacula-StorageDaemon, the storage-server
       Loaded: loaded (/usr/lib/systemd/system/bacula-sd.service; disabled; vendor preset: disabled)
       Active: active (running) since 日 2018-03-11 16:57:06 JST; 17s ago
         Docs: man:bacula-sd(8)
     Main PID: 1856 (bacula-sd)
       CGroup: /system.slice/bacula-sd.service
               └─1856 /usr/sbin/bacula-sd -f -c /etc/bacula/bacula-sd.conf -u bacula -g tape
    
     3月 11 16:57:06 centos7-101 systemd[1]: Started Bacula-StorageDaemon, the storage-server.
     3月 11 16:57:06 centos7-101 systemd[1]: Starting Bacula-StorageDaemon, the storage-server...
    # systemctl status bacula-fd
    ● bacula-fd.service - Bacula-FileDaemon, a Backup-client
       Loaded: loaded (/usr/lib/systemd/system/bacula-fd.service; disabled; vendor preset: disabled)
       Active: active (running) since 日 2018-03-11 16:57:09 JST; 20s ago
         Docs: man:bacula-fd(8)
     Main PID: 1865 (bacula-fd)
       CGroup: /system.slice/bacula-fd.service
               └─1865 /usr/sbin/bacula-fd -f -c /etc/bacula/bacula-fd.conf -u root -g root
    
     3月 11 16:57:09 centos7-101 systemd[1]: Started Bacula-FileDaemon, a Backup-client.
     3月 11 16:57:09 centos7-101 systemd[1]: Starting Bacula-FileDaemon, a Backup-client...
    
  3. コンソールを起動します
  4. # bconsole
    Connecting to Director localhost:9101
    1000 OK: 103 bacula-dir Version: 9.0.6 (20 November 2017)
    Enter a period to cancel a command.
    *
    
  5. バックアップを実行します
    runと入力します
  6. *run
    
  7. 実行可能なjobがリストされるのでリストから実行するjob番号を入力して[Enter]キーを押します
    ここでは1番のBackupCentOS7-101を実行します
    表示されているのがJobリソースで設定したものです
  8. *run
    Automatically selected Catalog: MyCatalog
    Using Catalog "MyCatalog"
    A job name must be specified.
    The defined Job resources are:
         1: BackupCentOS7-101
         2: BackupClient1
         3: BackupCatalog
         4: RestoreFiles
    Select Job resource (1-4): 1
    
  9. バックアップが実行されます
  10. Run Backup job
    JobName:  BackupCentOS7-101
    Level:    Full
    Client:   bacula-fd
    FileSet:  FullBK
    Pool:     File (From Job resource)
    Storage:  File1 (From Job resource)
    When:     2018-03-11 16:59:36
    Priority: 10
    OK to run? (yes/mod/no): yes
    Job queued. JobId=1
    
  11. バックアップの状態を確認するにはstatusと入力して、表示されるリストから1を入力します
    このバックアップは小さいデータなので、この時点で完了しています
    Terminated Jobsでに表示されるジョブが完了しているジョブです
  12. *status
    Status available for:
         1: Director
         2: Storage
         3: Client
         4: Scheduled
         5: Network
         6: All
    Select daemon type for status (1-6): 1
    bacula-dir Version: 9.0.6 (20 November 2017) x86_64-redhat--gnu redhat (Core)
    Daemon started 11- 3?2018 16:56, conf reloaded 11- 3月-2018 16:56:43
     Jobs: run=1, running=0 mode=0,0
     Heap: heap=270,336 smbytes=106,164 max_bytes=134,516 bufs=333 max_bufs=366
     Res: njobs=4 nclients=1 nstores=2 npools=3 ncats=1 nfsets=3 nscheds=2
    
    Scheduled Jobs:
    Level          Type     Pri  Scheduled          Job Name           Volume
    ===================================================================================
    Differential   Backup    10  11- 3?2018 23:05  BackupClient1      Vol-0001
    Full           Backup    11  11- 3?2018 23:10  BackupCatalog      Vol-0001
    ====
    
    Running Jobs:
    Console connected at 11- 3?2018 16:58
    No Jobs running.
    ====
    
    Terminated Jobs:
     JobId  Level      Files    Bytes   Status   Finished        Name 
    ====================================================================
         1  Full           5       442   OK       11- 3?2018 16:59 BackupCentOS7-101
    
    ====
    You have messages.
    
    
  13. バックアップファイルを確認します
    list files jobid=ジョブIDを入力します
  14. *list files jobid=1
    Using Catalog "MyCatalog"
    +----------+
    | Filename |
    +----------+
    | /home/frevouser/.bash_logout |
    | /home/frevouser/.bash_profile |
    | /home/frevouser/.bashrc |
    | /home/frevouser/ |
    | /home/   |
    +----------+
    +-------+-------------------+---------------------+------+-------+----------+----------+-----------+
    | JobId | Name              | StartTime           | Type | Level | JobFiles | JobBytes | JobStatus |
    +-------+-------------------+---------------------+------+-------+----------+----------+-----------+
    |     1 | BackupCentOS7-101 | 2018-03-11 16:59:51 | B    | F     |        5 |      442 | T         |
    +-------+-------------------+---------------------+------+-------+----------+----------+-----------+
    *
    
  15. quitでコンソールを終了できます

バックアップしたデータがリストアできるかを確認してみましょう

バックアップしたデータがリストアできるかの確認をしてみます。

  1. コンソールを起動します
  2. # bconsole
    Connecting to Director localhost:9101
    1000 OK: 103 bacula-dir Version: 9.0.6 (20 November 2017)
    Enter a period to cancel a command.
    *
    
  3. restoreコマンドを実行します
    表示される選択で1を入力して直近20件の履歴を表示します
  4. *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: Select full restore to a specified Job date
        13: Cancel
    Select item:  (1-13): 1
    +-------+-----------+---------------------+----------+----------+----------+
    | JobId | Client    | StartTime           | JobLevel | JobFiles | JobBytes |
    +-------+-----------+---------------------+----------+----------+----------+
    | 1     | bacula-fd | 2018-03-11 16:59:51 | F        | 5        | 442      |
    +-------+-----------+---------------------+----------+----------+----------+
    
  5. 3を選択してJobIDを入力します
  6. 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: Select full restore to a specified Job date
        13: Cancel
    Select item:  (1-13): 3
    Enter JobId(s), comma separated, to restore: 1
    You have selected the following JobId: 1
    
    Building directory tree for JobId(s) 1 ...  
    3 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.
    
  7. lsコマンドでバックアップデータの中身をリストします
    今回は1つのディレクトリしかないので見た目が悪く申し訳ありません。
    この状態ではcdでバックアップデータの中に進むことができます
  8. $ ls
    home/
    $ cd home/
    cwd is: /home/
    $ ls
    frevouser/
    
  9. ここでは全てのデータをリストアするでaddコマンドに*を付けて実行します
  10. $ add *
    4 files marked.
    
  11. 選択が完了したらdoneコマンドを実行します
    実行の可否にyesを入力します
  12. $ done
    Bootstrap records written to /var/spool/bacula/bacula-dir.restore.1.bsr
    
    The Job will require the following (*=>InChanger):
       Volume(s)                 Storage(s)                SD Device(s)
    ===========================================================================
       
        Vol-0001                  File1                     FileChgr1                
    
    Volumes marked with "*" are in the Autochanger.
    
    
    5 files selected to be restored.
    
    Automatically selected Client: bacula-fd
    Using Catalog "MyCatalog"
    Run Restore job
    JobName:         RestoreFiles
    Bootstrap:       /var/spool/bacula/bacula-dir.restore.1.bsr
    Where:           /tmp/bacula-restores
    Replace:         Always
    FileSet:         Full Set
    Backup Client:   bacula-fd
    Restore Client:  bacula-fd
    Storage:         File1
    When:            2018-03-11 17:26:43
    Catalog:         MyCatalog
    Priority:        10
    Plugin Options:  *None*
    OK to run? (yes/mod/no): yes
    Job queued. JobId=2
    You have messages.
    
  13. statusコマンドで状態を確認します
    バックアップと同様にTerminated Jobsにジョブが完了していれば終了です
  14. *status
    Status available for:
         1: Director
         2: Storage
         3: Client
         4: Scheduled
         5: Network
         6: All
    Select daemon type for status (1-6): 1
    bacula-dir Version: 9.0.6 (20 November 2017) x86_64-redhat-linux-gnu redhat (Core)
    Daemon started 11- 3?2018 16:56, conf reloaded 11- 3月-2018 16:56:43
     Jobs: run=2, running=0 mode=0,0
     Heap: heap=204,800 smbytes=108,080 max_bytes=1,252,958 bufs=346 max_bufs=373
     Res: njobs=4 nclients=1 nstores=2 npools=3 ncats=1 nfsets=3 nscheds=2
    
    Scheduled Jobs:
    Level          Type     Pri  Scheduled          Job Name           Volume
    ===================================================================================
    Differential   Backup    10  11- 3?2018 23:05  BackupClient1      Vol-0001
    Full           Backup    11  11- 3?2018 23:10  BackupCatalog      Vol-0001
    ====
    
    Running Jobs:
    Console connected at 11- 3?2018 17:17
    No Jobs running.
    ====
    
    Terminated Jobs:
     JobId  Level      Files    Bytes   Status   Finished        Name 
    ====================================================================
         1  Full           5       442   OK       11- 3?2018 16:59 BackupCentOS7-101
         2  Restore        5       442   OK       11- 3?2018 17:27 RestoreFiles
    
    ====
    

この後は実際にデータが復元されているかを確認します。

ここまでで、Baculaの設定とバックアップ、リストアの確認を完了しました。