CentOS 7 下 Bacula 企业级备份系统实战部署与灾备恢复

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),原因有三:

  1. Bacula 的 Job 表有 2000 万+ 记录时,PostgreSQL 的 VACUUM 清理效率比 MySQL OPTIMIZE TABLE 高 5 倍;
  2. pg_stat_activity 可实时监控 Bacula 的 SQL 查询,定位慢查询;
  3. 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 ,如果看不到对应端口,说明

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值