CentOS7でBaculaを構築した話

最近Baculaというミドルウェアを構築することがあり、備忘録も兼ねて記事を投稿することにしました。

##構築環境##
バックアップサーバー:CentOS Linux release 7.2.1511 (Core)
バックアップ対象サーバー:WindowsServer2016
ミドルウェア:bacula-9.6.6


##Baculaインストール##
始めにOSのアップデートを行います。
（一度アップデートせずにインストールを行ったところ古いバージョンがインストールされてしまったので念のため行っています）

```
yum update
```

続いてcdコマンドで/etc/yum.repos.d/に移動し、リポジトリの追加を行います。

```
wget https://copr.fedorainfracloud.org/coprs/slaanesh/Bacula/repo/epel-7/slaanesh-Bacula-epel-7.repo
```

baculaをインストールします。baculaには3つのデーモンがあるのでこれらのインストール及びコンソールとDBのインストールを行います。
ざっくりとしたデーモンの構成を下図に貼っておくので参考にしてみてください。

<img width="500" alt="bacula_daemon構成.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/948786/27fa8a45-ccd7-5629-c823-691b66c4a6a8.png">

```
yum -y install bacula-deirector bacula-client bacula-storage bacula-console mariadb-server
```

インストール後は念のためrpmコマンドで適切なバージョンがインストールされているのか確認しておくと良いです。

```
rpm -qa | grep bacula
bacula-director-9.6.6-1.e17.x86_64
bacula-libs-9.6.6-1.e17.x86_64
bacula-libs-sql-9.6.6-1.e17.x86_64
bacula-storage-9.6.6-1.e17.x86_64
bacula-console-9.6.6-1.e17.x86_64
bacula-common-9.6.6-1.e17.x86_64
bacula-client-9.6.6-1.e17.x86_64
```
##MariaDBの設定##
MariaDBを起動し、初期化を行います。

```
systemctl start mariadb
mysql_secure_installation
```

初期化を行うとパスワードの設定について聞かれるので「y」を押して、パスワードを設定します。

```
Set root password? [Y/n] y
New passwprd:任意のパスワード(今回はdbpass)
```

パスワード設定後にもいくつか聞かれますが基本的に「y」を押してもらって大丈夫です。

MariaDBにログインしします。ログインの際にパスワードを聞かれるので設定したパスワード(dbpass)を入力します。

```
mysql -u root p
```

bacula用のDBとユーザーを作成します。ユーザーの権限について今回は【with grant option】を付与しています。今回の記事では紹介しませんが、baculaにはGUIコンソールとしてbaculumというものがあり、baculumとMariaDBをAPI連携させるときにこの権限が必要となるためです。作成後は「quit」でログアウトしておきます。

```
create database bacula;
grant all privileges on bacula.* to bacula@localhost identified by 'dbpass' WITH GRANT OPTION;
quit
```

続いてbaculaが使用するDBを変更します。デフォルトではPostgreSQLが選択されているため「1」を入力しMysqlに変更します。

```
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
```

##Baculaの権限変更##
Baculaの設定ファイルを編集する前にファイルの権限を変更しておきます。
権限を適切に付与していないとbconsoleから接続できなくなります。

```
ls -l /etc/bacula
合計 36
-rw-rw-rw- 1 root bacula 10190 11月 19 15:34 bacula-dir.conf
-rw-rw-rw- 1 root root    1055 11月 19 10:57 bacula-fd.conf
-rw-rw-rw- 1 root root    9818 11月 19 10:52 bacula-sd.conf
-rw-rw-rw- 1 root root     243 11月 19 11:41 bconsole.conf
-rw-r----- 1 root bacula   312 10月  7 23:42 query.sql

chmod 755 /etc/bacula
chmod 640 /etc/bacula/*
```


##bacula-dir.confの設定##
続いてbacula構築がうまくいかない原因No.1のbacula-dir.confの設定を行います。ここでは各パスワードと名前がどのように他デーモンと連携しているのか理解しておくと構築がスムーズに進むと思います。こちらもざっくりとした関係図を載せておきます。
<img width="500" alt="bacula構成図(Qiita用).png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/948786/b1e0667a-3b41-7956-0170-d93fc62e101c.png">

viエディタでbacula-dir.confを開きます。今回の記事では変更が必要な項目のみ説明をしていくので、説明がない項目については基本的には触る必要はないです。パスワードについては上図のように設定をするので割愛します。

まずはJobのひな型となる**JobDefs**リソースについてです。
ここではコンソールからジョブを選択する際ににデフォルトで選択されている値を設定することができます。
**各値について**
 <dd>**Level**：Full/ Differential / Incrementalから選びます。
