因此整理個人的PVE到現在必要的一些配置:
1. PCIE直通的IOMMU設定
2. 獨顯要直通,需要防止載入驅動
3. intel內顯開啟GVT-G
4. ZFS記憶體使用量限制
以上四個會在相同的地方進行設定,故直接從下列步驟依序開始:
1. 開機程序指令修改
以前是從/etc/default/grub去配置iommu,但PVE不知道從何時開始已經不使用grub開機程序了(官網似乎有寫),網路上中文的教學文章大部分還沒更新,因此做紀錄:
編輯開機程序指令
nano /etc/kernel/cmdline
裡面應該會有載入zfs相關的指令(以下灰字),不要換行,往後加指令,每多一個指令就空一格輸入,例如我的配置是這樣的:
root=ZFS=rpool/ROOT/pve-1 boot=zfs intel_iommu=on iommu=pt pcie_acs_override=downstream video=efifb:off,vesafb:off
指令解釋:
intel_iommu=on
最白話的設定,開啟IOMMU
iommu=pt
聽說是加強IOMMU的性能,也有人說不加也沒差,因為懶得比較,我就沒拿掉
pcie_acs_override=downstream
這個似乎是加強PCIE裝置的分組,我個人理解是:
沒加這行=分組後直通顯卡會包含繪圖裝置跟聲音裝置,直通一個另一個會跟著被直通
加入這行=分組後可以把繪圖裝置跟聲音裝置分別直通給不同VM
video=efifb:off,vesafb:off
包刮了video的兩個設定:
efifb:off是efi開機後載入fb0的設定,off的話當然就是不要開啟啦XD
vesafb:off是vesa程序載入fb0的設定,我也不知道是啥,反正很多人在直通時把這行也加上去了,沒試過不加,總之就跟著加了,也是設定不要開啟
2. 針對modprobe.d裡面的conf檔做設定
這個設定是讓開機程序開始以後,希望對module做哪些設定,好像可以跟上面的cmdline共用指令,我不確定哪些可以,似乎最終會以cmdline的為主,有興趣的可以自己嘗試~
常常會看到很多人對這裡面設定什麼pve-blacklist.conf、kvm.conf一堆設定檔,但經過個人實驗以後,其實只要一個檔案就好了,在裡面自己用註解標記指令的功能就不怕忘記,也不用每次都得確認自己在哪個設定檔設過什麼指令
增加設定檔(在建立以前,建議把裡面原本就有的都備份起來,雖然我的起初裡面好像就是空的?)
nano /etc/modprobe.d/user.conf
檔案內容,直接用註解的方式解釋每個在做啥:
# 黑名單,不讓程式開機就載入下面的驅動程式,顯卡才能夠直通
# A卡的驅動,我不想改就沒拿掉了
# N卡的linux內建基本驅動
# N卡的驅動
# 主機板聲音卡的驅動程式
# blacklist to stop driver loading
blacklist radeon
blacklist nouveau
blacklist nvidia
blacklist snd_hda_intel
# code43迴避方式
# 聽說VM會出現code 43,是由於顯卡知道自己在虛擬環境而發error
# 用下面的指令讓顯卡不發error
# 不確定,總之我是這樣認為~
# kvm config to avoid code 43
options kvm ignore_msrs=1
options report_ignored_msrs=0
# 允許vfio模組發出中斷,應該是這樣
# 因為之後會載入去給PCIE裝置,這邊要設定允許
# IOMMU interrupts
options vfio_iommu_type1 allow_unsafe_interrupts=1
# GVT-G配置
# gvt: 看自己要不要玩GVT-G,要=1,不要=0
# guc: 是否開啟低功耗什麼的,有GVT-G只能=0,否則想開=2/3 (3要看CPU是否支援huc)
# INTEL Graphic config
options i915 enable_gvt=1
options i915 enable_guc=0
# 設定ZFS只能使用這麼多記憶體
# 設定邏輯就是預設2G + ((儲存空間每1T)=1G) * (16+1+1) = 20G,然後換算成byte
# ZFS config
options zfs zfs_arc_max=21474836480
到此檔案內容已經結束!!!!
另外解釋一下個人理解的ZFS檔案系統運作邏輯:
當在寫入或讀取的時候,系統會先把操作寫入cache,事後等待系統同步硬碟資料
同步之後這些cache就會轉變為dirty page,不會被ZFS釋放,因此會越寫越多,導致記憶體占用逐漸膨脹
個人解決辦法是寫腳本定期去同步+清理,但如果有大檔案傳輸的話(例如BT下載),可能會在腳本動作以前就因為不斷的寫入而膨脹了,所以需要卡使用上限,這樣ZFS就會自行清除超過的部分,但....依舊不會釋放額滿的部分,還是只能等腳本去同步清理
3. 需要載入的modules
上面已經都提到要阻止驅動加入了,接下來當然是跟系統說要載入哪些驅動去取代原本被阻止的驅動
直接開啟modules設定檔,裡面應該原本是空的但有註解解釋
nano /etc/modules
加入的檔案內容:
# load GVT-G driver
kvmgt
# load VFIO drivers
vfio
vfio_iommu_type1
vfio_pci
vfio_virqfd
這些就不解釋這麼仔細了,簡單而言:
kvmgt用來載入GVT-G的驅動
剩下的都是讓IOMMU分組的裝置載入vfio驅動
個人解讀:所謂直通就是透過vfio驅動,讓VM映射裝置的實體位址後可以直接讀取並且使用
4. 把剛才做的所有一切都寫入開機程序之中
很神奇的是,以下兩行都是刷新開機程序,執行後跑出來的狀態描述是相同的,我不喜歡一直重複開機去實驗只跑一行的結果如何,所以這兩行我都下了一次,這樣只要重新開機一次就好XD
update-initramfs -u
pve-efiboot-tool refresh
值得一提的是,雖然PVE不使用grub了,但你按照網路上的作法改完grub後下update-grub,會被強制引導並且執行上面的指令,也就是說不管怎麼設定grub檔案,你的開機程序都不會有改變,IOMMU自然是不會成功了...這應該是很多夥伴在嘗試直通時遇到的大坑!!!!
之後就是重新啟動,然後檢查有沒有成功啟動IOMMU:
dmesg | grep 'remapping'
沒東西=失敗....((應該不會失敗啦QQ
接著確認自己IOMMU分組有沒有成功:
find /sys/kernel/iommu_groups/ -type l
理論上就會出現一長排自己電腦的分組訊息,例如我的長這樣:
find /sys/kernel/iommu_groups/ -type l
/sys/kernel/iommu_groups/17/devices/0000:05:00.0
/sys/kernel/iommu_groups/7/devices/0000:00:1b.0
/sys/kernel/iommu_groups/15/devices/0000:01:00.0
/sys/kernel/iommu_groups/15/devices/0000:01:00.1
/sys/kernel/iommu_groups/5/devices/0000:00:16.0
/sys/kernel/iommu_groups/13/devices/0000:00:1c.7
/sys/kernel/iommu_groups/3/devices/0000:00:08.0
/sys/kernel/iommu_groups/11/devices/0000:00:1c.5
/sys/kernel/iommu_groups/1/devices/0000:00:01.0
/sys/kernel/iommu_groups/18/devices/0000:06:00.0
/sys/kernel/iommu_groups/8/devices/0000:00:1b.4
/sys/kernel/iommu_groups/16/devices/0000:03:00.0
/sys/kernel/iommu_groups/6/devices/0000:00:17.0
/sys/kernel/iommu_groups/14/devices/0000:00:1f.0
/sys/kernel/iommu_groups/14/devices/0000:00:1f.5
/sys/kernel/iommu_groups/14/devices/0000:00:1f.3
/sys/kernel/iommu_groups/14/devices/0000:00:1f.4
/sys/kernel/iommu_groups/4/devices/0000:00:14.2
/sys/kernel/iommu_groups/4/devices/0000:00:14.0
/sys/kernel/iommu_groups/22/devices/00000000-0000-0000-0000-000000000401
/sys/kernel/iommu_groups/12/devices/0000:00:1c.6
/sys/kernel/iommu_groups/2/devices/0000:00:02.0
/sys/kernel/iommu_groups/20/devices/0000:08:00.0
/sys/kernel/iommu_groups/10/devices/0000:00:1c.4
/sys/kernel/iommu_groups/0/devices/0000:00:00.0
/sys/kernel/iommu_groups/19/devices/0000:07:00.0
/sys/kernel/iommu_groups/9/devices/0000:00:1c.0
到這裡就結束了~~
做完上述設定,可以成功做到跟需要注意的事情:
1. 開啟VM直通功能
2. 直通N卡,VM可以透過顯卡輸出畫面,相對的就是不能在宿主機/LXC上使用N卡
3. 接上述,有獨顯就不打算直通內顯了,所以沒研究要阻擋哪些驅動(盲猜應該是i915)
4. 內顯開啟GVT-G,根據bios分配的記憶體,可以直通虛擬顯卡最多兩張(改bios可以更多,但目前對我來說夠用了,所以不嘗試)
5. GVT-G無法輸出畫面,只是擁有了顯卡的硬體功能(解編碼),並且效能是共享的,本質上終究只有一張內顯
6. 因為直通N卡了,此時宿主機的系統畫面就只能由內顯作輸出,別插錯螢幕線了!!!!
7. 強烈不推薦同時直通內顯跟獨顯,否則沒有了任何畫面,系統掛了將會看不到錯誤訊息,網卡設定錯了將會從此失去WEB UI跟SSH連線