麒麟 V10 SP1 排查实录:ttyS5 每 10 秒莫名收到一批报文,元凶是 eGTouchD

麒麟 V10 SP1 排查实录:ttyS5 每 10 秒莫名收到一批报文,元凶是 eGTouchD

环境:麒麟 V10 SP1 桌面版(UKUI + lightdm),/dev/ttyS5,9600/8N1

现象:串口调试工具每 10 秒收到 24 字节固定报文,怀疑是读端攒批 → 一路追到 eGalax 串口触屏守护 eGTouchD 在扫端口


一、原始现象

串口调试工具 COMB 日志(\\.\COM5 是 Windows 侧命名,透传到麒麟里即 /dev/ttyS5):

ini 复制代码
[2026/7/14 16:05:22 772]  COMB[\\.\COM5]接收8字节: 00 00 00 00 00 00 00 00
[2026/7/14 16:05:23 025]  COMB[\\.\COM5]接收8字节: 00 E0 00 E0 00 E0 00 E0
[2026/7/14 16:05:23 264]  COMB[\\.\COM5]接收5字节: 98 80 06 06 FE
[2026/7/14 16:05:23 517]  COMB[\\.\COM5]接收3字节: 0A 01 41

批内 4 帧、共 24 字节,批间 ≈ 10 秒,内容完全重复:

长度 数据 角色推测
1 8B 00 00 00 00 00 00 00 00 前导/空闲
2 8B 00 E0 00 E0 00 E0 00 E0 同步字,00 E0 重复 4 次
3 5B 98 80 06 06 FE 载荷头,FE 疑似帧尾
4 3B 0A 01 41 短尾帧 / 命令字

初步判断:不像 Modbus,更像某家私有协议的"心跳 / 枚举 probe"。


二、第一轮:排除读端 termios 攒批

先查 ttyS5 的 termios 参数:

bash 复制代码
sudo stty -F /dev/ttyS5 -a

关键输出:

lua 复制代码
speed 9600 baud; min = 1; time = 0;
-parenb cs8 -cstopb clocal -crtscts
  • VMIN=1, VTIME=0 → 来 1 字节就返回,不按时间攒批
  • VTIME 单位是 0.1s,若真是 VTIME 导致攒批,得是 time=100(=10 秒),这里不是

👉 读端清白,10 秒周期不是 termios 憋出来的,方向转向"设备侧 / 本机某进程周期性写"

💡 stty 里还有几个隐患项顺手记一下:icanonicrnlecho 都还开着,自己写程序 open("/dev/ttyS5") 直读时,0A 01 41 里的 0A 会被 canonical 当行结束吃掉,建议改 raw:

bash 复制代码
sudo stty -F /dev/ttyS5 raw -echo -icanon -icrnl

三、第二轮:谁在写 ttyS5?

3.1 lsof / fuser 都扑空

