一、什么是bacula?
  BaculaBacula是一款开源的跨平台网络备份工具,提供基于企业级的CS的备份解决方案。可以对数据进行备份、恢复、以及完整性校验。
功能特点:
支持完全备份,增量备份,差异备份。
支持多种恢复方式
支持多种文件系统下的备份恢复(ext3、ext2、reiserfs、xfs、jfs、smbfs、iso9660、ntfs等)
支持各种备份介质
支持多种操作系统
强大的内部功能

二、bacula的基本组成
 一个完整的bacula备份系统,由下面5个部分组成
Director Daemon:负责监听所有的备份、恢复、验证、存档事务,以及定制备份和恢复文件计划等,并将整个系统运行状况记录在一个数据库文件中。推荐使用mysql,其配置文件为bacula-dir.conf。
Storage Daemon(SD):主要负责将数据备份到存储介质上,而在数据恢复时,负责将数据从存储介质中传送出去。其配置文件为bacula-sd.conf。
File Daemon(FD):安装在需要备份数据的机器上的守护进程,在备份数据时,它负责把文件传出,在恢复数据时负责接收数据并执行恢复操作。配置文件为bacula-fd.conf。
Console:管理控制台。可以通过这个控制台连接到Director Daemon进行管理备份与恢复操作。
Monitor:进程监控端。 负责监控Director Daemon、Storage Daemon和File Daemon的守护进程。bacula备份系统的组成如图1所示。  

三、bacula的恢复流程
1、通过console连接到Director端,备份恢复操作开始。
2、Director端从自己的数据库中调出记录信息,对存储端SD与客户端FD的任务进行协调。
3、客户端FD负责验证Director的操作许可,如果验证通过,则允许连接到存储端SD
4、客户端FD根据Director发出的请求去连接SD,将FD端的数据备份到存SD指定的存储介质上,或者将SD端存储介质中的数据传回到客户端FD指定的位置上,完成备份恢复过程。
   需要注意的是,在bacula的整个备份恢复系统中,客户端FD和SD要保证网络连接畅通,为了保证备份以及恢复数据的速度和效率,最好让客户端FD和SD处在一个网段中。


四、bacula的几种网络备份拓扑
前面介绍了bacula有5个组成部分,在实际的应用中,没有必要将5个部分分别放在不同的服务器上,它们之间的某些部分是可以合并的,常见的bacula部署结构有如下几种:
Director与SD以及Console在一台机器上,而客户端FD在另外一台机器上,当然客户端FD可以有一台或者多台上。
Director与Console在一台机器上,SD在一台机器上,客户端FD在一台或者多台上。
Director与客户端FD、SD以及Console端都在一台机器上,也就是服务器自己备份自己,数据保存在本机。

五、编译安装bacula

一个bacula的部署环境
--------------------------------------------------------------------------------------
   主机名                 ip地址            操作系统                    应用角色
--------------------------------------------------------------------------------------
 baculaserver        192.168.137.194       centos 5.3             Director,SD,Console
 baculaclient        192.168.137.194       centos 5.3                     FD
--------------------------------------------------------------------------------------

1.在服务器端安装bacula
tar xzvf bacula-5.2.6.tar.gz
cd bacula-5.2.6
./configure --prefix=/usr/local/bacula --with-mysql=/data/mysql
make install
bacula需要数据库的支持,这里采用的是mysql,mysql已经安装在/data/mysql

2.在bacula客户端安装bacula
tar xzvf bacula-5.2.6.tar.gz
cd bacula-5.2.6
./configure --prefix=/usr/local/bacula --enable-client-only
make
make install

3.初始化mysql数据库
在bacula服务器端执行,初始化mysql的脚本
cd /usr/local/bacula/etc/
./grant_mysql_privileges
./create_mysql_database
./make_mysql_tables

注意:在执行上面三行mysql初始化代码时,默认由空密码的root用户执行。

