介绍
Bacula 是一种开源网络备份解决方案,可让您创建备份并执行计算机系统的数据恢复。 它非常灵活和健壮,这使得它虽然配置起来有点麻烦,但适用于许多情况下的备份。 备份系统是大多数服务器基础架构 中的 重要组件,因为从数据丢失中恢复通常是灾难恢复计划的关键部分。
在本教程中,我们将向您展示如何在 CentOS 7 服务器上安装和配置 Bacula 的服务器组件。 我们将配置 Bacula 以执行每周创建本地备份的作业(即 自己主机的备份)。 这本身并不是 Bacula 的一个特别引人注目的用途,但它将为您提供创建其他服务器备份的良好起点,即 备份客户端。 本系列的下一个教程将介绍通过安装和配置 Bacula 客户端以及配置 Bacula 服务器来创建其他远程服务器的备份。
如果您更愿意使用 Ubuntu 14.04,请点击以下链接:如何在 Ubuntu 14.04 上安装 Bacula 服务器。
先决条件
您必须在 CentOS 7 服务器上具有超级用户 (sudo) 访问权限。 此外,服务器将需要足够的磁盘空间来存储您计划在任何给定时间保留的所有备份。
如果您使用的是 DigitalOcean,您应该在您的 Bacula 服务器以及位于同一数据中心区域的所有客户端服务器上启用 Private Networking。 这将允许您的服务器在执行备份时使用专用网络,从而减少网络开销。
我们将配置 Bacula 以使用我们服务器的私有 FQDN,例如 bacula.private.example.com
。 如果您没有 DNS 设置,请改用适当的 IP 地址。 如果您没有启用专用网络,请将本教程中的所有网络连接信息替换为相关服务器可访问的网络地址(例如 公共 IP 地址或 VPN 隧道)。
最后一个假设是 SELinux 已禁用,或者您可以自行解决与 SELinux 相关的问题。
让我们从 Bacula 组件的概述开始。
Bacula 组件概述
尽管 Bacula 由多个软件组件组成,但它遵循服务器-客户端备份模型; 为了简化讨论,我们将更多地关注 备份服务器 和 备份客户端 ,而不是单个 Bacula 组件。 尽管如此,对各种 Bacula 组件有粗略的了解还是很重要的,所以我们现在将介绍它们。
Bacula server,我们也将其称为“备份服务器”,具有以下组件:
- Bacula Director (DIR): 控制由文件和存储守护程序执行的备份和恢复操作的软件
- Storage Daemon (SD): 对用于备份的存储设备执行读写操作的软件
- 目录: 维护备份文件数据库的服务。 数据库存储在 SQL 数据库中,例如 MySQL 或 PostgreSQL
- Bacula 控制台: 允许备份管理员与 Bacula Director 交互和控制的命令行界面
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 客户端 ,即 将要备份的服务器,运行 File Daemon (FD) 组件。 文件守护程序是为 Bacula 服务器(特别是 Director)提供对将要备份的数据的访问权限的软件。 我们还将这些服务器称为“备份客户端”或“客户端”。
正如我们在介绍中提到的,我们将配置备份服务器以创建自己的文件系统的备份。 这意味着备份服务器也将是一个备份客户端,并将运行文件守护程序组件。
让我们开始安装吧。
安装 Bacula 和 MySQL
Bacula 使用 SQL 数据库(例如 MySQL 或 PostreSQL)来管理其备份目录。 在本教程中,我们将使用 MySQL 的替代品 MariaDB。
使用 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
提示将询问您当前的 root 密码。 由于您刚刚安装了 MySQL,因此您很可能没有安装 MySQL,因此请按 Enter 将其留空。 然后提示将询问您是否要设置root密码。 继续点击Enter
,然后设置密码。 对于其余的问题,您只需在每个提示中按 Enter
键即可接受默认值。 这将删除一些示例用户和数据库,禁用远程 root 登录,并加载这些新规则,以便 MySQL 立即尊重我们所做的更改。
现在我们需要为 Bacula 数据库用户设置密码。
以 MySQL 根用户身份进入 MySQL 控制台:
mysql -u root -p
在提示符处输入您刚刚设置的 MySQL root 密码。
现在为 Bacula 数据库用户设置密码。 使用此命令,但将突出显示的“bacula_db_password”替换为强密码:
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):
OutputThere 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 需要一个 backup 目录 - 用于存储备份存档 - 和 restore 目录 - 将放置恢复的文件。 如果您的系统有多个分区,请确保在一个有足够空间的分区上创建目录。
让我们为这两个目的创建新目录:
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 资源,并将其配置为侦听 127.0.0.1
(localhost),方法是添加此处显示的 DirAddress
行:
bacula-dir.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 作业用于执行备份和恢复操作。 作业资源定义了特定作业的详细信息,包括客户端的名称、要备份或恢复的文件集等。
在这里,我们将配置用于执行本地文件系统备份的作业。
在 Director 配置中,找到名称为“BackupClient1”的 Job 资源(搜索“BackupClient1”)。 将 Name
的值更改为“BackupLocalFiles”,如下所示:
bacula-dir.conf — 重命名 BackupClient1 作业
Job { Name = "BackupLocalFiles" JobDefs = "DefaultJob" }
接下来,找到名为“RestoreFiles”的 Job 资源(搜索“RestoreFiles”)。 在此作业中,您要更改两件事:将 Name
的值更新为“RestoreLocalFiles”,并将 Where
的值更新为“/bacula/restore”。 它应该如下所示:
bacula-dir.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 FileSet 将一组文件或目录定义为 include 或 exclude 文件从备份选择中,并由作业使用。
找到名为“Full Set”的 FileSet 资源(位于“#要备份的文件列表”的注释下)。 在这里,我们将进行三处更改:(1)添加使用 gzip 压缩备份的选项,(2)将包含文件从 /usr/sbin
更改为 /
,以及(3)添加 [X158X ] 在排除部分下。 删除注释后,它应该如下所示:
bacula-dir.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.
请记住,如果您在备份作业中始终使用广泛的文件集,例如“完整集”,那么您的备份将需要更多的磁盘空间,而不是您的备份选择更具体。 例如,仅包含自定义配置文件和数据库的 FileSet 可能足以满足您的需求,如果您有一个明确的恢复计划,详细说明安装所需的软件包并将恢复的文件放置在适当的位置,同时只使用一小部分备份存档的磁盘空间。
配置存储守护程序连接
在 Bacula Director 配置文件中,存储资源定义了 Director 应连接到的存储守护程序。 稍后我们将配置实际的存储守护程序。
找到存储资源,并将地址的值 localhost
替换为备份服务器的私有 FQDN(或私有 IP 地址)。 它应该看起来像这样(替换突出显示的单词):
bacula-dir.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 Director 配置文件中,Catalog 资源定义了 Director 应该使用和连接到的数据库的位置。
找到名为“MyCatalog”的目录资源(位于“通用目录服务”的注释下),并更新 dbpassword
的值,使其与您为 bacula MySQL 设置的密码匹配用户:
bacula-dir.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 Director 连接到 MySQL 数据库。
配置池
池资源定义了 Bacula 用于写入备份的存储集。 我们将使用文件作为我们的存储卷,我们将简单地更新标签,以便我们的本地备份得到正确的标签。
找到名为“File”的 Pool 资源(它位于“# File Pool definition”的注释下),并添加一行指定标签格式。 完成后应该是这样的:
bacula-dir.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 Director 的配置。
检查导向器配置:
让我们验证一下您的 Director 配置文件中没有语法错误:
sudo bacula-dir -tc /etc/bacula/bacula-dir.conf
如果没有错误消息,则您的 bacula-dir.conf
文件没有语法错误。
接下来,我们将配置存储守护程序。
配置存储守护程序
我们的 Bacula 服务器几乎已设置完毕,但我们仍需要配置 Storage Daemon,因此 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”的设备资源(搜索“FileStorage”),并更新 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; }
保存并退出。
验证存储守护程序配置
让我们验证您的 Storage Daemon 配置文件中没有语法错误:
sudo bacula-sd -tc /etc/bacula/bacula-sd.conf
如果没有错误消息,则您的 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
这些命令生成并设置存储守护程序密码。 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
这些命令生成并设置本地文件守护程序(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、存储守护程序和本地文件守护程序:
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
消息应显示“未找到先前的完整备份作业记录”,并且备份作业已开始。 如果有任何错误,则说明有问题,它们应该会提示您作业未运行的原因。
查看作业状态的另一种方法是检查 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 ====
当您的工作完成后,它将移至状态报告的“终止工作”部分,如下所示:
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 服务器,它会自动被选中。
下一个提示将询问您要使用哪个 FileSet。 选择“全套”,应该是2:
Select FileSet resource (1-2):2
这会将您放入具有您备份的整个目录结构的虚拟文件树中。 这个类似于 shell 的界面允许使用简单的命令来标记和取消标记要恢复的文件。
因为我们指定要“全部恢复”,所以每个备份的文件都已标记为要恢复。 标记的文件由前导 *
字符表示。
如果您想微调您的选择,您可以使用“ls”和“cd”命令导航和列出文件,使用“mark”标记要恢复的文件,使用“unmark”取消标记文件。 通过在控制台中输入“help”可以获得完整的命令列表。
完成还原选择后,继续键入:
done
确认您要运行还原作业:
OK to run? (yes/mod/no):yes
检查消息和状态
与备份作业一样,您应该在运行还原作业后检查消息和 Director 状态。
通过键入以下内容检查消息:
messages
应该有一条消息表明恢复作业已开始或以“恢复正常”状态终止。 如果有任何错误,则说明有问题,它们应该会提示您作业未运行的原因。
同样,检查 Director 状态是查看还原作业状态的好方法:
status director
完成还原后,键入 exit
以离开 Bacula 控制台:
exit
验证还原
要验证还原作业是否确实还原了所选文件,您可以查看 /bacula/restore
目录(在 Director 配置中的“RestoreLocalFiles”作业中定义):
sudo ls -la /bacula/restore
您应该会在根文件系统中看到文件的恢复副本,不包括“RestoreLocalFiles”作业的“排除”部分中列出的文件和目录。 如果您试图从数据丢失中恢复,您可以将恢复的文件复制到相应的位置。
删除恢复的文件
您可能希望删除恢复的文件以释放磁盘空间。 为此,请使用以下命令:
sudo -u root bash -c "rm -rf /bacula/restore/*"
请注意,您必须以 root 身份运行此 rm
命令,因为许多恢复的文件都归 root 所有。
结论
您现在有一个基本的 Bacula 设置,可以备份和恢复您的本地文件系统。 下一步是将您的其他服务器添加为备份客户端,以便在数据丢失的情况下恢复它们。
下一个教程将向您展示如何将其他远程服务器添加为 Bacula 客户端:如何使用 Bacula 备份 CentOS 7 服务器。