學習Linux的歷程裡沒提過的外傳故事!QEMU/KVM技能樹。
截至目前,GNU/Linux系統常見的虛擬化軟體有:
- QEMU/KVM,搭配Virt Manager或GNOME Boxes管理
- Oracle VirtualBox
- VMware
- Xen
為什麼本站的「虛擬機與容器技術」分類文章談論的虛擬機軟體幾乎都是QEMU/KVM呢?(至少到現在為止),這得從我對QEMU/KVM的沉迷說起。
小弟不才,關於Linux虛擬化的理解也只是一瓢飲的程度而已。
1. 焗烤義大利麵與QEMU/KVM#
之所以熱衷研究QEMU/KVM虛擬機到現在,是因為最初想遷移到Linux,又擔憂失去存取Windows功能的因素。
2022年以前,還沒有接觸過邪教式的自由軟體意識形態,所以我自是放不下Windows。即使知道Wine的存在,還是希望有一個虛擬機能即弄出Windows環境,好讓我在必要的時候跑軟體。
(後見之明:沒想到會在兩年後去資工系學C#程式,虛擬機救了我一命讓我得以安裝Visual Studio完成作業。)
此前已經有一些虛擬機操作經驗,但其實不是很懂背後原理,僅是覺得VirtualBox和Vmware很直觀好用!系統唰唰地就裝起來了。QEMU/KVM對我來說是未知的領域。
我隱約了解到,虛擬機最大的死穴就是圖形處理能力,於是從大二的時候(2020年)開始研究GPU直通技術。
在屏東大學學校宿舍附屬的學校餐廳,我點了焗烤義大利麵,坐下來拿出手機,看著「為了可能的聲音」、「CT Wang」、「如何在Linux打LOL」、「鳥哥」等人寫的文章,開始研究如何GPU直通。
同一時期,嘗試過在實體機安裝黑蘋果,讀著文章,回去宿舍測試後還真的成功了!啊不過音效卡kext搞不定所以很快放棄ㄌ
店家提供的小碗盛著餐點,義大利麵包在鋁箔中間,上面覆蓋著熱熱的焗烤餅皮。用叉子一戳破,捲著牽羹的番茄麵條和餅皮,放入口中酥脆又酸甜的感覺,實在好吃。
媽媽咪呀,根本看不懂網友文章在寫什麼,什麼IOMMU、VFIO、nouveau黑名單蝦米碗糕!?為什麼每個人介紹GPU直通都像在寫論文一樣。看著看著麵也吃完了,就不做了睡大覺!
慢慢到了2022年,我才第一次在Ubuntu嘗試成功GPU直通,也不是突然開悟什麼的,而是不斷試錯才成功的。畢竟那個時期是連vim都不會用的時候。
初次完成某事的喜悅總是盛大的,快要手舞足蹈的地步,所以我鉅細靡遺的把GPU直通步驟寫在舊「Ivon的實驗室」部落格上。這篇文章後來搬移到這個部落格: Ubuntu Nvidia GPU直通教學
爾後進入大distro-hopping時代,卻沒有忘記QEMU/KVM,這一定是我每次裝系統必裝的軟體。
在不同的Linux發行版重複類似的步驟,多做幾次GPU直通後,對步驟的熟稔度也就提升了許多。慢慢摸索出背後的邏輯關係。
我不曉得明明Virt Manager有GUI可以用,卻一堆人要用命令行virt-install新增虛擬機,並且還專注介紹virsh指令用法。當然,不過是各人的關注面向不同罷了,畢竟是我要玩虛擬機,不是真的管伺服器。
2022年,玩BlissOS的時候順便學到了virglrenderer的半虛擬化GPU加速技術。
2023年,學會使用Looking Glass擷取虛擬機畫面取代外接螢幕的用法。並且順道學了反遊戲偵測QEMU/KVM虛擬機的技巧。
除了GPU直通外,還順道學習了許多Libvirt的相關技術,例如VirtIO-FS、擴充容量、遠端虛擬機桌面的用法,這可以說是學習永無止境。
到現在,已經研究了四年啊,斷斷續續的才了解到Libvirt與QEMU/KVM鬆散又複雜的關係。像我這種學習速度,若是修一門資工系的課程早就被當100次了。
2. 使用QEMU/KVM的優點#
為什麼很少人提及QEMU/KVM當作桌面版Linux的虛擬化方案呢?用戶似乎都以伺服器運維工程師為主,不然就是寫韌體的工程師用命令行跑QEMU。那麼使用QEMU/KVM虛擬機究竟有何優勢?
參考 RedHat官網的說法,跟Vmware比起來,成本、擴展性、開源、靈活性就是QEMU/KVM的優點。
但我認為靈活性也是最大缺點。
許多新手桌面Linux用戶似乎偏好Virtualbox和Vmware這類虛擬化方案。這背後的理由不難理解,畢竟他們參考資料比較多,跨平台,也較容易上手。
相較之下,QEMU/KVM的方案是個很鬆散的組合,這不利於行銷。因為除了QEMU/KVM套件外,你還得安裝Libvirt、virsh、Virt Manager、Virt Viewer、OVMF、VirtIO、swtpm等等服務,才可以組合起來。而玩到最後你會發現Virt Manager不過是個前端而已!真正跑在背後的虛擬機是Libvirt和QEMU/KVM。更慘的是圖形介面無法管理Libvirt的全部功能,有時得手動修改虛擬機XML,甚或打指令,這就很不友善。
有沒有可能,真的需要QEMU/KVM功能的用戶,都直接裝Proxmox VE了呢?它的網頁管理介面很好用的!
不過回到桌面Linux為主的使用環境,一旦你真的需要「自由軟體」解決方案,並且滿足「PCI Passthrough」的功能,那麼前面兩個虛擬機軟體就不可能同時滿足。
並且QEMU/KVM可以被許多工具管理,例如Libvirt、virsh、Virt Manager、Cockpit、oVirt、GNOME Boxes等等。
這就是QEMU/KVM的優點所在。
至於為什麼我文章都要強調「QEMU/KVM」而非只寫KVM,是希望能讓軟體開發者得到同等的重視,KVM只是核心模組,若沒有QEMU搭配啥都不是。的確,市面上有不依賴QEMU跑KVM的虛擬機軟體,例如Amazon Firecracker,但目前來說QEMU配KVM依然是主流作法。
3. 現今跑QEMU/KVM的配置#
所學有限,未來可能會改配置。
現在的用法是混合型,我把Linux當桌面系統用,出門在外再用SSH與內網穿透軟體遠端存取,把Linux當伺服器用。
因為電腦有Intel內顯,故Nvidia GPU直通的時候Linux依然能使用桌面。大部分時候上網是不太需要Nvidia GPU的,至於玩大型遊戲就往Windows虛擬機裡面塞。
跑QEMU/KVM的電腦,CPU和RAM自是越大越好。
Linux發行版我選擇穩定發表的,也就是Ubuntu LTS。我不希望跑在Arch Linux這種不穩定的環境,那在虛擬機裡面測試就好了,外部的基礎設施不可以這麼放蕩。
關於虛擬機容量問題,只能很笨的將虛擬機qcow2檔案存在第二個硬碟裡面(所以他們可以活過distro-hopping),需要空間的時候再手動qemu-nbd掛載調整。等到我學會LVM之後應該就不會用這麼笨的方法了,彼時也得學著做RAID呢。
現在如果需要用GPU跑某些AI運算的時候,再用虛擬機跑,取代過去直接在實體系統安裝Python套件的做法,這樣隔絕的環境也比Docker要徹底。
將Nvidia顯示卡關在虛擬機裡面還有另外一個原因:KDE 5 X11搭配Nvidia驅動很容易畫面撕裂。那就乾脆不要出來了,讓Intel負責顯示畫面就好。
最後,我一直在想,是不是哪天乾脆把Ubuntu換成Proxmox VE好呢?
嗯嗯,不要,我還是希望實體的桌面Linux可以存在,而不是永遠活在虛擬的機器裡面。