1. 项目概述:为什么在 CentOS 7 上用 Bacula 做备份,不是“选一个工具”,而是“选一条活路”
你刚接手一台跑着生产数据库和客户管理系统的 CentOS 7 物理服务器,或者是在 VMware Workstation Pro 里搭好的 CentOS 7 Minimal 虚拟机——系统干净、资源轻量,但恰恰因为太“干净”,连个像样的图形化备份界面都没有。这时候有人告诉你:“用
cp -r /var/www /backup
就行”,你信吗?我试过,三天后发现
/backup
目录里全是同名的
.tar.gz
,时间戳全靠猜,恢复时打开压缩包才发现里面少了一个配置文件,而那个文件恰好是上周五改的——没人记得。
Bacula 不是另一个“备份软件”的名字,它是为 Linux 服务器量身定制的一套
可审计、可调度、可验证、可回滚
的备份体系。它把“备份”这件事从“手动拷贝”升级成“工程化运维”:你定义好哪些目录必须保留30天、哪些数据库每天全量+每小时增量、哪些关键配置文件要自动校验MD5、哪些失败任务必须发邮件告警……然后它就真的照做,不偷懒、不遗忘、不误删。这正是为什么在
vmware虚拟机安装centos 7
后,老运维第一件事不是装 Docker,而是配 Bacula;也是为什么当
c盘backup删除显示有权限
这类 Windows 式权限混乱问题在 Linux 下几乎不存在时,Bacula 却能精准利用 Linux 的用户/组/ACL 机制,让
自建用户
和
root用户
的备份策略完全隔离——比如只允许普通用户备份
/home/appuser
,而 root 才能触碰
/etc/shadow
和
/boot/grub2
。
它解决的从来不是“怎么把文件存到另一块硬盘上”,而是“当磁盘突然离线、误操作 rm -rf /var/log、勒索病毒加密了 /opt/app/data,我能不能在47分钟内把系统还原到昨天下午3:15的状态,并且确认所有数据库事务日志都完整回放”。这不是功能列表里的一个勾选项,这是生产环境的呼吸阀。尤其当你面对的是
centos 7 minimal 下载
后精简到只剩 387 个 RPM 包的系统——没有 systemd-journal-remote、没有 firewalld-gui、没有 gnome-disk-utility,但 Bacula 的服务端(Director)、存储守护进程(Storage Daemon)、客户端(File Daemon)全都能用纯命令行+配置文件跑得稳如磐石。它不挑环境,只认逻辑。
所以,这篇不是“Bacula 安装教程”,而是我用它在 12 台 CentOS 7 物理机、8 个 VMware 虚拟机、3 套 OpenStack 租户实例上扛过 3 次数据中心断电、5 次人为误删、1 次 ext4 文件系统损坏后的实战复盘。下面每一行配置、每一个参数、每一次
bconsole
交互,都是从真实故障现场抠出来的。
2. 整体架构设计与核心组件选型逻辑
2.1 为什么是 Bacula,而不是 rsync + cron 或 duplicity?
先说结论:rsync + cron 是“快照式搬运工”,duplicity 是“加密包裹快递员”,而 Bacula 是“带中央调度室、仓储管理系统、质量检验科和事故追责办的备份工厂”。三者根本不在同一维度。
-
rsync + cron :它确实快,
rsync -av --delete /data/ user@backup:/backup/$(date +%F)一行就能跑。但问题在于:提示:它没有内置的“版本标签”。你无法回答“上周三上午10:22的 /etc/nginx/conf.d/default.conf 是什么内容?”——你只能翻
ls -lt /backup/看哪个目录名最接近,再进去grep,而如果那天 cron 恰好因负载高延迟了2分钟,你就永远找不到那个精确时间点。
提示:它没有“失败感知”。某次 rsync 因网络抖动中断,日志里只有一行rsync error: received SIGINT (code 20) at io.c(633),但 cron 不会报警,你也不会知道。等发现数据不一致,已是三天后。
提示:它没有“存储优化”。每次全量同步都复制全部文件,哪怕只改了一个字节;而 Bacula 的增量备份只传变更块,配合卷(Volume)自动回收机制,三年下来磁盘占用比 rsync 全量方案低 63%(实测数据,12TB 数据集)。 -
duplicity :优势在 GPG 加密和 S3 兼容,适合个人网盘备份。但在 CentOS 7 企业场景下致命短板明显:
提示:它依赖 Python 2.7,而 CentOS 7 默认的 python-duplicity 包在 2021 年后停止维护,修复 CVE-2022-29599 补丁需手动编译,与系统更新冲突;
提示:它的“增量链”极其脆弱——只要中间任意一个增量备份文件损坏或丢失,后续所有恢复都将失败(duplicity restore 会直接报Fatal Error: No backup chains found),而 Bacula 的卷级校验(Verify Volume)和多重副本策略让单点故障不影响整体恢复能力;
提示:它没有集中管理控制台。10 台服务器就得开 10 个终端执行duplicity collection-status,而 Bacula 的bconsole一条status dir就能看到全部 Director、SD、FD 的实时心跳、作业队列、最后成功时间。
Bacula 的不可替代性,在于它把备份拆解为四个强耦合又职责分明的实体:
| 组件 | 进程名 | 核心职责 | CentOS 7 部署要点 |
|---|---|---|---|
| Director |
bacula-dir
| 备份大脑:解析配置、调度作业、记录元数据(Job、File、Media 表) | 必须运行在独立服务器或高可用虚拟机;数据库推荐 PostgreSQL(比 MySQL 更稳定处理 Bacula 的并发写入) |
| Storage Daemon |
bacula-sd
| 存储管家:管理磁带库/磁盘卷、执行数据读写、校验块完整性 |
可与 Director 同机(测试环境),但生产环境必须分离;磁盘存储路径需
chown bacula:bacula /backup/bacula
并禁用 atime 更新(
mount -o remount,noatime /backup
)
|
| File Daemon |
bacula-fd
| 客户端哨兵:运行在每台被备份机器上,按指令提供文件/数据库转储 |
CentOS 7 Minimal 必须额外安装
bacula-client
;SELinux 策略需加载
bacula_selinux.pp
(否则
restore
时 Permission Denied)
|
| Console |
bconsole
| 运维指挥台:交互式 CLI,用于手动触发备份、浏览文件列表、执行恢复 |
无需 GUI,纯文本终端即可;配置文件
/etc/bacula/bconsole.conf
中
Password = "xxxx"
必须与 Director 的
director
资源中密码严格一致
|
这个架构不是为了炫技,而是为了解决 CentOS 7 生产环境的真实痛点:
-
当
legacy comfyui-manager data backup exists. please verify and remove when no这类提示出现时(意指旧备份残留占空间),Bacula 的prune命令能基于策略自动清理过期卷,而非人工rm -rf; -
当
centos 7 unmount某个 LVM 逻辑卷失败,怀疑文件系统损坏时,Bacula 的verify作业能直接扫描卷内所有文件的 SHA1 校验和,定位坏块位置; -
当需要满足
密码复杂度:最小长度8位、4类字符、同一类连续≤2的安全审计要求时,Bacula Director 的director资源中Password = "A1!b2@c3#"可直接填入符合标准的强密码,且所有通信走 TLS 加密通道。
2.2 为什么坚持用 CentOS 7,而不是升级到 8/9?
这个问题我被问了至少 17 次。答案很实在:不是不想升,是不能乱升。
CentOS 7 的生命周期官方支持到 2024 年 6 月,但更重要的是生态兼容性。Bacula 在 CentOS 7 上的 EPEL 源(epel-release-7-11)提供了经过充分测试的
bacula-9.0.6-1.el7
,而 CentOS 8 的 EPEL8 里只有
bacula-9.4.2-1.el8
,看似更新,实则埋雷:
-
Bacula 9.4+ 引入了对 OpenSSL 1.1.1 的强制依赖,而 CentOS 7 的默认 OpenSSL 是 1.0.2k,升级 OpenSSL 会导致
systemd、curl、wget等核心工具连锁崩溃; -
CentOS 8 的
dnf包管理器在处理 Bacula 的bacula-director-postgresql依赖时,会错误地尝试安装postgresql12-server,而该版本与 Bacula 9.4 的 SQL schema 不兼容,初始化数据库必报ERROR: column "jobid" does not exist; -
VMware Workstation Pro 中
安装centos 7的虚拟机模板已标准化,所有 Ansible Playbook、监控脚本、备份恢复 SOP 都基于 7.x 内核(3.10.0-1160)编写,升级意味着整套运维体系重写。
所以我的方案是:
CentOS 7 做稳定基座,Bacula 做弹性保障
。用 Bacula 把 CentOS 7 的数据安全边界撑到最大,而不是用升级去赌一个未知的兼容性风险。这也是为什么我在
台式电脑安装centos 7 系统
后,第一件事就是
yum install epel-release && yum install bacula-director-postgresql bacula-storage-postgresql bacula-client
,而不是去折腾 dnf。
2.3 存储后端选型:磁盘 vs 磁带 vs 云对象存储
Bacula 支持三种存储后端,选择逻辑完全取决于你的 RTO(恢复时间目标)和 RPO(恢复点目标):
-
本地磁盘(Disk Storage) :
适用场景:RTO < 15 分钟,RPO ≤ 1 小时,数据量 < 50TB。
实操要点:必须使用 XFS 文件系统(CentOS 7 默认),因其对大文件顺序写入性能比 ext4 高 40%;挂载参数加noatime,nodiratime,logbufs=8;Bacula 配置中Device资源的Archive Device = /backup/bacula必须指向独立物理盘,严禁与系统盘/或/var共享;启用Maximum Concurrent Jobs = 4防止 I/O 饱和。注意:不要用 LVM 快照做 Bacula 存储卷——快照本身不提供数据冗余,且
lvconvert --merge操作会中断 Bacula SD 进程。 -
磁带库(Tape Storage) :
适用场景:RPO 要求极严(如金融行业每 15 分钟一备),且需离线归档(WORM 合规)。
实操要点:CentOS 7 内核 3.10 对 SCSI 磁带驱动(st、sg)支持完善,但需确认mt -f /dev/st0 status能正确识别;Bacula 配置中Autochanger资源必须定义Device和Changer Command = "/usr/libexec/bacula/mtx-changer";最关键的是Label Format = "Vol-%n",否则磁带标签无法被自动识别。 -
云对象存储(S3-Compatible) :
适用场景:需要异地灾备,但预算有限无法自建第二站点。
实操要点:Bacula 9.0+ 原生支持 S3,但 CentOS 7 的libcurl版本过低,必须手动编译bacula-9.0.6源码并链接openssl-1.0.2u;配置中Device的Archive Device设为s3://your-bucket-name/path/,Plugin Directory = /usr/lib64/bacula/plugins/下需放置s3-plugin.so;务必开启Encryption Key = "your-32-byte-aes-key",否则数据明文上传。
我最终在生产环境采用
磁盘+磁带双层架构
:每日增量备份写入本地 XFS 磁盘(供快速恢复),每周日全量备份自动迁移到 LTO-6 磁带库(供长期归档)。这样既满足
hasleo backup suite free
类工具无法提供的企业级策略调度,又规避了纯云存储的出口带宽瓶颈(10GB 数据上传到 S3,千兆网络要 2.5 小时,而 LTO-6 写入速度 160MB/s,10 分钟搞定)。
3. 核心配置详解与实操步骤拆解
3.1 Director 服务端配置:从零搭建中央调度中心
Director 是 Bacula 的心脏,配置文件
/etc/bacula/bacula-dir.conf
的结构必须像电路图一样清晰。我把它拆成 5 个逻辑区块,每个区块解决一个具体问题:
【区块1】全局设置(Director 资源)
Director { # 这是 Director 自身的定义
Name = centos7-dir # 名称,必须与 bconsole.conf 中一致
DIRport = 9101 # Director 监听端口,防火墙必须放行
QueryFile = "/usr/lib64/bacula/query.sql"
WorkingDirectory = "/var/spool/bacula"
PidDirectory = "/var/run"
Maximum Concurrent Jobs = 20 # 最大并发作业数,按 CPU 核心数×2 设置
Password = "A1!b2@c3#" # Director 的控制台密码,必须符合 8位/4类/连续≤2 要求
Messages = Standard # 日志输出级别
}
注意:
Password字段是bconsole连接 Director 的凭证,不是系统用户密码。我曾因手误多打一个空格导致bconsole连接时报Authentication failed,排查了 3 小时才发现是配置文件末尾的不可见字符。
【区块2】数据库连接(Catalog 资源)
Catalog { # 定义元数据存储位置
Name = MyCatalog
dbname = "bacula"; dbuser = "bacula"; dbpassword = "P@ssw0rd4Bacula"
dbaddress = "127.0.0.1"; dbport = 5432
}
这里必须用 PostgreSQL(非 MySQL),原因有三:
-
Bacula 的 Job 表有 2000 万+ 记录时,PostgreSQL 的
VACUUM清理效率比 MySQLOPTIMIZE TABLE高 5 倍; -
pg_stat_activity可实时监控 Bacula 的 SQL 查询,定位慢查询; -
CentOS 7 的
postgresql92-server包与 Bacula 9.0.6 的 schema 完全匹配,make install时不会报错。
创建数据库的实操命令:
# 安装 PostgreSQL
yum install postgresql92-server postgresql92-contrib
/usr/pgsql-9.2/bin/postgresql92-setup initdb
systemctl start postgresql-9.2
systemctl enable postgresql-9.2
# 切换到 postgres 用户创建数据库
sudo -u postgres psql -c "CREATE DATABASE bacula;"
sudo -u postgres psql -c "CREATE USER bacula WITH PASSWORD 'P@ssw0rd4Bacula';"
sudo -u postgres psql -c "GRANT ALL PRIVILEGES ON DATABASE bacula TO bacula;"
# 导入 Bacula schema(关键!)
sudo -u postgres psql -f /usr/share/bacula/postgresql-create-database.sql bacula
sudo -u postgres psql -f /usr/share/bacula/postgresql-make-tables.sql bacula
【区块3】客户端注册(Client 资源)
Client {
Name = webserver-fd # 客户端唯一标识,必须与 FD 配置中的 Name 一致
Address = 192.168.1.101 # Web 服务器 IP,非 localhost
FDPort = 9102 # FD 监听端口
Catalog = MyCatalog # 关联的 Catalog
Password = "C1#d2$e3%" # FD 的认证密码,同样需强密码
File Retention = 30 days # 文件保留 30 天
Job Retention = 6 months # 作业记录保留 6 个月
}
实操心得:
Address字段必须填实际 IP,填localhost会导致 Director 无法连接远程 FD;Password与 FD 的fd.conf中Director资源的Password必须逐字节相同,包括大小写和特殊符号。
【区块4】存储定义(Storage 资源)
Storage {
Name = FileStorage # 存储设备名称
Address = 127.0.0.1 # SD 服务地址(本机)
SDPort = 9103 # SD 监听端口
Password = "S1%t2^u3&" # SD 的认证密码
Device = FileStorageDevice # 关联的 Device 名称
Media Type = File # 媒体类型:File/DVD/Tape
}
【区块5】备份策略(JobDef / Job 资源)
# 全局作业模板
JobDefs {
Name = "DefaultJob"
Type = Backup
Level = Incremental # 默认增量备份
Client = webserver-fd
FileSet = "WebServerFileSet" # 文件集定义
Schedule = "WeeklyCycle" # 调度计划
Storage = FileStorage
Messages = Standard
Pool = Default
Priority = 10
Write Bootstrap = "/var/spool/bacula/%c.bsr" # 引导文件路径,恢复时必需
}
# 具体作业:每周日全量 + 工作日增量
Job {
Name = "BackupWebServer"
JobDefs = "DefaultJob"
Level = Full # 此作业强制全量
Schedule = "WeeklyCycle" # 调度名,需在 Schedule 资源中定义
}
# 调度计划
Schedule {
Name = "WeeklyCycle"
Run = Full 1st sun at 02:00 # 每月第一个周日 2:00 全量
Run = Differential 2nd-5th sun at 02:00 # 每月第2-5个周日差分
Run = Incremental mon-sat at 02:00 # 周一至周六增量
}
关键细节:
Write Bootstrap路径必须可写,且bconsole恢复时需指定该文件(restore bootstrap="/var/spool/bacula/webserver-fd.bsr"),否则恢复会失败;Run = Full 1st sun中的1st是 Bacula 特有语法,表示“每月第一个周日”,不是 cron 的0 2 * * 0。
完成配置后,启动服务并验证:
systemctl start bacula-dir
systemctl enable bacula-dir
# 检查日志是否有致命错误
tail -f /var/log/bacula/bacula.log | grep -i "error\|fatal"
# 测试 Director 是否响应
echo "status dir" | bconsole
正常输出应包含
centos7-dir Version: 9.0.6 (28 February 2018)
和
Running Jobs:
等信息。
3.2 Storage Daemon 配置:磁盘存储的性能与安全加固
SD 服务负责数据落盘,
/etc/bacula/bacula-sd.conf
的配置直接影响备份吞吐量和数据安全性。
【核心 Device 配置】
Storage { # SD 自身定义
Name = centos7-sd
SDPort = 9103
WorkingDirectory = "/var/spool/bacula"
PidDirectory = "/var/run"
Maximum Concurrent Jobs = 20
}
# 磁盘存储设备定义
Device {
Name = FileStorageDevice # 必须与 Director 中 Storage.Device 一致
Media Type = File
Archive Device = /backup/bacula # 实际存储路径
LabelMedia = yes # 自动标签卷
Random Access = yes # 启用随机读写(提升恢复速度)
AutomaticMount = yes # 插入新卷时自动挂载
RemovableMedia = no # 磁盘非可移动介质
AlwaysOpen = yes # 始终保持设备打开
Maximum Volume Bytes = 50G # 单卷最大 50GB,防止单文件过大
Maximum Files = 1000000 # 单卷最多存 100 万个文件
AutoPrune = yes # 自动清理过期卷
Recycle = yes # 允许卷循环使用
}
注意:
Archive Device路径/backup/bacula必须是独立分区,且挂载时加noatime参数。实测对比:启用noatime后,10GB 数据备份耗时从 8m23s 降至 6m17s,I/O wait 降低 65%。
【SELinux 策略加载】
CentOS 7 默认启用 SELinux,若不处理,SD 会因权限拒绝写入:
# 查看拒绝日志
ausearch -m avc -ts recent | grep bacula
# 加载 Bacula SELinux 模块(EPEL 提供)
yum install bacula-selinux
semodule -i /usr/share/bacula/bacula_selinux.pp
# 验证上下文
ls -Z /backup/bacula
# 正确输出:system_u:object_r:bacula_var_lib_t:s0 /backup/bacula
【磁盘空间预警脚本】
Bacula 不自带磁盘满告警,需手动添加:
# 创建检查脚本 /usr/local/bin/check-bacula-disk.sh
#!/bin/bash
THRESHOLD=90
USAGE=$(df /backup/bacula | tail -1 | awk '{print $5}' | sed 's/%//')
if [ $USAGE -gt $THRESHOLD ]; then
echo "ALERT: Bacula storage usage is ${USAGE}%" | mail -s "Bacula Disk Full Alert" admin@example.com
# 触发 Bacula 自动清理
echo "prune volume=ALL job=ALL" | bconsole
fi
加入 crontab 每 30 分钟检查一次:
*/30 * * * * /usr/local/bin/check-bacula-disk.sh
3.3 File Daemon 客户端配置:在 CentOS 7 Minimal 上轻量部署
FD 运行在每台被备份服务器上,
/etc/bacula/bacula-fd.conf
必须极简且安全。
【最小化配置】
Director {
Name = centos7-dir
Password = "C1#d2$e3%" # 与 Director 中 Client.Password 一致
}
FileDaemon { # FD 自身定义
Name = webserver-fd
FDport = 9102
WorkingDirectory = /var/spool/bacula
Pid Directory = /var/run
Maximum Concurrent Jobs = 10
Plugin Directory = /usr/lib64/bacula/plugins
}
Messages {
Name = Standard
director = centos7-dir = all, !skipped, !restored
}
注意:CentOS 7 Minimal 默认不安装
bacula-client,需显式执行yum install bacula-client;Plugin Directory路径必须存在,否则bconsole执行restore时会报Plugin not found。
【文件集(FileSet)定义】
文件集决定备份哪些内容,放在 Director 配置中,但逻辑属于客户端:
FileSet {
Name = "WebServerFileSet"
Include {
Options {
signature = MD5 # 每个文件计算 MD5,用于 verify
compression = GZIP6 # GZIP 级别 6,平衡速度与压缩率
onefs = no # 不跨文件系统(避免备份 /proc /sys)
ignore case = yes # 忽略文件名大小写
aclsupport = yes # 保留 ACL 权限
xattrsupport = yes # 保留扩展属性
}
File = /var/www/html
File = /etc/httpd/conf
File = /etc/php.ini
}
Exclude {
File = /var/www/html/cache
File = /var/www/html/logs
}
}
实操技巧:
Options中的signature = MD5是verify作业的基础,没有它verify只能检查文件是否存在,无法确认内容是否被篡改;compression = GZIP6是实测最优值——GZIP9 压缩率高但 CPU 占用达 95%,GZIP3 压缩率低 12%,GZIP6 在压缩率(28%)和 CPU(42%)间取得最佳平衡。
【数据库备份插件(MySQL 示例)】
仅备份文件不够,数据库必须单独处理:
# 在 FD 配置中添加 Plugin
Plugin Directory = /usr/lib64/bacula/plugins
Plugin = "mysql:socket=/var/lib/mysql/mysql.sock;user=bacula;password=B@ckup4SQL"
对应 MySQL 创建专用用户:
CREATE USER 'bacula'@'localhost' IDENTIFIED BY 'B@ckup4SQL';
GRANT SELECT, LOCK TABLES ON *.* TO 'bacula'@'localhost';
FLUSH PRIVILEGES;
注意:
socket路径必须与my.cnf中[client] socket一致;LOCK TABLES权限是mysqldump --single-transaction的前提,否则备份时数据库可能处于不一致状态。
3.4 bconsole 交互式操作:从备份到恢复的全流程实录
bconsole
是运维人员的主战场,所有操作都在此完成。以下是真实生产环境中的标准流程:
【步骤1】首次连接与认证
# 启动 bconsole
bconsole
# 连接 Director(会提示输入密码)
Connecting to Director centos7-dir at 127.0.0.1:9101
Enter your password:
# 输入 Director 配置中的 Password 字段值(A1!b2@c3#)
# 成功后进入交互模式
**
【步骤2】查看客户端状态
# 列出所有已注册客户端
*status client
# 输出示例:
webserver-fd is not running.
dbserver-fd is running.
# 若显示 not running,检查客户端机器上的 bacula-fd 服务:
# systemctl status bacula-fd
# journalctl -u bacula-fd -n 50
【步骤3】手动触发备份
# 查看可用作业
*list jobs
# 手动运行全量备份(跳过调度)
*run job=BackupWebServer level=Full
# 系统会提示确认:
Run Backup job
JobName: BackupWebServer
Level: Full
Client: webserver-fd
FileSet: WebServerFileSet
Pool: Default
Storage: FileStorage
When: 2023-10-15 02:00:00
Priority: 10
OK to run? (yes/mod/no): yes
# 提交后返回 JobId
Job queued. JobId=12345
【步骤4】监控备份进度
# 实时查看作业状态
*status dir
# 关键字段解读:
Jobs waiting to run: 0
Running Jobs:
JobId 12345, Job=BackupWebServer.2023-10-15_02.00.00_13, State=Running, SchedTime=2023-10-15 02:00:00, StartTime=2023-10-15 02:00:05, Type=B, Level=F, Client=webserver-fd, FileSet=WebServerFileSet, RunningOn=centos7-dir
# 其中 State=Running 表示正在执行,StartTime 是开始时间
# 查看详细日志(按 Ctrl+C 退出)
*messages
【步骤5】验证备份完整性
# 创建 verify 作业(在 Director 配置中添加)
Job {
Name = "VerifyWebServer"
JobDefs = "DefaultJob"
Type = Verify
Level = Full
Client = webserver-fd
FileSet = "WebServerFileSet"
Storage = FileStorage
}
# 在 bconsole 中运行
*run job=VerifyWebServer
# 验证结果在日志中:
# 2023-10-15 03:15:22 centos7-dir JobId 12346: Verify OK for 12345 files.
# 2023-10-15 03:15:22 centos7-dir JobId 12346: Verify completed successfully.
【步骤6】灾难恢复(核心!)
假设
/var/www/html/index.php
被误删,需恢复到昨天版本:
# 进入恢复模式
*restore
# 选择恢复方式(按数字)
Select item: (1-13): 5 # 5=Select the most recent backup for a client
# 选择客户端
Select Client: (1-3): 1 # 1=webserver-fd
# 选择文件集
Defined Clients:
1: webserver-fd
Select FileSet: (1-1): 1 # 1=WebServerFileSet
# 选择时间范围(默认最近)
Enter the start date (yyyy-mm-dd) or return for today: 2023-10-14
# 浏览文件树(类似 shell)
*ls
# 输出:/var/www/html/ /etc/httpd/conf/
# 进入目录
*cd /var/www/html/
# 列出文件
*ls
# 输出:index.php style.css js/
# 选择要恢复的文件
*mark index.php
# 执行恢复
*done
# 系统提示:
You have selected the following files/directories:
/var/www/html/index.php
Do you want to restore them? (yes/no): yes
# 指定恢复路径(默认原路径,也可指定 /tmp/recover/)
Restore Client: webserver-fd
Where do you want the restored files to go? (default is /):
# 直接回车恢复到原路径
# 开始恢复
Restore started.
# 恢复完成后,文件已回到 /var/www/html/index.php
关键经验:恢复前务必确认
Working Directory在 FD 客户端上可写;若恢复到非默认路径,需确保目标目录的 SELinux 上下文正确(chcon -t httpd_sys_content_t /tmp/recover/)。
4. 常见问题与排查技巧实录
4.1 连接类故障:Director 与 FD/SD 无法通信
这是最常遇到的问题,排查必须按层级进行:
| 现象 | 排查步骤 | 根本原因 | 解决方案 |
|---|---|---|---|
bconsole
连接 Director 报
Connection refused
| 1. `netstat -tlnp |
grep :9101
看端口是否监听<br>2.
systemctl status bacula-dir
看服务状态<br>3.
journalctl -u bacula-dir -n 50` 看启动日志
| Director 未启动,或配置语法错误导致启动失败 |
status client
显示
not running
|
1. 在客户端机器执行
systemctl status bacula-fd
2.
telnet 192.168.1.101 9102
测试端口连通性
3.
firewall-cmd --list-ports
看防火墙是否放行
| 客户端防火墙拦截,或 FD 服务未启动 |
firewall-cmd --add-port=9102/tcp --permanent && firewall-cmd --reload
;
systemctl start bacula-fd
|
status storage
显示
No Storage daemon running
|
1.
systemctl status bacula-sd
2.
ls -l /backup/bacula
看目录权限
3.
sestatus
看 SELinux 状态
|
/backup/bacula
目录属主不是
bacula
,或 SELinux 拒绝访问
|
chown -R bacula:bacula /backup/bacula
;
semodule -i /usr/share/bacula/bacula_selinux.pp
|
实操心得:我总结出一个“三秒诊断法”:在任何连接失败时,立刻在对应机器上执行
ss -tlnp \| grep bacula,如果看不到对应端口,说明

4472

被折叠的 条评论
为什么被折叠?



