麒麟 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

相关推荐
妙码生花3 分钟前
利用AI从零学Go并完成实战项目,完工总结:目录结构
前端·后端·go
妙码生花6 分钟前
利用AI从零学Go并完成实战项目,完工总结:商业级开源产品定位和核心特性介绍
前端·后端·go
程序员cxuan17 分钟前
GPT-6 Astra 的提示词泄露了,里面居然藏着个保安?
人工智能·后端·程序员
苍何32 分钟前
WorkBuddy + 飞书的 8 种神仙用法(建议收藏)
后端
Captaincc36 分钟前
掘金AI用量统计v0.1.0大更新-支持桌面宠物自定义和订阅额度卡片
前端·后端
大哥43091 小时前
AI 接口高并发 ≠ 秒杀高并发:为什么我把并发闸门挂在 LLM 调用汇聚点
后端
大哥43091 小时前
Redis 主从下的库存一致性:我推翻了"付款前查库存"这个方案
后端
ikoala1 小时前
DeepSeek 官方仓库惊现 DeepSeek Harness 桌面端!
前端·javascript·后端
用户408527444142 小时前
一个个人开发者,怎么啃下 12 种工控协议?
后端
Bs_MoneyMagnet2 小时前
基于springboot+vue的旅游景区点评系统的设计与实现 源码+文档
java·vue.js·spring boot·后端·spring·旅游