**FileSet**：バックアップ対象となるディレクトリを指定します。詳細は後述。
**Schedule**：バックアップスケジュールを設定できます。詳細は後述。
**Storage**：使用するストレージを設定できます。後述のAutochangerリソースのNameと一致させる必要があります。</dd>

```
JobDefs {
  Name = "DefaultJob"
  Type = Backup
  Level = Full
  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**リソースについてです。バックアップ対象機の台数分作成する必要があります。
**各値について**
 <dd>**Name**：バックアップ対象の区別がつきやすいような名前にすると操作ミスを減らすことができます。
**Client**：後述のClientリソースと同じ名前にします。
**Jobdefs**：使用するJobのひな型を設定します。</dd>

```
Job {
  Name = "WinSV2016"
  Client = bacula-fd
  JobDefs = "DefaultJob"
}
```

続いてFileSetリソースを確認します。
こちらはバックアップ対象となるディレクトリを指定するリソースです。
**各値について**
 <dd>**Options**：ここに「Compression=GZIP」を追加すると圧縮されて保存されるので効率的にディスクを使うことができます。
**File**：ここに入力したディレクトリがバックアップ対象となります。複数個指定することも可能です。Windowsの場合でも「￥」ではなく「/」を使用します。
**Exclude**：今回は入力していませんが、Excludeに入力したファイルはバックアップ対象から外すことができます。</dd>

```
# List of files to be backed up
FileSet {
  Name = "Full Set"
  Include {
    Options {
      signature = MD5
      Compression=GZIP
    }
    File = "C:/Users/bk"
  }

#
# If you backup the root directory, the following two excluded
#   files can be useful
#
  Exclude {
  }
}
```

続いて**Schedule**リソースをみていきます。こちらは自動でバックアップを行う際のスケジュールを設定できるリソースです。
今回は月曜日から日曜日の18時30分にバックアップをとるように設定しています。
隔週や曜日指定も可能ですので必要に応じて値を変更してみてください。

```
# When to do the backups, full backup on first sunday of the month,
#  differential (i.e. incremental since full) every other sunday,
#  and incremental backups other days
Schedule {
  Name = "WeeklyCycle"
  Run = Full mon-sun at 18:30
}
```

次は**Client**リソースです。こちらで設定した値が誤っていた場合バックアップ対象機と疎通がとれなくなりますので注意が必要です。
**各値について** 
<dd>**Address**：バックアップ対象機のIPアドレス
**File Retention**：バックアップデータの保存期間
**Job Retention**：ジョブの保存期間</dd>

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

続いてbaculaのバージョンによってリソース名が変わる**Autochanger**リソースです。
古いバージョンだとこの名前がStorageだったりします。リソースとしての機能はほとんど同じですので名前が違うんだな～くらいで認識いただければ。。
Autochangerではどのデバイスを使用するのか設定ができるのですが、デフォルトでは２つのデバイスを目的に応じて切り替えながらバックアップを行うような設定になっています。baculaになれるまではごちゃごちゃしてしまうので今回は１つのデバイスだけ使用するように設定します。
**各値について**
<dd>**Address**：バックアップサーバーのIPアドレス。バックアップ対象機はここで設定してアドレスに向けてデータを送り返すのでlocalhostとしてしまうと、バックアップ対象機は自身のことかバックアップサーバーのことかわからず、動作不良になってしまうので注意です。
**Device**：使用するデバイス名。詳細はbacula-sd.confで説明します。</dd>

```
# Definition of file Virtual Autochanger device
Autochanger {
  Name = File1
# Do not use "localhost" here
  Address = 192.168.10.2                # N.B. Use a fully qualified name here
  SDPort = 9103
  Password = "bstr-pass"
  Device = BaculaStorage
  Media Type = File1
  Maximum Concurrent Jobs = 10        # run up to 10 jobs a the same time
  Autochanger = File1                 # point to ourself
}
```
デフォルトだと２つめのAutochangerリソースも有効になっていますが、今回は使用しないので「#」でコメントアウトしておきます。

```
# Definition of a second file Virtual Autochanger device
#   Possibly pointing to a different disk drive
#Autochanger {
#  Name = File2
# Do not use "localhost" here
#  Address = localhost                # N.B. Use a fully qualified name here
#  SDPort = 9103
#  Password = "@@SD_PASSWORD@@"
#  Device = FileChgr2
#  Media Type = File2
#  Autochanger = File2                 # point to ourself
#  Maximum Concurrent Jobs = 10        # run up to 10 jobs a the same time
#}
```

続いて**Catalog**リソースです。このリソースは使用するDBの情報を設定する場所です。
**各値について**
<dd>**dbname**：使用するDBの名前です。デフォルトでbaculaが入力されています。
**dbuser**：DBの設定の際に作成したUser名を入力します。
**dbpassword**：DBの設定の際に決めたパスワードを入力します。</dd>

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

bacula-dir.conf最後は**Console**リソースです。こちらはTray-Monitorでbacula-dirに接続する際に必要なリソースです。

```
# Restricted console used by tray-monitor to get the status of the director
Console {
  Name = bacula-mon
  Password = "bcon-pass"
  CommandACL = status, .status
}
```

以上でbacula-dir.confの設定は終了です。

##bacula-sd.confの設定##
viエディタでbacula-sd.confを開きます。まずはAutochangerリソースを設定します。
**各値について**
<dd>**Name**：bacula-dir.confのAutochangerリソースのNameと一致させます。
**Device**：bacula-dir.confのAutochangerリソースのDeviceと一致させます。</dd>

```
# Define a Virtual autochanger
#
Autochanger {
  Name = File1
  Device = BaculaStorage
  Changer Command = ""
  Changer Device = /dev/null
}
```

続いてDeviceリソースです。
**各値について**
<dd>**Name**：AutochangerリソースのDeviceと一致させます。
**Archive Device**：バックアップデータを保存するデバイスを指定します。</dd>

```
Device {
  Name = BaculaStorage
  Media Type = File1
  Archive Device = 任意のデバイス
  LabelMedia = yes;                   # lets Bacula label unlabeled media
  Random Access = Yes;
  AutomaticMount = yes;               # when device opened, read it
  RemovableMedia = no;
  AlwaysOpen = no;
  Maximum Concurrent Jobs = 5
}
```

今回はデイバスを切り替えないので、bacula-sd.confの２つめ以降のDeviceリソースやAutochangerリソースは「#」でコメントアウトしておきます。
以上でbacula-sd.confの設定は終了です。

##bacula-fd.confの設定##
これまでの操作でbacula-fdデーモンはバックアップサーバーにはインストールされていますが、バックアップ対象機にはインストールされていません。そのため対象となるサーバーにインストールする必要があります。

バックアップ対象機で下記のサイトにアクセスします。アクセスしたらバックアップサーバーにインストールしたBaculaのバージョンと同じ、もしくは低いバージョンのBinariesをインストールします。
**Bacula Windows Binaries**
https://www.bacula.org/binary-download-center/

<img width="800" alt="201121_0020.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/948786/49d4ee61-5643-cb3c-ae6a-ad93bd54245c.png">

インストール後、下図のウィンドウが表示されます。【Next】を押したら次の画面で規約への同意が求められるので同意します。
<img width="500" alt="201121_0023.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/948786/c3b6bd03-e6b1-9dd9-c8f8-80a5ba5105e3.png">

同意後、インストールのタイプを選択する画面が表示されますのでAutomaticにチェックが入っていることを確認し、【Next】を押します。
<img width="500" alt="201121_0025.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/948786/82774d08-1460-722d-d1e9-9a334ee6a907.png">

その後、インストールしたコンポーネントについて聞かれますのでServerにチェックが入っていないことを確認し、【Next】を押します。
<img width="500" alt="201121_0026.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/948786/df77c802-a3a5-2a8f-bd74-c107387f065c.png">

続いてbacula-dirについて聞かれますのでので設定した値を入力します。今回の場合は「bacula-dir」、「bdir-pass」、「192.168.10.2」を入力することになります。
<img width="500" alt="201121_0027.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/948786/1607c575-d4f9-c40d-467e-43b18446e8f9.png">

入力後に【Install】を押したらバックアップ対象機へのインストールは完了です。
WindowsServer2016の場合はインストールしたファイルはローカルディスク→Program Files→Baculaの中に入っています。Baculaフォルダの中にbacula-fd.confがあるので開き、**FileDaemon**リソースを確認します。
**各値について**
<dd>**Name**：bacula-dir.confのClientリソースで設定したNameと一致させます。</dd>

```
# "Global" File daemon configuration specifications
#
FileDaemon {                          # this is me
  Name = bacula-fd
  FDport = 9102                  # where we listen for the director
  WorkingDirectory = /var/spool/bacula
  Pid Directory = /var/run
  Maximum Concurrent Jobs = 20
  Plugin Directory = /usr/lib64/bacula
}
```

FileDaemon及びDirectorリソースを設定したら再起動し、バックアップ対象機での設定は終了です。


##バックアップの実施##
今回はBaculumをインストールしないのでCUIコンソールであるbconsoleを使用して実施していきます。
bconsoleの起動は「bconsole」コマンドで行います。起動後は「run」を入力し、ジョブ選択で「1」を選択します。

```
bconsole

