macos备份完整性校验须结合结构验证、哈希比对与元数据检查,time machine用tmutil verifychecksums+目录快照,.dmg/.sparsebundle先哈希再hdiutil verify,数据库导出需验非空、sql头和解压性。
macos 系统备份的定期完整性校验不能只靠“能打开”或“有文件”,必须结合结构验证、哈希比对与元数据检查。系统自带工具能力有限,需用脚本串联关键命令,实现自动化、可回溯、带日志的校验流程。
校验核心:三类目标分别处理
不同备份类型适用不同校验逻辑,混用会导致漏检:
-
Time Machine 备份:重点验证元数据一致性与块级校验和,用
tmutil verifychecksums+ 目录结构快照比对 -
手动克隆镜像(.dmg/.sparsebundle):先校验文件本身哈希,再挂载后运行
hdiutil verify检查文件系统完整性 - 数据库导出备份(如 pg_dump / sqlite .dump):验证文件非空、SQL 头部有效、压缩包可解压,避免空文件或截断
基础校验脚本框架(zsh)
以下为可直接部署的轻量脚本模板,适配日常定时任务(如 launchd 或 cron),已避开恢复模式限制,兼容 macOS Sonoma 及更新版本:
#!/bin/zsh
BACKUP_PATH="/Volumes/BackupDrive/Backups.backupdb/MacBook/latest"
LOG_FILE="/var/log/backup-verify.log"
DATE=$(date "+%Y-%m-%d %H:%M")
echo "[$DATE] 开始校验 Time Machine 备份..." >> $LOG_FILE
if tmutil verifychecksums "$BACKUP_PATH" 2>&1 | grep -q "succeeded"; then
echo "✓ 校验通过:数据块完整性正常" >> $LOG_FILE
else
echo "✗ 校验失败:发现损坏数据块" >> $LOG_FILE
osascript -e 'display notification "Time Machine 备份校验失败" with title "备份警报"'
fi
# 同时记录目录项数量作为辅助指标
REAL_COUNT=$(find ~/Documents ~/Desktop ~/Downloads -type f 2>/dev/null | wc -l)
BACKUP_COUNT=$(find "$BACKUP_PATH"/MacBook/Data/Documents "$BACKUP_PATH"/MacBook/Data/Desktop 2>/dev/null | wc -l)
if [ "$REAL_COUNT" -gt 0 ] && [ "$BACKUP_COUNT" -gt 0 ]; then
echo "? 源文件数: $REAL_COUNT | 备份文件数: $BACKUP_COUNT" >> $LOG_FILE
fi
增强可靠性:加入自动修复与告警
纯校验不够,脚本应具备响应能力:
- 发现校验失败时,自动尝试在恢复模式下运行急救:
diskutil apfs repairVolume /dev/diskXsY(需提前授权) - 连续两次校验失败,触发邮件或通知(可用
osascript或mail命令) - 每次校验后生成简明摘要文件(如
verify-summary-$(date +%Y%m%d).txt),含时间、结果、文件数差异,方便人工抽查 - 对加密备份,校验前先用
hdiutil isencrypted确认卷状态,避免因密码错误误判为损坏
不依赖图形界面的离线验证方案
当主系统异常、需在恢复模式下验证时,脚本需精简适配:
- 避免使用
basename、date -v等高版本命令,改用${PATH##*/}和date "+%Y%m%d" - 不调用网络工具(curl/mail),仅写入本地日志或触发通知(
say或osascript在恢复模式仍可用) - 预置脚本到外接备份盘根目录(如
/Volumes/BackupDrive/verify.sh),进入恢复模式后终端中直接运行:bash /Volumes/BackupDrive/verify.sh











