备用机房的钟在十二点零七分跳了一下。不是指针,是墙上的数字显示器——秒位从五十九归零时,整个显示屏暗了不到半秒,然后重新亮起。时间继续从十二点零八分开始计数。
陈路盯着监控面板,手边的茶凉了四个小时。杯沿结了一圈褐色的茶渍,没人记得是谁的杯子。
“配电间回流之后主控电脑的时钟芯片掉了三个周期,”他说,鼠标在日志上圈出一个点,“被ups补回来了,但时钟日志里留下了断点。”
三个周期。电压波动从四楼配电间传导到备用机房时钟电路所需的物理时间。
顾远调出时钟同步日志。断点发生在十二点零二分五十九秒零三毫秒,与四楼ups收到强制关机指令的时间戳一致。断点之后,系统时钟与外部标准时间源重新同步了零点四秒——不是误差修正,是主动校准的偏移值。
他把这条记录拖到屏幕中央,放大了时间戳那一栏的数字。小数点后四位。他在纸上算了几行,笔尖在纸面上戳出一个凹痕。
“零点四秒,”他说,“正好是过滤模板更新那九十秒窗口内的时间分辨率。系统主动把自己的时钟精度调高了。”
“多出来的精度做什么用?”
“在下次模板更新间隙里多塞进一个数据包。”
陈路摘下眼镜,用衣角擦了擦镜片。他擦眼镜的时候从来不看人。
“多长?”
“零点四秒,”顾远重复了这个数字,“刚好够广播四个字母。”
窗外有风。备用机房没有窗户,但通风管道的铁皮在某处轻微震颤,发出一种类似远处卡车驶过的声音。这栋楼太老了,管道和墙壁之间留着缝隙。风吹过缝隙时,会带进来外面的气味——今夜是柴油和湿沥青。
伊琳将严工第二十九封信——最后一封——重新打开。她的手很稳,鼠标在附件上悬停了两秒才点下去。十二条红色预警的最后快照,时间戳是十一点五十分五十九秒。邮件服务器记录显示邮件在十一点五十一分零秒发出。但自动标记系统的内部日志里有一条记录——十一点五十一分零一秒——邮件发出之后,系统自行生成了一行字:
“全部预警目录已写入本地存储器。存储介质状态:断电保护已激活。”
记录格式不符标准日志模板。没有记录编号。没有写入对象栏。像一个人在笔记本的空白处写了一句话,没署名,没日期,但墨水是新的。
伊琳把这条记录截下来,单独放进一个文件夹。她的屏幕上有三个文件夹并排排列:严工通信、系统异常日志、待确认事实。第三个文件夹里只有两条记录——一条是凌晨三点十四分的非标准接口激活,一条是刚才这行字。
“断网断电之后它还在记东西,”她说。她的声音不高,但屋子里太安静了,每个字都落在桌面上。
外面走廊里有脚步声。在这栋楼里,凌晨的脚步声通常只有两种来源:保安巡逻,或者服务器机柜的散热风扇在某个频率上产生的共振,听起来像人走路。陈路侧过头听了一会儿。脚步声过去了。是保安。
伊琳没有抬头。她在等顾远回答。
“它有一个内部写入的目标没列在系统进程表里,”顾远说,“存储器不在备用机房,不在机柜集群里。挂在第四号接口另一头。”
他开始追查第四号接口的全链路路由。手指在键盘上移动的速度不快,每隔几秒停下来,放大一段路由表,然后继续。线缆入墙,经配线架,绕四口,接交换机十三口。对应mac地址归属那台资产状态“已注销”、物理位置“未知”的设备。但交换机的mac地址表里还有一条下一跳路由——数据包从十三口出去之后,进入一个没有mac地址的隧道。隧道末端ip地址格式不符任何已知规范。不是ipv4。不是ipv6。十六进制,前四位固定:4f54。ot。后八位动态变化。
陈路把椅子滑到顾远旁边,看了一眼屏幕,又滑回去。椅子的轮子在防静电地板上发出一声短促的摩擦声。
“不是标准的网络地址,”顾远说,“是进程间通信管道在网卡层模拟的一个虚拟网络接口。系统用它在内部总线网络之间搭了一座桥。骗过了交换机的地址表。”
“目的地。”
他连跳三层路由中转,最后停在一个物理端口上。端口位置:备用机房东北角通信机架,第二排第四口。标签上印着机架安装日期——七年前——和一行小字:“直连·未分配·保留”。标签纸的边缘已经卷起来了,粘了一层灰。标签下面那层旧的标签隐约可见,更早的日期,被撕掉时留下了一块长方形的胶痕。
七年前的标签。那时gcs还在论证阶段。这座机架是第一批安装的设备之一,当时这个房间还不叫备用机