Connecting to Director localhost:9101
1000 OK: 103 bacula-dir Version: 9.6.6 (20 September 2020)
Enter a period to cancel a command.
*run
Automatically selected Catalog: MyCatalog
Using Catalog "MyCatalog"
A job name must be specified.
The defined Job resources are:
     1: WinSV2016
     2: BackupCatalog
     3: RestoreFiles
Select Job resource (1-3): 1
```

ジョブを選択後、ジョブの詳細が表示されます。変更したい場合には「mod」を入力すればジョブの変更が可能です。ジョブ実行の際は「y」入力でジョブの実行とJobIdの発行が行われます。

```
Run Backup job
JobName:  WinSV2016
Level:    Full
Client:   bacula-fd
FileSet:  Full Set
Pool:     File (From Job resource)
Storage:  File1 (From Job resource)
When:     2020-11-24 11:50:35
Priority: 10
OK to run? (yes/mod/no): y
Job queued. JobId=83
You have messages.
```

ジョブの状態を確認する際は、「status」コマンドを入力します。ジョブの状態確認は「1」のDirectorを入力します。２のクライアントを選択すると、bconsoleを介したクライアントとの疎通確認ができます。

```
*status
Status available for:
     1: Director
     2: Storage
     3: Client
     4: Scheduled
     5: Network
     6: All
