在 Ubuntu 上配置 Bacula:从服务端和客户端到备份与恢复

Bacula 用一组相互协作的服务管理网络备份、恢复与校验。Ubuntu Server 官方教程采用一个适中的部署:备份服务器安装 Director、Catalog、Storage、File 和 Console,既协调网络备份,也备份自身;另一台工作站只安装 File 服务,将指定数据交给服务器存储。

本文完整编译源页,并整理资源之间的引用关系。源文日志使用 Bacula 15.0.3 和 Ubuntu 25.10,时间戳来自 2025 年;它们是原作者的示例环境,不能当成当前软件包版本或本稿实测结果。本文未安装 Bacula、未读取系统配置密码、未启动备份或恢复作业。

Bacula 备份服务器内的 Console 连接 Director,Director 调度客户端 File Daemon 并记录 Catalog,File Daemon 将数据传给 Storage Daemon 写入备份卷;恢复沿反向数据路径写入指定恢复目录。
图 1:控制、目录索引和备份数据各有路径。未完纪原创技术示意图;图中组件可以部署在不同主机。

一、先分清六个组件

组件 职责
Director 控制备份、恢复、校验与归档,定义客户端、计划、文件集、存储池和作业。
Console 与 Director 交互,查询状态、运行作业、选择恢复文件。
File Daemon(FD) 安装在被备份机器上,处理 Director 请求的数据;恢复时也在目标客户端写文件。
Storage Daemon(SD) 把数据写入物理介质或从中读回。
Catalog 在 SQL 数据库中保存文件索引与卷信息,帮助定位备份;它不是备份文件本身。
Monitor 用于监视备份系统的图形托盘工具,本文不额外部署。

原文介绍 Linux、Windows 和 Mac OS X 客户端,本文实际配置针对 Ubuntu。组件可集中在一台机器,也可分布到多台;完全分布式有利于扩展,但需要更多网络、命名与认证配置。

二、安装服务器组件与目录数据库

原文列出 PostgreSQL、MySQL 和 SQLite 三种 Catalog 数据库,并把 SQLite 限于测试或开发。各 Bacula 版本与发行包的数据库支持应另行核对。本教程选 PostgreSQL:

sudo apt install postgresql
sudo apt install bacula

bacula 元包会拉取此部署所需组件。安装过程中会要求设置 Bacula 数据库所有者的密码;按原文,留空会生成随机密码。这里的 PostgreSQL 存放的是备份目录索引,不是“自动备份业务 PostgreSQL 数据”的方案。数据库业务一致性备份需要另行设计。

服务或工具 主要配置文件
Director /etc/bacula/bacula-dir.conf
Storage /etc/bacula/bacula-sd.conf
File /etc/bacula/bacula-fd.conf
Console /etc/bacula/bconsole.conf

安装程序为组件之间的认证生成密码,并保存在配置文件及 /etc/bacula/common_default_passwords 中。后者可供后续安装的本机组件复用;原文说所有组件配置完成后通常不再需要它。保留与清理都应遵循秘密管理规则,不能把其内容贴到工单、终端录屏或公共代码仓库。

下列所有“安装生成的密码”都是说明性占位文本,必须用相应主机已有的真实值配置,不能原样使用。示例主机名 bacula-server.lxd 与 workstation1.lxd 来自原文环境,实际网络必须能正确解析这些资源所用地址。

三、配置 Director:让资源相互引用

Bacula 配置以花括号包围的资源块组成。除明确指出其他文件外,本节都编辑 bacula-dir.conf。应在安装生成配置上修改并保留所需 Catalog、Schedule、Messages 等资源,下面这些块并不是能直接覆盖整个文件的完整配置。

Director 与网络监听

Director {
  Name = bacula-server-dir
  DIRport = 9101
  QueryFile = "/etc/bacula/scripts/query.sql"
  WorkingDirectory = "/var/lib/bacula"
  PidDirectory = "/run/bacula"
  Maximum Concurrent Jobs = 20
  Password = "<本机安装生成的 Director 密码>"
  Messages = Daemon
  DirAddress = 127.0.0.1
}

原文习惯用 主机名-dir 命名 Director,以减少与默认配置的差异。它还建议注释 DirAddress 使服务监听所有接口。本稿安全改编:示例保留本地监听;若确需远程 Console 或其他入站控制连接,再绑定所需的管理接口,并限制允许访问的来源。远端机器被备份,不应被理解为所有控制端口都要向整个网络开放。

FileSet:选哪些文件,排除哪些文件

