前言
在本人使用的一台 Intel N5105 处理器的工控机使用RR安装黑群晖 SA6400 时,遇到如下问题:在 PVE 下使用虚拟机安装黑群晖运行非常稳定,但一旦物理机直装,系统就会非常不稳定出现各种各样的问题。
常见的故障表现包括但不限于:
- 不定时异常重启:开机一段时间后,在使用过程中或是空闲时间,不定时的出现系统异常重启的情况。
- 套件异常崩溃:套件异常停止并无法重新启动,甚至套件中心显示所有套件停止,但实际套件仍在运行。
- 资源监控失效:打开资源监控看不到任何数据/打开存储管理器看不到硬盘信息。
经过深入排查,这并非硬件损坏,而是 Linux 内核与 Jasper Lake CPU 的 C-State(电源管理) 兼容性问题。本文记录了完整的排查过程和解决方案。
一、 故障排查
通过 SSH 登录群晖,查看内核日志 dmesg,发现了大量的内存段错误(Segfault)和 CPU 指令读取错误。
dmesg | grep -i segfault
日志输出示例:
[ 8720.678527] SYNO.Entry.Sock[14489]: segfault at ... error 14 in synoscgi...
[ 8720.691756] Code: Unable to access opcode bytes at RIP ...
分析结论:
Unable to access opcode bytes 意味着 CPU 在尝试从深度睡眠(C-State)唤醒时,由于电压波动导致读取指令失败。这是 N5105 在 Linux 5.10/5.15 内核下的通病。
此外,通过检查 CPU 空闲驱动:
cat /sys/devices/system/cpu/cpuidle/current_driver
# 输出: acpi_idle
发现系统加载了通用的 acpi_idle 驱动,且默认启用了 C3(对应硬件 C6/C7)深度睡眠,导致死机。
二、 解决方案
为彻底解决死机问题,需要在内核启动参数中强制限制 CPU 的睡眠深度。以下操作为在群晖中挂载引导分区修改 cmdline,亦可以直接在 RR 引导中修改。
1. 挂载引导分区
SSH 登录后,执行以下命令挂载引导盘(通常是第一个分区):
sudo -i
echo 1 > /proc/sys/kernel/syno_install_flag
mkdir -p /tmp/synoboot1
mount /dev/synoboot1 /tmp/synoboot1
2. 修改 user-config.yml
使用 vi 或 WinSCP 编辑 /tmp/synoboot1/user-config.yml 文件。
找到 cmdline: 字段。如果它是空的,请将其修改为如下格式。
cmdline: {"processor.max_cstate": "1"}。
3. 重启验证
保存文件后,重启 NAS。
reboot
重启后,执行以下命令验收成果:
grep . /sys/devices/system/cpu/cpu0/cpuidle/state*/name
成功标志:输出结果中只包含 POLL 和 C1,不再出现 C2、C3 或更高数值。
/sys/devices/system/cpu/cpu0/cpuidle/state0/name:POLL
/sys/devices/system/cpu/cpu0/cpuidle/state1/name:C1
只要看到这个结果,N5105 的死机问题即告彻底根除。
