把顯示卡交給虛擬機器:真正的障礙不是驅動程式,而是群組

將硬體直接直通給虛擬機器是可行的,但裝置是以群組為單位交出,而不是一個一個交出。而交出去的硬體,也會奪走虛擬機器移動的自由。

AtlasPVE ·

本條目涵蓋以下問題

  • proxmox gpu 直通
  • proxmox iommu 群組
  • proxmox pci 直通 無法使用
  • proxmox 顯示卡 給 vm
  • proxmox 硬體直通

將實體顯示卡、磁碟控制器或擷取卡直接交給虛擬機器是可行的。這個承諾是真的:虛擬機器會像使用自己的硬體一樣使用它。

但大家卡住的地方不是驅動程式,而是群組。

裝置不是一個一個交出去的

主機板決定了哪些裝置可以彼此隔離,並把它們分成群組。無法只從群組中交出單一裝置,必須交出整個群組。

結果就是:如果顯示卡與磁碟控制器位在同一個群組,交出顯示卡就等於連磁碟控制器一起交出。這通常是做不到的,因為伺服器自己的磁碟就接在那裡。

因此,購買硬體時該問的不是這張顯示卡能不能用,而是它在這片主機板上是否自成一個群組。分組是主機板的特性,而不是顯示卡的特性。同一張卡在某片主機板上可以順利直通,在另一片上卻完全不行。

裝置會從伺服器上消失

第二個意外:一旦把裝置交給虛擬機器,伺服器就再也無法使用它。這不是出借,而是轉讓。

最常見的情況是:在只有一張顯示卡的機器上,把這張卡交給虛擬機器,伺服器自己的畫面也跟著消失。如果可以遠端連線,這沒有問題;但一旦出了狀況,就再也無法接上鍵盤和螢幕查看。

直通的硬體也會奪走移動的自由

對建立過叢集的人來說,這是最重要的一點:具有硬體直通的虛擬機器通常無法遷移到另一個節點。

原因很簡單:交出去的那張卡就在這台實體機器裡。即使另一個節點有完全相同的型號,那也不是同一個裝置。

因此,叢集所提供的安全網並不涵蓋這台虛擬機器。在維護的夜晚無法遷移它,故障時也無法在另一個節點上啟動它。設定直通時,真正做出的選擇是:以移動性,換取效能與直接的硬體存取。

記憶體也不再有彈性

第四個、也是最少人知道的限制:直通的硬體會直接寫入虛擬機器的記憶體。為了讓這件事成立,記憶體必須固定不動。

但負責伸縮記憶體、把記憶體收回的機制,恰恰就是會搬動記憶體的那個機制。兩者在同一台虛擬機器上同時啟用時,驅動程式那一端就會出問題。

實務上的規則是:在具有硬體直通的虛擬機器上,不要讓記憶體伸縮,而是給它固定的容量。這意味著這台虛擬機器無法參與上一篇文章所描述的那種承諾多於實際擁有的遊戲。承諾給它的記憶體,是真正被保留下來的。

一句話的決策

直通不是單純的收穫,而是一場交換。得到的是:真正的硬體速度,以及使用該硬體所有能力的途徑。失去的是:可攜性、伺服器對該裝置的使用權,以及記憶體的彈性。

如果是在知情的情況下做這筆交換,它就是正確的工具。如果是在沒有察覺的情況下做的,就會在第一個維護之夜或第一次故障時才發現。

Atlas 的做法

Atlas 讀取伺服器上的 PCI 裝置時,也會讀取每一個裝置位在哪一個隔離群組。因此在做決定之前就能看到分組情況:想交出去的裝置是單獨存在,還是旁邊還有不想一起交出去的東西。

還有一條規則正好對應本文的最後一部分。如果一台虛擬機器定義了硬體直通,同時又啟用了記憶體伸縮,Atlas 會將它標示為警告:兩者並用會在驅動程式端造成問題。這個警告不只說有問題,還會說明該怎麼做,並直接帶到記憶體設定。

這是產品整體立場的一個小例子:設定本身是有效的,沒有任何錯誤,但兩個有效的設定放在一起卻毫無意義。這類事情需要在設定時就說出來,而不是等到故障時。

資料來源

Proxmox 官方文件。內容為英文,且在此主題上以官方文件為準。

相關條目

這項工作在 Atlas 中是什麼樣子?

前往產品頁面