FileSet {
  Name = "Home Set"
  Include {
    Options {
      signature = SHA256
      aclsupport = yes
      xattrsupport = yes
    }
    Options {
      wilddir = "/home/*/Downloads"
      wildfile = "*.iso"
      exclude = yes
    }
    File = /home
  }
}

这里保留原文 FileSet:选择 /home,要求保存 POSIX ACL 与扩展属性,并使用 SHA256 签名。带 exclude=yes 的通配模式旨在排除下载目录和 ISO 文件;它不是按文件大小排除。原文指出无法在这里直接按大小选掉大文件,所以用位置和扩展名近似。

File 可以出现多次,选择范围累加;Options 可以有多个块。匹配顺序和后端行为应在实际版本中核对,首次演练必须检查最终文件清单,确认排除项确实生效,尤其不能只根据作业结束状态推定文件集正确。

Client:登记被备份系统

Client {
  Name = bacula-server-fd
  Address = bacula-server.lxd
  FDPort = 9102
  Catalog = MyCatalog
  Password = "<与服务器 FD 中 Director 资源一致的密码>"
  File Retention = 60 days
  Job Retention = 6 months
  AutoPrune = yes
}

Name 应与该机器的 FileDaemon 名称匹配。即使现在组件共处一台主机,也应理解地址会被传给其他系统;分布式配置里的 localhost 指向接收它的那台机器,并不自动指向备份服务器。

File Retention 与 Job Retention 管理 Catalog 记录的保留,AutoPrune 按保留策略清理相关记录。这和备份介质能保存多久不是同一个层次。原文提到默认 BackupClient1 作业与 Catalog 归档,实际安装名称可能不同,应核对现有 Catalog 备份作业,避免重命名时丢掉它的职责。

Pool:备份卷的集合

Pool {
  Name = File
  Pool Type = Backup
  Recycle = yes
  AutoPrune = yes
  Volume Retention = 365 days
  Maximum Volume Bytes = 50G
  Maximum Volumes = 100
  Label Format = "Vol-"
}

一个 Volume 可以是一盘磁带,也可以是一个磁盘文件。此处按原文每卷 50G、最多 100 卷,配置容量乘积约为 5000GB;它不是已经占用的空间,也不能作为存储实际可用容量保证。卷自动命名为 Vol-0001 等。

Recycle=yes 允许满足条件的卷被重新使用,可能覆盖旧备份数据。保留期、可回收条件与 Catalog 记录必须一起规划。这里的 365 天不是在容量不足、管理操作或配置变化时仍能保证恢复一年前所有文件的承诺。

Storage:Director 找到存储服务

Storage {
  Name = FileBackup
  Address = bacula-server.lxd
  SDPort = 9103
  Password = "<本机安装生成的 SDPASSWD 对应值>"
  Device = FileBackup
  Media Type = File
}

Address 必须是客户端也能连接的地址,不能用 localhost 替代。Device 和 Media Type 要与 SD 文件中的 Device 资源一致。SD 的密码可在安装已有资源、common_default_passwords 或 SD 配置中核对;原文给出打印 SDPASSWD 的命令,本稿只说明核对位置,不鼓励把秘密输出到共享日志。

四、配置 Storage Daemon 与真实存储目录

转到 /etc/bacula/bacula-sd.conf。原文用注释 SDAddress 的方式监听所有接口。本稿给出显式接口的改编形式,192.0.2.10 是文档保留地址,必须替换为备份服务器真实且受保护的接口:

Storage {
  Name = bacula-server-sd
  SDPort = 9103
  WorkingDirectory = "/var/lib/bacula"
  Pid Directory = "/run/bacula"
  Plugin Directory = "/usr/lib/bacula"
  Maximum Concurrent Jobs = 20
  Encryption Command = "/etc/bacula/scripts/key-manager.py getkey"
  SDAddress = 192.0.2.10
}

Device {
  Name = FileBackup
  Media Type = File
  Archive Device = /storage/backups
  Random Access = yes
  Automatic Mount = yes
  Removable Media = no
  Always Open = no
  Label Media = yes
}

Director {
  Name = bacula-server-dir
  Password = "<与 Director 文件 Storage 资源一致的密码>"
}

Archive Device 指向备份卷目录,可由外部存储挂载到此处;Label Media=yes 允许为文件卷命名。最后的 Director 资源指定允许使用该 SD 的 Director 名称与认证密码,二者必须匹配前面的配置。

