介绍
Bacula是开源的网络备份解决方案,通过它你可以构建强壮灵活的备份系统,但是bacula相对其他解决方案会稍显笨重。但是备份系统在绝大多数的服务器基础设施中尤其重要,数据恢复也是灾备的重要环节。
通过这篇文章,我们将向你展示如何在CentOS7上安装配置Bacula,并且制定一个每周备份本地文件(指备份Bacula本机)的任务。虽然通常不会这么玩,但是这将会让你更好的理解Bacula的用法。为你配置备份远程主机打下基础,我们会在下篇文章中介绍如何备份其他远程的服务器。
须知
你必须在CentOS7上有个拥有超级用户(sudo)权限的用户, 并且拥有足够的空间来储存你的备份。
配置好主机名 例如
bacula.private.example.com
可以使用
hostnamectl --sethostname 主机名
来配置。 如果你对selinux不是很熟悉,你暂时还是把它给关掉吧。 关闭方法
sed 's/enable/disable/g' /etc/sysconfig/selinux
重启即可
Bacula组件介绍
尽管Bacula是由好几个组件组成,但它遵循服务端-客户端的备份模型;简单的来讲,我们将会更多地关注备份服务器和备份客户端,而并不是Bacula的组件,当然,我们还是需要大概的了解下Bacula的组件,让我们一起看看吧 一个Bacula服务器,我们通常会叫它备份服务器,由以下组件构成:
Bacula Director (DIR): 通过文件服务(File Daemon)和存储服务(Storage Daemon)控制备份及还原操作
Storage Daemon (SD): 读取或写入备份文件至存储设备
Catalog: 把已备份文件信息写到数据库,数据库可以是 Mysql 或者 PostgreSQL
Bacula Console: 供备份系统管理员使用的命令行工具,可以用来控制Bacula Director
注意: Bacula组件不需要在同时运行在同一服务器上,但是它们一起工作才能实现备份服务器的功能。
Bacula客户端,即被备份的服务器,运行文件服务(File Damen)组件, Bacula服务器通过文件服务访问需要备份的文件,我们通常也把这些服务器叫做备份客户端或者客户端。
正如我们介绍中说的那样,我们将配置一个备份服务器并备份自己本地的文件系统,这意味着备份服务器也是备份客户端,将运行文件服务组件。
让我们开始配置吧。
安装Bacula和MySQL
Bacula使用数据库,例如MySQL或者PostreSQL,来管理备份记录. 在本文中,我们将使用MySQL的替代软件MariaDB.
通过yum安装Bacula和MariaDB:
sudo yum install -y bacula-director bacula-storage bacula-console bacula-client mariadb-server
安装完成后,启动MariaDB:
sudo systemctl start mariadb
现在MariaDB已经安装并已经运行,接下来通过以下脚本创建Bacula数据库及用户和表:
/usr/libexec/bacula/grant_mysql_privileges
/usr/libexec/bacula/create_mysql_database -u root
/usr/libexec/bacula/make_mysql_tables -u bacula
接下来,我们要运行一个简单的安全脚本,它将会移除掉一些危险的默认配置并对访问数据库的权限进行简单的配置。执行下面的命令:
sudo mysql_secure_installation
提示让你输入当前的数据库root密码,我们还没有为root设置密码所以留空就行了,直接Enter到下一步.接着会提示你是否设置root密码,根据提示设置好root密码.接下来的操作可以一路Enter到底, 使用默认设置即可,这些操作会移除掉一些示例用户及数据库,禁止root用户远程登录,重载数据库用户权限,让我们所做的操作立即生效.
现在我们需要为Bacula数据库用户设置密码 使用root用户进入MySQL console
mysql -u root -p
输入你设置的root密码
执行以下sql语句为bacula用户设置密码。注意将bacula_db_password换成你想设置的密码
UPDATE mysql.user SET Password=PASSWORD(' bacula_db_password') WHERE User='bacula';
FLUSH PRIVILEGES;
配置好后输入exit退出MySql console
配置MariaDB开机启动:
sudo systemctl enable mariadb
配置Bacula使用MySQL库
默认情况下,Bacula使用PostgreSQL库. 因为我们使用的是MySQL,所以我们需要配置使用MySQL替代下. 执行以下命令:
sudo alternatives --config libbaccats.so
你会看到一个提示, 输入1(MySQL)确认即可 输出如下
There are 3 programs which provide 'libbaccats.so'.
Selection Command
-----------------------------------------------
1 /usr/lib64/libbaccats-mysql.so
2 /usr/lib64/libbaccats-sqlite3.so
*+ 3 /usr/lib64/libbaccats-postgresql.so
Enter to keep the current selection[+], or type selection number: 1
到此为止,Bacula服务端(客户端)组件都安装好了. 接下来我们将创建备份和恢复目录.
创建备份和恢复目录
Bacula需要一个备份目录用了存储备份归档及一个恢复目录用来恢复文件.如果你的系统有多个分区,请确保创建的目录有足够的空间.
让我们创建新的目录来满足这一需要:
sudo mkdir -p /bacula/backup /bacula/restore
我们需要配置目录的权限,只让bacula进程(还有超级用户)才能访问这些目录:
sudo chown -R bacula:bacula /bacula
sudo chmod -R 700 /bacula
现在我们已经准备好开始配置Bacula Director.
配置Bacula Director
Bacula的几个组件必须独立的配置才能保证功能的正常.所有组件的配置文件都在/etc/bacula目录
我们从配置Bacula Director开始 用你最喜欢的文本编辑器打开Bacula Director配置文件,这里我们使用vi:
sudo vi /etc/bacula/bacula-dir.conf
配置Director Resource
找到Director Resourece,让它监听127.0.0.1(localhost),如下添加DirAddress这一行:
Director { # define myself
Name = bacula-dir
DIRport = 9101 # where we listen for UA connections
QueryFile = "/etc/bacula/query.sql"
WorkingDirectory = "/var/spool/bacula"
PidDirectory = "/var/run"
Maximum Concurrent Jobs = 1
Password = "@@DIR_PASSWORD@@" # Console password
Messages = Daemon
DirAddress = 127.0.0.1 #添加这一行
}
接着往下移动.
配置Local Jobs
Bacula job 是用来执行备份和恢复操作的.Job定义了一个任务将会如何操作,包括客户端名字,备份文件等其他信息. 这里,我们将配置一个job用来进行备份本地文件. 在Director配置文件中找到名字为"BackupClient1"的_Job_.把Name改成"BackupLocalFiles",如下所示:
bacula-dir.conf — Rename BackupClient1 job
Job {
Name = " BackupLocalFiles"
JobDefs = "DefaultJob"
}
接下来找到名字为"RestoreFiles"的_Job_.在这里你需要更改2处:把_job_的_name_给改成"RestoreLocalFiles",把_Where_改成"/bacula/restore".如下所示:
bacula-dir.conf — Rename RestoreFiles job
Job {
Name = " RestoreLocalFiles"
Type = Restore
Client=BackupServer-fd
FileSet="Full Set"
Storage = File
Pool = Default
Messages = Standard
Where = /bacula/restore
}
这个配置了RestoreLocalFile任务将文件恢复至我们之前创建的文件夹/bacula/restore中.
配置File Set
Bacula FileSet定义了包含或者排除的文件或者目录的信息,供Jobs使用。 找到"Full Set"这一块儿(在"# List of files to be backed up"这行后面),这里我们要改3处地方:
添加gzip压缩选项
把_/usr/bin_改为_/_,因为我们要备份整个文件系统
在Exclude section添加_File = /bacula _. 移除注释后如下所示:
bacula-dir.conf — Update "Full Set" FileSet
FileSet {
Name = "Full Set"
Include {
Options {
signature = MD5
compression = GZIP
}
File = /
}
Exclude {
File = /var/lib/bacula
File = /proc
File = /tmp
File = /.journal
File = /.fsck
File = /bacula
}
}
让我们再回顾下刚才所做的操作.首先我们打开gizp压缩,然后设置备份路径为_/_ 即根目录,其次,排除掉_/bacula_目录,因为我们不想多余的备份Bacula的备份和恢复文件.
注意: 如果你有在/分区之外的分区,你也想备份它的话,只要在FileSet中添加_include 挂载点_可以.
如果你在Jobs中经常使用大范围的的FileSets,例如"Full Set",那么你的备份比起指定范围的备份会需要更多空间.例如,一个FileSet只包含自定义的配置文件或者数据库或许就满足你的备份需求了,不过需要你比较清楚安装软件并且知道配置文件的正确位置, 这样备份就只占用很少一部分磁盘空间了.
配置Storage Daemon Connection
在_Bacula Director_配置文件中, Storage 定义了_Director_应该与哪个_Storage Daemon_连接. 我们接下来将配置_Storage Daemon_.
找到_Storage_, 把_Address_的_localhost_换成备份服务器的主机名(或者内网IP地址). 改完后应该和下面的差不多:
bacula-dir.conf — Update Storage Address
Storage {
Name = File
# Do not use "localhost" here
Address = backup_server_private_FQDN # N.B. Use a fully qualified name here
SDPort = 9103
Password = "@@SD_PASSWORD@@"
Device = FileStorage
Media Type = File
}
这一步是很必要的,因为我们要让_Storatge Daemon_监听内网网卡,这样远程的客户端才能连接它.
配置 Catalog Connection
在Bacula Director配置文件中, Catalog定义了Director与数据库的连接信息. 找到名字为_"MyCatalog"_(在"#Generic catalog service"这行后面),把_dbpassword换成我们前面设置好的密码:
bacula-dir.conf — Update Catalog dbpassword
# Generic catalog service
Catalog {
Name = MyCatalog
# Uncomment the following line if you want the dbi driver
# dbdriver = "dbi:postgresql"; dbaddress = 127.0.0.1; dbport =
dbname = "bacula"; dbuser = "bacula"; dbpassword = " bacula_db_password"
}
这样Bacula Director 就可以连接的MySQL数据库了.
配置Pool
Pool定义了Bacula备份介质的配置信息,这里我们将使用文件作为存储卷(storage volumes),另外,我们会简单的更新下标签,以便正确的标注本地备份. 找到名字为_File_的Pool(在"# File Pool definition"这行下面),然后添加一行_Label Format_. 改为应该跟下面差不多:
bacula-dir.conf — Update Pool:
# File Pool definition
Pool {
Name = File
Pool Type = Backup
Label Format = Local-
Recycle = yes # Bacula can automatically recycle Volumes
AutoPrune = yes # Prune expired volumes
Volume Retention = 365 days # one year
Maximum Volume Bytes = 50G # Limit Volume size to something reasonable
Maximum Volumes = 100 # Limit number of Volumes in Pool
}
保存并退出编辑. 你已经完成_bacula Director的配置啦.
检查Director的配置
让我们来检查下配置文件会不会有语法错误:
sudo bacula-dir -tc /etc/bacula/bacula-dir.conf
如果没有报错信息,说明你的_bacula-dir.conf没有语法错误. 接下来,我们将配置Storage Daemon
配置 Storage Daemon
我们的Bacula服务器已经配置的擦不多了,但是我们还需要配置_Storage Daemon_,这样Bacula才知道把存储放在哪儿. 用你最喜欢的文本编辑器打开SD(Storage Daemon),在这里我们还是使用vi
sudo vi /etc/bacula/bacula-sd.conf
配置 Storage Resource
在配置文件中找到Storage. 这个定义了SD进程将监听信息. 添加_SDAddress_这个参数, 并赋予它备份服务器的IP地址或者FQDN主机名:
bacula-sd.conf — update SDAddress
Storage { # definition of myself
Name = BackupServer-sd
SDPort = 9103 # Director's port
WorkingDirectory = "/var/lib/bacula"
Pid Directory = "/var/run/bacula"
Maximum Concurrent Jobs = 20
SDAddress = backup_server_private_FQDN
}
配置Storage Device
接下来,在配置文件中找到名字为"FileStorage"的_Device_,把_Archive Device_的配置更改为你的备份目录:
bacula-sd.conf — update Archive Device
Device {
Name = FileStorage
Media Type = File
Archive Device = /bacula/backup
LabelMedia = yes; # lets Bacula label unlabeled media
Random Access = Yes;
AutomaticMount = yes; # when device opened, read it
RemovableMedia = no;
AlwaysOpen = no;
}
保存并退出.
验证Storage Daemon配置文件
让我们检查下Storage Daemon配置文件是否有语法错误:
sudo bacula-sd -tc /etc/bacula/bacula-sd.conf
如果没有错误信息,则说明你的配置没有语法错误.
我们已经完成了Bacula的配置.我们已经准备好重启Bacula的各个组件了.
设置Bacula组件的密码
每个Bacula组件,例如Director,SD和FD,它们在内部通信的时候都会需要到密码(或许你已经在我们改配置文件的时候注意到了). 我们可以手动配置这些密码,但是我们并不需要知道这些密码.所以我们将使用下面的命令去生成这些密码并把它替换到Bacula的配置文件中.
以下的命令生成Director的密码. bconsole_需要连接到_Director,所以它也需要配置这个密码:
DIR_PASSWORD=`date +%s | sha256sum | base64 | head -c 33`
sudo sed -i "s/@@DIR_PASSWORD@@/${DIR_PASSWORD}/" /etc/bacula/bacula-dir.conf
sudo sed -i "s/@@DIR_PASSWORD@@/${DIR_PASSWORD}/" /etc/bacula/bconsole.conf
以下的命令生成并配置_Storage Daemon的密码. Director需要连接到SD,所以它也需要配置这个密码:
SD_PASSWORD=`date +%s | sha256sum | base64 | head -c 33`
sudo sed -i "s/@@SD_PASSWORD@@/${SD_PASSWORD}/" /etc/bacula/bacula-sd.conf
sudo sed -i "s/@@SD_PASSWORD@@/${SD_PASSWORD}/" /etc/bacula/bacula-dir.conf
以下的命令生成并配置本地File Daemon(Bacula客户端)的密码.Director需要连接到这个FD.所以他也需要配置这个密码:
FD_PASSWORD=`date +%s | sha256sum | base64 | head -c 33`
sudo sed -i "s/@@FD_PASSWORD@@/${FD_PASSWORD}/" /etc/bacula/bacula-dir.conf
sudo sed -i "s/@@FD_PASSWORD@@/${FD_PASSWORD}/" /etc/bacula/bacula-fd.conf
现在我们已经准备启动我们的Bacula组件啦!
启动Bacula组件
使用下面的命令启动Bacula Director,Storage Daemon,还有本地的File Daemon:
sudo systemctl start bacula-dir
sudo systemctl start bacula-sd
sudo systemctl start bacula-fd
如果它们都正常启动,执行下面的命令,让这些服务都开机自动启动:
sudo systemctl enable bacula-dir
sudo systemctl enable bacula-sd
sudo systemctl enable bacula-fd
让我们来跑一个备份任务以来测试下Bacula.
测试备份任务
我们将使用_Bacula Console_来运行我们的第一个备份任务.如果它爬起来木有任何问题,那就说明我们配置对啦。 现在通过以下命令键入Console:
sudo bconsole
执行完你会看到一个_*_开头的提示符.
创建Label
执行下面的命令:
label
会提示你输入一个卷名.输入任何你喜欢的名字:
Enter new Volume name: MyVolume
接着会让你选择使用哪个_Pool_,选择2,使用我们前面配置的"File"就可以了:
Select the Pool (1-3):
2
手动运行备份任务
Bacula现在知道我们想让备份数据写在哪里了.现在让我们来执行我们的备份任务来验证它是否正常工作:
run
会提示你选择一个任务.我们要执行的是"BackupLocalFiles",选择"1"就好了:
Select Job resource (1-3):
1
在"Run Backup job"这个环节,检查下详细信息,然后输入"yes"来运行这个任务:
yes
检查消息和状态
当执行玩一个任务, Bacula会告诉你有一条新消息. 消息是运行运行的任务生成的。 使用下面的命令检查消息:
messages
消息应该会说"No prior Full backup Job record found", 并且备份任务已经执行.如果有任何错误或者不对的地方,消息会给你提示,为什么任务没有执行. 另一个查看任务状态的方法是检查Director的状态.在bconsole里执行:
status director
如果运行正常,你应该可以看到你的任务正在运行.像下面这样: Output — status director (Running Jobs)
Running Jobs:
Console connected at 09-Apr-15 12:16
JobId Level Name Status
======================================================================
3 Full BackupLocalFiles.2015-04-09_12.31.41_06 is running
====
当任务完成,它会移到已终止任务(Terminated Jobs)的报告里面,像下面这样:
Terminated Jobs:
JobId Level Files Bytes Status Finished Name
====================================================================
3 Full 161,124 877.5 M OK 09-Apr-15 12:34 BackupLocalFiles
状态"OK"表示备份任务运行没有任何问题。恭喜你! 你已经有一个Bacula服务器的"Full Set"备份啦. 接下来的任务是测试恢复任务.
测试恢复任务
现在已经创建好了一个备份, 验证它是否能被正确恢复是很重要的. 恢复命令将允许我们恢复已经备份的文件.
允许恢复全部任务
为了验证,我们将恢复我们上个备份中的所有文件:
restore all
会出现一个有很多选项的菜单,来确认那个是需要被恢复的.因为我们只有一个备份,让我们选择"Select the most recent backup" - 选择5:
Select item (1-13):
5
因为这里只有Bacula服务器这一个客户端,所以它会自动被选择. 接下来讲问你选择哪个FileSet.选择"Full set",即选择2:
Select FileSet resource (1-2):
2
接下来将会到一个包含备份文件中所有目录结构的虚拟文件树. 这个类shell的接口允许使用一些简单的命令来标记和反标记恢复哪些文件. 因为我们一开始指定了"restore all",所以每个备份过得文件都已经被标记过了.被标记的文件开头会有_*_. 如果你想要微调自己的选择,你可以通过"cd"和"ls"命令切换目录和列出文件,使用"mask"标记要被恢复的,"unmask"标记不被恢复.你可以通过键入"help"查看完整的命令列表. 当你完成你的选择之后.敲入:
done
确认你想要运行这个恢复任务:
OK to run? (yes/mod/no):
yes
查看消息和状态
和backup任务一样,在运行完恢复任务之后,你应该检查下消息和Director的状态.
检查消息:
messages
应该会说恢复任务已经结束,状态是"Restore OK". 如果这里有任何错误或者不对的地方,消息都会给你提示. 查看Director状态是一种很好的方式用来查看恢复任务的状况:
status director
当你已经完成恢复任务,键入_exit_退出Bacula Console:
exit
验证备份
验证恢复任务有没有真正的恢复你选择的文件,你可以直接去看/bacula/restore这个目录(我们在Director配置文件中的"RestoreLocalFiles"中定义过):
sudo ls -la /bacula/restore
你应该会看到你根目录中已被恢复的文件,正如我们前面在配置文件中定义的那样包含哪些不包含哪些目录.如果你因为文件丢失要尝试文件恢复,那么你可以复制这些恢复的文件到它们正确的位置.
删除已恢复的文件
你或许想删掉恢复的文件,以便释放磁盘空间. 执行下面的命令就可以:
sudo -u root bash -c "rm -rf /bacula/restore/*"
注意你必须以root用户去执行这个rm命令.因为恢复文件的所属用户为root.
恭喜你
你已经知道了Bacula基础配置,实现了备份和恢复你的本地文件系统.下一步要学习的时如何添加其他服务作为备份客户端,这样你才能在数据丢失的时候恢复它们. 下篇文章将向你展示如何添加其他,远程的服务器作为Bacula Clients.