簡易版チュートリアル

投稿者: | 2014年6月11日

この章では、Bacula の操作の一連の流れを紹介する。すでにBacula が単一ファイルデーモン構成でインストールされていると仮定する。この場合、Bacula を非root ユーザ権限で実行して、以下の一連の操作を追体験できる。ただし、.conf ファイルは変更されていないものと仮定する。.conf ファイルを変更してしまった場合は、いったんBacula をアンインストールし、再度インストールしてほしい。そして一切変更しないでテストしてほしい。この章の例では、デフォルト設定ファイルを使用し、使用中のディスクの/tmp ディレクトリにボリュームを書き込む。Bacula のビルドに使ったソースディレクトリをバックアップ対象とする1。以下の操作はすべて非root ユーザで実施することとする。ただし、正式運用するときは、ファイルデーモンはroot ユーザ権限で実行する必要がある。この問題についての議論は「Bacula のセキュリティ」の章を参照。

Bacula を稼働させる一般的な手順は以下のとおりである。

  1. cd <install-directory>
  2. データベースを起動する(MySQL またはPostgreSQL を使用している場合)
  3. ./bacula start コマンドでデーモン群を起動する
  4. コンソールプログラムを起動してディレクタに接続する。
  5. ジョブを実行する
  6. ボリュームの空き容量がなくなったら、ボリュームをアンマウントし、テープドライブの場合は新しいものにラベルを付けて、作業を続ける。ただしこの章では、ディスク上のファイルへの書き込みしか行わないので、しばらくの間テープについて考える必要はない。
  7. 書き込んだそのファイルのうちいくつかをボリュームから復元して、バックアップが正常に行われていることを確認する。リカバリ方法はすでに知っているものとする。ディザスタに見舞われる前にテストしておくことが望まれる。
  8. 2 台目のクライアント(バックアップ対象サーバ及びエージェント)を追加する

それぞれのステップについて、以下に詳しく説明する。

Bacula を起動する前の確認事項

Bacula を実行する前に、Bacula Enterprise Utility programs のUtility Program chapter (chap-ter 1.9 on page 14) の章で説明している、btape プログラムのtest を使って、テープドライブを確認することを推奨する。これにより、テープドライブをBacula で使用できるか確認できる。Bacula プロジェクトではHP、Sony、Quantum DDS、またはDLT の最近のテープドライブをLinux またはSolaris 上で検証してあるため、これらの条件があてはまる場合にはこのテストはスキップしてもかまわない。そうでない場合には、このテストの実施を強く推奨する。btape にはfill というコマンドも含まれている。これは、テープを使いきって次のテープに進むときのBacula の挙動を再現する。このコマンドを実行することも検討してほしいが、テープ容量が大きい場合には数時間かかる可能性がある(筆者のドライブでは約4 時間を要した)。

1訳注: Bacula ソースディレクトリがない場合は、たとえば/usr/share/doc などを対象にするといいだろう。


データベースの起動

Bacula 用のデータベースにMySQL またはPostgreSQL を使う場合は、Bacula がエラーにならないようにするために、先にデータベースを起動する必要がある。システムを起動したときにMySQL またはPostgreSQl が自動的に起動するようにしておくといいだろう。

私(Kern)はstartmysql 及び stopmysql スクリプトを利用してローカルのMySQLを起動・停止している。SQLiteを利用している場合、startmysql や stopmysqlは使いたくないかもしれません。Baculaを本番環境で利用している場合、MySQL、PostgreSQLをシステム再起動後に自動起動する方法を望まれると思います。もしSQLiteを利用している場合は./configure コマンド内のwith-sqlite=xxx を指定する事でBacula側からSQLiteを自動起動する事が出来ます。)


デーモンの起動

デーモン群を手動で起動するには、Bacula Enterprise では次のコマンドを実行する。

./bacula start

bacula スクリプトは、ファイルデーモン、ストレージデーモン、およびディレクタデーモンを起動し、これらはバックグラウンドでデーモンとして起動する。Bacula の自動起動機能を使っていれば、システム最起動時に自動的にデーモンが起動する。また、通常/etc/init.d ディレクトリにあるbacula-dir、bacula-fd、およびbacula-sd スクリプトで個別に制御できる。ディストリビューションによっては別のディレクトリに置かれていることもある。

ただしWindows ではファイルデーモンだけが利用可能で、別の方法で起動する必要がある。本マニュアルの「Windows 用Bacula クライアント」の章を参照。

rpm パッケージは、デーモン群をuser=root、group=bacula で起動するように設定する。このため、rpm をインストールすると、bacula グループが存在しなければ自動的に作成される。bacula グループに追加したユーザは、デーモン群が作成したファイルにアクセスできる。デーモンの起動スクリプトを編集して、この挙動を無効にしたり変更できる。

  • /etc/bacula/bacula
  • /etc/init.d/bacula-dir
  • /etc/init.d/bacula-sd
  • /etc/init.d/bacula-fd

そしてデーモンを再起動する。

本マニュアルのInstallChapterにはスクリプトを利用してシステム起動時に自動でデーモンを再起動する方法が記載されています。

ディレクタを使ったジョブの実行と確認

ディレクタと通信してBacula の状態を問い合わせたりジョブを実行するには、トップレベルディレクトリに移動て次のコマンドを実行する。

./bconsole

Qt4 をインストールして–enable-bat をcofigure スクリプトのオプションとして指定してBaculaをビルドした場合、コマンドラインのコンソールを使う代わりに、Bacula 管理ツール(bat) を使用できる。

./bat

このプログラムはグラフィカルインタフェースを持ち、bconsole より多機能である。

他にも、GNOME 版のコンソールであるbgnome-console、wxWidgets プログラムのbwx-console を使うことができる。

簡潔にするために、以下では./bconsole についてのみ説明する。説明内容のほとんどは、./bat./bgnome-consolebwx-console についても同様になる。

