“這是最后的機(jī)會(huì),之后你將無(wú)法回頭。服下藍(lán)藥丸,故事結(jié)束,你會(huì)在床上醒來(lái),繼續(xù)信任你愿意相信的一切。服下紅藥丸,你將留在仙境,我會(huì)帶你走進(jìn)兔子洞,告訴你真相有多深……記住,我所提供的,只有真相,僅此而已……”
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…
這是電影《黑客帝國(guó)1》中的經(jīng)典場(chǎng)景之一。墨菲斯(Morpheus)邀請(qǐng)尼奧(Neo)做出一個(gè)決定,選擇紅藥丸還是藍(lán)藥丸——選擇追求真相還是沉迷虛假。
?
運(yùn)行在虛擬機(jī)中的操作系統(tǒng)與生活(被奴役)在矩陣中的居民面臨同樣的問(wèn)題,它們能夠感知到自己運(yùn)行在一個(gè)虛幻的環(huán)境中嗎?或者說(shuō),它們能夠區(qū)分自己是運(yùn)行在真正的硬件上,還是由 Oracle VirtualBox、VMware 等虛擬機(jī)軟件創(chuàng)建的“矩陣”中呢?
真巧,Oracle(先知)一詞出現(xiàn)在了一篇以黑客帝國(guó)開(kāi)場(chǎng)的文章中
答案是取決于具體情況,但有些線索能夠幫助操作系統(tǒng)判斷身在何處。
例如,這里在蘋(píng)果的 macOS 上安裝了 Oracle VirtualBox,又在新建的虛擬機(jī)中安裝了 Ubuntu。那 Ubuntu 是否知道自己運(yùn)行在虛擬機(jī),而不是 mac 中呢?
只需要在 Ubuntu 中執(zhí)行一條命令就可以知道答案:
$ systemd-detect-virt
oracle

這里輸出了“oracle”,證明 Ubuntu 是知道自己運(yùn)行在 Oracle VirtualBox 中的。
該命令的工作原理其實(shí)不難:通過(guò)一系列預(yù)設(shè)的探索策略,檢查運(yùn)行在虛擬機(jī)中的操作系統(tǒng)的“隱秘角落”,尋找真相。
比如,最簡(jiǎn)單的策略之一就是掃描如下文件:
/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
若在其中發(fā)現(xiàn) VirtualBox
、 VMware
、 AmazonEC2
、 QEMU
等關(guān)鍵詞,就可以知道自己是運(yùn)行在對(duì)應(yīng)的虛擬機(jī)中。
/sys/class/dmi
是什么
在 Linux 系統(tǒng)中, /sys/class/dmi
是一個(gè)虛擬文件系統(tǒng)路徑(執(zhí)行 mount
命令可以看到, sysfs on/sys type sysfs(rw,noexec,nosuid,nodev)
),用于訪問(wèn)有關(guān)硬件系統(tǒng)的信息,尤其是與 DMI(Desktop Management Interface)相關(guān)的數(shù)據(jù)。
DMI 是一種用于在計(jì)算機(jī)系統(tǒng)中管理硬件的信息接口,提供系統(tǒng)廠商( sys_vendor
)、主板( board_vendor
)、BIOS( bios_vendor
)等詳細(xì)信息。

systemd-detect-virt
命令的其他策略還包括探索 /proc/device-tree/
、 /sys/hypervisor/
等路徑的內(nèi)容。當(dāng)無(wú)法從這些特殊的文件中找到有價(jià)值的信息時(shí),該命令還會(huì)執(zhí)行 x86 架構(gòu) CPU 中的一條特殊指令 CPUID
,以此來(lái)獲取虛擬環(huán)境的信息。
此外,該命令還能判斷操作系統(tǒng)是否運(yùn)行在 Docker、LXC 等容器中。
除了 systemd-detect-virt
命令, hostnamectl
命令也能輸出有關(guān)操作系統(tǒng)運(yùn)行環(huán)境的信息。


尼奧選擇了紅藥丸,隨后墨菲斯告知尼奧現(xiàn)在差不多是 2199 年,而不是他以為的 1999 年。這時(shí),墨菲斯提出了一個(gè)核心問(wèn)題,什么是真實(shí)?
“什么才是真實(shí)?你怎么定義‘真實(shí)’?如果你說(shuō)的‘真實(shí)’是你能觸摸到的、能聞到的、能品嘗到的、能看到的,那‘真實(shí)’其實(shí)就是你大腦解讀的電信號(hào)。”
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.
正如墨菲斯所說(shuō),你認(rèn)為眼見(jiàn)為實(shí), systemd-detect-virt
也是這樣“想”的,它會(huì)優(yōu)先根據(jù)從 /sys/class/dmi/id/
中看到的內(nèi)容為判斷依據(jù),接收來(lái)自此處的信號(hào)。
那我是不是能通過(guò)篡改這些文件,從而讓操作系統(tǒng)誤以為運(yùn)行在另一個(gè)虛擬空間中呢?理論上是可以的,只不過(guò)看看那些文件的權(quán)限。
-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
...
“矩陣”不想讓你醒來(lái)。
該文章在 2024/12/18 18:14:35 編輯過(guò)