“這是最后的機會,之后你將無法回頭。服下藍藥丸,故事結束,你會在床上醒來,繼續信任你愿意相信的一切。服下紅藥丸,你將留在仙境,我會帶你走進兔子洞,告訴你真相有多深……記住,我所提供的,只有真相,僅此而已……”
This is your last chance. After this there is no turning back. You take the blue pill, the story ends, you wake up in your bed and believe whatever you want to believe. You take the red pill, you stay in Wonderland, and I show you how deep the rabbit hole goes… Remember, all I’m offering is the truth, nothing more…
這是電影《黑客帝國1》中的經典場景之一。墨菲斯(Morpheus)邀請尼奧(Neo)做出一個決定,選擇紅藥丸還是藍藥丸——選擇追求真相還是沉迷虛假。
?
運行在虛擬機中的操作系統與生活(被奴役)在矩陣中的居民面臨同樣的問題,它們能夠感知到自己運行在一個虛幻的環境中嗎?或者說,它們能夠區分自己是運行在真正的硬件上,還是由 Oracle VirtualBox、VMware 等虛擬機軟件創建的“矩陣”中呢?
真巧,Oracle(先知)一詞出現在了一篇以黑客帝國開場的文章中
答案是取決于具體情況,但有些線索能夠幫助操作系統判斷身在何處。
例如,這里在蘋果的 macOS 上安裝了 Oracle VirtualBox,又在新建的虛擬機中安裝了 Ubuntu。那 Ubuntu 是否知道自己運行在虛擬機,而不是 mac 中呢?
只需要在 Ubuntu 中執行一條命令就可以知道答案:
$ systemd-detect-virt
oracle
這里輸出了“oracle”,證明 Ubuntu 是知道自己運行在 Oracle VirtualBox 中的。
該命令的工作原理其實不難:通過一系列預設的探索策略,檢查運行在虛擬機中的操作系統的“隱秘角落”,尋找真相。
比如,最簡單的策略之一就是掃描如下文件:
/sys/class/dmi/id/product_name
/sys/class/dmi/id/sys_vendor
/sys/class/dmi/id/board_vendor
/sys/class/dmi/id/bios_vendor
/sys/class/dmi/id/product_version
若在其中發現 VirtualBox
、 VMware
、 AmazonEC2
、 QEMU
等關鍵詞,就可以知道自己是運行在對應的虛擬機中。
/sys/class/dmi
是什么
在 Linux 系統中, /sys/class/dmi
是一個虛擬文件系統路徑(執行 mount
命令可以看到, sysfs on/sys type sysfs(rw,noexec,nosuid,nodev)
),用于訪問有關硬件系統的信息,尤其是與 DMI(Desktop Management Interface)相關的數據。
DMI 是一種用于在計算機系統中管理硬件的信息接口,提供系統廠商( sys_vendor
)、主板( board_vendor
)、BIOS( bios_vendor
)等詳細信息。
systemd-detect-virt
命令的其他策略還包括探索 /proc/device-tree/
、 /sys/hypervisor/
等路徑的內容。當無法從這些特殊的文件中找到有價值的信息時,該命令還會執行 x86 架構 CPU 中的一條特殊指令 CPUID
,以此來獲取虛擬環境的信息。
此外,該命令還能判斷操作系統是否運行在 Docker、LXC 等容器中。
除了 systemd-detect-virt
命令, hostnamectl
命令也能輸出有關操作系統運行環境的信息。
尼奧選擇了紅藥丸,隨后墨菲斯告知尼奧現在差不多是 2199 年,而不是他以為的 1999 年。這時,墨菲斯提出了一個核心問題,什么是真實?
“什么才是真實?你怎么定義‘真實’?如果你說的‘真實’是你能觸摸到的、能聞到的、能品嘗到的、能看到的,那‘真實’其實就是你大腦解讀的電信號。”
What is real? How do you define real? If you’re talking about what you can feel, what you can smell, what you can taste and see, then real is simply electrical signals interpreted by your brain.
正如墨菲斯所說,你認為眼見為實, systemd-detect-virt
也是這樣“想”的,它會優先根據從 /sys/class/dmi/id/
中看到的內容為判斷依據,接收來自此處的信號。
那我是不是能通過篡改這些文件,從而讓操作系統誤以為運行在另一個虛擬空間中呢?理論上是可以的,只不過看看那些文件的權限。
-r--r--r-- 1 root root 4096 Dec 4 19:11 /sys/class/dmi/id/bios_vendor
-r--r--r-- 1 root root 4096 Dec 4 19:11 /sys/class/dmi/id/board_vendor
-r--r--r-- 1 root root 4096 Dec 4 19:13 /sys/class/dmi/id/chassis_vendor
-r--r--r-- 1 root root 4096 Dec 4 18:45 /sys/class/dmi/id/sys_vendor
...
“矩陣”不想讓你醒來。
該文章在 2024/12/18 18:14:35 編輯過