使用bacula实现Linux的远程备份和还原

Bacula,被誉为开源软件中最好的备份还原软件,它提供了企业级的客户机/服务器的备份解决方案,能够通过网络来管理文件的备份,恢复和核实工作。Bacula,既有windows版本的,也有Linux,Unix的。但目前有关于其使用的文章是在太少,而且介绍的很不详细,今天,我就来和大家一起探讨一下。(最新版本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"     # 要和RHEL5上bacula-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"    # 要和client上bacula-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 = [email protected] = all, !skipped

operator = [email protected] = 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 = [email protected] = 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.conf中director中一致

}

现在启动进程

终于配置完毕,但还有关键的一步,添加存储介质

黄色的是要输入的部分。现在就已经进入到控制台了。

配置客户机(需要备份的client):

1,  编译安装bacula

然后make和make 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下看看

哈哈,看见了吧,刚才删掉的文件现在全部回来了

四,最后

因为手头上没有现成的资料,加上本人英语水平有限,有不足的地方还请大家谅解。

时间: 2024-12-28 13:40:58

使用bacula实现Linux的远程备份和还原的相关文章

LinuxShell脚本之利用rsync+ssh实现Linux文件系统远程备份

功能介绍: 该脚本用于定期(结合crontab一起使用)将本地目录通过rsync+ssh传输到远程服务器,每次执行都生成一个带有以时间命名的目录,并且当前最新版本的数据链接到一个名字叫current的符号链接上,便于查找和恢复.在数据传输完成前,会传输到临时目录下,这个临时目录被命名为"时间-incomplete".超过10天的备份将被删除,超过10天的日志文件也将被删除. 运行原理: 脚本运行的核心就在于ssh的互信和rsync命令.利用rsync能实现压缩传输,节省传输时间. 感谢

linux下远程备份mysql数据库

本次环境主要是远程备份mysql数据库的一种常见方法,对于其他知识不做太多讲解. 环境需求: 两台linux:一台mysql数据库服务器,另一台当作客户端用来做备份. 环境目标: 实现mysql数据库的远程备份 例子: (A为服务端ip为192.168.1.1    B为客户端ip为192.168.1.2) 1.首先你得在A上建立一个数据库(建立数据库名称我以 xianyu 为例) create database xianyu;   (建立数据库xianyu) 2.在A上建立一个数据库用户用来做

Linux FTP远程备份shell脚本命令

定期备份各服务器的动摇资料,到ftp服务器,注意主动模式和被动模式区别 #!/bin/bash #主动FTP对服务端有利,客户端iptables关闭,客户端需要执行passsiveh后上传数据 #被动FTP对客户端有利,服务端iptables关闭,Linux客户端ftp登陆后不需要执行passive命令,可上传 # #vim /etc/sysconfig/iptables #开放防火墙端口主动模式下,客户端防火墙需要关闭 #-A INPUT -p tcp --dport 20 -j ACCEPT

Linux下远程备份、上传工程,重启服务器

Linux服务器实现远程,原项目的备份.删除,新项目上传,以及远程重启服务器!分成一个主shell调用三个shell文件步骤完成.mainsh.sh一次按顺序执行多个脚本,将三步sh顺序完成: #!/bin/sh 02.#此Shell一次按顺序执行多个脚本 03.#参数:: 04. #远程jboss服务器所在的ip 05. IP=127.0.0.1 06. #服务器登录账户 07. userx='tskk' 08. #服务器登录密码 09. passx='sasa' 10. #部署jboss远程

Mysql的备份与还原(win系统+Linux系统)

一.Win系统下mysql备份与还原: 1,备份: 开始->运行->cmd,进入到mysql的bin文件夹: mysqldump  -u 用户名 -p databasename >exportfilename 输入密码即可导出数据库. 2,还原: 进入到mysql命令行,"mysql>",创建要还原的数据库: create database databasesname: 进入到创建的数据库中,并且还原: use databasename: source expo

Ubuntu16.04系统的备份与还原

本文目的在于记录在命令行的模式下进行linux系统的备份与还原,虽然系统的备份方法有很多种,但本文只记录最简单粗暴的一种: 首先成为root用户:$ sudo su 然后进入文件系统的根目录(当然,如果你不想备份整个文件系统,你也可以进入你想要备份的目录,包括远程目录或者移动硬盘上的目录):# cd / 下面是我用来备份系统的完整命令:# tar cvpzf backup.tgz --exclude=/proc --exclude=/lost+found --exclude=/backup.tg

linux实现自动远程备份(scp+ssh)

刚上线的服务器需要备份日志,要备份到另一台服务器上去,为了减少工作量,采用linux的定时任务去自动执行.因服务器都是linux的,因此采用linux的远程复制scp命令.但这里涉及到一个问题,就是scp命令执行时需要输入密码,在网上大概搜集了下有两种方法:①一种是采用except方法(会存储明文密码):②采用ssh生成密钥的方式.这里我采用第二种方式. 备份方式:拷贝前一天的日志文件到备份服务器,再压缩后删除复制的本地文件.日志文件每天都会产生,格式都为access_20151214类似的文件

Linux Shell脚本之Gitlab远程备份

注:Gitlab是一个git服务程序,有web图形界面和一系列管理工具,具体详细介绍可以Google it. 这一篇可以说是上一篇<Linux Shell脚本之Atlassian confluence远程备份方法>的姊妹篇.其说明和原理是和上一篇是一样的,其核心原理都是core dump.scp.ssh和find+rm,但也有不同. 1.Gitlab本身提供了较好的备份方法,只是一个命令那么简单,并且它也支持远程备份(远程存储和云存储),例如它可以存储到aws的s3上. 2.本脚本运行在Git

Linux Shell脚本之Atlassian confluence远程备份方法

注:Atlassian confluence是一个较专业的wiki程序,由java语言写成,其详细介绍可以Google it(一点美中不足,java占用内存还是比较大的). 该脚本的设计思路是根据Atlassian confluence官方提供的文档说明写的,主要是备份一些配置文件,上传的一些附件之类的其他文件以及数据库,其数据库支持多种数据库,这次我采用的是PostgreSQL数据库,你可以使用自己熟悉的数据库,如MySQL. 问题释疑: 1.为什么不使用rsync而是使用scp作为远程文件传