./bconsole はBacula のコンソールプログラムを起動してディレクタデーモンに接続する。Bacula はネットワークプログラムなので、ネットワーク上のどこからでもコンソールプログラムを実行できる。しかしディレクタと同じマシン上で実行するのが普通である。コンソールプログラムを起動すると、最初に次のように表示される。

[kern@polymatou bin]$ ./bconsole
Connecting to Director lpmatou:9101
1000 OK: HeadMan Version: 2.1.8 (14 May 2007)
*

アスタリスク(*) はコンソールにおけるコマンドプロンプトである。

help をタイプすると利用できるコマンドの一覧が表示される。

*help
  Command    Description
  =======    ===========
  add        add media to a pool
  autodisplay autodisplay [on|off] -- console messages
  automount  automount [on|off] -- after label
  cancel     cancel [<jobid=nnn> | <job=name>] -- cancel a job
  create     create DB Pool from resource
  delete     delete [pool=<pool-name> | media volume=<volume-name>]
  disable    disable <job=name> -- disable a job
  enable     enable <job=name> -- enable a job
  estimate   performs FileSet estimate, listing gives full listing
  exit       exit = quit
  gui        gui [on|off] -- non-interactive gui mode
  help       print this command
  list       list [pools | jobs | jobtotals | media <pool=pool-name> |
files <jobid=nn>]; from catalog
  label      label a tape
  llist      full or long list like list command
  memory     print current memory usage
  messages   messages
  mount      mount <storage-name>
  prune      prune expired records from catalog
  purge      purge records from catalog
  python     python control commands
  quit       quit
  query      query catalog
  restore    restore files
  relabel    relabel a tape
  release    release <storage-name>
  reload     reload conf file
  run        run <job-name>
  status     status [[slots] storage | dir | client]=<name>
  setdebug   sets debug level
  setip      sets new client address -- if authorized
  show       show (resource records) [jobs | pools | ... | all]
  sqlquery   use SQL to query catalog
  time       print current time
  trace      turn on/off trace to file
  unmount    unmount <storage-name>
  umount     umount <storage-name> for old-time Unix guys
  update     update Volume, Pool or slots
  use        use catalog xxx
  var        does variable expansion
  version    print Director version
  wait       wait until no jobs are running [<jobname=name> | <jobid=nnn> | <ujobid=complete_name>]
*

コンソール・プログラムのコマンドの詳細についてはBacula Enterprise Console Manual のConsole chapter (chapter 1 on page 1) を参照のこと。


ジョブの実行

ここでは、以下のことを実行ずみであると仮定する2。

  • ./configure –your-options でBacula のconfigure スクリプトを実行した。
  • make を使ってBacula をビルドした。
  • make install でBacula をインストールした。
  • ./create_sqlite_database などのスクリプトを実行してデータベースを作成した。
  • ./make_bacula_tables を実行してデータベースにBacula 用のテーブルを作成した。
  • 自分の環境に合わせてbacula-dir.conf を編集して、さらにディレクタの名前とパスワードを変更した場合、他の.conf ファイルもこれに対応して変更した(当面は変更しないことを推奨する)。
  • ./bacula start コマンドでBacula を起動した。
  • ./bconsole でコンソールプログラムを起動している。

さらに、デフォルトの設定ファイルを使っていると仮定する。

ここで、次のコマンドを実行すると、

show filesets

以下のような結果が表示される。

FileSet: name=Full Set
      O M
      N
      I /home/kern/bacula/regress/build
      N
      E /proc
      E /tmp
      E /.journal
      E /.fsck
      N
FileSet: name=Catalog
      O M
      N
      I /home/kern/bacula/regress/working/bacula.sql
      N

これはBacula のソースディレクトリをバックアップするためにあらかじめ定義されたファイルセットである。表示されるディレクトリ名と実際のシステム構成は対応していなければならない。テストが目的であるため、40 メガバイト程度で過度に複雑でないディレクトリをバックアップ対象にしている。Catalog はBacula カタログのバックアップ用のファイルセットで、今回は使わない。I で始まる行はバックアップ対象に含めるファイルやディレクトリで、E は
バックアップ対象から除外する。O 行はファイルセットのオプションである。バックアップ対象を変更するには、bacula-dir.conf を編集してFileSet リソースのFile =の行を書き換える。

初めてのバックアップジョブを実行してみよう。/tmp ディレクトリのFile ボリュームにBaculaソースディレクトリをバックアップする手順は、以下のようにとても簡単である。次のコマンドを実行すると

status dir

以下の出力が得られる。

rufus-dir Version: 1.30 (28 April 2003)
Daemon started 28-Apr-2003 14:03, 0 Jobs run.
Console connected at 28-Apr-2003 14:03
No jobs are running.
Level          Type     Scheduled          Name
=================================================================
Incremental    Backup   29-Apr-2003 01:05  Client1
Full           Backup   29-Apr-2003 01:10  BackupCatalog
====

時刻とディレクタの名前は、実行した環境やタイミングによって異なる。上の出力の場合、1:05にClient1 という増分バックアップのジョブが、また1:10 にBackupCatalog というジョブの実行が予定されていることを示している。将来新しいクライアントを追加したときに混乱しないようにするために、Client1 という名前を各自のマシンの名前に書き換えるのが望ましい。ここでは、Client1 を筆者のマシン名であるRufus に書き換えることにする。

次のコマンドを実行すると

status client

以下の出力が得られる。

The defined Client resources are:
     1: rufus-fd
Item 1 selected automatically.
Connecting to Client rufus-fd at rufus:8102
rufus-fd Version: 1.30 (28 April 2003)
Daemon started 28-Apr-2003 14:03, 0 Jobs run.
Director connected at: 28-Apr-2003 14:14
No jobs running.
====

