zoukankan      html  css  js  c++  java
  • 使用bacula实现Linux的远程备份和还原

    Bacula,被誉为开源软件中最好的备份还原软件,它提供了企业级的客户机/服务器的备份解决方案,能够通过网络来管理文件的备份,恢复和核实工作。Bacula,既有windows版本的,也有LinuxUnix的。但目前有关于其使用的文章是在太少,而且介绍的很不详细,今天,我就来和大家一起探讨一下。(最新版本2.4.3主页 [url]http://www.bacula.org[/url]
    一,bacula的模型
    为了部署bacula,应该了解它的主要组件。
     
     
     
    控制器是协调备份,恢复和校验操作的守护进程。用户可以通过控制台向控制守护进程提交任务。控制台不一定非要和控制守护进程在同一台机器上,可以分离。
    存储守护进程是用来写入备份数据或者读取备份数据的。它必须安装在提供存储的机器上。也就是安装了磁带机或者要将备份存放的服务器上。它和控制守护进程可以分离,不一定要安装在一起。
    文件守护进程安装在每台需要备份数据的系统上。比如,你想备份网络中的某台文件服务器上的数据,那么,你就应该将文件守护进程安装在此台服务器上。
    编目是一个数据库,它保存所有备份的每个文件和卷的信息。所以,它需要数据库软件的支持,现在bacula支持mysql,postgresql和sqlite。
     
    二,设置
    试验环境如下:有两台linux主机,
    一台主机名为RHEL5(以下简称server),ip为192.168.0.5,系统为RHEL 5.1,角色为备份服务器兼存储服务器(另挂一块磁盘到/tmp/test/下作为存储)
    另一台主机名为client。Ip是192.168.0.6,系统是RHEL5.1,角色为需要备份的主机(这里我们以/boot为要备份还原的目录)
     
    准备工作:在server上安装mysql和gcc环境(bacula编译需要gcc),并启动mysql
              在client上只需安装gcc环境
     
    配置服务器server
    1, 解压编译安装bacula:
     
    然后是make和make install
    默认情况,bacula安装在/etc/bacula/目录下
     
     
    2,创建mysql脚本
       Bacula已经为我们建好了脚本,直接运行就OK,一共3个。如果不运行,后面9101端口是起不来的。
     
     
     
    3,修改配置
    作为存储服务器兼控制台,现在需要依次对bacula-dir.Conf(管全局)  bacula.sd.conf(管存储)和bconsole.conf(管控制台)配置文件进行修改。
     
    bacula-dir.conf是最复杂的一个文件,它一共有10个逻辑段:
    director(定义全局),
    catalog(定义日志),
    jobdefs(定义备份的默认值)
    job(定义特定操作),
    fileset(定义备份哪些区域不备份哪些区域),
    schedule(定义备份时间),
    pool(定义备份介质),
    client(定义要备份的主机),
    storage(定义如何存储)
    messages(定义如何处理消息)
    因为此文件比较复杂,所以我把我配置好的文件直接贴出来,一些特别重要的地方咱们拿出来讨论
     
    Director {             # 全局的一些配置       
      Name = RHEL5-dir
      DIRport = 9101               
      QueryFile = "/etc/bacula/query.sql"
      WorkingDirectory = "/var/bacula/working"
      PidDirectory = "/var/run"
      Maximum Concurrent Jobs = 1    # 定义一次能处理的并发作业数
      Password = "RTQVFEti4EAPrGLJV+xn+/7ScFU0D+iDs5OWCvy354uI"   # 这个地方必须与控制台所在主机上的bconsole.conf一致,这里是本机
      Messages = Daemon
    }
     
    JobDefs {
      Name = "DefaultJob"
      Type = Backup
      Level = Incremental
      Client = RHEL5-fd   # 如果本机也需备份就在后面去定义RHEL5-fd为本机
      FileSet = "Full Set"
      Schedule = "WeeklyCycle"
      Storage = File
      Messages = Standard
      Pool = Default
      Priority = 10
    }
     
    Job {                           # 定义一个任务
      Name = "Client"       # 任务的名称   后面咱们可以在bacula的控制台中看到
      Client = Client    # 引用后面定义的客户端“Client”,表示此任务对名字叫client主机进行操作
      JobDefs = "DefaultJob"
      Write Bootstrap = "/var/bacula/working/Client1.bsr"  #定义备份的引导信息放在什么地方
      Level = Full           #定义备份类型为完全
    FileSet = "Full Set"     #备份的范围根据后面定义的名叫“Full Set”的操作
      Schedule = "WeeklyCycleAfterBackup"  #备份计划任务按"WeeklyCycleAfterBackup" 定义的执行
    }
     
    Job {
      Name = "BackupCatalog"
      JobDefs = "DefaultJob"
      Level = Full
      FileSet="Catalog"
      Schedule = "WeeklyCycleAfterBackup"
      RunBeforeJob = "/etc/bacula/make_catalog_backup bacula bacula"
      RunAfterJob  = "/etc/bacula/delete_catalog_backup"
      Write Bootstrap = "/var/bacula/working/BackupCatalog.bsr"
      Priority = 11                   # run after main backup
    }
     
    Job {
      Name = "RestoreFiles"
      Type = Restore
      Client=RHEL5-fd  #这里就是指的RHEL5这台主机自己
      FileSet="Full Set"
      Storage = File
      Pool = Default
      Messages = Standard
      Where = /bacula-restores
    }
     
    FileSet {
      Name = "Full Set"
      Include {
        Options {
       signature = MD5
        }
         File = /boot     # 备份的范围,这里我根据需要只备份了/boot分区,如果要备份其他可加入相应路径
      }
     
      Exclude {       # 排除的,不备份的内容
        File = /proc
        File = /tmp
        File = /.journal
        File = /.fsck
      }
    }
     
    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
    }
     
    Schedule {
      Name = "WeeklyCycleAfterBackup"
      Run = Full sun-sat at 23:10
    }
     
    FileSet {
      Name = "Catalog"
      Include {
        Options {
          signature = MD5
        }
                                 
    File = /var/bacula/working/bacula.sql
      }
    }
     
    Client {
      Name = RHEL5-fd
      Address = 192.168.0.5        # 指定了RHEL5这台主机的地址,如果有DNS可以写FQDN
      FDPort = 9102
      Catalog = MyCatalog
      Password = "f/4eSVt8B+tvY8fsWerClwGwWxnMRIgung8h+zWb4tRv"     # 要和RHEL5bacula-fd.conf的一致
      File Retention = 30 days            # 30 days
      Job Retention = 6 months            # six months
      AutoPrune = yes                     # Prune expired Jobs/Files
    }
     
    Client {
      Name = Client       # 前面引用过的client就是在这定义的
      Address = 192.168.0.6    # 告诉服务器client在什么地方
      FDPort = 9102
      Catalog = MyCatalog
      Password = "f/4eSVt8B+tvY8fsWerClwGwWxnMRIgung8h+zWb4tRv2"    # 要和clientbacula-fd.conf的一致
      File Retention = 30 days            # 30 days
      Job Retention = 6 months            # six months
      AutoPrune = yes                     # Prune expired Jobs/Files
    }
     
    Storage {            #定义存储服务器
      Name = File
      Address = 192.168.0.5                # 告诉服务器数据存储在哪台机器上。这里是主机自己。
      SDPort = 9103
      Password = "oTJC6wYD/kTLcptwdReP/Gl7xxqngURQdZZfQINCeMzd"  # 要和本机bacula-sd.conf上一致
                                                              
    Device = FileStorage
      Media Type = File  # 定义以文件方式存储
    }
     
     
    Catalog {   # 关于日志和数据库的定义
      Name = MyCatalog
      dbname = "bacula"; dbuser = "bacula"; dbpassword = ""
    }
     
    Messages {
      Name = Standard
      mailcommand = "/sbin/bsmtp -h localhost -f "(Bacula) <%r>" -s "Bacula: %t %e of %c %l" %r"
      operatorcommand = "/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/bacula/working/log" = all, !skipped
    }
     
     
    Messages {
      Name = Daemon
      mailcommand = "/sbin/bsmtp -h localhost -f "(Bacula) <%r>" -s "Bacula daemon message" %r"
      mail = root@localhost = all, !skipped
      console = all, !skipped, !saved
      append = "/var/bacula/working/log" = all, !skipped
    }
    Pool {
      Name = Default
      Pool Type = Backup
      Recycle = yes                       # Bacula can automatically recycle Volumes
      AutoPrune = yes                     # Prune expired volumes
      Volume Retention = 365 days         # one year
    }
     
    Pool {
      Name = Scratch
      Pool Type = Backup
    }
     
    Console {
      Name = RHEL5-mon
      Password = "YZDfclvKrfWVkmGdGtWygMOR8ZOX7XK7MYvaFd1dIraN"
      CommandACL = status, .status
    }
     
    第二个文件bacula-sd.conf
        Storage {                             # 定义存储。本例中是自己RHEL5
      Name = RHEL5-sd
      SDPort = 9103                  # 存储端口     
      WorkingDirectory = "/var/bacula/working"
      Pid Directory = "/var/run"
      Maximum Concurrent Jobs = 20
    }
     
    Director {
      Name = RHEL5-dir
      Password = "oTJC6wYD/kTLcptwdReP/Gl7xxqngURQdZZfQINCeMzd"  # bacula-dir.conf中对应的Storage项一致
    }
     
    Director {
      Name = RHEL5-mon
      Password = "xyqzFcPkpqwmQm7BD5OhegyynhOhFHcNZWoIfMZN2bY5"
      Monitor = yes
    }
    Device {
      Name = FileStorage
      Media Type = File
      Archive Device = /tmp/test         # 定义备份到什么地方
      LabelMedia = yes;                   # lets Bacula label unlabeled media
      Random Access = Yes;
      AutomaticMount = yes;               # 如果设备可用,则读取
      RemovableMedia = no;
      AlwaysOpen = no;
    }
    Messages {
      Name = Standard
      director = RHEL5-dir = all
    }
     
    最后一个文件bconsole.conf
    Director {
      Name = RHEL5-dir
      DIRport = 9101
      address = 192.168.0.5          # 服务器位置
      Password = "RTQVFEti4EAPrGLJV+xn+/7ScFU0D+iDs5OWCvy354uI"  # bacula-dir.confdirector中一致
    }
    现在启动进程
     
    终于配置完毕,但还有关键的一步,添加存储介质
     
     
    黄色的是要输入的部分。现在就已经进入到控制台了。
    配置客户机(需要备份的client):
    1,  编译安装bacula
     
    然后makemake install
    默认安装在/etc/bacula/目录下
    1,  改配置文件 bacula-fd.conf
      Director {
      Name = RHEL5-dir  # 与服务器上的bacula-dir.conf中一致
      Password = "f/4eSVt8B+tvY8fsWerClwGwWxnMRIgung8h+zWb4tRv2"  # 与服务器上的bacula-dir.conf中一致
    }
    Director {
      Name = RHEL5-mon        # 与服务器上的bacula-dir.conf中一致
      Password = "yqzFcPkpqwmQm7BD5OhegyynhOhFHcNZWoIfMZN2bY5"  # 与服务器上的bacula-dir.conf中一致
      Monitor = yes
    }
    FileDaemon {                       
      Name = Client       # 指自己
      FDport = 9102                  # 监听端口r
      WorkingDirectory = /var/bacula/working
      Pid Directory = /var/run
      Maximum Concurrent Jobs = 20
    }
    Messages {
      Name = Standard
      director = Client-dir = all, !skipped, !restored
    }
    客户端相对配置较简单。改这一个文件就行了。
    然后启动进程
     
     
    三,验证
    经过了艰苦的工作,现在到了享受结果的时候了(呵呵,这个东东我已经弄了3天了,痛苦呀)
    咱们现在先备份client下的/boot目录吧
    server
     
    接着
     
    可以通过status查看状态
     
     
    呵呵,看见OK了吗,备份成功了哟
     
    接下来咱们来做还原,首先咱们把client上的/boot中的文件删除掉
     
    现在回到server上来还原(还是在控制台)
     
    显示如下提示
     
    接着标记要还原内容,并且执行
     
    这个地方注意一下,如果要还原到client原位置则按以下步骤
     
    现在再回到client下看看
     
    哈哈,看见了吧,刚才删掉的文件现在全部回来了
     
    四,最后
    因为手头上没有现成的资料,加上本人英语水平有限,有不足的地方还请大家谅解。
  • 相关阅读:
    SQL: 返回刚插入记录的ID 及 output 更新记录时得到更新记录的ID值 .
    asp.net 用伪静态修改webconfig配置文件 .
    Asp.Net : 捕捉和记录网站中出现的所有未处理错误,抛出详细的页面来源和访问ip,调用的接口方法及异常实例(记事本日志,系统日志及数据库日志)
    js闭包(转载) (jquery ajax 异步 多循环运用 )
    c# enum 枚举名称和ID 互换获取.................
    WCF :服务开发与调用的完整示例
    关于DataSet 、 DataTable 、 ArrayList 、 IList 、Array
    Expression Tree不完全入门
    WF4 Beta2:IExecutionProperty的使用
    Groovy 1.8.9, 2.0.7 和 2.1.1 发布
  • 原文地址:https://www.cnblogs.com/timssd/p/4406699.html
Copyright © 2011-2022 走看看