Encryption Command 是源文保留的配置项;看到这个名字并不能证明整个备份存储已经完成加密,更不能替代密钥备份与恢复验证。源文日志虽展示 TLS 连接,也不能证明读者当前机器的 TLS 配置正确。应按所用版本核对传输认证、加密和证书/密钥策略。

原文创建 /storage、备份和恢复目录,并递归改变 /storage 所有权。为避免波及该路径下原有其他文件,本稿把命令改为只创建并配置三个明确目录:

sudo install -d -o bacula -g bacula -m 0700 /storage /storage/backups /storage/restore

这仍会改变指定目录的所有权和权限,执行前要确认路径与挂载设备,不能在不清楚用途的已有目录上运行。普通用户不应能读取备份内容;服务需要在目标目录创建和移除卷文件。还要检查挂载失败时是否会把数据写到系统盘上的同名空目录。

五、用 Job 把客户端、文件集和存储连起来

作业回答“备份谁、备份什么、存到哪里、什么时候运行”。在 Director 文件中保留安装自带的 WeeklyCycle、Standard 和 MyCatalog 等资源,并把默认作业设置改为:

JobDefs {
  Name = "DefaultJob"
  Type = Backup
  Level = Incremental
  Client = bacula-server-fd
  FileSet = "Home Set"
  Schedule = "WeeklyCycle"
  Storage = FileBackup
  Messages = Standard
  Pool = File
  SpoolAttributes = yes
  Priority = 10
  Write Bootstrap = "/var/lib/bacula/%c.bsr"
}

Job {
  Name = "DirectorHomeBackup"
  JobDefs = "DefaultJob"
}

Job {
  Name = "RestoreFiles"
  Type = Restore
  Client = bacula-server-fd
  Storage = FileBackup
  FileSet = "Home Set"
  Pool = File
  Messages = Standard
  Where = /storage/restore
}

原文一致性修正:源文配置把作业叫作 DirectorHomeBackup,后面的控制台记录却写成 HomeBackup。本文统一采用前者,读者应以自己的实际资源名操作,不能照抄菜单序号。

恢复作业仍必须保留有效的 FileSet 与 Pool 引用,虽然它们不用于选择恢复内容。Where 是恢复时加到原始路径前的目录前缀;此处先恢复到隔离目录。一次恢复也可以修改目标客户端和路径,但应在确认摘要中再次核对。

六、File Daemon、Console 与配置清理

服务器本身也需要 File Daemon。原文在 bacula-fd.conf 中注释 FDAddress 以方便以后拆分组件;本稿建议若仅有本机 Director/Storage,保留所需最小监听范围。若要远程连接,再设置相应接口,并通过防火墙只允许授权组件。原文默认 FD 端口是 9102,SD 是 9103,Director 是 9101。

本机 Console 使用安装生成的 bconsole.conf 即可。若让非 root 用户运行 Console,原文提供:

sudo adduser <实际用户名> bacula

新组权限通常需重新登录后生效。加入 bacula 组可能使用户能够读取所有备份数据,应按备份管理员权限对待,不能为使用方便给普通账户随意加组。

使用文件 Device 后,未引用的 Autochanger 资源可在确认依赖后删除;原文还列出 SD 中随其产生的 FileChgr1-Dev1、FileChgr1-Dev2、FileChgr2-Dev1 和 FileChgr2-Dev2。只清理确实没有其他作业使用的资源。修改完配置,按维护窗口重启相关服务:

sudo systemctl restart bacula-dir.service bacula-fd.service bacula-sd.service

服务重启会影响正在运行的作业;先验证配置与资源引用、确认无冲突任务,再安排重启。本文没有实际执行任何这些命令。

七、手动运行首次备份并检查结果

在 Director 主机以 sudo bconsole 进入控制台。help 查看命令,help run 查看作业参数;在交互提示中输入一个点 . 可取消当前命令。

输入 run,选择实际存在的 DirectorHomeBackup。在最终摘要中逐项核对 Client、FileSet、Pool、Storage、Level 和时间;需要调整时输入 mod,确认后才输入 yes。Director 返回的 JobId 仅说明作业入队,不能据此宣称备份成功。

messages
list jobs
list jobid=<本次 JobId>
list joblog jobid=<本次 JobId>

messages 显示未读消息并将其标为已读;list jobs 列出作业;后两条针对一个作业查看摘要和详细日志。还可查阅服务器的 /var/log/bacula/bacula.log。

