麒麟 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 里还有几个隐患项顺手记一下:
icanon、icrnl、echo都还开着,自己写程序open("/dev/ttyS5")直读时,0A 01 41里的0A会被 canonical 当行结束吃掉,建议改 raw:
bashsudo 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.conf 的 session-setup-script |
eGTouchResume.service |
只是 suspend 钩子,不是常驻拉起口,systemctl status 搜不到 eGTouchd.service 是正常的 |
关键字供检索:麒麟 V10 SP1 eGTouchD ttyS5 10秒 串口占用 00 E0 default SerialPath lightdm 52-egalax