rufus-fd がクライアント名になるが、ユーザの環境によって違う名前になっていてもかまわない。rufus-fd Version … から始まる行は、このファイルデーモンが起動して動作可能であることを示している。

最後にストレージデーモンの状態も確認する。

status storage

以下の出力が得られる。

The defined Storage resources are:
     1: File
Item 1 selected automatically.
Connecting to Storage daemon File at rufus:8103
rufus-sd Version: 1.30 (28 April 2003)
Daemon started 28-Apr-2003 14:03, 0 Jobs run.
Device /tmp is not open.
No jobs running.
====

ストレージデーモンのデバイスのデフォルトの名前はFile であり、と名前が付けられており、/tmp をデバイスとして使用すること、さらにこのデバイスは現在オープンしていないことを確認できる。

実際にジョブを実行してみよう。

run

すると以下の出力が得られる。

Using default Catalog name=MyCatalog DB=bacula
A job name must be specified.
The defined Job resources are:
     1: Client1
     2: BackupCatalog
     3: RestoreFiles
Select Job resource (1-3):

Bacula は実行可能な3 種類のジョブを一覧表示している。1 をタイプしてEnter キーを押すと、次の出力が表示される。

Run Backup job
JobName:  Client1
FileSet:  Full Set
Level:    Incremental
Client:   rufus-fd
Storage:  File
Pool:     Default
When:     2003-04-28 14:18:57
OK to run? (yes/mod/no):

この出力内容を注意深く読んで理解することは、きわめて重要である。Client1 というジョブを実行していいかを尋ねている。このジョブは、Full Set というファイルセット(前述のファイルセットの一覧にある) を対象とした増分バックアップで、対象クライアントはrufus-hd、バックアップ先はFile というストレージのDefault プールである。実行時刻は現在の時刻が表示されているはずであり、ただちにジョブを実行することになる。

このプロンプトに対して、yes(実行する)、mod(パラメータを修正する)、no(実行しない) を選択できる。yes を入力すると、ただちにコマンドプロンプト(アスタリスク) が表示される。数秒待ってmessages というコマンドを入力すると、次のような出力が得られる。

28-Apr-2003 14:22 rufus-dir: Last FULL backup time not found. Doing
                  FULL backup.
28-Apr-2003 14:22 rufus-dir: Start Backup JobId 1,
                  Job=Client1.2003-04-28_14.22.33
28-Apr-2003 14:22 rufus-sd: Job Client1.2003-04-28_14.22.33 waiting.
                  Cannot find any appendable volumes.
Please use the "label"  command to create a new Volume for:
    Storage:      FileStorage
    Media type:   File
    Pool:         Default

最初のメッセージは、フルバックアップの履歴が見つからなかったためにBacula が増分をフルバックアップにアップグレードしたことを示している(これは正常な挙動である)。2 つ目のメッセージは、ジョブが1 というジョブID で開始したことを、3 つ目はプールの中にボリュームを見つけられなかったことを示している。ラベル付けしたボリュームをまだ作っていないので、このメッセージも正常な挙動である。メッセージとともに、必要なボリュームの詳細情報が表示されている。

この時点では、ジョブは利用可能なボリュームを待つBLOCKED という状態になっている。必要ならstatus dir でこれを確認できる。継続するには、Bacula が書き込めるボリュームを作る必要がある。引き続き、ボリュームを作成しよう。

label

Bacula は次のように表示する。

The defined Storage resources are:
     1: File
Item 1 selected automatically.
Enter new Volume name:

ここで、英文字で始まり、英数字とピリオド、ハイフン、下線で構成される名前を入力する。たとえばTestVolume001 を入力すると、次の出力が表示される。

Defined Pools:
     1: Default
Item 1 selected automatically.
Connecting to Storage daemon File at rufus:8103 ...
Sending label command for Volume "TestVolume001" Slot 0 ...
3000 OK label. Volume=TestVolume001 Device=/tmp
Catalog record for Volume "TestVolume002", Slot 0  successfully created.
Requesting mount FileStorage ...
3001 OK mount. Device=/tmp

その後messages を実行すると、次のような出力が得られる。

28-Apr-2003 14:30 rufus-sd: Wrote label to prelabeled Volume
   "TestVolume001" on device /tmp
28-Apr-2003 14:30 rufus-dir: Bacula 1.30 (28Apr03): 28-Apr-2003 14:30
JobId:                  1
Job:                    Client1.2003-04-28_14.22.33
FileSet:                Full Set
Backup Level:           Full
Client:                 rufus-fd
Start time:             28-Apr-2003 14:22
End time:               28-Apr-2003 14:30
Files Written:          1,444
Bytes Written:          38,988,877
Rate:                   81.2 KB/s
Software Compression:   None
Volume names(s):        TestVolume001
Volume Session Id:      1
Volume Session Time:    1051531381
Last Volume Bytes:      39,072,359
FD termination status:  OK
SD termination status:  OK
Termination:            Backup OK
28-Apr-2003 14:30 rufus-dir: Begin pruning Jobs.
28-Apr-2003 14:30 rufus-dir: No Jobs found to prune.
28-Apr-2003 14:30 rufus-dir: Begin pruning Files.
28-Apr-2003 14:30 rufus-dir: No Files found to prune.
28-Apr-2003 14:30 rufus-dir: End auto prune.

ただちに出力が得られない場合は、ジョブが終わるまでmessages コマンドを入力し続ける。またはautodisplay on を指定しておくと、メッセージが利用可能になったときに自動的に出力される。

ここで/tmp ディレクトリに対してls -l を実行すると、以下のような項目が表示されるはずである。

-rw-r-----    1 kern     kern     39072153 Apr 28 14:30 TestVolume001

これは、ジョブ実行によって作られたファイルボリュームで、すべてのデータが書き込まれている。別のジョブを追加して実行すると、とくに指定しない限りこのボリュームに追記される。

