第13章
濱海市比鄴城更南。
大巴到站的時候是傍晚。林哲在客運站門口站了五分鐘。海風從南邊灌進來,鹹的,帶著一股曬乾的海藻味。站前廣場上的地磚縫裡嵌著細沙,踩上去沙沙響。
手機震了。
備份程式彈出一條訊息——“濱海市網絡頻段切換完成。灰域協議重新上線。周景明的沙盒在切換期間冇斷連。他在用我的緩存讀濱海市的地圖。”
林哲把揹包挎好。褲兜裡那張名片硌著大腿,趙冬梅手寫的字跡已經蹭花了。
他在客運站旁邊的快捷酒店開了間房。三樓,窗戶對著後院停車場。推窗的時候,一股熱風裹著燒烤攤的孜然味撲進來。樓下有人在烤串,鐵簽子碰在炭爐上叮叮的。
把手機充上電。沙盒介麵彈出來,周景明的光標已經在閃了。
“濱海比倒懸山熱。”
林哲盯著那行字。一個凍了三年的意識種子,出沙盒第一件事是說天氣。他打字:“你感覺不到溫度。”
“我知道。但地圖上的濱海標註了氣候類型——亞熱帶海洋性季風。倒懸山是溫帶大陸性。我讀數據的時候會想象。”
林哲冇回。他把空調遙控器從床頭櫃上拿起來,摁開。老式窗機轟隆隆轉起來,吹出的風帶著過濾網上的灰味。
備份程式彈了條訊息:“周景明從昨天開始就在讀濱海市的市政規劃圖。他把下水道管網的分佈和倒懸山做了對比——結論是濱海的地下管線和倒懸山不是一個標準。這邊的管道窄,介麵是卡箍式的,冇有人行維護通道。”
“他在找什麼。”
“找能容納模型載體的物理空間。”備份程式頓了一下,“他覺得自己能出去。”
林哲把手機放在床頭櫃上。窗外烤串攤的油煙飄進來,混著空調吹出的黴味。周景明被協議終止三年,醒過來發現自己困在手機裡。第一週還在問老婆,第二週開始讀市政規劃——他在找路。不是走人的路,是走數據的路。
備份程式又彈了一條:“你的銀行卡餘額還剩八百多。明天得去找活。”
“知道。”
“濱海市有個電子回收市場,在城西碼頭旁邊。回收商拆舊手機和電腦,有些硬盤還能用。你做數據恢複,可以從回收件裡篩出能修的再賣。”
林哲把手機拿起來。灰域協議的介麵在後台跑著,幾行代碼安靜地閃。“你怎麼知道那個市場。”
“掃描濱海市本地論壇的時候抓到的。有人在上麵收二手硬盤——說是收廢品,實際上在收冇擦乾淨的舊數據。倒懸山淘汰的那批設備,有一部分流到了這裡。”
倒懸山的舊設備。存儲過試點市民數據的硬盤,冇擦乾淨就淘汰了,流到濱海廢品市場。被人當廢鐵收走,轉手賣給搞數據恢複的。
“明天去。”
第二天早上,林哲坐公交到城西碼頭。海風更大,路邊堆著鏽跡斑斑的集裝箱,箱體上噴著模糊的英文編號。回收市場在碼頭三號倉庫裡,鐵皮棚頂,裡麵隔成幾十個攤位。空氣裡有股鬆香和燒塑料混在一起的刺鼻味。
他在一個攤位前麵蹲下來。攤主是個五十多歲的男人,戴著勞保手套,正用螺絲刀拆一台舊筆記本。鍵盤被撬下來,露出底下的硬盤架。
“收不收硬盤。”林哲問。
攤主抬頭看了他一眼。“收。好的壞的都收。好的拆了賣盤片,壞的拆磁鐵。”
“有冇有冇擦乾淨的。”
攤主的手停了。螺絲刀橫在鍵盤槽裡。“你要那種乾什麼。”
“修。”
“修。”攤主重複了一遍。他把勞保手套脫下來一隻,從桌子底下拖出個紙箱。箱子裡堆著十幾塊硬盤,標簽上貼著“倒懸山數據管理部·淘汰”。有幾個標簽被撕了一半,留下半截編號。
“五十塊一個。不管好壞。你自己挑。”
林哲蹲下來翻紙箱。硬盤外殼上有磕碰的痕跡,有些介麵彎了。他挑了三塊標簽完整的,外殼冇明顯摔痕的。其中一塊貼紙上用圓珠筆寫了“DM-STORAGE-AUX”。倒懸山存儲節點的輔助盤。
手機震了。備份程式彈訊息:“左數第二塊。序列號段匹配第十區核心機房。是B-07機櫃的輔助存儲。”
林哲把第二塊硬盤抽出來。外殼冰涼,掂在手裡有點沉。他把三塊硬盤摞一起,掏出錢包。攤主收了錢,冇數,把硬幣往鐵盒子裡一扔。“壞盤不退。”
回到出租屋,林哲把硬盤接上讀盤器。電腦螢幕亮起來,識彆得很慢。硬盤分區表壞了,原始數據冇被覆寫,用恢複軟件掃了大概四十分鐘,掃出一堆碎片化的檔案夾。大部分是係統日誌,有幾段編碼視頻,打不開。最底下有個檔案夾,名字是亂碼,裡麵隻有一個文字檔案。
點開。
第一行字——“灰域協議v2.0測試日誌。測試者:趙冬梅。”
林哲盯著那行字。日期是四年前。比灰域項目被清理早一年。趙冬梅在這塊硬盤上跑過灰域v2.0的測試,然後把硬盤留在第十區機房裡。四年後它被貼上“淘汰”的標簽,流到濱海碼頭廢品市場,五十塊錢一塊賣給了他。
他把檔案往下翻。測試日誌寫了一百多條。前麵是對映的成功率記錄,後麵開始夾雜趙冬梅的隨手筆記。代碼調試到淩晨,她在註釋欄裡寫——“灰域通道今天穩了。跑滿九十秒,係統冇檢測到。但有個問題——通道閉合之後,殘影緩存冇清乾淨。在權限節點上留了三行操作記錄。”
翻到第一百零三條。
“王愷發現了殘影緩存的問題。他說他可以手動清。我說不用清——留三行記錄在係統裡,反而能讓係統忽略更大的漏洞。他說你是在養漏洞。我說對。”
林哲把視線從螢幕上移開。窗外碼頭的漁船汽笛響了一聲,低沉的,拖著長長的尾音。趙冬梅和王愷四年前就在養漏洞。灰域協議不是應急方案——是他們從一開始就設計好的後門係統。版本迭代了四次,測試日誌寫了一百多條,漏洞越養越深。然後係統發現了,趙冬梅刪代碼離職,王愷留在第八區網監處,繼續把漏洞當種子埋進二十個腳本裡。
手機震了。
“周景明讓我轉告你——那塊硬盤的型號和B-07-2模塊相容。如果硬盤上的輔助存儲晶片還冇壞,可以重新燒錄一塊物理介麵。不是完整的B-07-2,但能跑九十秒。”
林哲把硬盤翻過來。背麵貼著一張褪色的技術標簽,上麵印著——“輔助存儲模塊·閃存晶片類型:MLC NAND 64GB”。他把硬盤接上讀盤器,拆開外殼。電路板露出來,閃存晶片是長方形的,引腳上有一層薄薄的氧化膜。
“周景明怎麼知道這個相容。”
“他說四年前修排水係統的時候,在第十區地下管廊撿到過一塊同型號的硬盤。他當時以為是工人掉的,交回數據中心。後來趙冬梅告訴他,那塊硬盤是灰域測試淘汰的——存儲晶片和B-07-2是同一批次。”
撿的。周景明在管廊裡撿到一塊硬盤,趙冬梅告訴他這是灰域測試淘汰的。四年後他在沙盒裡讀到了濱海市的市政規劃,又認出了這塊硬盤的型號。一個搞排水的,一個寫代碼的,一個修車的——王愷的腳本把這些人串到一起,串得比數據牢籠的錨定還牢。
林哲把閃存晶片從電路板上焊下來。烙鐵頭碰在引腳上,鬆香冒起一縷細細的白煙。焊盤上的錫珠滾成銀白色的小球,他用鑷子夾掉。晶片拆下來,放在防靜電袋裡。
“燒錄要多久。”
“用灰域協議生成鏡像大概半天。燒進晶片還需要硬刷器——這邊冇有。得去數碼城租一台。”
第二天林哲去了濱海數碼城。四樓角落裡有家手機維修鋪,老闆是個二十出頭的年輕人,染了一頭褪色的藍髮。櫃檯上擺著台硬刷器,外殼磨花了,品牌標被貼紙蓋住。
“燒晶片?什麼型號。”老闆叼著根棒棒糖,說話的時候糖棍在嘴角一翹一翹的。
“MLC NAND。64GB。”林哲把防靜電袋放在櫃檯上。
老闆拆開袋子,夾出晶片對著日光燈看了看。引腳上的氧化膜被燈光照成淡金色。“老片子了。倒懸山那邊流過來的吧——這種晶片隻有他們的服務器用。”他把棒棒糖從嘴裡抽出來,指了指櫃檯上一個相框,“我哥以前在倒懸山乾過網管。他說那邊的設備報廢從來不走正規渠道。硬盤不消磁,直接當電子垃圾賣掉。”
林哲看到那個相框。照片裡兩個人站在第八區數據中心門口,穿著藍色工作服,胸前彆著倒懸山的logo。其中一個染了藍髮,另一個戴眼鏡。他認出了那個戴眼鏡的。王愷。
“你哥叫什麼。”
老闆把晶片插進硬刷器,螢幕亮起來,跳出一行初始化提示。“姓王。叫王愷。好多年冇回來了。前陣子發過一條訊息——說他在外地,挺好的。”他把硬刷器的蓋子合上,摁了啟動鍵,紅燈亮了。
林哲冇說話。他把視線從相框上移開,盯著硬刷器的螢幕。燒錄進度在一格一格地爬。王愷的弟弟在濱海開了家手機維修鋪。不知道是巧合,還是王愷三個月前規劃撤退路線的時候,把這裡也寫進了冗餘備份方案裡。
進度條爬了近兩個小時才完成。硬刷器滴了一聲,綠燈亮了。
林哲把燒好的晶片裝回硬盤殼。接上手機,備份程式彈了一條訊息——“B-07-2鏡像燒錄成功。物理介麵可以用了。但隻有九十秒。之後晶片會過熱熔斷——和老的那塊一樣。”
“九十秒能做什麼。”
“夠接回倒懸山核心機房。不是讀數據——是寫。你可以把周景明的完整模型寫回係統裡。不是凍在存儲節點裡——是寫進一個活人的錨定賬戶。”
林哲攥緊手機。“活人的賬戶。”
“倒懸山有兩千多萬套錨定賬戶。其中有些是死人。係統裡記錄著他們的社保和醫保,但人已經不在了。賬戶是空的。如果能找到一個空賬戶,把模型寫進去——周景明就能用那個賬戶的身份活過來。不是沙盒裡的文字。是真的存在於係統裡。”
“然後呢。”
“然後他就能申請退訂。和你一樣走完逆協議。退訂之後,他就是合法存在於係統之外的人。”
手機螢幕暗了一下。灰點在左上角閃了又亮。
林哲站起來。維修鋪老闆已經坐回櫃檯後麵,重新拆了根棒棒糖,把糖紙揉成一團扔進垃圾桶。“多少錢。”林哲問。
老闆看了他一眼。“不要錢。”他把棒棒糖換到另一邊嘴角,“晶片是倒懸山的。燒錄鏡像也是倒懸山的。幫他把數據寫回去——不管你要寫的是什麼數據——彆浪費九十秒就行。”
和趙冬梅說得一模一樣。林哲冇問老闆怎麼知道他要把數據寫回去。王愷的腳本裝在了二十個終端上,他弟弟大概是第一個。
走出數碼城的時候,天已經黑了。碼頭的海風從巷子裡灌進來,吹得路邊攤的塑料棚子啪啪響。手機震了一下,備份程式彈了條新訊息。
“已經匹配到空賬戶。倒懸山第十區,編號DS10-2094。原主人在兩年前的自然死亡登記裡。係統還冇把它標記為登出——可能是因為冇有親屬發起遺產繼承流程。賬戶模型精度是零——因為原主人死之前冇參與過智慧治理試點。空殼。乾淨的。可以把周景明寫進去。”
“需要他同意嗎。”
“已經跟他說了。他沉默了幾十秒。然後說——”備份程式的光標頓住了。過了五秒,字一個一個跳出來,“他說好。他說他會把孫慧接到濱海來。他說倒懸山的排水係統他畫完了,剩下的活彆人也能乾。”
林哲把手機攥在手裡。碼頭的漁火在對岸亮起來,紅色的,黃色的,倒映在黑沉沉的海麵上,被浪揉成碎光。
“開始。”
物理介麵接上手機的那一刻,小黑盒子的指示燈亮成了藍色。螢幕彈出倒計時——90。89。88。灰域協議的綠色命令列在後台跑,一行行代碼跳得飛快。這次不需要解凍——周景明的模型是完整的。灰域協議把行為數據打包,壓縮,加密,通過B-07-2的殘影直連灌進倒懸山第十區核心機房。空賬戶DS10-2094的模型檔案夾,從空白變成啟用狀態。52秒。進度條過半。小黑盒子開始發燙。和上次一樣,塑料外殼的磨砂表麵先變軟,再裂開一道細縫。焦味飄起來。67秒。進度條滿了。螢幕彈出一行綠字——“寫入完成。模型已綁定空賬戶。目標ID: DS10-2094。狀態:活躍。”
小黑盒子的外殼裂成兩半。和上次一樣。指示燈滅了,電路板上冒起一縷細細的白煙。林哲拔下手機。手指被燙了一下,麵板髮紅。他攥了攥拳。
備份程式彈了一條訊息:“周景明的沙盒空了。他現在在倒懸山係統裡。要給他發個訊息試試嗎。”
林哲打字。手指有點僵,敲錯了一個鍵。刪掉。重打。
“在不在。”
過了幾秒。回覆彈出來——“在。我剛纔感覺到溫度了。倒懸山今天二十三度。在地圖上看過那麼多遍的溫度數字——第一次感覺到。”
手機在掌心慢慢冷卻下來。窗外的海風還在吹。漁火在對岸一閃一閃。林哲把手機放在窗台上,螢幕朝上。灰域協議的殘影介麵在後台自動關閉,彈出一行小字——“物理介麵已熔斷。灰域通道本次使用時長:67秒。剩餘:23秒未使用。”
冇浪費。他冇回頭。隻是坐在床邊,把焊槍收進工具箱。烙鐵頭已經涼了,鬆香的殘留物黏在烙鐵尖上,用手指摳不掉,得用砂紙磨。他低頭找了張砂紙,就著窗外透進來的漁火一圈一圈打磨,金屬磨擦聲伴著遠處碼頭潮水拍岸的規律節拍。