Select daemon type for status (1-6): 1
```

Directorを選択すると、runningのジョブや完了したジョブの一覧が表示されます。日付は文字化けすることが多いのですが、特に問題はありません。

```
bacula-dir Version: 9.6.6 (20 September 2020) x86_64-redhat-linux-gnu redhat (Core)
Daemon started 24-11羃020 11:08, conf reloaded 24-11月-2020 11:08:42
 Jobs: run=1, running=0 mode=0,0
 Heap: heap=208,896 smbytes=124,882 max_bytes=1,279,526 bufs=454 max_bufs=584
 Res: njobs=7 nclients=5 nstores=1 npools=3 ncats=1 nfsets=3 nscheds=2

Scheduled Jobs:
Level          Type     Pri  Scheduled          Job Name           Volume
===================================================================================
Full           Backup    10  24-11羃020 18:30   WinSV2016          Vol-0001

====

Running Jobs:
Console connected at 24-11羃020 11:49
No Jobs running.
====

Terminated Jobs:
 JobId  Level      Files    Bytes   Status   Finished        Name 
====================================================================
    83  Full           3       26     OK     24-11羃020 11:51 WinSV2016

====
```

以上でバックアップは終了です。

##リストアの実施##
リストアに関してもバックアップと同じような流れで実施していきます。リストアの際は「restore」コマンドで行います。コマンドを入力すると、リストアする対象を検索する方法が12個提示されます。今回は最新のバックアップをリストアするため、「5」を選択します。

```
*restore
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): 5
```

続いて、バックアップ対象機の選択とFileSetの選択を行います。

```
Defined Clients:
     1: bacula-fd
Select the Client (1-5): 1
The defined FileSet resources are:
     1: Catalog
     2: Full Set
Select FileSet resource (1-2): 2
```

FileSetを選択すると下記のように表示されますので、JobIdを入力します。
すると、リストアを行うファイルの選択画面に移ります。今回はC:/users/bkディレクトリのバックアップを行いました。そのため、この状態でlsコマンドを使用するとCドライブが見えます。

```
+-------+-------+----------+----------+---------------------+------------+
| JobId | Level | JobFiles | JobBytes | StartTime           | VolumeName |
+-------+-------+----------+----------+---------------------+------------+
|    83 | F     |        2 |       26 | 2020-11-24 11:51:14 | Vol-0001   |
+-------+-------+----------+----------+---------------------+------------+
You have selected the following JobId: 83

Building directory tree for JobId(s) 83 ...  
1 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: /
$ ls
C:/
```

C:/users/bkディレクトリの中に移動後、再度lsコマンドを使用するとリストアしたいファイルであるbk.txtがあることが確認できます。

```
$ cd C:/Users/bk
cwd is: C:/Users/bk/
$ ls
bk.txt
```

bk.txtをリストア対象に設定するためには「mark」コマンドを使用します。選択が終わったらdoneを入力します。

```
$ mark bk.txt
1 file marked.
$ 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                     BaculaStorage            

Volumes marked with "*" are in the Autochanger.


1 file selected to be restored.

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:            2020-11-24 11:54:17
Catalog:         MyCatalog
Priority:        10
Plugin Options:  *None*
OK to run? (yes/mod/no): 
```

yesを入力するとリストアが実行されます。

```
OK to run? (yes/mod/no): y
Job queued. JobId=84
```

なお、ファイルを元の場所に戻したい場合には、modから「Where」を選択し、「/」を入力すると元の場所にリストアできます。
実行結果についてはバックアップと同様に、statusコマンドで確認することができます。
以上でリストアの手順は終了です。


これでBaculaの構築は完了です！日本よりも海外でより使われているMWみたいですが、日本語のGUIで操作もできるので比較的使いやすいんじゃないかなと思います。
GUIであるBaculumについてはまたそのうち記事あげるかもしれないです。