bash 复制代码
sudo lsof /dev/ttyS5      # 无命中
sudo fuser -v /dev/ttyS5  # 无命中
sudo grep -l '/dev/ttyS5' /proc/*/fd/* 2>/dev/null  # 也无

fd 层面查不到,说明没有进程长占 ttyS5,更可能是"短连接 open→write→close"模式,lsof 瞬时扫不到。

3.2 auditd 抓 write

bash 复制代码
sudo auditctl -w /dev/ttyS5 -p w -k ttyS5_write

等两个 10 秒周期后:

bash 复制代码
sudo ausearch -k ttyS5_write -i

关键命中:

ini 复制代码
proctitle=/usr/bin/eGTouchD -f
syscall=openat, a2=O_RDWR|O_NONBLOCK, success=yes
name=/dev/ttyS5
exe=/usr/local/eGTouch64withX/eGTouchD
ppid=1, pid=2264

时间戳序列:16:16:38 → 16:16:48 → 16:16:58 → 16:17:09,≈ 10 秒一次,完美对上原始报文周期。

👉 真凶:eGTouchD,eGalax 串口触摸屏守护进程,它在周期性 open ttyS5 发 probe。


四、第四轮:eGTouchD 是谁拉的?ini 为什么扫到 ttyS5?

4.1 文件分布

bash 复制代码
find /etc /usr/local -name 'eGTouch*'
bash 复制代码
/etc/eGTouchL.ini                                    # 优先级高
/etc/systemd/system/eGTouchResume.service           # 仅 suspend 钩子
/usr/local/eGTouch64withX/eGTouchD                   # 二进制
/usr/local/eGTouch64withX/eGTouchL.ini              # fallback

systemctl status eGTouchd 找不到 service 是正常的------常驻不是 systemd 拉的。

4.2 进程归属

bash 复制代码
ps -fp 2264
objectivec 复制代码
UID   PID   PPID  CMD
root  2264  1     /usr/bin/eGTouchD -f
bash 复制代码
cat /proc/2264/cgroup

cgroup 挂在 lightdm.service 下,提示是 lightdm 会话拉起来的

4.3 拉起入口定位

bash 复制代码
grep -R 'eGTouchD' /etc/lightdm/ /usr/share/lightdm/ 2>/dev/null
ini 复制代码
/etc/lightdm/lightdm.conf.d/52-egalax-lightdm.conf:
    session-setup-script=/usr/bin/eGTouchD -f
    greeter-setup-script=/usr/bin/eGTouchD -f

闭环 ✅:

arduino 复制代码
lightdm.service
 └─ 52-egalax-lightdm.conf
     ├─ session-setup-script → eGTouchD -f
     └─ greeter-setup-script → eGTouchD -f

eGTouchResume.service 只是 suspend.target 后给 eGTouchD 发 SIGVTALRM 让它重枚举,不是常驻拉起口。

4.4 ini 根因:SerialPathX = default

/etc/eGTouchL.ini 内容:

ini 复制代码
[eGTouchL.ini]
DeviceNums                      1
BaudRate                        0
ScanInterface                   0

[String]
SerialPath0                             default
SerialPath1                             default

default 在 eGalax 语义里 ≠ 只用 SerialPath0 这一个 ------而是让驱动展开内置端口列表(ttyS0/1/2/3/4/5 + ttyUSB0...)全扫一遍。

DeviceNums=1 只控制"成功匹配几个设备后停枚举",不控制扫哪些口;scan 阶段仍然会把 default 展开的整份列表挨个 open → probe → close。

👉 所以 ttyS5 每 10 秒被 open 一次,发的那 24 字节就是 eGTouchD 的串口触屏枚举帧(00 E0 同步头 + 0A 01 41 尾帧,符合 eGalax 私有协议风格)。


五、处置方案(三选一)

方案 A:保留触屏,只把 ttyS5 踢出扫描(推荐)

/etc/eGTouchL.ini

ini 复制代码
DeviceNums                      1
[String]
SerialPath0                             /dev/ttyS0
# SerialPath1 删掉,DeviceNums=1 时只用 SerialPath0

然后:

bash 复制代码
sudo kill 2264   # lightdm 会在下次 greeter/session 重拉,读到新 ini

如果触屏接在 ttyS1,就把 SerialPath0 换成 /dev/ttyS1

方案 B:这台没接 eGalax 串口触屏 → 直接禁 lightdm 那两段

bash 复制代码
sudo vim /etc/lightdm/lightdm.conf.d/52-egalax-lightdm.conf
javascript 复制代码
# session-setup-script=/usr/bin/eGTouchD -f
# greeter-setup-script=/usr/bin/eGTouchD -f
bash 复制代码
sudo kill 2264

eGTouchD 被杀后不会被重拉(lightdm 只在 session-start/greeter-start 时调 script),ttyS0/S5 全解放。

USB 触屏不受影响------eGTouchD 串口守护不加载而已,UKUI 走 libinput 照样认 USB HID 触屏。

方案 C:懒人调试法

bash 复制代码
sudo mv /usr/bin/eGTouchD /usr/bin/eGTouchD.bak
sudo kill 2264

lightdm 下次调 script 找不到 binary,ttyS5 立刻清净。恢复就 mv 回去。


六、验证闭环

bash 复制代码
# 1. 确认 eGTouchD 不再碰 ttyS5
sudo ausearch -k ttyS5_write -i

# 2. 裸收 ttyS5,10 秒一批应消失
sudo cat /dev/ttyS5 | hexdump -C

处置前 ausearch 能看到 10 秒一次的 eGTouchD open /dev/ttyS5;处置后只剩之前 auditctl -w 自身的 add_rule 记录。


七、本案踩坑小结

说明
COM5 命名 日志里 \\.\COM5 是 Windows 侧(VMware USB 透传常见),麒麟里对应 /dev/ttyS5,别被名字误导去 Windows 侧查
lsof/fuser 扑空 eGTouchD 是 open→probe→close 短连接,fd 窗口太短,必须用 auditd 抓 write
DeviceNums=1 不限制扫口 eGalax ini 里 SerialPathX=default 会展开内置全端口列表,DeviceNums 只管"匹配几个后停"
麒麟桌面拉起入口 不是 rc.local、不是 gdm、不是 xdg-autostart,是 lightdm.conf.d/52-egalax-lightdm.confsession-setup-script
eGTouchResume.service 只是 suspend 钩子,不是常驻拉起口,systemctl status 搜不到 eGTouchd.service 是正常的

关键字供检索:麒麟 V10 SP1 eGTouchD ttyS5 10秒 串口占用 00 E0 default SerialPath lightdm 52-egalax

相关推荐
卷无止境1 小时前
Python FFI 技术深度解析:ctypes、cffi 与 pybind11 的性能差异与实践挑战
后端·python
ServBay1 小时前
AI Gateway 是什么?为什么每个平台都在做
后端·aigc·ai编程
SamDeepThinking2 小时前
Vibe Coding最重要的是Spec
后端·程序员·ai编程
掘金_答案2 小时前
上线那天,一个 ConcurrentHashMap 差点送走我的 AI 客服——3 天排查 JVM 血泪史
java·后端·架构
妙码生花2 小时前
从 PHP 到 AI + Golang,程序员自救转型手记(三十三):权限规则管理器
后端·go·gin
Kim_wang2 小时前
agent项目部署流程
人工智能·后端
程序员天天困3 小时前
优雅记录操作日志:从注解到 SpEL 的全链路实践与开源方案对比
java·后端
饼干哥哥4 小时前
Vibe Coding 出海首月收割 100+用户爆赚美金,怎么做?
后端·架构·代码规范
大康4 小时前
macOS Homebrew 重装与国内镜像配置手册
后端