六、配置一个bacula备份系统
根据上面的安装已经将Director,SD,Console安装在一台服务器baculaserver上。

1.配置bacula的Console端
Console端的配置文件是bconsole.conf,内容如下:
Director {
    Name = baculaserver.test.com-dir
    DIRport = 9101
    address = 192.168.137.194
    Password = "hHcQvwpl7ZUSBNBKrxjpelRnbI5i0wzb5hy3w5a/oUiv"
}


2.配置bacula的Director端
•Director端的配置文件是bacula-dir.conf,bacula-dir.conf是核心配置文件,该文件非常复杂共分10个逻辑段,分别是:
•Director,定义全局设置
•Catalog,定义后台数据库
•Jobdefs,定义默认执行任务
•Job,自定义一个备份或者恢复任务
•Fileset,定义备份哪些数据,不备份哪些数据
•Schedule,定义备份时间策略
•Pool,定义供Job使用的池属性
•Client,定义要备份的主机地址
•Storage,定义数据的存储方式
•Messages,定义发送日志报告和记录日志的位置

下面是一个配置好的文件

Director {
    Name = baculaserver.test.com-dir
    DIRport = 9101
    QueryFile = "/usr/local/bacula/etc/query.sql"
    WorkingDirectory = "/usr/local/bacula/var/bacula/working"
    PidDirectory = "/var/run"
    Maximum Concurrent Jobs = 1
    Password = "hHcQvwpl7ZUSBNBKrxjpelRnbI5i0wzb5hy3w5a/oUiv"
    Messages = Daemon
}

Job {
    Name = "Client1"                            #自定义一个备份任务
    Type = Backup                              #定义的Job类型,backup为备份任务,可选的类型还有restore和verify
    Level = Incremental                     #定义备份级别Incremental为增量备份,Differential为差异备份
                                                     #如果第一次没有做完全备份,则先进行完全备份再进行Incremental。
    Client = dbfd                                 #指定要备份的客户端主机,dbfd在后面的Client逻辑段中进行定义。
    FileSet = dbfs                                #指定要备份的客户端数据,dbfs在后面的FileSet逻辑段中进行定义。
    Schedule = "dbscd"                   #指定这个备份的执行时间策略,dbscd在后面的Schedule逻辑段中进行定义。
    Storage = dbsd                        #指定备份数据的存储路径与介质,dbsd在后面的Storage逻辑段中进行定义。
    Messages = Standard                    
    Pool = dbpool                            #指定备份使用的pool属性,dbpool在后面的Pool逻辑段中进行定义。
    Priority = 10
    Write Bootstrap = "/usr/local/bacula/var/bacula/working/Client2.bsr"    #指定备份的引导信息路径。
}

Job {
    Name = "Client" #一定一个名字为Client的差异备份任务
    Type = Backup
    Level = Differential
    Client = dbfd
    FileSet = dbfs
    Schedule = "dbscd"
    Storage = dbsd
    Messages = Standard
    Pool = dbpool
    Priority = 10
    Write Bootstrap = "/usr/local/bacula/var/bacula/working/Client1.bsr"
}

Job {
    Name = "BackupCatalog" #定义一个名为BackupCatalog的完全备份任务
    Type = Backup
    Level = Full
    Client = dbfd
    FileSet = dbfs
    Schedule = "dbscd"
    Storage = dbsd
    Messages = Standard
    Pool = dbpool
    Priority = 10
    RunBeforeJob = "/usr/local/bacula/etc/make_catalog_backup bacula bacula"
    RunAfterJob = "/usr/local/bacula/etc/delete_catalog_backup"
    Write Bootstrap = "/usr/local/bacula/var/bacula/working/BackupCatalog.bsr"
}

#定义一个还原任务
Job {
    Name = "RestoreFiles"
    Type = Restore
    Client = dbfd
    FileSet = dbfs
    Storage = dbsd
    Messages = Standard
    Pool = dbpool
    where = /data/bacula-Restores #指定默认恢复数据到这个路径
}

