简介
Bacula 是一个开源的网络备份解决方案,允许您创建备份并对计算机系统进行数据恢复。它非常灵活和强大,虽然配置略显繁琐,但适用于许多情况的备份。备份系统是大多数服务器基础设施中的重要组成部分,因为从数据丢失中恢复通常是灾难恢复计划的关键部分。
在本教程中,我们将向您展示如何在 Ubuntu 14.04 服务器上安装和配置 Bacula 的服务器组件。我们将配置 Bacula 执行每周作业,创建本地备份(即其自身主机的备份)。这本身并不是 Bacula 特别引人注目的用途,但它将为您提供创建其他服务器(即备份客户端)备份的良好起点。本系列的下一个教程将涵盖通过安装和配置 Bacula 客户端以及配置 Bacula 服务器来创建其他远程服务器的备份。
先决条件
您必须在 Ubuntu 14.04 服务器上拥有超级用户(sudo)访问权限。此外,服务器将需要足够的磁盘空间来存储您计划在任何给定时间保留的所有备份。
如果您使用 DigitalOcean,您应该在 Bacula 服务器和所有位于同一数据中心区域的客户端服务器上启用私有网络。这将允许您的服务器在执行备份时使用私有网络,从而减少网络开销。
我们将配置 Bacula 使用我们服务器的私有 FQDN,例如 bacula.private.example.com
。如果您没有 DNS 设置,请使用相应的 IP 地址。如果您没有启用私有网络,请使用本教程中与相关服务器可达的网络连接信息(例如公共 IP 地址或 VPN 隧道)替换所有网络连接信息。
让我们首先来看一下 Bacula 组件的概述。
Bacula 组件概述
尽管 Bacula 由多个软件组件组成,但它遵循服务器-客户端备份模型;为了简化讨论,我们将更多地关注备份服务器和备份客户端,而不是单个 Bacula 组件。尽管如此,对各种 Bacula 组件有一定的了解仍然很重要,因此我们现在将对它们进行介绍。
Bacula 服务器,我们也将其称为“备份服务器”,具有以下组件:
- Bacula Director (DIR): 控制由文件和存储守护程序执行的备份和恢复操作的软件
- 存储守护程序 (SD): 用于备份的存储设备上执行读取和写入操作的软件
- 目录: 维护备份文件的数据库服务。数据库存储在诸如 MySQL 或 PostgreSQL 之类的 SQL 数据库中
- Bacula 控制台: 允许备份管理员与 Bacula Director 进行交互和控制的命令行界面
注意:Bacula 服务器组件不需要在同一台服务器上运行,但它们共同工作以提供备份服务器功能。
Bacula 客户端,即将被备份的服务器,运行文件守护程序 (FD) 组件。文件守护程序是提供 Bacula 服务器(特别是 Director)访问将被备份的数据的软件。我们还将这些服务器称为“备份客户端”或“客户端”。
正如我们在简介中提到的,我们将配置备份服务器创建其自身文件系统的备份。这意味着备份服务器也将是备份客户端,并将运行文件守护程序组件。
让我们开始安装。
安装 MySQL
Bacula 使用 SQL 数据库(如 MySQL 或 PostreSQL)来管理其备份目录。在本教程中,我们将使用 MySQL。
首先,更新 apt-get:
sudo apt-get update
现在使用 apt-get 安装 MySQL 服务器:
sudo apt-get install mysql-server
您将被提示为 MySQL 数据库管理用户 root 输入密码,然后确认密码。
请记住此密码,因为它将在 Bacula 安装过程中使用。
安装 Bacula
使用 apt-get 安装 Bacula 服务器和客户端组件:
sudo apt-get install bacula-server bacula-client
您将被提示输入一些信息,这些信息将用于配置 Bacula 使用的 Postfix:
- 邮件配置的一般类型: 选择“Internet Site”
- 系统邮件名称: 输入您服务器的 FQDN 或主机名
接下来,您将被提示输入用于设置 Bacula 数据库的信息:
- 使用 dbconfig-common 为 bacula-director-mysql 配置数据库?: 选择“是”
- 数据库的管理用户密码: 输入您的 MySQL root 密码(在安装 MySQL 时设置)
- bacula-director-mysql 的 MySQL 应用程序密码: 输入新密码并确认,或者留空以生成随机密码
安装的最后一步是更新 Bacula 在其目录备份作业期间使用的脚本的权限:
sudo chmod 755 /etc/bacula/scripts/delete_catalog_backup
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
配置本地作业
Bacula 作业用于执行备份和恢复操作。作业资源定义了特定作业将执行的详细信息,包括客户端的名称、要备份或恢复的文件集等。
在 Director 配置中,找到名称为 “BackupClient1” 的Job资源(搜索 “BackupClient1”)。将 Name
的值更改为 “BackupLocalFiles”,使其如下所示:
Job { Name = "BackupLocalFiles" JobDefs = "DefaultJob" }
接下来,找到名称为 “RestoreFiles” 的Job资源(搜索 “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 文件集定义了要从备份选择中包括或排除的文件或目录集,并由作业使用。
找到名称为 “Full Set” 的FileSet资源(在一个注释下,注释说 “# 要备份的文件列表”)。在这里,我们将进行三个更改:(1)添加选项以使用 gzip 压缩我们的备份,(2)将包含文件从 /usr/sbin
更改为 /
,(3)将第二个排除文件更改为 /bacula
。去除注释后,它应该如下所示:
FileSet { Name = "Full Set" Include { Options { signature = MD5 compression = GZIP } File = / } Exclude { File = /var/lib/bacula File = /bacula File = /proc File = /tmp File = /.journal File = /.fsck } }
让我们来看看我们对 “Full Set” 文件集所做的更改。首先,在创建备份归档时启用了 gzip 压缩。其次,我们包括了 /
,即根分区,以进行备份。第三,我们排除了 /bacula
,因为我们不希望冗余地备份我们的 Bacula 备份和恢复的文件。
注意:如果您的分区挂载在 / 中,并且您希望将它们包含在文件集中,您将需要为每个分区包含额外的 File 记录。
请记住,如果您在备份作业中始终使用像 “Full Set” 这样的广泛文件集,您的备份将需要比如果您的备份选择更为具体时更多的磁盘空间。例如,仅包括您定制的配置文件和数据库的文件集可能已经足够满足您的需求,如果您有一个清晰的恢复计划,详细说明了安装所需的软件包并将恢复的文件放置在正确的位置,同时只使用备份归档的一小部分磁盘空间。
配置存储守护程序连接
在 Bacula Director 配置文件中,Storage 资源定义了 Director 应连接到的存储守护程序。我们将很快配置实际的存储守护程序。
找到 Storage 资源,并将 Address 的值 localhost
替换为您的备份服务器的私有 FQDN(或私有 IP 地址)。它应该如下所示(替换高亮词):
Storage { Name = File Address = your_private_FQDN SDPort = 9103 Password = "your_password" Device = FileStorage Media Type = File }
# 不要在这里使用 "localhost" Address = backup_server_private_FQDN # 注意:在这里使用完全合格的名称 SDPort = 9103 Password = "ITXAsuVLi1LZaSfihQ6Q6yUCYMUssdmu_" Device = FileStorage Media Type = File } 这是必要的,因为我们将配置存储守护程序以侦听私有网络接口,以便远程客户端可以连接到它。 ### 配置池 池资源定义了 Bacula 用于编写备份的存储集。我们将使用文件作为我们的存储卷,并简单地更新标签,以便我们的本地备份可以正确地标记。 找到名为 "File" 的池资源(它在一个注释下,注释说 "# File Pool definition"),并添加一行指定标签格式。完成后,它应该如下所示:
File Pool definition
Pool {
Name = File
Pool Type = Backup
Label Format = Local-
Recycle = yes # Bacula 可以自动回收卷
AutoPrune = yes # 剪除过期卷
Volume Retention = 365 days # 一年
Maximum Volume Bytes = 50G # 将卷大小限制为合理值
Maximum Volumes = 100 # 限制池中卷的数量
}
保存并退出。您终于完成了 Bacula Director 的配置。 ### 检查 Director 配置: 让我们验证您的 Director 配置文件中是否没有语法错误: ```command 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 { # 定义自己 Name = BackupServer-sd SDPort = 9103 # Director 的端口 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; # 让 Bacula 标记未标记的媒体 Random Access = Yes; AutomaticMount = yes; # 打开设备时,读取它 RemovableMedia = no; AlwaysOpen = no; }
保存并退出。
验证存储守护程序配置
让我们验证您的存储守护程序配置文件中是否没有语法错误:
sudo bacula-sd -tc /etc/bacula/bacula-sd.conf
如果没有错误消息,则您的 bacula-sd.conf
文件没有语法错误。
我们已完成 Bacula 配置。我们准备重新启动 Bacula 服务器组件。
重新启动 Bacula Director 和存储守护程序
为了使您所做的配置更改生效,请使用以下命令重新启动 Bacula Director 和存储守护程序:
sudo service bacula-director restart sudo service bacula-sd restart
现在两个服务都已重新启动,让我们通过运行备份作业来测试它是否正常工作。
测试备份作业
我们将使用 Bacula 控制台来运行我们的第一个备份作业。如果它能够正常运行,我们将知道 Bacula 配置正确。
现在使用以下命令进入控制台:
sudo bconsole
这将带您进入 Bacula 控制台提示符,以 *
提示符表示。
创建标签
首先发出一个 label
命令:
label
然后,您将被提示输入卷名称。输入任何您想要的名称:
[secondary_label 输入新的卷名称:] MyVolume
然后选择备份应该使用的池。我们将使用我们之前配置的 “File” 池,输入 “2”:
[secondary_label 选择池(1-3):] 2
### 手动运行备份作业 Bacula 现在知道我们要如何写入备份数据了。我们现在可以运行备份来测试它是否能正常工作: ```custom_prefix(*) run
系统会提示你选择要运行的作业。我们要运行"BackupLocalFiles"作业,所以在提示处输入"1":
[secondary_label 选择要运行的作业资源 (1-3):] 1
在"运行备份作业"确认提示处,确认详情,然后输入"yes"来运行作业:
yes
检查消息和状态
运行作业后,Bacula 会告诉你有消息。这些消息是运行作业生成的输出。
通过输入以下命令来检查消息:
messages
消息应该显示"未找到先前的完整备份作业记录",并且备份作业已经开始。如果有任何错误,那么就有问题了,消息应该会提示作业未能运行的原因。
另一种查看作业状态的方法是检查主管的状态。要做到这一点,在 bconsole 提示符下输入以下命令:
status director
如果一切正常,你应该会看到你的作业正在运行。类似于这样的输出:
[secondary_label 输出 — 主管状态 (运行中的作业)] 运行中的作业: 控制台连接时间 09-Apr-15 12:16 作业 ID 级别 名称 状态 ====================================================================== 3 完整 BackupLocalFiles.2015-04-09_12.31.41_06 正在运行 ====
当你的作业完成后,它将移动到状态报告的"已终止作业"部分,如下所示:
[secondary_label 输出 — 主管状态 (已终止作业)] 已终止作业: 作业 ID 级别 文件数 字节数 状态 完成时间 名称 ==================================================================== 3 完整 161,124 877.5 M OK 09-Apr-15 12:34 BackupLocalFiles
“OK” 状态表示备份作业已经顺利运行。恭喜你!你已经备份了 Bacula 服务器的"完整集"。
下一步是测试还原作业。
测试还原作业
现在备份已经创建,检查它是否可以正确还原是很重要的。restore
命令将允许我们还原备份的文件。
运行还原所有作业
为了演示,我们将还原最近备份的所有文件:
restore all
将会出现一个选择菜单,其中有许多不同的选项,用于确定要从哪个备份集还原。由于我们只有一个备份,让我们选择"选择最近的备份" —— 选择选项 5:
[secondary_label 选择项目 (1-13):] 5
因为只有一个客户端,即 Bacula 服务器,它将自动被选中。
接下来的提示将询问你要使用哪个文件集。选择"完整集",应该是 2:
[secondary_label 选择文件集资源 (1-2):] 2
这将使你进入一个虚拟文件树,其中包含你备份的整个目录结构。这种类似 shell 的界面允许使用简单的命令来标记和取消标记要还原的文件。
因为我们指定了要"还原所有",每个备份的文件已经被标记为要还原。标记的文件以前导的 *
字符表示。
如果你想要微调你的选择,你可以使用 “ls” 和 “cd” 命令导航和列出文件,使用 “mark” 命令标记要还原的文件,使用 “unmark” 命令取消标记文件。输入 “help” 可以获取命令的完整列表。
当你完成还原选择后,输入以下命令继续:
done
确认你要运行还原作业:
[secondary_label 确认运行? (yes/mod/no):] yes
检查消息和状态
与备份作业一样,运行还原作业后,你应该检查消息和主管状态。
通过输入以下命令来检查消息:
messages
应该会有一条消息显示还原作业已经开始或以"还原 OK"状态终止。如果有任何错误,那么就有问题了,消息应该会提示作业未能运行的原因。
同样,检查主管状态是查看还原作业状态的好方法:
status director
当你完成还原后,输入 exit
退出 Bacula 控制台:
exit
验证恢复
要验证恢复作业是否真正恢复了所选文件,您可以查看 /bacula/restore
目录(在 Director 配置中的 “RestoreLocalFiles” 作业中定义):
sudo ls -la /bacula/restore
您应该会看到在根文件系统中恢复的文件副本,不包括在 “RestoreLocalFiles” 作业的 “Exclude” 部分中列出的文件和目录。如果您正在尝试从数据丢失中恢复,您可以将恢复的文件复制到其适当的位置。
删除恢复的文件
您可能希望删除恢复的文件以释放磁盘空间。要这样做,请使用以下命令:
sudo -u root bash -c "rm -rf /bacula/restore/*"
请注意,您必须以 root 用户身份运行此 rm
命令,因为许多恢复的文件的所有者是 root。
结论
您现在拥有一个可以备份和恢复本地文件系统的基本 Bacula 设置。下一步是将其他服务器添加为备份客户端,以便在数据丢失时可以恢复它们。
下一个教程将向您展示如何将其他远程服务器作为 Bacula 客户端添加:如何使用 Bacula 备份 Ubuntu 14.04 服务器。