Bacula が使用するボリュームすべてにラベルを付ける必要があるのかという疑問があるかもしれない。ディスクボリュームに関しては、必ずしもラベルを明示的に指定する必要はない。代わりに自動的にボリュームラベルを付けさせることができる。しかしテープボリュームについては、使用したいボリュームごとにラベルを付ける必要がある。

ここでテストを終了したければ、コンソールプログラムでquit を入力し、さらにBacula 自体を停止するには./bacula stop を実行するとよい。初期状態に戻したければ、/tmp/TestVolume001を削除して、データベースを再初期化すればいい。

./drop_bacula_tables
./make_bacula_tables

ただし、データベースを再初期化すれば、これまでに実行したジョブすべてについての情報が削除されることに留意する必要がある。テスト目的の場合にはこれでもよいが、通常は再初期化すべきではない。

バックアップしたファイルをリストアする方法は、次のセクションで説明する。

ファイルのリストア

デフォルトの設定のままで前述の手順でBacula ソースコードをバックアップしてあれば、コンソールプログラムを使ってそれをリストアできる。次のコマンドを実行する。

restore all

以下の出力が得られる。

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: Cancel
Select item:  (1-12):

いくつかの選択肢が提示されるが、最新のバックアップをリストアするために5 を入力する。
すると次のような出力が得られる。

Defined Clients:
     1: rufus-fd
Item 1 selected automatically.
The defined FileSet resources are:
     1: 1  Full Set  2003-04-28 14:22:33
Item 1 selected automatically.
+-------+-------+----------+---------------------+---------------+
| JobId | Level | JobFiles | StartTime           | VolumeName    |
+-------+-------+----------+---------------------+---------------+
| 1     | F     | 1444     | 2003-04-28 14:22:33 | TestVolume002 |
+-------+-------+----------+---------------------+---------------+
You have selected the following JobId: 1
Building directory tree for JobId 1 ...
1 Job inserted into the tree and marked for extraction.
The defined Storage resources are:
     1: File
Item 1 selected automatically.
You are now entering file selection mode where you add and
remove files to be restored. All files are initially added.
Enter "done" to leave this mode.
cwd is: /
$

読みやすくするために出力の一部を切り詰めてある。先頭から順に見ていこう。まず、Baculaはクライアントを知っていて、1 つのクライアントしか存在しないためにそれが自動的に選択されている。ファイルセットも同様である。次に、現在保存されているバックアップについて、それを作成したジョブの一覧が表示されている。ジョブも1 つしか存在しないため、それが自動的に選択され、同様にストレージデーモンも自動的に選択されている。そしてBacula は、ジョブID が1 のジョブに含まれるファイル名情報を抜き出して、ディレクトリツリー(メモリ上に構成したファイルシステムのコピーのようなもの) に入れている。ユーザは、cd、ls、dirなどのコマンドでディレクトリツリーの中を移動したり内容を確認して、どのようなファイルがリストアされるかを確認できる。たとえば、cd /home/kern/bacula/bacula-1.30、続けてdir を実行すると、と入力すると、Bacula ソースディレクトリのすべてのファイルのリストを表示できる(実際のパスはユーザの状況によって異なる)。ディレクトリツリーの操作の詳細については、本マニュアルの「リストア」の章を参照。

次のコマンドを実行すると、

done

このモードが終了して、次のような出力が得られる。

Bootstrap records written to
   /home/kern/bacula/testbin/working/restore.bsr
The restore job will require the following Volumes:
   
   TestVolume001
1444 files selected to restore.
Run Restore job
JobName:         RestoreFiles
Bootstrap:      /home/kern/bacula/testbin/working/restore.bsr
Where:          /tmp/bacula-restores
Replace:        always
FileSet:        Full Set
Backup Client:  rufus-fd
Restore Client: rufus-fd
Storage:        File
JobId:          *None*
When:           2005-04-28 14:53:54
OK to run? (yes/mod/no):

yes と回答すると、ファイルは/tmp/bacula-restores ディレクトリにリストアされる。元の位置にリストアしたい場合は、mod と回答した上で、Where:を空(または/) に変更する。今回は、yes と答えてほしい。そして数秒待ってからmessages コマンドを実行する。ジョブの要約とともに、リストアされたファイルのリストが表示される。

28-Apr-2005 14:56 rufus-dir: Bacula 2.1.8 (08May07): 08-May-2007 14:56:06
Build OS:               i686-pc-linux-gnu suse 10.2
JobId:                  2
Job:                    RestoreFiles.2007-05-08_14.56.06
Restore Client:         rufus-fd
Start time:             08-May-2007 14:56
End time:               08-May-2007 14:56
Files Restored:         1,444
Bytes Restored:         38,816,381
Rate:                   9704.1 KB/s
FD Errors:              0
FD termination status:  OK
SD termination status:  OK
Termination:            Restore OK
08-May-2007 14:56 rufus-dir: Begin pruning Jobs.
08-May-2007 14:56 rufus-dir: No Jobs found to prune.
08-May-2007 14:56 rufus-dir: Begin pruning Files.
08-May-2007 14:56 rufus-dir: No Files found to prune.
08-May-2007 14:56 rufus-dir: End auto prune.

/tmp/bacula-restores にリストアされたファイルの詳細を調べるために、コンソールプログラムを終了する。すべてのファイルがリストアされたディレクトリツリーが入っているはずである。最後に、リストアしたファイルを削除しておく。

rm -rf /tmp/bacula-restore

コンソールプログラムの終了

コンソールを終了するコマンドはquit である。.

2 台目のクライアントの追加