FileSet {                            #定义一个名为dbfs的备份资源,也就是指定需要备份那些数据,
                                             #需要排除那些数据,可以指定多个FileSet
    Name = dbfs
    Include {
        Options {
            signature = MD5    #表示使用MD5加密并压缩
            Compression = GZIP
        }
        File = /data             #指定客户端FD需要备份的文件目录
    }

    Exclude {                        #通过Exclude排除不需要备份的文件或者目录
        File = /usr/local/bacula/var/bacula/working
        File = /tmp
        File = /proc
        File = /tmp
        File = /.journal
        File = /.fsck
    }
}

Schedule {                                 #定义一个名为dbscd的备份任务调度策略
    Name = "dbscd"            
    Run = Full 1st sun at 23:05 #第一周的星期日晚上23:05进行完全备份
    Run = Differential 2nd-5th sun at 23:05 #第2-5周的星期日晚上23:05进行差异备份
    Run = Incremental mon-sat at 23:05            #所有周一至周六晚上23:05进行增量备份
}

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

Client {                                                     #Client用来定义备份哪个客户端的FD数据
    Name = dbfd                                            #Client的名称可以在前面的Job中调用
    Address = 192.168.137.195                #要备份的客户端FD主机的IP地址
    FDPort = 9102                                   #与客户端FD通信的端口
    Catalog = MyCatalog         #使用哪个数据库存储信息,“MyCatalog”在后面的MyCatalog逻辑段中进行定义
                                         #Director端与客户端FD的验证密码,
                                         #这个值必须与客户端FD配置文件bacula-fd.conf中密码相同
    Password = "B/mFX9D8LAo/it7VmA8GAkKwF1jl5DJZcD0T4GjRvCk6"
    File Retention = 30 days         #指定保存在数据库中的记录多久循环一次,
                                              #这里是30天,只影响数据库中的记录不影响备份的文件
    Job Retention = 6 months                 #指定Job的保持周期,应该大于File Retention指定的值
    AutoPrune = yes                     #当达到指定的保持周期时,是否自动删除数据库中的记录,
                                               #yes表示自动清除过期的Job
}

Client {
    Name = dbfs1
    Address = 192.168.137.196
    FDPort = 9102
    Catalog = MyCatalog
    Password = "B/mFX9D8LAo/it7VmA8GAkKwF1jl5DJZdfas4GjRvCk6"
    File Retention = 30 days
    Job Retention = 6 months
    AutoPrune = yes
}

Storage {                                                    # Storage用来定义将客户端的数据备份到哪个存储设备上
    Name = dbsd                                            
    Address = 192.168.137.194                #指定存储端SD的IP地址
    SDPort = 9103                                        
                                               #Director端与存储端SD的验证密码,这个值必须
                                               #与存储端SD配置文件bacula-sd.conf中Director逻辑段密码相同
    Password = "E2R4gI+kVChdU2GbzZznk59sX8IZzQwfhWf+ZYSrp7zc"
    Device = dbdev                                     #指定数据备份的存储介质,必须与存储端的bacula-sd.conf
                                                              #配置文件中的Device逻辑段的Name项名称相同
    Media Type = File                                #指定存储介质的类别,必须与存储端SD的bacula-sd.conf
                                                            #配置文件中的Device逻辑段的Media Type项名称相同
}

Catalog {
    Name = MyCatalog                                 # Catalog逻辑段用来定义关于日志和数据库设定
    dbname = "bacula"; dbuser = "bacula"; dbpassword = ""
}

