飞牛 NAS 相册人脸识别“图片不存在”报错排查与指南

现象描述

在飞牛 NAS (FNOS) 系统中使用相册服务时,部分用户在执行“AI 人脸识别”或“智能识别”任务时,可能会遇到大量任务执行失败的情况。查看错误详情,通常会显示红色的警告信息:“xx项内容失败,图片不存在”

导出相册系统的 error.log(路径实例:Debug_Log_XXXXXXXXXXXXX/内置应用/trim.photos/error.log)后,会发现大量类似以下的报错日志:

Plaintext

time="..." level=error msg="gen thumb err, id: 70476, err: open /vol2/.../Xiaomi 24129PN74C_1/.../IMG20250915160246.jpg: no such file or directory"
time="..." level=error msg="read file error open /var/apps/trim.photos/...: no such file or directory"
time="..." level=error msg="original file:.../mmexport1773138315554.jpg not exist"

问题成因

该问题属于典型的**“数据库索引与物理存储脱节”**引发的任务队列死锁。

典型触发场景:

用户挂载了某存储空间(例如“空间2”)的文件夹到相册中,系统随之自动触发并添加了大量 AI 人脸识别任务。但在这些 AI 任务尚未执行完成前,用户手动删除了硬盘上的物理文件夹,并顺带将该文件夹从相册的“挂载目录”中剔除了

逻辑死锁分析:

  1. 任务队列中已经生成了指向这些绝对路径的 AI 识别任务。

  2. 物理文件丢失导致引擎在执行 open() 操作时触发阻断式错误。

  3. 由于目录已被相册剔除挂载,后续无论系统如何“重新扫描”,都不会再去访问这些已注销的路径,导致这些“空任务”永远卡在队列中无法被清理或标记为失败。

常规排查与试错记录

在最终解决问题前,通常会经历以下试错过程。这些方法虽对普通错误有效,但针对上述的“脱机死锁”任务均告失败:

  1. 基础刷新(无效): 直接在相册中点击“重新扫描”。结果:因目录已脱离相册监控,系统直接跳过,报错依旧。

  2. 高级设置重置(无效): 进入“AI相册设置” -> “人脸识别” -> “高级设置”,不修改任何参数直接点击“确认”以重新触发聚合。结果:仅对内存不足导致的显示为空有效,无法解决任务队列死锁。

  3. 瞬间“新建+删除”触发(无效): 通过脚本瞬间创建缺失的文件夹并立刻删除,试图触发 inotify 监听。结果:同样因为目录已不在相册监控范围内,瞬间的操作无法被相册服务捕获。

终极解决思路与流程

针对极其顽固的脱机幽灵任务,核心解决思路为**“狸猫换太子 + 恢复挂载”**:

先根据错误日志提取所有缺失文件的绝对路径,批量生成 0 字节的假文件(占位符)接着将这些目录重新挂载回相册,让系统能够扫描到这些假文件。AI 引擎读取到文件后,会因文件格式无效(0字节)将其标记为“已处理/格式错误”并移出队列,从而彻底终结报错。

详细操作步骤

⚠️ 权限提醒: 以下操作需通过 SSH 登录 NAS 终端,并全程在 root 权限下执行。

步骤 1:定位并提取错误日志

确保已通过飞牛 NAS 管理界面导出系统诊断日志,并找到 trim.photos/error.log 的绝对路径。(例如:/vol3/1002/其他/Debug_Log/apps/trim.photos/error.log)。

步骤 2:执行“狸猫换太子”批量生成脚本

在终端中执行以下命令,该脚本将提取缺失路径,并自动重建完整的目录结构和 0 字节的假文件。

Bash

# 1. 切换到 root 权限
sudo -i

# 2. 进入任意工作目录
cd /vol2/1002/hui/

# 3. 定义错误日志的绝对路径(请根据实际情况替换)
LOG_FILE="/vol3/1002/其他/Debug_Log_20260412151107/apps/trim.photos/error.log"

# 4. 提取所有报错的图片绝对路径,并去重保存到 missing_list.txt
grep -oE '/vol2/1002/hui/photos/MobileBackup/Xiaomi 24129PN74C_1/[^:]+\.(jpg|png|JPG|PNG|jpeg|JPEG)' "$LOG_FILE" | sort | uniq > missing_list.txt

# 打印抓取到的目标数量
echo "🎯 成功从日志中抓取到 $(wc -l < missing_list.txt) 个幽灵照片路径!"

# 5. 批量生成完整路径及 0字节 假照片文件
while read -r filepath; do
    mkdir -p "$(dirname "$filepath")"
    touch "$filepath"
done < missing_list.txt

echo "✅ 假照片已全部生成完毕!"

步骤 3:恢复挂载并在相册系统中“消化”队列(关键)

完成占位符文件的生成后,必须回到飞牛相册的 Web 管理端进行以下操作

  1. 恢复目录挂载(核心前提): 在相册设置中,手动将刚才重建假照片所在的根文件夹(例如 Xiaomi 24129PN74C_1 的父目录)重新添加/挂载到相册的监控空间中

  2. 重新扫描目录: 挂载完成后,进入 设置 -> 文件夹管理 -> 点击 重新扫描,等待扫描进度条彻底跑完,让相册系统“看到”这些假文件。

  3. 重试人脸识别: 进入 人脸识别 界面,点击出错任务的重试按钮。此时 AI 任务队列会被顺利消化,报错数量迅速清零。

步骤 4:清理战场(过河拆桥)

确认网页端的所有红字报错已经彻底消失后,回到 Linux 终端,清理掉假数据现场,并在网页端移除挂载。

Bash

# 彻底删除伪造的基础备份目录 (执行前务必核对路径,切勿误删正常数据!)
rm -rf "/vol2/1002/hui/photos/MobileBackup/Xiaomi 24129PN74C_1"

# 删除工作目录下生成的临时列表文件
rm /vol2/1002/hui/missing_list.txt

echo "🗑️ 假数据现场已清理完毕!"

最后,在相册网页端将该目录再次取消挂载,并点最后一次 重新扫描 即可。至此,因提前删除目录导致的任务队列死锁问题被完美解决。

评论