飞牛 1.1.19 NAS 升级后的连环故障排查及解决方案

飞牛 NAS 故障复盘

适合:技术博客发布 / 提交官方工单附件
目标:不仅讲结论,也讲“怎么排查、怎么修、怎么验证”

1. 环境与问题概述

  • 设备:两台飞牛 NAS(记为 NAS-ANAS-B
  • 更新后主要问题:

    1. SMB 显示开启,但共享“可发现不可访问”
    2. 文档服务 trim-docs-pgsql 启动失败
    3. 一台机器出现持续 soft lockup 内核告警

2. SMB 故障:完整排查与修复步骤

2.1 现象确认(先不改配置)

A. 检查端口是否监听

# 在任意同网段终端
nc -vz NAS_IP 139
nc -vz NAS_IP 445
  • 端口不开:优先查服务未起
  • 端口开但打不开共享:优先查 Samba 日志与配置

B. 检查 SMB 服务状态

systemctl is-active smbd nmbd smb
systemctl status smbd --no-pager -n 50

C. 查看关键日志

journalctl -u smbd -n 120 --no-pager | egrep -i 'trim_perms|vfs_init failed|error loading module|NT_STATUS'
本次故障核心命中:trim_perms.so 不存在但被配置加载。

2.2 配置修复(核心)

A. 先备份配置

sudo cp -a /etc/samba/smb.conf /etc/samba/smb.conf.bak.$(date +%F-%H%M%S)
sudo cp -a /etc/samba/smb.custom.conf /etc/samba/smb.custom.conf.bak.$(date +%F-%H%M%S)

B. 移除失效 VFS 模块组合

sudo sed -i 's/vfs objects = trim_perms full_audit/vfs objects = full_audit/g' \
  /etc/samba/smb.conf /etc/samba/smb.custom.conf

C. 确保共享 include 生效(按你的系统实际 share 文件路径)

grep -q '^\s*include\s*=\s*/etc/samba/users/1000.share.conf\s*$' /etc/samba/smb.conf || \
  echo '  include = /etc/samba/users/1000.share.conf' | sudo tee -a /etc/samba/smb.conf >/dev/null

D. 语法检查 + 重启服务

sudo testparm -s
sudo systemctl restart smbd nmbd smb
systemctl is-active smbd nmbd smb

2.3 防复发(关键)

问题点:后台切换 SMB 开关会重写配置,可能把 trim_perms 写回来。

A. 写入启动前自修脚本

sudo tee /usr/local/sbin/fix-smb-vfs.sh >/dev/null <<'SH'
#!/bin/sh
set -eu
for f in /etc/samba/smb.conf /etc/samba/smb.custom.conf; do
  [ -f "$f" ] || continue
  sed -i 's/vfs objects = trim_perms full_audit/vfs objects = full_audit/g' "$f"
done
if [ -f /etc/samba/smb.conf ]; then
  grep -q 'include = /etc/samba/users/1000.share.conf' /etc/samba/smb.conf || \
    echo '  include = /etc/samba/users/1000.share.conf' >> /etc/samba/smb.conf
fi
testparm -s >/dev/null 2>/dev/null || exit 1
SH
sudo chmod 755 /usr/local/sbin/fix-smb-vfs.sh

B. 做 systemd override(每次 smbd 启动前自动纠偏)

sudo mkdir -p /etc/systemd/system/smbd.service.d
sudo tee /etc/systemd/system/smbd.service.d/override.conf >/dev/null <<'EOF'
[Service]
ExecStartPre=/usr/local/sbin/fix-smb-vfs.sh
EOF

sudo systemctl daemon-reload
sudo systemctl restart smbd nmbd smb

2.4 修复后验证

# 本机枚举(NAS 内部)
smbclient -L //127.0.0.1 -U YOUR_USER%YOUR_PASS -m SMB3

# 客户端验证
# Windows: \\NAS_IP
# macOS:  smb://NAS_IP

同时看最近日志不再出现:

  • trim_perms.so missing
  • vfs_init failed for trim_perms

3. 文档服务 trim-docs-pgsql:排查与处理步骤

3.1 快速诊断

systemctl is-active trim-docs-pgsql
sudo systemctl status trim-docs-pgsql.service --no-pager -n 40
sudo journalctl -u trim-docs-pgsql.service -n 80 --no-pager

本次命中错误:

pg_ctl: directory ".../trim.docs/pgsql-data/db" does not exist

即 PGDATA 路径缺失。


3.2 先止血(低风险)

sudo systemctl disable --now trim-docs-pgsql.service

目的:停止重启风暴,降低系统噪音与干扰。


3.3 查找可恢复目录(非破坏性)

sudo find /vol1 /vol2 /var/lib -maxdepth 6 -type d \( -iname '*trim*docs*' -o -iname 'pgsql-data' -o -iname 'postgres*' \) 2>/dev/null
sudo ls -lah /vol1/@appmeta/trim.docs 2>/dev/null
如果找到原目录,优先做“路径修正 + 权限恢复”。

3.4 本次实际结果

  • 目录缺失问题明确
  • 你后续通过启用/更新文档编辑器应用后,前台功能恢复
  • 底层数据库路径问题建议继续观察(避免后续再次异常)

4. soft lockup:应急处置步骤

4.1 现场症状

持续出现:

watchdog: BUG: soft lockup - CPU#X stuck for XXXXs! [kworker/X:Y:PID]

4.2 先留证据

sudo journalctl -k --since "2 hours ago" --no-pager > /tmp/kernel-lockup.log
sudo ps -eLo pid,tid,psr,pcpu,stat,comm,wchan:32 | grep kworker > /tmp/kworker.log

4.3 快速止血

  • 进入维护窗口后重启
  • 重启后第一时间复查:
uptime
sudo journalctl -k -b --no-pager | egrep -i 'soft lockup|watchdog|hung task'
vmstat 1 3

4.4 本次结果

  • 重启前持续告警
  • 重启后复查未再持续出现同类告警(仍建议短期观察)

5. 最终状态(本轮结束)

  • NAS-A:SMB 恢复并做了防复发
  • NAS-B:SMB 恢复;文档服务根因已定位;soft lockup 重启后暂未复发

拾柒
“ 做自己 ”
 喜欢文章
头像