如何在 CentOS 7 上安装 Bacula 服务器
介绍
Bacula 是一种开源网络备份解决方案,可让您创建备份并执行计算机系统的数据恢复。它非常灵活和健壮,这使得它虽然配置起来有点麻烦,但适用于许多情况下的备份。备份系统是大多数服务器基础架构中的重要组件,因为从数据丢失中恢复通常是灾难恢复计划的关键部分。
在本教程中,我们将向您展示如何在 CentOS 7 服务器上安装和配置 Bacula 的服务器组件。我们将配置 Bacula 以执行创建本地备份(即其自身主机的备份)的每周作业。这本身并不是 Bacula 的特别引人注目的用途,但它将为您提供一个很好的起点来创建其他服务器的备份,即备份客户端。本系列的下一篇教程将介绍通过安装和配置 Bacula 客户端以及配置 Bacula 服务器来创建其他远程服务器的备份。
如果您更愿意使用 Ubuntu 14.04,请点击此链接:如何在 Ubuntu 14.04 上安装 Bacula 服务器。
先决条件
您必须在 CentOS 7 服务器上具有超级用户 (sudo) 访问权限。此外,服务器将需要足够的磁盘空间来存储您计划在任何给定时间保留的所有备份。
如果您使用的是 DigitalOcean,则应在您的 Bacula 服务器以及同一数据中心区域中的所有客户端服务器上启用专用网络。这将允许您的服务器在执行备份时使用专用网络,从而减少网络开销。
我们将配置 Bacula 以使用我们服务器的私有 FQDN,例如bacula.private.example.com
。如果您没有 DNS 设置,请改用适当的 IP 地址。如果您没有启用专用网络,请将本教程中的所有网络连接信息替换为相关服务器可访问的网络地址(例如公共 IP 地址或 VPN 隧道)。
最后一个假设是 SELinux 被禁用,或者您能够自行解决与 SELinux 相关的问题。
让我们首先看一下 Bacula 组件的概述。
Bacula 组件概述
虽然 Bacula 由多个软件组件组成,但它遵循服务器-客户端备份模型;为了简化讨论,我们将更多地关注备份服务器和备份客户端,而不是单个 Bacula 组件。尽管如此,粗略了解各种 Bacula 组件还是很重要的,因此我们现在将对它们进行回顾。
Bacula 服务器,我们也将其称为“备份服务器”,具有以下组件:
- 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 客户端,即要备份的服务器,运行文件守护程序 (FD) 组件。文件守护进程是为 Bacula 服务器(特别是 Director)提供对将要备份的数据的访问权限的软件。我们还将这些服务器称为“备份客户端”或“客户端”。
正如我们在介绍中提到的,我们将配置备份服务器来创建它自己的文件系统的备份。这意味着备份服务器也将是一个备份客户端,并将运行文件守护程序组件。
让我们开始安装吧。
安装 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
提示将询问您当前的 root 密码。因为你刚刚安装了 MySQL,你很可能没有,所以按回车键留空。然后提示会问你是否要设置root密码。继续并按 Enter
,然后设置密码。对于其余问题,您只需在每个提示中按 Enter
键即可接受默认值。这将删除一些示例用户和数据库,禁用远程 root 登录,并加载这些新规则,以便 MySQL 立即遵守我们所做的更改。
现在我们需要为 Bacula 数据库用户设置密码。
- 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 需要一个备份目录(用于存储备份档案)和恢复目录(用于放置恢复的文件)。如果您的系统有多个分区,请确保在有足够空间的分区上创建目录。
让我们为这两个目的创建新目录:
- 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
(本地主机),方法是添加此处显示的 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,如下所示:
Job {
Name = "BackupLocalFiles"
JobDefs = "DefaultJob"
}
接下来,找到名为“RestoreFiles”的作业资源(搜索“RestoreFiles”)。在此作业中,您想要更改两件事:将 Name
的值更新为 \RestoreLocalFiles,并将 Where
的值更新为 \/bacula/restore。它应该是这样的:
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 定义了一组文件或目录,以包含或排除备份选择中的文件,并由作业使用。
找到名为 \Full Set 的 FileSet 资源(它位于注释为 \# List of files to be backup up 的下方)。在这里我们将进行三处更改:(1) 添加使用 gzip 压缩备份的选项,(2) 将包含文件从 /usr/sbin
更改为 /
, (3) 在排除部分下添加 File=/bacula
。删除注释后,它应该如下所示:
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
}
}
让我们回顾一下我们对 \Full Set FileSet 所做的更改。首先,我们在创建备份存档时启用了 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 Director 配置文件中,存储资源定义了 Director 应该连接的存储守护进程。稍后我们将配置实际的存储守护进程。
找到存储资源,并将地址 localhost
的值替换为备份服务器的私有 FQDN(或私有 IP 地址)。它应该看起来像这样(替换突出显示的词):
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 配置文件中,目录资源定义了 Director 应该使用和连接的数据库的位置。
找到名为 \MyCatalog 的目录资源(它在一条注释为 \Generic catalog service 的下方),并更新 dbpassword
的值,使其与您为 bacula 设置的密码相匹配 MySQL 用户:
# 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 的注释下),并添加一行指定标签格式。完成后应该如下所示:
# 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 服务器几乎设置完毕,但我们仍然需要配置存储守护程序,以便 Bacula 知道在哪里存储备份。
在您喜欢的文本编辑器中打开 SD 配置。我们将使用 vi:
- sudo vi /etc/bacula/bacula-sd.conf
配置存储资源
找到存储资源。这定义了 SD 进程将在何处侦听连接。添加 SDAddress
参数,并将其分配给备份服务器的私有 FQDN(或私有 IP 地址):
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
的值以匹配您的备份目录:
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 组件密码
每个 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 使用我们之前配置的 \File 池:
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 服务器的 \Full Set。
下一步是测试还原作业。
测试恢复作业
现在已经创建了备份,重要的是检查它是否可以正确恢复。 restore
命令将允许我们恢复备份的文件。
运行恢复所有作业
为了演示,我们将恢复上次备份中的所有文件:
- restore all
将出现一个选择菜单,其中包含许多不同的选项,用于标识要从哪个备份集还原。由于我们只有一个备份,让我们“选择最近的备份”——选择选项 5:
Select item (1-13):5
因为只有一个客户端,Bacula 服务器,它会被自动选中。
下一个提示将询问您要使用哪个文件集。选择\Full Set,应该是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 服务器。