これまでのサンプルジョブがすべてうまく動作したなら、2 台目以降のクライアント(ファイルデーモン) を追加できる準備が整ったことになる。新しいクライアントにインストールする必要があるコンポーネントは、bacula-fd (Windows の場合bacula-fd.exe) のバイナリと、その設定ファイルであるbacula-fd.conf だけである。現在のbacula-fd.conf ファイルをコピーした上で数箇所を変更して、2 台目のクライアント用のconf ファイルを作ってよい。このとき、少なくともファイルデーモンの名前は、コピー元のファイルで使っていた名前(前述の例ではrufus-fd) とは異なる名前に変更しなければならない。最良の選択は、2 台目のマシン名をベースにすることである。たとえば、次の行を

...
#
# "Global" File daemon configuration specifications
#
FileDaemon {                          # this is me
  Name = rufus-fd
  FDport = 9102                  # where we listen for the director
  WorkingDirectory = /home/kern/bacula/working
  Pid Directory = /var/run
}
...

以下のように書き換えてみる。

...
#
# "Global" File daemon configuration specifications
#
FileDaemon {                          # this is me
  Name = matou-fd
  FDport = 9102                  # where we listen for the director
  WorkingDirectory = /home/kern/bacula/working
  Pid Directory = /var/run
}
...

つまり、rufus-fd をmatou-fd に変更してある。なお、上のリストは設定ファイルの一部の抜粋である。実際のホスト名にもとづいた名前を指定してほしい。今のところ、他の項目は変更しないようにしてほしい。後でパスワードを変更することになるが。

このように変更した設定ファイルを2 台目のクライアントにインストールする。次に、新しいファイルデーモン(クライアント) を登録するために、ディレクタ設定ファイルに多少の項目を追加する。この章で述べてきたサンプルを使っているならば、以下の行ブロックをディレクタ設定ファイルbacula-dir.conf に追加する。これらの行は、設定ファイルに存在した行ブロックをコピーして名前を書き換えたものとなっている。

#
# Define the main nightly save backup job
#   By default, this job will back up to disk in /tmp
Job {
  Name = "Matou"
  Type = Backup
  Client = matou-fd
  FileSet = "Full Set"
  Schedule = "WeeklyCycle"
  Storage = File
  Messages = Standard
  Pool = Default
  Write Bootstrap = "/home/kern/bacula/working/matou.bsr"
}
# Client (File Services) to backup
Client {
  Name = matou-fd
  Address = matou
  FDPort = 9102
  Catalog = MyCatalog
  Password = "xxxxx"                  # password for
  File Retention = 30d                # 30 days
  Job Retention = 180d                # six months
  AutoPrune = yes                     # Prune expired Jobs/Files
}

次に、Storage リソースのAddress パラメータの設定を完全修飾ドメイン名(FQDN) に書き換える。”localhost”のような名前ではいけない。このアドレスがファイルデーモン(クライアント) に通知されるためである。”localhost”のような名前が指定されていると、ファイルデーモン側で名前解決が失敗し、ストレージデーモンとの接続がタイムアウトで失敗してしまう。

以上で準備作業は完了する。これまでの作業内容を要約しておこう。まず、2 番目のクライアント(matou-fd) をバックアップするためのジョブ(Matou) を登録した。書き換えたのは、matou-fd というクライアント名、Matou というジョブ名、およびブートストラップファイルの名前だけで、他のパラメータは書き換えていない。このことは、Matou のバックアップスケジュールやバックアップ先はすべてrufus-fd と同じということを意味する。将来これらを変更したくなるかもしれないが、今のところはそのままにしておく。

2 番目の変更点は、matou-fd を定義するためのClient リソースを追加したことである。ここでクライアントのアドレスにmatou を指定してあるが、ユーザ環境でも完全修飾ドメイン名かIP アドレスを指定する必要がある。パスワード(上例ではxxxxxx と表記) は変更していない。

登録が終わったら、Bacula をいったん終了して再起動する。そして2 番目のマシンでBaculaファイルデーモン(クライアント) を起動すると、すべての準備が整う。status client などの実行結果に2 台のクライアントがリストされるようになる。

正式な運用の際には、別のプールや別のスケジュールを割り当てる必要があるが、もちろんそのようにカスタマイズできる。なおセキュリティの観点からは、ディレクタとクライアント設定ファイルのパスワードは変更するのが望ましい。

名前とパスワードの管理、およびコンポーネント間での名前とパスワードのマッチングに関する図解については、Bacula Enterprise Problem Resolution Guide のAuthorization Errors chapter(chapter 1.5 on page 2) を参照。


テープボリュームを使い切った場合

テープを使っていて夜間にジョブをスケジューリングしていると仮定する。もしもテープを使い切ってしまってBacula が書き込みを続けられなくなることも想定される。このような場合、Bacula は以下のようなメッセージを送る。

rufus-sd: block.c:337 === Write error errno=28: ERR=No space left
          on device

テープの空きがなくなったために書き込みエラーが起きていることを示している。Bacula は、ジョブに指定してあるプールから追記可能なボリュームを自動的に探してくれる。一番都合がいいケースは、保存期間が適切に設定されていてすべてのテープが再利用可能になっている場合である。このときは、Bacula はプールに属するテープを再利用して、古いボリュームを上書きする。再利用についての情報は、本マニュアルの「ボリュームの自動再利用」の章を参照。ボリュームの再利用が失敗した場合(多くの場合設定のミスが原因) は、「ボリュームの自
動再利用」の章のManually Recycling Volumes を参照。

最初に書き込んだ日時にもとづくボリュームラベルを使っていたり、保存期間が正しく設定されていない場合、Bacula はプールの中から適切なテープを選ぶことができない。そして、次のようなメッセージを送る。

rufus-sd: Job kernsave.2002-09-19.10:50:48 waiting. Cannot find any
          appendable volumes.
Please use the "label"  command to create a new Volume for:
    Storage:      SDT-10000
    Media type:   DDS-4
    Pool:         Default