Messages {                                                 #Messages逻辑段用来设定Director端如何保存日志,
                                                               #以及日志的保存格式,可以将日志信息发送到管理员邮箱,
                                                               #前提是必须开启sendmail服务
    Name = Standard
    mailcommand = "/usr/local/bacula/sbin/bsmtp -h localhost -f \"\(Bacula\) \<%r\>\" -s \"Bacula: %t %e of %c %l\" %r"
    operatorcommand = "/usr/local/bacula/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 = "/usr/local/bacula/var/bacula/working/log" = all, !skipped
    append = "/usr/local/bacula/var/bacula/working/err" = error, warning, fatal
    catalog = all
}


Messages {                  #定义了一个名为Daemon的Messages逻辑段,Daemon已经在前面进行了引用
    Name = Daemon
    mailcommand = "/usr/local/bacula/sbin/bsmtp -h localhost -f \"\(Bacula\) \<%r\>\" -s \"Bacula daemon message\" %r"
    mail = root@localhost = all, !skipped                        
    console = all, !skipped, !saved
    append = "/usr/local/bacula/var/bacula/working/log" = all, !skipped
}

Pool {                                                        #定义供Job任务使用的池属性信息,例如,
                                                                #设定备份文件过期时间、是否覆盖过期的备份数据、
                                                                 #是否自动清除过期备份等
    Name = dbpool
    Pool Type = Backup
    Recycle = yes                                        #重复使用
    AutoPrune = yes                                    #表示自动清除过期备份文件
    Volume Retention = 7 days                #指定备份文件保留的时间
                                        #设定备份文件的命名格式,这个设定格式
                                        #会产生的命名文件为:db-2010-04-18-id139
    Label Format = "db-${Year}-${Month:p/2/0/r}-${Day:p/2/0/r}-id${JobId}"
    #Maximun Volumes = 7                         #设置最多保存多少个备份文件
    Recycle Current Volume = yes         #表示可以使用最近过期的备份文件来存储新备份
    #Maximun Volume Jobs = 1                 #表示每次执行备份任务创建一个备份文件
    
}

Console {                                                    #限定Console利用tray-monitor获得Director的状态信息
    Name = baculaserver.test.com-mon
    Password = "SJ5PnV7A992M3p1LQ+pUidDVaXUVK6ImFbC4we8IfbJR"
    CommandACL = status, .status
}


3.配置bacula的SD端
SD可以是一个单独的服务器,也可以和Director在一台机器上,我们现在把SD端和Director端
放在同一台机器上。SD的配置文件是bacula-sd.conf,配置文件如下:
Storage {                                    #定义存储
    Name = baculaserver.test.com-sd ##定义存储名称
    SDPort = 9103                         #监听端口
    WorkingDirectory = "/usr/local/bacula/var/bacula/working"
    Pid Directory = "/var/run"
    Maximum Concurrent Jobs = 20
}

Director {                                 #定义一个控制StorageDaemon的Director
    Name = baculaserver.test.com-dir    #这里的“Name”值必须和Director端
                                                   #配置文件bacula-dir.conf中Director逻辑段名称相同同
                                      #这里的“Password”值必须和Director端配置文件
                                      #bacula-dir.conf中Storage逻辑段密码相同
    Password = "E2R4gI+kVChdU2GbzZznk59sX8IZzQwfhWf+ZYSrp7zc"
}

Director {                                 #定义一个监控端的Director
    Name = baculaserver.test.com-mon    #这里的“Name”值必须和DiDrector端配置
                                                        #文件bacula-dir.conf中Console逻辑段名称相同
                                        #这里的“Password”值必须和Director端配置文件
                                        #bacula-dir.conf中Console逻辑段密码相同
    Password = "SJ5PnV7A992M3p1LQ+pUidDVaXUVK6ImFbC4we8IfbJR"
    Monitor = yes
}
Device {                                        #定义Device
    Name = dbdev                            #定义Device的名称,这个名称在Director
                                                   #端配置文件bacula-dir.conf中的Storage逻辑段Device项中被引用

    Media Type = File                 #指定存储介质的类型,File表示使用文件系统存储
    Archive Device = /data/webdata #Archive Device用来指定备份存储的
                                                 #介质,可以是cd、dvd、tap等,这里是将
                                                  #备份的文件保存的/data/webdata目录下
    LabelMedia = yes;                                     ##通过Label命令来建立卷文件
    Random Access = Yes;                                #设置是否采用随机访问存储介质,这里选择yes
    AutomaticMount = yes;                             ##表示当存储设备打开时,是否自动使用它,这选择yes
    RemovableMedia = no;                                #是否支持可移动的设备,如tap或cd,这里选择no
    AlwaysOpen = no;                    #是否确保tap设备总是可用,这里没有使用tap设备,因此设置为no
}

