介绍
Bacula是一种开源网络备份解决方案,允许您创建备份并执行计算机系统的数据恢复。它非常灵活和健壮,这使得它在配置时有点麻烦,但适合在许多情况下进行备份。备份系统是大多数服务器基础架构中的重要组件,因为从数据丢失中恢复通常是灾难恢复计划的关键部分。
在本教程中,我们将向您展示如何在CentOS 7服务器上安装和配置Bacula的服务器组件。我们将配置Bacula以执行每周创建本地备份的作业(即备份其自己的主机)。这本身并不是Bacula特别引人注目的用途,但它将为您创建其他服务器(即备份客户端)的备份提供一个良好的起点。本系列的下一个教程将介绍通过安装和配置Bacula客户端以及配置Baculla服务器来创建其他远程服务器的备份。
如果你更愿意使用Ubuntu 14.04,请点击以下链接:如何在Ubuntu 14.4上安装Bacula服务器。
先决条件
您必须在CentOS 7服务器上具有超级用户(sudo)访问权限。此外,服务器将需要足够的磁盘空间来存储您计划在任何给定时间保留的所有备份。
如果您使用的是DigitalOcean,您应该在Bacula服务器以及位于同一数据中心区域的所有客户端服务器上启用专用网络。这将允许您的服务器在执行备份时使用专用网络,减少网络开销。
我们将配置Bacula使用我们服务器的专用FQDN,例如bacula.private.example.com
。如果您没有DNS设置,请使用适当的IP地址。如果未启用专用网络,请将本教程中的所有网络连接信息替换为相关服务器可以访问的网络地址(例如公共IP地址或VPN隧道)。
最后一个假设是SELinux已禁用,或者您能够自己解决与SELinux相关的问题。
让我们从杆菌成分的概述开始。
细菌成分概述
虽然Bacula由多个软件组件组成,但它遵循服务器-客户端备份模型;为了简化讨论,我们将更多地关注备份服务器和备份客户端,而不是单个Bacula组件。尽管如此,对各种杆菌成分有粗略的了解是很重要的,所以我们现在就来复习一下。
Bacula服务器,我们也将其称为“备份服务器”,具有以下组件:
-
**Bacula控制器(DIR):**控制文件和存储守护进程执行的备份和恢复操作的软件
-
**存储守护进程(SD):**在用于备份的存储设备上执行读取和写入的软件
-
**目录:**维护备份文件数据库的服务。数据库存储在SQL数据库中,如MySQL或PostgreSQL
-
**Bacula控制台:*一个命令行界面,允许备份管理员与Bacula控制器交互和控制
Note: The Bacula server components don't need to run on the same server, but they all work together to provide the backup server functionality.
Bacula客户端,即将被备份的服务器,运行**文件守护进程(FD)**组件。文件守护进程是一种软件,它为Bacula服务器(特别是控制器)提供对将要备份的数据的访问。我们还将这些服务器称为“备份客户端”或“客户端”。
正如我们在引言中所指出的,我们将配置备份服务器以创建其自己文件系统的备份。这意味着备份服务器也将是一个备份客户端,并将运行文件守护进程组件。
让我们开始安装。
安装Bacula和MySQL
Bacula使用SQL数据库(如MySQL或PostreSQL)来管理其备份目录。在本教程中,我们将使用MariaDB,它是MySQL的一个替代品。
使用yum安装Bacula和MariaDB服务器包:
sudo yum install -y bacula-director bacula-storage bacula-console bacula-client mariadb-server
安装完成后,我们需要使用以下命令启动MySQL:
sudo systemctl start mariadb
现在MySQL(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
提示将询问您当前的根密码。由于您刚刚安装了MySQL,很可能没有MySQL,所以按enter键将其留空。然后提示将询问您是否要设置根密码。继续,点击Enter
,然后设置密码。对于其余的问题,只需在每个提示中点击Enter
键即可接受默认值。这将删除一些示例用户和数据库,禁用远程根登录,并加载这些新规则,以便MySQL立即尊重我们所做的更改。
现在我们需要为Bacula数据库用户设置密码。
以MySQL根用户身份进入MySQL控制台:
mysql -u root -p
在提示下输入您刚刚设置的MySQL根密码。
现在为Bacula数据库用户设置密码。使用此命令,但将突出显示的“bacula db密码”替换为强密码:
UPDATE mysql.user SET Password=PASSWORD('bacula_db_password') WHERE User='bacula'; FLUSH PRIVILEGES;
完成后,退出MySQL提示符:
exit
启用MariaDB以在引导时启动。使用以下命令执行此操作:
sudo systemctl enable mariadb
将Bacula设置为使用MySQL库
默认情况下,Bacula设置为使用PostgreSQL库。因为我们使用的是MySQL,所以需要将其设置为使用MySQL库。
运行此命令:
sudo alternatives --config libbaccats.so
您将看到以下提示。输入1(MySQL):
Output 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控制器。
配置Bacula控制器
Bacula有几个组件,必须独立配置才能正常工作。配置文件都可以在/etc/bacula
目录中找到。
我们将从Bacula控制器开始。
在您最喜欢的文本编辑器中打开Bacula控制器配置文件。我们将使用vi:
sudo vi /etc/bacula/bacula-dir.conf
配置控制器资源
通过添加此处显示的DirAddress
行,找到控制器资源,并将其配置为在127.0.0.1
(本地主机)上侦听:
细菌定向。conf-添加控制器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 }
现在转到文件的其余部分。
配置本地作业
Bacula作业用于执行备份和恢复操作。作业资源定义特定作业的详细信息,包括客户端的名称、要备份或还原的文件集等。
在这里,我们将配置用于执行本地文件系统备份的作业。
在控制器配置中,找到名称为“BackupClient1”的作业资源(搜索“BackupClient1”)。将Name
的值更改为“BackupLocalFiles”,如下所示:
细菌定向。conf-重命名BackupClient1作业
Job { Name = "BackupLocalFiles" JobDefs = "DefaultJob" }
接下来,找到名为“RestoreFiles”的作业资源(搜索“restorepiles”)。在这个作业中,您需要更改两件事:将Name
的值更新为“RestoreLocalFiles”,将Where
的值更新成“/bacula/restore”。它应该是这样的:
细菌定向。conf-重命名RestoreFiles作业
Job { Name = "RestoreLocalFiles" Type = Restore Client=BackupServer-fd FileSet="Full Set" Storage = File Pool = Default Messages = Standard Where = /bacula/restore }
这将RestoreLocalFiles作业配置为将文件还原到/bacula/restore
,即我们之前创建的目录。
配置文件集
Bacula文件集定义了一组文件或目录,用于从备份选择中包括或排除文件,并由作业使用。
查找名为“Full Set”的文件集资源(在一条注释下,注释为“#要备份的文件列表”)。在这里,我们将进行三个更改:(1)添加使用gzip压缩备份的选项,(2)将include文件从/usr/sbin
更改为/
,以及(3)在Exclude部分下添加File = /bacula
。删除注释后,应如下所示:
细菌定向。conf-更新“全套”文件集
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 } }
让我们回顾一下我们对“全套”文件集所做的更改。首先,我们在创建备份档案时启用了gzip压缩。其次,我们要备份/
,即根分区。第三,我们不包括/bacula
,因为我们不想冗余备份我们的Bacula备份和恢复的文件。
Note: If you have partitions that are mounted within /, and you want to include those in the FileSet, you will need to include additional File records for each of them.
请记住,如果在备份作业中始终使用广泛的文件集(如“完整集”),则备份所需的磁盘空间将比备份选择更具体时要多。例如,如果您有一个明确的恢复计划,详细说明如何安装所需的软件包并将恢复的文件放置在适当的位置,同时只使用一小部分磁盘空间进行备份归档,那么仅包含自定义配置文件和数据库的文件集可能就足以满足您的需要。
配置存储守护进程连接
在Bacula控制器配置文件中,存储资源定义了控制器应连接到的存储守护进程。我们稍后将配置实际的存储守护程序。
找到存储资源,并将地址localhost
的值替换为备份服务器的专用FQDN(或专用IP地址)。它应该是这样的(替换突出显示的单词):
细菌定向。conf-更新存储地址
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 }
这是必要的,因为我们要将存储守护进程配置为在专用网络接口上侦听,以便远程客户端可以连接到它。
配置目录连接
在Bacula控制器配置文件中,目录资源定义控制器应使用和连接到的数据库的位置。
找到名为“MyCatalog”的目录资源(位于“Generic Catalog service”的注释下),并更新dbpassword
的值,使其与您为\u bacula\uMySQL用户设置的密码匹配:
细菌定向。conf-更新目录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控制器连接到MySQL数据库。
配置池
池资源定义了Bacula用于写入备份的存储集。我们将使用文件作为存储卷,只需更新标签,就可以正确标记本地备份。
找到名为“File”的池资源(它位于一条注释下,注释上写着“#File Pool definition”),并添加一行指定标签格式。完成后应该是这样的:
细菌定向。conf-更新池:
# 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控制器的配置。
检查控制器配置:
让我们验证一下控制器配置文件中是否没有语法错误:
sudo bacula-dir -tc /etc/bacula/bacula-dir.conf
如果没有错误消息,则bacula-dir.conf
文件没有语法错误。
接下来,我们将配置存储守护进程。
配置存储守护进程
我们的Bacula服务器几乎已经设置好了,但我们仍然需要配置存储守护进程,以便Bacula知道在哪里存储备份。
在您最喜欢的文本编辑器中打开SD配置。我们将使用vi:
sudo vi /etc/bacula/bacula-sd.conf
配置存储资源
查找存储资源。这定义了SD进程侦听连接的位置。添加SDAddress
参数,并将其分配给备份服务器的专用FQDN(或专用IP地址):
bacula sd。conf-更新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 }
配置存储设备
接下来,找到名为“FileStorage”的设备资源(搜索“filestorages”),并更新Archive Device
的值以匹配备份目录:
bacula sd。conf-更新存档设备
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; }
保存并退出。
验证存储守护程序配置
让我们验证一下存储守护进程配置文件中是否没有语法错误:
sudo bacula-sd -tc /etc/bacula/bacula-sd.conf
如果没有错误消息,则bacula-sd.conf
文件没有语法错误。
我们已经完成了细菌配置。我们已经准备好重新启动Bacula服务器组件。
设置Bacula组件密码
每个Bacula组件(如Director、SD和FD)都有用于组件间身份验证的密码。在浏览配置文件时,您可能会注意到占位符。可以手动设置这些密码,但由于您实际上不需要知道这些密码,我们将运行命令生成随机密码,并将其插入各种Bacula配置文件。
这些命令生成并设置控制器密码。bconsole
连接到控制器,因此也需要密码:
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
这些命令生成并设置存储守护进程密码。控制器连接到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
这些命令生成并设置本地文件守护进程(Bacula客户端软件)密码。控制器连接到此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控制器、存储守护程序和本地文件守护程序:
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控制台运行第一个备份作业。如果它运行没有任何问题,我们将知道Bacula配置正确。
现在使用以下命令进入控制台:
sudo bconsole
这将带您进入Bacula控制台提示符,由*
提示符表示。
创建标签
首先发出label
命令:
label
系统将提示您输入卷名。输入您想要的任何名称:
Enter new Volume name:MyVolume
然后选择备份应使用的池。我们将通过输入“2”来使用前面配置的“文件”池:
Select the Pool (1-3):2
手动运行备份作业
Bacula现在知道我们要如何为备份写入数据。现在,我们可以运行备份来测试它是否正常工作:
run
系统将提示您选择要运行的作业。我们希望运行“BackupLocalFiles”作业,因此在提示下输入“1”:
Select Job resource (1-3):1
在“运行备份作业”确认提示下,查看详细信息,然后输入“是”以运行作业:
yes
检查消息和状态
运行作业后,Bacula会告诉你有消息。这些消息是由运行作业生成的输出。
通过键入以下内容检查消息:
messages
消息应显示“未找到之前的完整备份作业记录”,并且备份作业已启动。如果有任何错误,说明有问题,他们应该提示您为什么作业没有运行。
查看作业状态的另一种方法是检查主管的状态。为此,请在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 ====
作业完成后,它将移动到状态报告的“已终止作业”部分,如下所示:
Output — status director (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服务器“全套”的备份。
下一步是测试恢复作业。
测试还原作业
既然已经创建了备份,那么重要的是检查它是否可以正确还原。restore
命令将允许我们恢复已备份的文件。
运行恢复所有作业
为了演示,我们将恢复上次备份中的所有文件:
restore all
将出现一个选择菜单,其中包含许多不同的选项,用于标识要从中恢复的备份集。由于我们只有一个备份,让我们“选择最近的备份”-选择选项5:
Select item (1-13):5
由于只有一个客户端,即Bacula服务器,因此将自动选择它。
下一个提示将询问您要使用哪个文件集。选择“全套”,应为2:
Select FileSet resource (1-2):2
这会将您放入一个虚拟文件树中,其中包含您备份的整个目录结构。这个类似于shell的界面允许使用简单的命令来标记和取消标记要还原的文件。
因为我们指定要“全部还原”,所以每个备份的文件都已经标记为要还原。标记文件由前导*
字符表示。
如果您想微调选择,可以使用“ls”和“cd”命令导航和列出文件,使用“mark”标记要恢复的文件,并使用“unmark”取消标记文件。通过在控制台中键入“help”,可以获得完整的命令列表。
完成还原选择后,继续键入:
done
确认要运行还原作业:
OK to run? (yes/mod/no):yes
检查消息和状态
与备份作业一样,您应该在运行还原作业后检查消息和控制器状态。
通过键入以下内容检查消息:
messages
应该有一条消息表明恢复作业已启动或已终止,状态为“恢复正常”。如果有任何错误,说明有问题,他们应该提示您为什么作业没有运行。
同样,检查控制器状态是查看恢复作业状态的好方法:
status director
完成恢复后,键入exit
离开Bacula控制台:
exit
验证还原
要验证还原作业是否实际还原了所选文件,可以查看/bacula/restore
目录(该目录在控制器配置的“RestoreLocalFiles”作业中定义):
sudo ls -la /bacula/restore
您应该在根文件系统中看到文件的还原副本,不包括“RestoreLocalFiles”作业的“Exclude”部分中列出的文件和目录。如果您试图从数据丢失中恢复,可以将恢复的文件复制到相应的位置。
删除还原的文件
您可能需要删除还原的文件以释放磁盘空间。为此,请使用以下命令:
sudo -u root bash -c "rm -rf /bacula/restore/*"
注意,您必须以root用户身份运行这个rm
命令,因为许多恢复的文件都是root用户所有的。
结论
现在,您有了一个基本的Bacula设置,可以备份和恢复本地文件系统。下一步是将其他服务器添加为备份客户端,以便在数据丢失时恢复它们。