原文的作业状态 T 表示正常结束,日志中还展示 FD/SD 结束状态及 Backup OK,并在 /storage/backups 看到 Vol-0001。这些都是源文记录,不是本稿运行输出。增量作业即便新增文件数为零也可能正常结束;需要结合预期数据变化判断,而不能只看“有卷文件”或状态字母。

八、恢复文件才是闭环

不要直接运行 RestoreFiles 作业。应输入 restore,先选含目标文件的作业,再进入文件选择模式。原文用“选择某客户端最近一次备份”的菜单项,由 Bacula 组合所需全量和增量作业。

在选择模式中,dir 查看清单、cd 进入目录、mark 选中文件、unmark 取消选择,最后用 done 结束选择。下面是操作形态,文件名必须来自当前清单:

restore
# 在菜单中选择客户端和目标备份链
dir
cd home/ubuntu
dir
mark <已确认存在的文件名>
done

原文后续选择 .tmux.conf,但前面的节选目录清单没有显示它;本文不复制这种不完整记录来假装已核验该文件。应以实际备份树为准。

退出选择后,Bacula 生成 bootstrap 记录,并列出所需卷、Storage、Device 以及恢复摘要。默认 Where=/storage/restore 时,原始 /home/ubuntu/文件 将恢复到目标客户端的 /storage/restore/home/ubuntu/文件,不是必然恢复到 Storage 服务器。

原文还展示通过 mod 修改 Where,输入 / 去掉前缀、恢复到原始路径;同一摘要中的 Replace: Always 可能覆盖现有文件。这是有破坏性的恢复方式,本稿未执行;首次验证应保留隔离路径,并确认替换策略和目标客户端。

恢复作业结束后,应核对实际文件内容、权限、所有者、ACL 和扩展属性;必要时验证业务能够读取恢复数据。原文的“恢复成功”记录只证明其示例环境的行为,不能替代读者自己的恢复演练。

九、加入一台工作站

在工作站 workstation1 安装 bacula-fd。编辑它的 /etc/bacula/bacula-fd.conf:Director 的 Name 必须是 Director 资源名,而非随意填写的主机地址;安装生成的 FD 密码稍后要同步到服务器的 Client 资源。

sudo apt install bacula-fd
Director {
  Name = bacula-server-dir
  Password = "<工作站安装生成的 FD 认证密码>"
}

FileDaemon {
  Name = workstation1-fd
  FDport = 9102
  WorkingDirectory = /var/lib/bacula
  Pid Directory = /run/bacula
  Maximum Concurrent Jobs = 20
  Plugin Directory = /usr/lib/bacula
  FDAddress = 192.0.2.20
}

Messages {
  Name = Standard
  director = bacula-server-dir = all, !skipped, !restored, !verified, !saved
}

192.0.2.20 同样是需替换的文档保留地址;本稿用显式接口替代原文监听全部接口的示例。完成后重启工作站 bacula-fd.service。

回到 Director 的配置文件登记该客户端,再定义继承默认值的工作站作业:

Client {
  Name = workstation1-fd
  Address = workstation1.lxd
  FDPort = 9102
  Catalog = MyCatalog
  Password = "<与工作站 Director 资源一致的 FD 密码>"
  File Retention = 60 days
  Job Retention = 6 months
  AutoPrune = yes
}

Job {
  Name = "BackupWorkstation"
  JobDefs = "DefaultJob"
  Client = workstation1-fd
}

核对名称、地址和密码后,在维护窗口重启 bacula-dir.service。通过 list clients 确认新客户端,再用 run 选择 BackupWorkstation。它继承默认文件集、存储、池与计划,只覆盖客户端。

最后仍需用 restore 选择工作站的备份,确认里面是工作站的文件,并恢复到选定的验证目录。原文用 this-is-workstation1.txt 区分两台机器,本稿不据此声称本地存在或已恢复该文件。

来源、署名和限制

原文:Ubuntu Server documentation — How to install and configure Bacula。作者:Canonical / Ubuntu Server 文档贡献者,源站页脚版权 © 2026 Canonical。进一步参数定义参见 Bacula 官方文档。

未完纪于 2026-10-05 中文编译,保留源文各实质步骤,修正作业命名不一致,补充最小监听范围、秘密输出、目录所有权、卷回收和覆盖恢复风险。源页没有单独列出本篇文档许可证;不把 Bacula 软件许可证冒充文档许可证。

所有配置与命令仅经静态审查,未进行安装、网络、TLS、备份或恢复测试;没有发现的问题不代表不存在漏洞。实际配置必须在授权的隔离环境中核对,再形成可恢复的部署方案。

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容