Messages {                                                        #为存储端SD定义一个日志或消息处理机制
    Name = Standard
    director = baculaserver.test.com-dir = all
}


4.配置bacula的FD端
客户端FD运行在一台独立的服务器上,也就是我们需要备份的服务器,
它的配置文件为bacula-fd.conf,内容如下:
Director {                             #定义一个允许连接FD的控制端
    Name = baculaserver.test.com-dir           #这里的“Name”值必须和Director端配置
                                                            #文件bacula-dir.conf中Director逻辑段名称相同
                         #这里的“Password”值必须和Director端配置文件bacula-dir.conf中Client逻辑段密码相同
    Password = "B/mFX9D8LAo/it7VmA8GAkKwF1jl5DJZcD0T4GjRvCk6"
}

Director {                            #定义一个允许连接FD的监控端
    Name = baculaclient.test.com-mon
    Password = "nroBCq6jNavbl56NHPeddMNrPAFncR/1DO5hUzvqiLu8"
    Monitor = yes
}

FileDaemon {                     #定义一个FD端
    Name = baculaclient.test.com-fd
    FDport = 9102
    WorkingDirectory = /usr/local/bacula/var/bacula/working
    Pid Directory = /var/run
    Maximum Concurrent Jobs = 20    #定义一次能处理的并发作业数
}

Messages {                #定义一个用于FD端的Messages
    Name = Standard
    director = baculaclient.test.com-dir = all, !skipped, !restored
}


七、启动bacula的Director daemon与Storage daemon

完成上面的配置后,就可以启动或关闭bacula了。在baculaserver上启动或关闭控制端的所有服务,有如下两种方式。

第一种方式如下:
[root@baculaserver etc]# /usr/local/bacula/sbin/bacula {start|stop|restart|status}


也可以通过分别管理bacula各个配置端的方式,依次启动或者关闭每个服务:
[root@baculaserver etc]# /usr/local/bacula/etc/bacula-ctl-dir {start|stop|restart|status}
[root@baculaserver etc]# /usr/local/bacula/etc/bacula-ctl-sd {start|stop|restart|status}
[root@baculaserver etc]# /usr/local/bacula/etc/bacula-ctl-fd {start|stop|restart|status}


由于将客户端FD配置到了另一个主机baculaclient上,因此无需在baculaserver上启动File daemon服务。启动bacula的所有服务后,通过netstat命令,观察启动端口情况:
[root@localhost etc]# netstat -antl |grep 91
tcp 0 0 0.0.0.0:9101 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:9103 0.0.0.0:* LISTEN


其中,9101代表Director daemon;9102代表File daemon;9103代表Storage daemon。注意在启动bacula的所有服务前,必须启动MySQL数据库,
如果MySQL数据库没有启动,连接bacula的控制端时会报错.

八、启动bacula的File daemon
最后 ,在客户端FD(即baculaclient)上启动File daemon服务,操作如下:
[root@baculaclient etc]# /usr/local/bacula/sbin/bacula start
Starting the Bacula File daemon


管理客户端FD的服务,也可以通过以下方式完成:
[root@baculaclient etc]# /usr/local/bacula/sbin/bacula {start|stop|restart|status}
[root@ baculaclient etc]# /usr/local/bacula/etc/bacula-ctl-fd {start|stop|restart|status}