このメッセージは、新しいボリュームを作成するまで、1 時間後、2 時間後、そして時間間隔を2 倍にしながら最大1 日後まで、繰り返し送信される。

この事態への対処方法は、以下のようになる。

まず、コンソールプログラムでunmount コマンドを使って使用中のテープをクローズする。テープドライブが1 基だけの場合は自動的に選択されるが、複数ある場合にはメッセージに書いてあるストレージ(上記の例の場合はSTD-10000) を解放する。

次に、ドライブからテープを外して新品のテープと取り替える。古いテープドライブの中には、Bacula がラベルを読もうとしてテープを巻き切ってしまうことを防ぐ目的で、end of fileマークを書き込まなければならない(mt f /dev/nst0 weof) ものがあるので、注意してほしい。

最後に、コンソールからlabel コマンドを使って新しいボリュームにラベルを書き込む。labelコマンドはストレージデーモンにソフトウェアラベルを書き込むことを指示し、成功した場合には新しいボリュームをプールに追加し、mount コマンドをストレージデーモンに発行する。テープへのラベリングについては、本章の前節を参照。

この作業を行うと、Bacula は新しいボリュームにバックアップデータを書き込んで、以前のジョブを継続する。

プールに複数のボリュームがあって、これらが再利用できる場合には、Bacula は”Cannot findany appendable volumes (追記可能なボリュームがない)”というメッセージではなく、特定のボリュームのマウントを要求する。この場合は、指示どおりに対応すればよい。(何らかの理由で) 指示されたボリュームが利用できない場合、同じプールの別のボリュームをマウントすればよい。追記可能であれば、Bacula はそのボリュームを使用する。ボリュームが追記可能かどうかを調べるには、コンソールプログラムでlist volumes コマンドを実行する。

ボリュームの保存期間を適切に設定していても、空き容量があるボリュームがなくなってしまうこともある。この場合には、ラベルを付け替えてボリュームを再利用できる。

  • コンソールでlist volumes コマンドを実行して、ラベルを付け替えるべきもっとも古いボリュームを探す。
  • 保存期間が正しく設定されていれば、”VolStatus Purged“という属性が表示される。
  • VolStatus がPurged でない場合には、そのボリュームに書き込んだジョブ情報をpurgejobs volume コマンドでデータベースから削除する必要がある。複数のプールがあれば、プールを指定した上でVolumeName(またはMediaId) を指定する。
  • relabel コマンドでボリュームのラベルを付け替える。

ボリュームラベルの付け替えを手動で行うには、以下の追加ステップが必要になる。

  • delete volume コマンドをコンソールで実行して、削除対象ボリュームのVolumeNameまたはMedald を指定し、ボリュームをカタログから削除する。
  • コンソールでunmount コマンドを使用して、古いテープをアンマウントする。
  • ボリュームを再利用可能にするために、削除した古いボリュームに物理的なラベルを書き換える。
  • 古いボリュームをテープドライブに挿入する。
  • コマンドラインで次のコマンドを実行する。mt -f /dev/st0 rewind およびmt f/dev/st0 weof。/dev/st0 というデバイス名は、実際に使っているシステムにおけるテープドライブ名に書き換えること。
  • コンソールでlabel コマンドを使って、テープに新しいBacula のラベルを書き込む。
  • 自動的にマウントされなければ、コンソールでmount コマンドを実行する。Bacula は新しいラベルが付けられたテープを使い始める。

利用頻度が高いコンソールコマンド

status dir
実行中のジョブと24 時間以内に予定されているジョブの状態を表示する。

statusデーモンの種類を指定するプロンプトが表示され、ユーザが選択したデーモンの状態
を表示する。

status jobid=nnnn で指定したジョブID のジョブが実行中であれば、その状態を表示する。
ディレクタはストレージデーモンに接続して、そのジョブの状態を表示させる。

list poolsカタログに定義されているプールの一覧を表示する。デフォルトではDefault だけが定義されている。

list mediaカタログに定義されているメディアの一覧を表示する。

list jobsカタログに保存されている実行中または実行済みの全ジョブの情報を表示する。

list jobid=nnnn で指定したジョブID のジョブのカタログ情報を表示する。

list jobtotalsカタログにあるジョブの合計数を表示する。

list files jobid=nn nn で指定したジョブID のジョブがバックアップしたファイルの一覧を表
示する。

list jobmedia実行中のジョブのメディアに関する情報を表示する。

messagesコンソールに送られたメッセージを表示する。

unmount storage=storage-namestorage-nameという名前のドライブが使われていなければアンマウントする。このコマンドは、テープラベルを付け替えるためにドライブをBacula 管理下から解放するために使う。

mount storage=storage-namestorage-name という名前のストレージデバイスをマウントする。Bacula がボリュームを使い切って、新しいボリュームをマウントするようにリクエストしてきたとき、新しいボリュームをドライブに挿入してこのコマンドを実行する。Bacula で新しいボリュームの読み書きを始めるのに必要なコマンドである。

quitコンソールプログラムを終了する。

Listコマンド以外のこれらのコマンドのほとんどは、コマンド名だけを入力すれば必要な引数の入力を求めるプロンプトが表示される。

デーモン出力のデバッグ

動作中のデーモンからのデバッグ出力が必要な場合、Bacula バイナリが入っているディレクトリから次のようにデーモン群を起動する。

./bacula start -d100

デバッグレベルに正の値を指定すると、出力は起動した端末に送られる。通常の起動手順だと、デーモンからのコンソール出力はNULL デバイスにリダイレクトされるため、この手法はデーモンがうまく起動しないときにとくに有用である。

3 つのデーモンを止めるには、Bacula バイナリが入っているディレクトリから次のように入力する。

./bacula stop

bacula stop を実行したときに、プロセスID が見つからないという警告が表示されることがある。きわめてまれなことだが、デーモンのどれかが死んでしまったことによるならば、とくに問題はない。

