跨越17年的誤解
故事要從一臺高達模型說起……
騙你的。我其實根本不懂高達,但我那次去朋友家裡做客,他堅持要給我展示他的眾多高達模型收藏。他把這些寶貝放在一個櫃子裡。我聽著他介紹,一邊似懂非懂地點頭,一邊仔細打量這個櫃子裡的其他東西。此時,我注意到它了。
我說:“原來你家有印表機啊,怎麼一直吃灰,也從來沒聽你提過?”
他說:“幾個月前從Facebook Marketplace收的二手,總共才花了50刀(加元,約250人民幣),賣家還送了一大堆墨盒。可惜,它太老了,不能連WiFi,得專門接一臺電腦。但我手上沒多餘的電腦了,也許過段時間再去收一臺二手機器,專門拿來供它。”
我說:“不必。今天就能用上。”
這是一臺佳能MX850,噴墨機,影印、掃描、傳真一體,還有我從來沒見過的紙盒和後置進紙器,連掃描器都是平板和進紙器兩種掃描方式,甚至這掃描器的進紙器還配了自動雙面(Duplex ADF),讓我這個只用過破爛印表機的人開了眼了。這臺機器2008年釋出,確實不能自主連線到網路,必須有線連線PC。不過,我立刻想到了答案:樹莓派。CUPS。把它變成網路印表機。而很巧的是,我手上正好有一個閒置的樹莓派3。
我大戰印表機的故事,就這麼開始了。
用樹莓派加CUPS復活古董印表機
我此前從未在Linux上用過CUPS,自然免不了是要折騰一番。安裝和配置CUPS算是最容易的部分,首先,給樹莓派重新灌入Raspberry Pi OS,這個系統基本上就是原汁原味的Debian加上樹莓派的私有驅動。之後,透過apt安裝CUPS:
sudo apt update
sudo apt install cups
sudo systemctl enable cups --now
就這樣,沒了。這臺樹莓派現在已經是一個CUPS伺服器了。
因為我們的樹莓派不會暴露到公網,而我們信任家裡的每一個裝置,所以我放寬了CUPS的預設安全設定,把CUPS的Web介面開放給區域網內的所有裝置訪問,這樣我和朋友就都能直接透過瀏覽器管理印表機了。修改/etc/cups/cupsd.conf檔案,找到這些部分:
Listen localhost:631
...
<Location />
Order allow,deny
</Location>
<Location /admin>
Order allow,deny
</Location>
<Location /admin/conf>
AuthType Default
Require user @SYSTEM
Order allow,deny
</Location>
<Location /admin/log>
AuthType Default
Require user @SYSTEM
Order allow,deny
</Location>
分別改為
Listen localhost:631
Listen 10.0.0.250:631 # 加上樹莓派在區域網內的IP地址
...
<Location />
Order allow,deny
Allow from 10.0.0.*
</Location>
<Location /admin>
Order allow,deny
Allow from 10.0.0.*
</Location>
<Location /admin/conf>
AuthType Default
Require user @SYSTEM
Order allow,deny
Allow from 10.0.0.*
</Location>
<Location /admin/log>
AuthType Default
Require user @SYSTEM
Order allow,deny
Allow from 10.0.0.*
</Location>
重啟一下CUPS服務:
sudo systemctl restart cups
此外,還可以再安裝一個avahi-daemon,這樣就能在區域網內自動發現印表機了,也可以透過形如http://raspberrypi.local:631的地址訪問它:
sudo apt install avahi-daemon
sudo systemctl enable avahi-daemon --now
現在,整個區域網內的裝置都能直接發現它,並且直接向它傳送列印任務,就像用USB連線的一樣方便。
“PC到樹莓派”的部分已經做完了,接下來要做的就是補完“樹莓派到印表機”的部分。點亮印表機,用USB線連線到樹莓派上,開啟CUPS的Web介面(http://raspberrypi.local:631),進入“Administration”標籤頁,點選“Add Printer”,用Linux的賬戶登入,選擇USB上的這臺MX850,然後……
在這一步記得勾選“Share This Printer”,這樣才能在區域網內發現它!
然後,就是每一個印表機使用者最痛恨的部分:驅動。
請享受無法迴避的痛苦之印表機驅動
和印表機驅動作戰是永恆的痛。這臺佳能MX850已經停產多年,佳能官網上只能找到x86版本的Linux驅動,而且極其臃腫,就算能瞎貓碰死耗子般地用qemu-user執行它,也根本不知道該怎麼把它連入CUPS,只能求助於第三方驅動了。
幸運的是,已經有人來過了,而且還不止一種選擇。
Gutenprint是一個開源驅動,支援大量老舊印表機,包括MX850。Gutenprint的安裝和配置都很簡單,直接透過apt安裝:
sudo apt install printer-driver-gutenprint
安裝完成後,重新開啟CUPS的“Add Printer”介面,這次在“Make”列表裡就能看到“Canon”選項了。選擇它,然後在“Model”列表裡找到“Canon MX850 series - CUPS+Gutenprint v5.x.x”,繼續下一步,就全部完成了。
現在,印表機已經完全可用了。無論是Windows、Mac,還是iPhone,都能直接發現這臺印表機,並且直接傳送列印任務。至於列印質量,由於沒有原廠驅動可供對比,所以不清楚具體是好是壞,但至少列印黑白文件已經完全足夠了。彩色和雙面列印也能正常使用。
不過,這個故事還沒完。
還記得我剛剛提到的“不止一種選擇”嗎?除了Gutenprint,還有另一個選擇:TurboPrint。
TurboPrint是一個商業印表機驅動,和Gutenprint類似,支援各種古董印表機,並且號稱列印質量更好,還有諸如校色這樣的高階功能。畢竟MX850是一臺噴墨機,我當然期望它能達到列印照片的水平,校色功能尤其重要。
TurboPrint並沒有包含在大多數Linux發行版的官方軟體源裡,但它提供了tgz包,可以直接下載並安裝。安裝完成後,TurboPrint會自動整合到CUPS裡,重新開啟“Add Printer”介面,此時“Make”列表裡會多出“CANON TurboPrint”以及另外幾個有TurboPrint字尾的選項。選擇它,然後在“Model”列表裡找到“Canon MX850 series - TurboPrint v2.xx”,繼續下一步,同樣的,這樣就可以了。
但……它是商業軟體——要錢的。TurboPrint不限制免費使用,只是會在列印輸出上加水印,很大,而且水印不透明,換句話說免費版完全沒法用。
TurboPrint提供了30天的免費試用期,在這30天內,可以免費使用全部功能,不會有任何水印。只是,在我的樹莓派上,我一安裝完TurboPrint,它就立刻告訴我試用過期。
$ tpconfig
**************************************************************************
TurboPrint Studio XL 2.55-1 (20-SEP-2023) (c) ZEDOnet GmbH
Demo version expired
**************************************************************************
我檢查過,系統時間沒問題。一定是TurboPrint的DRM機制出了問題。不過我也沒多想,畢竟Gutenprint已經能滿足基本需求了,此後我們也一直用著Gutenprint。
這時是2025年3月。
大變
半年後。
Debian 13釋出了,但新的Raspberry Pi OS還沒跟進,我決定自己動手升級一下。升級過程不太順利,後來我才知道Raspberry Pi OS官方不推薦跨大版本升級,不過這是另一件事了。
儘管不推薦,但原位升級仍然是可行的,請務必按照這個指南操作:https://gist.github.com/jauderho/5f73f16cac28669e56608be14c41006c
樹莓派的私有部分卡了不少,我不得不反覆回應apt的使用者干預請求——總有這個包的依賴關係不滿足,那個包的檔案被修改之類的問題。
但是,在眾多提示中,大概是某種冥冥之中的安排,我立刻注意到了一個特別的提示:
Configuration file '/etc/mime.types'
==> Modified (by you or by a script) since installation.
==> Package distributor has shipped an updated version.
What would you like to do about it ? Your options are:
Y or I : install the package maintainer's version
N or O : keep your currently-installed version
D : show the differences between the versions
Z : start a shell to examine the situation
The default action is to keep your current version.
*** mime.types (Y/I/N/O/D/Z) [default=N] ?
好像哪裡不對。mime.types?我從來沒動過它。
這是系統識別檔案型別的基礎配置,Linux上的程式在讀取或處理內容時,往往要根據它判斷該怎麼解釋資料。它的更新頻率很低,通常,只有跨大版本更新系統時,它才會被更新。它不應該被篡改過,一定有鬼——一定有人搞鬼。
按“D”檢視的差異變化太多,因為包含原本從Debian 12到13的變更,我沒法一眼看出到底改了什麼。讓我們先中斷apt,看看哪裡出了問題。
下載mime.types的Debian 12版本:
apt download media-types=10.0.0 # 如果失敗,先將source.list改回bookworm,然後apt update
dpkg-deb -x media-types_10.0.0_all.deb /tmp/mime12
對比mime.types檔案:
$ diff -u /tmp/mime12/etc/mime.types /etc/mime.types
--- /tmp/mime12/etc/mime.types 2023-02-11 06:45:22.000000000 -0700
+++ /etc/mime.types 2023-03-20 19:46:13.000000000 -0600
@@ -1574,6 +1574,7 @@
application/x-oz-application oza
application/x-pkcs7-certreqresp p7r
application/x-pki-message
+application/x-posiwgnpntxd
application/x-python-code pyc pyo
application/x-qgis qgs shp shx
application/x-quicktimeplayer qtl
這是毫無意義的亂碼,看起來像某種密碼。我Google過了,沒有結果。最怪異的是,檔案修改時間就是當時裝系統的時間。
……
不好,有刺客!
無數種最糟糕的可能性湧上心頭。駭客入侵?供應鏈攻擊?是你嗎,Jia Tan?
我立刻檢查了journald日誌,看看有沒有異常登入記錄。沒有。這臺樹莓派本來就不暴露到公網,而朋友不懂Linux。
查查bash歷史記錄吧。一邊看,一邊回憶我在這一版本的系統上都做過什麼,裝過什麼。
所有的包都是走apt安裝的……等等,有一個例外。
TurboPrint。
它是閉源的。而且不經過apt,是自己的二進位制安裝程式。
它的嫌疑最大。
用strings看看它的可執行檔案裡都包含什麼字串:
$ strings /usr/bin/turboprint | grep mime
/etc/mime.types
$ strings /usr/bin/turboprint | grep application
application/x-p
...
TurboPrint的其他幾個可執行檔案,/usr/bin/tpconfig和/usr/bin/tpsetup等,也呈現完全相同的結果。現在,我有99%的把握,就是它。
但我沒有證據。我需要100%的把握。而且,更重要的是,我現在該幹什麼?
大調查
稍冷靜後,我決定做一個實驗:在一臺全新機器上安裝TurboPrint,看看它會不會修改mime.types。這次我在x86虛擬機器上測試,使用inotifywait監控系統檔案變化,看看它都修改了什麼。
$ sudo inotifywait -m -r /etc /usr /bin /sbin /boot /var /home /root /opt --exclude '^/var/log(/|$)' -e create -e modify -e delete -e attrib -e move > inotifywait_install.log
Setting up watches. Beware: since -r was given, this may take a while!
Watches established.
然後,讓我們安裝TurboPrint。
$ wget https://www.zedonet.com/download/tp2/turboprint-2.58-1.x86_64.tgz
$ tar -zxf turboprint-2.58-1.x86_64.tgz
$ cd turboprint-2.58-1
$ sudo ./setup
TURBOPRINT 2 INSTALLATION
Installation language (e)nglish or (d)eutsch? e
./setup.sh: line 201: /var/log/turboprint/install.log: No such file or directory
./setup.sh: line 202: /var/log/turboprint/install.log: No such file or directory
./setup.sh: line 207: /var/log/turboprint/install.log: No such file or directory
Installation for CUPS printing system (TP_CUPS=1)
Configuration files will go to.. /etc/turboprint
Shared files will go to......... /usr/share/turboprint
Executable files will go to..... /usr/bin
Logfiles files will go to....... /var/log
Documentation will go to........ /usr/share/doc/turboprint
Browser for documentation....... firefox
(edit system.cfg to change installation paths)
Begin installation now (y/n)? y
Copying program files...
install: omitting directory 'lib/appindicator'
install: omitting directory 'lib/gimpplugin'
install: omitting directory 'lib/gnomeapplet'
install: omitting directory 'lib/kde3applet'
install: omitting directory 'lib/kde41applet'
install: omitting directory 'lib/kde42applet'
install: omitting directory 'lib/kde5applet'
done
Installing TurboPrint daemon with systemd
Restarting TurboPrint printer port daemon
Creating PPD printer description files...
done
Updating existing TurboPrint printer entries...
done
Installing bjnp network backend for canon printers
Installing Ghostscript version for TurboPrint
E: Unable to locate package python-gobject
RESULT 0
Checking shared libraries:
(add missing libraries with your package manager)
* gdk library NOT found (part of gtk)
* gdk library NOT found (part of gtk)
* gtk library NOT found
Checking filter programs:
(if required, add missing packages with your package manager)
gs found (needed for PS,PDF,FIG,DVI,troff,html,ASCII)
lp found (command line printing)
Installation completed
HTML documentation can be found in /html /usr/share/doc/turboprint/html
Do you want to read the manual now (y/n)? n
$
讓我們看看inotifywait.log裡都記錄了什麼:
/usr/bin/ CREATE csrh
/usr/bin/ MODIFY csrh
/usr/bin/ ATTRIB csrh
...
/etc/ MODIFY mime.types
/etc/ ATTRIB mime.types
再看一眼mime.types:
$ cat /etc/mime.types | grep application/x-p
...
application/x-pojqujcbptxd
...
同樣的亂碼出現了。果然是你。
那麼,解除安裝掉會如何呢?執行同樣的inotifywait監控,然後解除安裝:
$ sudo ./uninstall.sh
Turboprint deinstallation
=========================
Will delete the following directories:
/etc/turboprint
/usr/share/turboprint
/usr/lib/turboprint
/var/log/turboprint
/var/spool/turboprint
And the following files:
/usr/bin/tpprint
/usr/bin/tpsetup
/usr/bin/tpconfig
/usr/bin/turboprint
/usr/share/man/man1/tpprint.1
/usr/share/man/man1/tpsetup.1
/usr/share/man/man1/tpconfig.1
/usr/share/man/man7/tpfilter.7
/usr/share/man/man7/turboprint.7
/usr/share/cups/model/turboprint
Start deinstallation now? y
Removing TurboPrint files...
Deinstallation complete
RESULT 0
$
/var/spool/ DELETE,ISDIR turboprint
...
/usr/local/share/ DELETE,ISDIR gpturboprint
/usr/bin/ DELETE gszedo
...
/etc/ DELETE,ISDIR turboprint
...
/usr/lib/ DELETE,ISDIR turboprint
/usr/bin/ DELETE tpprint
/usr/bin/ DELETE tpsetup
/usr/bin/ DELETE tpconfig
/usr/bin/ DELETE turboprint
/usr/bin/ DELETE turboprint-monitor
...
(點此檢視完整的inotifywait_install.log和inotifywait_uninstall.log)
它的確刪掉了自己的絕大多數檔案,不得不說,處理得還是很乾淨的。但是,有兩個例外。
/usr/bin/csrh還在,/etc/mime.types也沒有被還原。
$ cat /etc/mime.types | grep application/x-p
...
application/x-pojqujcbptxd
...
小手不太乾淨。
讓我們再看看另外那個留下的可執行檔案csrh是什麼東西:
$ strings /usr/bin/csrh
...
fxww
w6Zxdg7n
j4e;
BXa6
...
沒有人類可讀的字串。試試直接執行它吧。
$ csrh
bash: /usr/bin/csrh: cannot execute binary file: Exec format error
有問題。再仔細看看:
$ file /usr/bin/csrh
/usr/bin/csrh: data
$ cat /usr/bin/csrh | head -c 30
`Ö�[]}�i]�T䆁�w�8�p퉏>m
這不是可執行檔案,而是一堆不可讀的資料。
但是TurboPrint到底在用它幹嘛?讓我們重新裝一次,然後看看它都做了什麼。
/usr/bin/turboprint需要X11,我們換另一個可執行檔案。它要求root許可權執行:
$ sudo strace tpsetup
...
openat(AT_FDCWD, "/usr/bin/csrh", O_RDONLY) = 3
openat(AT_FDCWD, "/etc/mime.types", O_RDONLY) = 4
fstat(4, {st_mode=S_IFREG|0644, st_size=78309, ...}) = 0
fstat(4, {st_mode=S_IFREG|0644, st_size=78309, ...}) = 0
lseek(4, 77824, SEEK_SET) = 77824
read(4, "ttools.smacker\t\t\tsmk\nvideo/vnd.s"..., 485) = 485
lseek(4, 0, SEEK_SET) = 0
read(4, "################################"..., 77824) = 77824
read(4, "ttools.smacker\t\t\tsmk\nvideo/vnd.s"..., 4096) = 485
close(4) = 0
close(3) = 0
openat(AT_FDCWD, "/usr/bin/csrh", O_RDONLY) = 3
fstat(3, {st_mode=S_IFREG|0755, st_size=1976, ...}) = 0
read(3, "`\303\226\243[]}\366i]\371T\344\206\201\310w\2558\364\3p\24\33<\355\211\217>m\375\333"..., 4096) = 1976
close(3) = 0
openat(AT_FDCWD, "/usr/bin/csrh", O_RDONLY) = 3
fstat(3, {st_mode=S_IFREG|0755, st_size=1976, ...}) = 0
read(3, "`\303\226\243[]}\366i]\371T\344\206\201\310w\2558\364\3p\24\33<\355\211\217>m\375\333"..., 4096) = 1976
close(3) = 0
...
(點此檢視完整的strace_tpsetup.log)
它讀了很多次這些檔案,但沒有修改。只是,它到底在幹嘛,我實在看不懂。
它打開了幾次/usr/bin/csrh,一次什麼也沒做,一次讀了裡面的內容。它也打開了/etc/mime.types,立刻seek到一個很遠的位置,顯然它在找那個密碼。
我對著strace的輸出一籌莫展,漫無目的地到處翻log。我沒信心能從strace的記錄裡找出什麼特別有用的資訊,到這時候,也許只有反編譯能解開它的謎團。突然,我注意到了一行:
write(1, "Demo version - trial period unti"..., 52Demo version - trial period until 13-Dec-2025 23:52
) = 52
由於缺少當時的截圖,此處的日誌是後來按照bash歷史記錄重現的
它輸出了什麼?讓我們再試一次執行tpconfig,看得清楚些:
$ sudo tpsetup
**************************************************************************
TurboPrint Studio XL 2.58-1 (02-JUN-2025) (c) ZEDOnet GmbH
Demo version - trial period until 13-Dec-2025 23:52
**************************************************************************
=========================================================
TurboPrint printer config - main menu
=========================================================
Nr.Def.Short Configuration Connect Paper Quality Mode
------------------------------------------------------------------------------
<number> - change settings for a printer
S - Save changes & exit Q - Quit without saving
Your choice:
23:52。那是幾分鐘前,第一次裝它的時候。
我好像明白了。這是DRM,難道說?
我沒有仔細研究它的演算法,也不想立刻反編譯。我只是想知道,如果把它留下的這些痕跡抹掉,它會作何反應。
讓我試試移除它們,一次一個。
來看看會發生什麼:
# 先刪掉/usr/bin/csrh
$ sudo mv /usr/bin/csrh /usr/bin/csrh.bak
$ sudo tpsetup
**************************************************************************
TurboPrint Studio XL 2.58-1 (02-JUN-2025) (c) ZEDOnet GmbH
Demo version expired
**************************************************************************
...
$ sudo nano /etc/mime.types
# 把mime.types裡的那行亂碼刪掉
$ sudo tpsetup
**************************************************************************
TurboPrint Studio XL 2.58-1 (02-JUN-2025) (c) ZEDOnet GmbH
*** unregistered ***
**************************************************************************
移除csrh,試用期立刻過期;移除mime.types裡的那行亂碼,試用期變成了“未註冊”——行為上和過期是一樣的,同樣是列印帶水印,但還能看出一個額外的資訊:它不認為系統裡存在任何DRM狀態了。
啊哈,全搞清楚了!這就是TurboPrint的DRM。
它把安裝時間加密後藏在這裡,並且解除安裝後保留,是為了防止使用者透過反覆安裝解除安裝來重置試用期。兩個檔案來相互驗證,任何一個不對都會觸發保護,直接讓試用期失效。當然,破壞兩個也是一樣失效。
太好了,這下可以排除駭客的可能性了。
技術債的幽靈
只是,這件事仍然在我腦海中揮之不去。
這對嗎?這真的合理嗎?
它沒有在使用者手冊或許可協議中說過它會動/etc/mime.types這麼一個至關重要的Linux核心檔案。它把資料藏在這裡,理論上就是破壞系統完整性的行為,而且也確實造成了影響——我升級系統時就遇到了問題。
況且,我感受到的冒犯和驚嚇也是真實的——那一瞬間,我的第一反應就是供應鏈攻擊。
還有,那個/usr/bin/csrh,它根本不是可執行檔案,卻被添加了執行許可權。/usr/bin/只應該放真正的可執行檔案。
讓我們試想一下,如果一個生產環境的系統管理員,發現了這樣的事情,他的反應恐怕只會比我更激烈。
如果是不可變系統……
如果這事發生得更早,那時我還在這個樹莓派上執行openSUSE MicroOS,如果我要裝TurboPrint,會發生什麼?
MicroOS是一個不可變系統,它的根檔案系統是隻讀的,/etc/mime.types不能被外部修改。理論上,確實不應該在不可變系統上用make install或者TurboPrint這種自帶安裝程式的軟體,但假設我執意要裝呢?TurboPrint安裝程式會直接失敗嗎?如果我不得不解鎖根檔案系統然後安裝它,未來這個系統還能正常使用,正常升級嗎?
更隱蔽的是,TurboPrint在x86上提供deb和rpm包,但我測試過了,deb和rpm在解除安裝時也會留下這些DRM痕跡。
如果你用過不可變系統,你大概已經感覺頭皮發麻了。不過,還是讓我把這種情況說清楚:
假設一個(倒黴的)Fedora Silverblue使用者,他也有一臺這樣的近代的印表機,而他需要列印一些特殊材質(比如CD封面),不得不用TurboPrint。他下載了TurboPrint的rpm包,用rpm-ostree install安裝了它。TurboPrint安裝成功了,印表機也能用了。
之後,他解除安裝了TurboPrint,覺得自己再也不需要它了。rpm-ostree uninstall turboprint,一切看起來都很順利。
但實際上,TurboPrint在解除安裝時留下的DRM痕跡依然存在於根檔案系統中。他的Silverblue就此進入一個不穩定,或者至少是不確定的狀態,當他下一次使用rpm-ostree時,可能就會因為這些意外的汙染而失敗,不得不回滾整個系統——我們就假設他不會在這種時候繼續讓系統帶病執行吧。
我沒在故意挑刺,不可變系統已經在逐漸進入主流,而TurboPrint在某些情況下就是唯一選擇,不可替代。
供應鏈攻擊的陰影
讓我們回到那個心肺停止的時刻:
Configuration file '/etc/mime.types'
==> Modified (by you or by a script) since installation.
...
+++ /etc/mime.types 2023-03-20 19:46:13.000000000 -0600
為什麼我的第一反應是供應鏈攻擊?
因為2024年的XZ Utils後門事件。
化名為“Jia Tan”的維護者花了數年時間獲取社群信任,然後在xz植入後門。這個後門差點進入全世界幾乎所有的Linux系統。
xz後門的原理和TurboPrint DRM其實沒有任何相似之處,但是,在那件事之後,整個Linux社群的安全意識已經完全變了。
任何對檔案系統的異常修改,都不再是小事。它們不再被視為粗糙或者不專業,而是明顯的危險訊號。
我原本想就此對TurboPrint大加批判,寫一篇檄文,把它掛到Hacker News上,幫它炒作一番。但很快我冷靜下來,我意識到……它其實沒故意犯錯。
它只是過時了。
代際衝突
要想破開這套DRM設計的迷霧,我們得回到TurboPrint的起源。
1988年,TurboPrint誕生,最初為Amiga開發印表機驅動。
1991年,Linux 1.0釋出。
約1999-2000年,TurboPrint for Linux的第一個版本誕生。
2007年,TurboPrint for Amiga最後一次更新。
2008年,TurboPrint for Linux 2.0釋出,引入了我們現在看到的這套DRM機制。
2008年。17年前。
那時的Linux長什麼樣?
- 最新的系統是Debian 5.x(Lenny)
- 主流的桌面環境是GNOME 2和KDE 3
- systemd還不存在
- SELinux雖然有了,但普及度不足
至於容器和不可變系統,更是天方夜譚。
最重要的是,包管理器還不是鐵律。如果你有幸經歷過十多年前的Linux時代,你應該很熟悉這套流程:
./configure
make
sudo make install
make install會把檔案直接複製到系統目錄裡,完全不經過包管理器;向/etc/mime.types自行新增新型別,也是理所當然的事情。
而TurboPrint的./setup,和make install的思路完全一樣,區別只是它是GUI程式。
沒人覺得這有問題。這就是那個時代的常態。
但17年過去了,我們經歷了xz後門事件,迎來了Docker、Snap Flatpak,還有Silverblue和MicroOS這樣的不可變系統。我們開始留心供應鏈攻擊,開始重視系統完整性。
時代變了,而TurboPrint的DRM設計,停留在了17年前。
沒有完美答案
TurboPrint確實違反了現代Linux的準則。
可是,問題不光是整整17年的時間,還有單機軟體DRM這個永恆的困境。
如果讓我穿越回2008年,站在那個年代的開發者角度:我需要防止試用期被重置,但是很多機器可能並不聯網,也沒有可靠的硬體級指紋。
我會怎麼做?
可能,我也會選擇在/etc/mime.types藏個標記。
到了2025年,這個設計就一無是處嗎?
從隱私角度看,TurboPrint的選擇其實很剋制。
它沒有收集任何使用者資料,不訪問硬體識別符號,甚至完全不連線網際網路。它只是把安裝時間藏在一個不顯眼的地方。
這在GDPR的視角下,可能是最保險的做法——TurboPrint的開發商ZEDOnet GmbH位於德國。
聯網DRM,膈應使用者;離線DRM,要麼漏得像篩子,要麼膈應系統管理員。
Linux的系統完整性和純離線的完美隱私,在這一刻,竟然成了難兩全的問題。
琥珀裡的昆蟲
至此,TurboPrint的故事就要迎來尾聲了。
我理解了所有的來龍去脈,也接受了它自己的侷限性。
可是,我還是感覺五味雜陳。
它像一隻被困在琥珀裡的昆蟲,凝固在17年前的時光裡。
我該用一種什麼樣的心態去看待它呢?
是寬容,還是批判?
或許,不需要一個明確的答案。
它就在那裡,一個已經遠去的時代的最後見證者。
最後一個謎題
還記得嗎?在樹莓派(arm64)上,TurboPrint從安裝那一刻就顯示“Demo version expired”。
我後來在另一個arm64虛擬機器上測試過,結果也是一樣的——TurboPrint的arm64版本,試用的功能是損壞的,表現和樹莓派一樣。x86版本則不受影響。
我能修好它嗎?請聽下回分解。