Bacula 用一组相互协作的服务管理网络备份、恢复与校验。Ubuntu Server 官方教程采用一个适中的部署:备份服务器安装 Director、Catalog、Storage、File 和 Console,既协调网络备份,也备份自身;另一台工作站只安装 File 服务,将指定数据交给服务器存储。
本文完整编译源页,并整理资源之间的引用关系。源文日志使用 Bacula 15.0.3 和 Ubuntu 25.10,时间戳来自 2025 年;它们是原作者的示例环境,不能当成当前软件包版本或本稿实测结果。本文未安装 Bacula、未读取系统配置密码、未启动备份或恢复作业。

一、先分清六个组件
| 组件 | 职责 |
|---|---|
| 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、备份或恢复测试;没有发现的问题不代表不存在漏洞。实际配置必须在授权的隔离环境中核对,再形成可恢复的部署方案。












暂无评论内容