OS を含むシステム全体のバックアップは全ファイルへのアクセス権限が必要になるため、ファイルデーモンをroot ユーザで実行する必要がある。他のデーモンの実行にroot 権限は必須ではない。ただし、多くのシステムでテープドライブへのアクセスにroot 権限が必要で、ストレージデーモンはテープドライブをオープンする必要がある。このため、ストレージデーモンをroot で実行するか、非root ユーザがテープドライブにアクセスできるようにパーミッションを変更するか、どちらかの対応が必要である。MySQL とPostgreSQL の実行にroot 権限は
不要で、どのユーザID でインストールして実行してもかまわない。

デーモン開始と新規テープの認識の所要時間

Bacula デーモン群のうちストレージデーモンは、起動時にすべてのストレージデバイスをオープンし、設定されている場合にはマウントされているテープを照合する。すべてのストレージデバイスの照合が終わるまで、ストレージデーモンはコンソールからの接続を受け付けない。以前使用されたテープは巻き戻すが、デバイスによっては数分かかることがある。デーモン群を起動してからストレージデーモンと通信可能になるまで、忍耐強く待つ必要がある。テープドライブを目視できるなら、ランプ点滅が終わったことで準備が整ったことがわかる。

空のテープをHP DLT などのドライブにマウントした場合にも、同様のことが起こる。テープが空であることを認識するまで1~2 分かかるためである。認識中にコンソールからテープをマウントしようとすると、高い可能性でSCSI ドライバがハングアップする。空のテープを挿入したときも、忍耐強く待つ必要がある。テープにアクセスする場合には、デバイスの準備が整うまで必ず待ってほしい。

FDからSDに接続できないときは

ファイルデーモンからストレージデーモンに接続できない障害のもっともありがちな原因は、ディレクタ設定ファイルのStorage リソースのAddress ディレクティブが完全修飾ドメイン名になっていないことである。(ディレクタではなく) ファイルデーモンを実行するマシンのリゾルバが、与えられた名前を解決できる必要がある。確実に接続できないアドレスの例:localhost。接続できるかもしれないアドレスの例: megalon。接続できる可能性が高い例:
magalon.mydomain.com。

適切な名前をAddress に指定してあるにも関わらず接続できなければ、ストレージデーモン上の他のプログラムがポート9103 (ファイルデーモンからストレージデーモンに接続するときのポート番号) を使っていないことを確認する。Bacula のポート番号はIANA に登録済みだが、HP のプリンタがこのポートを使っていることがある。ストレージデーモンのマシンでnetstat-a を実行して、ポート9103 を使っているプログラムがあるか、確認する。

デーモンのコマンドライン・オプション

3 つのデーモン(ディレクタ、ファイル、ストレージ) のそれぞれに、以下のコマンドライン・オプションを指定できる。デーモンと同様に、コンソールプログラムも以下のオプションを受け付ける。

-c file
設定ファイルの名前を指定する。デフォルト値は、デーモン名の後に.conf を追加した名前。たとえば、bacula-dir.conf はディレクタ、bacula-fd.conf はファイルデーモン、bacula-sd はストレージデーモンのデフォルトの設定ファイルである。

-d nnデバッグレベルをnn に設定する。レベルを上げるほど、標準出力にデーモンの動作に
関する情報が増える。

-f デバッグレベルをnn に設定する。レベルを上げるほど、標準出力にデーモンの動作に
関する情報が増える。

-g <group>指定したグループの権限でプログラムを実行する。グループID ではなくグループ名を指定しなければならない。

-s シグナルをトラップしない。このオプションはデーモンをデバッガほ配下で動作させるときに必要である。

-t 設定ファイルを読み込んで、構文エラーが見つかった場合にはエラーメッセージを出力して、すぐに終了する。設定ファイルを書き換えたときに、構文チェックのために利用できる。

-u <user> 指定したユーザの権限でプログラムを実行する。ユーザID ではなくユーザ名を指定しなければならない。

-v エラーおよび通知メッセージをより詳しく、完全な形で表示する。このオプションをつねに指定することを推奨する。

-?バージョン番号とオプションの一覧を表示する。


プールの作成

プールは、Bacula の起動時に自動的に作成される。したがってプールの概念を理解しているユーザは、この節は読み飛ばしてもかまわない。

ジョブを実行するときに、Bacula はファイルセットを保存するボリュームを知っている必要がある。実際には、ボリューム(テープ) を直接指定する代わりに、複数のボリュームを登録できるプールを指定し、Bacula はバックアップを書き込む実際のテープをその中から探す。Baculaは実行するジョブに適したストレージデバイスをプールの中から見出して、利用可能な最初のボリュームを選択する。ボリュームに空き容量がなくなったら、Bacula はボリュームの状態をAppend からFull に変更する。そして、Bacula は次のボリュームに書き込む。これを必要に応じて繰り返す。プールの中に追記可能なボリュームがない場合、ディレクタは古いボリュームの再利用を試みる。それでも追記可能なボリュームが見つからない場合、Bacula は適切なボリュームを作成するよう、オペレータにメッセージを送信する。

Bacula はプールおよびプールに含まれるボリューム、そしてボリュームに関するさまざまな属性をつねに把握している。

起動時に、Bacula はプールに関するすべてのリソース情報がカタログに記録されていることを確認する。この情報は、次のコマンドで表示できる。

list pools

たとえば次のような結果が表示される。

*list pools
Using default Catalog name=MySQL DB=bacula
+--------+---------+---------+---------+----------+-------------+
| PoolId | Name    | NumVols | MaxVols | PoolType | LabelFormat |
+--------+---------+---------+---------+----------+-------------+
| 1      | Default | 3       | 0       | Backup   | *           |
| 2      | File    | 12      | 12      | Backup   | File        |
+--------+---------+---------+---------+----------+-------------+
*

新しいプールを作るときに登録済みのプール名と同じ名前を指定すると、Bacula は以下のエラーを表示する。

Error: Pool Default already exists.
Once created, you may use the {\bf update} command to
modify many of the values in the Pool record.

ボリュームのラベル付け

Bacula はすべてのボリュームがソフトウェアラベルを持っていることを要求する。ボリュームにラベルを付けるタイミングに関しては、何とおりかのポリシーが考えられる。最初のポリシーは、Bacula の要求に応じてコンソールコマンドでラベルを付けることである。新しいボリュームが必要になったがカタログにそれが見つからない場合、Bacula はボリュームをプールに追加することを要求するメッセージをオペレータに送信する。この要求に応じて、コンソールプログラムのlabel コマンドを使って新しいボリュームにラベルを付けて、プールのデータベースに登録する。Bacula は新しいボリュームに書き込みを開始する。または、ボリュームの状態がPurged になっていて使われていないボリュームがある場合は、コンソールのrelabelコマンドでそのボリュームに新しいラベルを付けてもよい。

別のポリシーは、あらかじめ複数のボリュームに一度にラベルを付けておき、Bacula が要求するたびにそれを使っていく、という方法である。オートローダを使っている場合などで一組のテープをセットとして循環して使う場合に、この方法がよく使われる。再利用の詳細は、このマニュアルの「ボリュームの自動再利用」の章を参照。

さらに、ジョブの実行中にラベル付きのテープがなくなってしまった場合、Bacula の通知に応じてその場で作成してもよい。ラベルに日付を含めることもできる。たとえばDLT-18April02など。label コマンドの詳細は、次節を参照。

コンソールプログラムを使ったボリュームのラベル付け

通常は、コンソールプログラムを使ってボリュームにラベルを付ける。

  1. ./bconsole
  2. label

すでにラベルがあるので新しいラベルを付けられないというエラーをBacula が通知した場合、コンソールのunmount コマンドでアンマウントし、空のテープをマウントしてlabel コマンドを再度実行する。

物理的な記録媒体はデバイスごとに違うため、label コマンドは以下のように、Storage リソースに定義されたリストを表示する。

The defined Storage resources are:
     1: File
     2: 8mmDrive
     3: DLTDrive
     4: SDT-10000
Select Storage resource (1-4):

選択しようとするドライブ用の空のテープを持っている必要がある。

次にコマンドはボリューム名を尋ねる。

Bacula が次のエラーを通知した場合は、

Media record for Volume xxxx already exists.

指定したxxxx というボリューム名がメディアデータベースに登録済みであることを意味している。定義済みのメディア(ボリューム) はlist media コマンドで確認できる(次の出力例のLastWritten 列は表示の都合上切り詰めてある)。

+---------------+---------+--------+----------------+-----/~/-+------------+-----+
| VolumeName    | MediaTyp| VolStat| VolBytes       | LastWri | VolReten   | Recy|
+---------------+---------+--------+----------------+---------+------------+-----+
| DLTVol0002    | DLT8000 | Purged | 56,128,042,217 | 2001-10 | 31,536,000 |   0 |
| DLT-07Oct2001 | DLT8000 | Full   | 56,172,030,586 | 2001-11 | 31,536,000 |   0 |
| DLT-08Nov2001 | DLT8000 | Full   | 55,691,684,216 | 2001-12 | 31,536,000 |   0 |
| DLT-01Dec2001 | DLT8000 | Full   | 55,162,215,866 | 2001-12 | 31,536,000 |   0 |
| DLT-28Dec2001 | DLT8000 | Full   | 57,888,007,042 | 2002-01 | 31,536,000 |   0 |
| DLT-20Jan2002 | DLT8000 | Full   | 57,003,507,308 | 2002-02 | 31,536,000 |   0 |
| DLT-16Feb2002 | DLT8000 | Full   | 55,772,630,824 | 2002-03 | 31,536,000 |   0 |
| DLT-12Mar2002 | DLT8000 | Full   | 50,666,320,453 | 1970-01 | 31,536,000 |   0 |
| DLT-27Mar2002 | DLT8000 | Full   | 57,592,952,309 | 2002-04 | 31,536,000 |   0 |
| DLT-15Apr2002 | DLT8000 | Full   | 57,190,864,185 | 2002-05 | 31,536,000 |   0 |
| DLT-04May2002 | DLT8000 | Full   | 60,486,677,724 | 2002-05 | 31,536,000 |   0 |
| DLT-26May02   | DLT8000 | Append |  1,336,699,620 | 2002-05 | 31,536,000 |   1 |
+---------------+---------+--------+----------------+-----/~/-+------------+-----+

指定されたボリュームがまだ登録されていないことが確認できたら、Bacula はそのボリュームを構成要素として登録するプールの名前を尋ねる。Default というデフォルトのプールしかない場合には、それが自動的に選択される。

テープにラベルを書き込めたら、指定したプールの中にボリュームが登録される。その後list
pools コマンドを実行すると、ボリューム名と関連する他の属性が表示される。さらに、ボリュームのメディアタイプががストレージデーモンの要求と一致するなら、バックアップに利
用できる。

テープにラベルを付けるときに指定しなければならない項目は、通常はボリューム名と状況によってはスロット番号だけである。しかし、カタログに保存されるボリュームに関する情報(メディアレコード) には多数の属性が記録される。これらの属性の大部分には、プールに対して定義された値がデフォルト値として入る。すなわち、ボリュームを新たに作成するときに必要なデフォルト属性のほとんどがプールに記録されている。

ボリュームに物理的ラベルをつけることなく、メディアをプールに追加することもできる。これにはadd コマンドを使う。詳しくは、Bacula Enterprise Console Manual のConsole chapter(chapter 1 on page 1) の章を参照。

カテゴリー: