看板 LoL 關於我們 聯絡資訊
# 如何在linux上玩lol # 簡介 多年來能夠充份提升硬體使用率的虛擬化技術為之流行。虛擬化技術除了能增加安全性, 亦能運行與實體機器不同的作業系統。 我們將藉由libvirt的協助使用QEMU/KVM在linux上建立虛擬機,並藉由GPU Passthrough 將顯卡新增至虛擬機裡取得最佳遊戲體驗。 在虛擬機內打LOL即為一應用場景:) # 背景知識 ## KVM KVM(Kernel-based Virtual Machine)是一種用於Linux kernel的核心模組,可為Linux kernel提供VMM(Virtual Machine Monitor)的功能。 KVM需要處理器支援硬體虛擬化延伸,例如Intel VT和AMD-V。Intel VT和AMD-V是指令集 延伸,能夠從硬體上協助VMM。 ## QEMU QEMU是一款可執行硬體虛擬化的VMM,可與KVM一起使用讓VM達到接近真實機器速度。 ## LIBVIRT LIBVIRT是一套開源的管理工具,用於管理和建立虛擬機。常被用於管理KVM/VM Ware ESXi/QEMU和其他虛擬化技術。 # 系統需求 1. 需要有UEFI BIOS的顯卡,這兩3年內出的基本上都會有。偏好AMD,N家也可但需要額 外步驟,在此不多贅述 2. 若是用Intel CPU,CPU需要支援虛擬化VT-d和VT-x,並在BIOS設定內開啟VT-d和 Intel Virtualization Technology,預設是不會開啟的。AMD CPU需要支援AMD I/O Virtualization Technology (IOMMU) 和SVM,同樣在BIOS內開啟相關選項。 3. CPU需要有內顯,並從BIOS設定僅使用內顯輸出。 4. Windows 10 64bit或是其他64bit的Windows作業系統安裝光碟映像檔,例如 "Win10_1903_V1_Chinese(Traditional)_x64.iso",我們需要在Linux上建立虛擬機並安 裝Windows # 實驗環境 ## 軟體 QEMU 2.11.1, Libvirt 4.0.0 HOST OS(實體機作業系統): Ubuntu MATE 18.04 (linux 4.15.0) GUEST OS(虛擬機作業系統): Windows 10 1903 Education ## 硬體 CPU: Intel i7-6700 RAM: 32G DISK: Intel SSD 512G 顯示卡: Radeon R7 250 電源: 300W 螢幕: Dell P2314H,具有D-sub/HDMI Input # 系統架構 用libvirt建立一台虛擬機器(Virtual Machine,VM)。qemu提供Guest OS一張QXL graphics device作為改善顯示效能用,Guest OS亦需要QXL driver。QXL Device將資料 傳送到libspice,libspcie內實作Spice Server的再將畫面傳給Host OS上的Spice client,於是使用者看得到虛擬機輸出畫面。 https://i.imgur.com/p4RpdIj.png
裝完作業系統和遊戲後將顯卡Passthrough進VM裡,Guest OS會偵測到該顯卡,使用者自 行裝完所需驅動後會用該卡輸出畫面,因此需要另一台螢幕。本實驗使用雙輸入 (D-sub/HDMI)螢幕,D-sub用來接內顯輸出,HDMI用來接Passthrough進VM的顯示卡輸出。 https://i.imgur.com/iQSzYJX.png
螢幕輸入從D-sub切到HDMI就能看到熟悉的windows爽爽玩遊戲囉!記得先用滑鼠點一下虛 擬機畫面讓滑鼠、鍵盤被"吃"進去。也能以同樣方式passthrough實體鍵盤、滑鼠進VM。 https://i.imgur.com/IJjBlkx.png
# 實驗流程 ## 安裝 安裝KVM/QEMU相關套件 ~$ sudo apt install qemu-kvm libvirt-clients libvirt-daemon-system bridge-utils virt-manager ovmf 檢查系統是否有能力運行hardware accelerated KVM virtual machines ~$ kvm-ok INFO: /dev/kvm exists KVM acceleration can be used ## 建立虛擬機 建立虛擬機的方式有很多種,最簡單的方式是使用virt-manager ~$ virt-manager 點選"建立新的虛擬機"開啟視窗,選擇"本地端安裝軟體",在下一步"ISO映像"選擇 windows10安裝光碟,在最後一步勾選"安裝前自訂組態",調整一些設定。 https://i.imgur.com/eIlqrht.png
Windows沒有購買授權是找不到其他Socket的CPU,因此直接調整Core數目。 https://i.imgur.com/pGgDpAk.png
BIOS選擇UEFI和Q35。 https://i.imgur.com/tLa6jw2.png
硬碟分配多大都可以,不會預先配置空間而是有多少佔多少。因為是Windows不建議選 virtio,考慮到穩定性優先選SATA。 https://i.imgur.com/r9zpwov.png
網路卡選擇"rtl8139"足以,選擇"virtio"需要自行裝驅動。 https://i.imgur.com/1Tvo77I.png
完成各項設定後記得按套用,開始安裝作業系統。第一次開機libvirt會自動新增一個光 碟機放映像檔,不需要手動新增一個。 https://i.imgur.com/NOjKAsP.png
裝完作業系統先裝LOL。 ## GPU Passthrough * Host OS不可以安裝要passthrough的顯卡驅動 編輯/etc/default/grub設定檔,在"GRUB_CMDLINE_LINUX_DEFAULT"上增加 intel_iommu=on GRUB_CMDLINE_LINUX_DEFAULT="intel_iommu=on" 更新grub ~$ sudo update-grub ~$ reboot 查看PCI devies是否被mapped到IOMMU群組 ~$ lspci -nnk https://i.imgur.com/db4kJtD.png
以R7 250這張卡為例,vendor ID與device ID則為1002:6610和1002:aab0 再次修改GRUB_CMDLINE_LINUX_DEFAULT,vfio-pci.ids後面填入顯示卡的vendor ID 與device ID。顯示卡如果是Radeon,modprobe.blacklist=radeon,在Radeon之後的顯 卡接modprobe.blacklist=amdgpu GRUB_CMDLINE_LINUX_DEFAULT="intel_iommu=on vfio_iommu_type1.allow_unsafe_interrupts=1 vfio-pci.ids=1002:6610,1002:aab0 modprobe.blacklist=radeon kvm.ignore_msrs=1" 啟用 vfio-pci 核心模組 ~$ sudo echo 'vfio-pci' > /etc/modules-load.d/vfio-pci.conf 更新grub並重新產生核心的initramfs ~$ sudo update-grub ~$ sudo update-initramfs -u ~$ reboot 等到重新啟動後,執行lspci -nnk可見到顯示卡使用vfio-pci driver https://i.imgur.com/wUrQzG4.png
回到virt-manager,為VM添加顯示卡並重開VM https://i.imgur.com/vBNUZEC.png
> 記得先用滑鼠點一下VM畫面讓滑鼠、鍵盤被"吃"進去VM。 螢幕接上顯卡輸出就能看到Windows桌面 https://i.imgur.com/pkp4fB7.png
由於QXL device也還沒拔掉,所以會是雙螢幕,建議僅用passthrough的顯卡輸出。 https://i.imgur.com/2K6E7Be.png
在裝置管理員看到AMD顯示卡,請自行安裝AMD驅動 https://i.imgur.com/Y9oHg7n.png
打LOL實景,特效中等,這張卡效能約莫RX460的一半,因此FPS較低。PING高是因為宿舍 網路問題,無解。 https://i.imgur.com/2kUeKmF.jpg
也能以同樣方式passthrough實體鍵盤、滑鼠進VM。 ## Looking glass Looking glass是一款開源應用程式,免去GPU Passthrough的VM接上實體螢幕、鍵盤和滑 鼠的各種麻煩。Host graphics card只要支援OpenGL,然而GuestOS必須是Win10。 在linux上編譯looking glass client,從 https://github.com/gnif/LookingGlass/releases取得最新的sourece code和 executable for windows。 # Install essential packages ~$ sudo apt install cmake libsdl2-dev libsdl2-ttf-dev nettle-dev libspice-protocol-dev libfontconfig1-dev libx11-dev fonts-freefont-ttf libconfig-dev # Download source code ~$ wget https://looking-glass.hostfission.com/ci/host/source?id=24 --content-disposition ~$ unzip -a LookingGlass-Release-B1.zip ~$ cd LookingGlass-Release-B1 # Building the client ~$ mkdir client/build ~$ cd client/build ~$ cmake ../ ~$ make /tmp/LookingGlass-Release-B1/common/src/bfd.inc.h:5:14: fatal error: bfd.h: 沒 有此一檔案或目錄 # Build again ~$ sudo apt install binutils-dev ~$ make ~$ ls looking-glass-client looking-glass-client 編譯完會生成looking-glass-client 修改VM configuration,這裡使用virsh ~$ virsh virsh # list Id Name State ---------------------------------------------------- - win10-2 shut off virsh $ edit win10-2 在"device" section添加這段: <shmem name='looking-glass'> <model type='ivshmem-plain'/> <size unit='M'>32</size> </shmem> 32是依據下列公式計算而來 width x height x 4 x 2 = total bytes total bytes / 1024 / 1024 = total megabytes + 2 例如有1920x1080 (1080p)解析度的螢幕 1920 x 1080 x 4 x 2 = 16,588,800 bytes 16,588,800 / 1024 / 1024 = 15.82 MB + 2 = 17.82 將上列數值近似至2的次方得到32 建議在VM啟動前建立shared memory file ~$ touch /dev/shm/looking-glass ~$ sudo chown user:kvm /dev/shm/looking-glass ~$ chmod 660 /dev/shm/looking-glass ~$ ls -al /dev/shm/looking-glass -rw-rw---- 1 user kvm 0 8月 15 20:59 /dev/shm/looking-glass 在/etc/apparmor.d/abstractions/libvirt-qemu添加下面幾行 # for LookingGlass /dev/shm/looking-glass rw, 重啟apparmor ~$ sudo systemctl restart apparmor 啟動VM,然而Windows並無IVSHMEM device的driver,至下方網址取得>0.1.161版的驅動 程式,在裝置管理員找到PCI standard RAM Controller為其更新驅動。 https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/upstream-virt io/ https://i.imgur.com/DJh18Ys.png
https://i.imgur.com/94bKLN2.png
回到Windows從https://github.com/gnif/LookingGlass/releases下載 looking-glass host applitcation並執行。為了方便使用,可設定登入時啟動。 https://i.imgur.com/sd6WpSY.png
回到Host OS,執行剛才編譯好的looking-glass-client,加上"-k"顯示FPS,加上"-F" 無邊框全螢幕 ~$ ./looking-glass-client -F Looking-glass表示在refresh rate 60Hz情況下,透過shared memory傳遞畫面延遲只有 不到16毫秒。 # 實驗結果 在桌面一開Youtube,在桌面二開Looking-glass打LOL https://youtu.be/A82RtXfSqeU
# 結論 從實驗結果可看出LOL FPS不超過80,本章節說明可能的效能瓶頸及未來研究方向。 在VM內Radeon R7 250,為較低階的顯卡,要改善FPS勢必要換更高階的顯卡,要換更高 階的顯卡,就必須先有錢買顯卡。此外OBS錄製影片時也佔用不少CPU資源。 未來會朝多開LOL方向研究,為了維持遊戲品質,每台VM都需要一張實體顯卡和PCI-E Slot。 # 銘謝 FT小精靈 # 參考資料 1. PCI passthrough via OVMF(https://wiki.archlinux.org/index.php/PCI_passthrough_via_OVMF) 2. Spice Roadmap(https://slideplayer.com/slide/11229044/) 3. Windows on KVM/QEMU: QXL Graphics Driver Install and Removable Storage Considerations (https://www.youtube.com/watch?v=24rfzSDVfBA)
4. KVM/QEMU 虛擬機器設定 GPU Passthrough 記錄(https://blog.gtwang.org/linux/u buntu-linux-kvm-qemu-gpu-passthrough-tutorial/) 5. Looking Glass Quickstart Guide(https://looking-glass.hostfission.com/quickstart) 6. Installing the Drivers on an Installed Windows Guest Virtual Machine(https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux /6/html/virtualization_host_configuration_and_guest_installation_guide/form-vi rtualization_host_configuration_and_guest_installation_guide-para_virtualized_ drivers-mounting_the_image_with_virt_manager) -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 101.101.101.101 (臺灣) ※ 文章網址: https://www.ptt.cc/bbs/LoL/M.1565890497.A.4CF.html
Nigger5566 : 嗯嗯,跟我想的差不多,不過被你先發了 08/16 01:37
cw846917 : 好累.... 08/16 01:37
chuchuyy : 嗯嗯我也是覺得這樣就能打LOL了08/16 01:37
ckpetercheng: 建議直接雙系統XDD08/16 01:39
Tchachavsky : 我都去網咖喝飲料就能有LOL打08/16 01:39
ckpetercheng: 不過lol也只是其中一個應用而已啦08/16 01:40
Neptunus : 真棒 給你一個讚08/16 01:40
kaiting00 : 恩恩 跟我想的一樣08/16 01:42
Daichiuri : 有辦法弄成image嗎08/16 01:42
qcow2,121G,Windows未啟用,請站內信
zhtw : 虛擬機不是被擋了嗎?08/16 01:43
我這不是開起來玩了嗎~
zhtw : 現在還可以噢?08/16 01:44
zhtw : 記得之前有人說MAC用虛擬機沒辦法玩了 Linux竟能玩08/16 01:44
沒銀彈買MAC:<
a96859685 : 你可以在windows環境下用linux啊08/16 01:45
peter0825 : 嗯嗯我原本也想在linux上實作的 既然你做了那就算了08/16 01:45
ilove640 : 嗯嗯 對 說得真好 我也同意08/16 01:45
ttoomm5520 : 嗯嗯 跟我的作法差不多08/16 01:51
helloeric : 推優文 但還是建議買一台win比較快= =08/16 01:54
leo75399 : 給直接END的你懶人包:請快存錢買台Windows08/16 01:55
q18066 : 嗯嗯 本來想說起床要發的 被你發就算了08/16 01:55
na191 : 嗯嗯08/16 01:58
s638450 : 懶人包:沒事別耍屌學人家用Linux 乖乖裝Windows08/16 01:59
CycleEnergy : 沒錯沒錯 不錯阿 我也一直都是這樣做08/16 02:01
anthony0901 : 嗯嗯08/16 02:04
zxcasd951159: 我以為大家都是這樣玩的欸08/16 02:05
p890040 : 我懂08/16 02:08
DLHZ : 嗯嗯跟我想的一樣 還是乖乖裝win10 linux放在virtua08/16 02:09
DLHZ : lbox就好08/16 02:09
shehe246 : QEMU2.0好舊了 最近也在玩gem5跟qemu08/16 02:12
更正,是2.11.1
schumi7401 : 這是殺小08/16 02:13
uglyfinger : 感覺是清流文... 但我文組= = 抱歉了08/16 02:13
k82817 : 我剛好打了一半 準備明天發文 08/16 02:14
k82817 : 看起來我們想法差不多 那我就不發了08/16 02:14
rude : 懶人包:用VM裝windows08/16 02:15
leo850319 : 還以為走錯板 08/16 02:18
energyy1104 : 想玩遊戲還是用windows吧 08/16 02:19
HiddenGuy : 可以裝在windows的linux模擬器裡的windows模擬器嗎? 08/16 02:24
可以,Virtualized Virtualization
S0323109 : 恩恩 08/16 02:26
prtscscroll : 這就是為什麼windows正版可以賣那麼貴 08/16 02:32
TUTOTO : 優質 08/16 02:34
RaiGend0519 : 所以為什麼不雙系統就好惹... 08/16 02:36
VM有很多優點呢,包擴充分利用硬體、隔離性、好管理。把LOL跟主系統隔離開:D
BardxBaymax : Linux是什麼== 08/16 02:40
Linux是一種生物,由核(Linux kernel)開始往外擴增
Scott850205 : 嗯 看來大家都是這樣做08/16 02:44
Nielro9721 : 嗯嗯嗯08/16 02:45
Tiandai : 大家是都在大便? 恩三小?08/16 02:53
idisnothing : 不用Win也能玩再通知我08/16 02:54
coco543961 : 我也是這樣幫朋友弄 只是要特地發文太多字了08/16 03:07
g5637128 : 我還是灌雙系統就好了= =08/16 03:09
as5656v : 你打了多久... 08/16 03:09
3天包含實驗,最重要的GRUB參數小精靈花了3天在找
saivantist : 好文 推推08/16 03:29
ares960 : 幫推 假裝看得懂 08/16 03:32
iamgodisme : Linux就是讓你好好工作用的 打啥LOL?08/16 04:05
※ 編輯: gR7P4zXH (111.248.22.103 臺灣), 08/16/2019 04:06:19 ※ 編輯: gR7P4zXH (111.248.22.103 臺灣), 08/16/2019 04:07:02
yunsaki : 推一下雖然看不懂 08/16 04:10
expup : 你這個我也玩過 不過下次更新可能就不行了 08/16 04:15
xxx8xxxz : 牛逼 08/16 04:24
Ten6666 : 懶人包:直接買一個Windows來裝 08/16 04:26
strangelife : 看不懂但是推 08/16 04:34
hakugetsu : KVM預設會傳遞一些flag 所以程式才可以拒絕在虛擬機 08/16 04:46
hakugetsu : 執行 但這些都可以改 08/16 04:46
mingtotoro : 好的好的 我懂了 08/16 04:48
hakugetsu : 就像NV禁止一般顯卡直通虛擬機一樣 flag改一下他認 08/16 04:49
hakugetsu : 不出來是KVM 驅動就可以用了 08/16 04:49
hakugetsu : 不過i7不是不支援ACS嗎 這樣不會有IOMMU group的問 08/16 04:50
hakugetsu : 題嗎? 08/16 04:50
也不是所有i7都不行
nickqqfuck : 跟我想法差不多。 08/16 04:57
nickqqfuck : 我覺得新增一個 -v kmontd49可以改善顯卡效能的問題 08/16 04:57
nickqqfuck : 。 08/16 04:57
nickqqfuck : 或者在增益集裡面放上CDPro2也是堪用。有興趣可以站 08/16 04:57
nickqqfuck : 內交流噢 08/16 04:57
q347 : 問題台服能用膩 08/16 04:58
嗯嗯
Yaoder : 我是直接切硬碟來用啦... 08/16 05:40
zenixls2 : 直接用wine 跑就好了,除了台服都沒問題 08/16 06:32
wayne580230 : 強者 只能推了 08/16 07:53
rp20031219 : 優文 08/16 07:55
Issarc0721 : 推認真XD 08/16 08:41
hipsteryang : 作業系統考生淚推 08/16 09:27
加油
yesido330 : 也太閒了XD。 08/16 09:52
jasomet : 直接切硬碟不是比較快嗎~macOS一直點下一步就可以 08/16 09:55
jasomet : 了 08/16 09:55
kaiDX : 猛 08/16 09:56
jasomet : 阿沒看文章我的錯QQ08/16 09:57
playgame555 : 好神啊!08/16 10:13
abc127845 : 感覺電腦太差跑去來應該會很卡08/16 10:22
heaviest : 推,以前有試著用過passthrough,但沒成功,也忘了08/16 10:31
heaviest : 是卡哪個步驟了08/16 10:31
clbkan : acid大好猛喔08/16 10:56
抱歉你認錯了
calvin0319 : 嗯嗯,跟我想的差不多08/16 11:11
e11gary30200: 嗯嗯 我也想這樣子做過08/16 11:15
dannyhsu1206: 真麻煩欸....打個lol灌一堆東西08/16 11:21
jellykid0305: 不要對糞game認真好爆08/16 11:52
zweibeee : 恩恩,跟我想的一樣簡單,辛苦了08/16 12:06
qaz940233 : 嗯 文組還是直接買台win的來玩就好08/16 12:08
weltschmerz : 何必呢 直接雙系統就好了…08/16 12:17
jinx55123 : 其實你是很享受弄這些吧 玩LOL只是順便XD08/16 12:20
coox : 那你幹嘛不直接裝windows就好??08/16 12:46
因為我在linux還有東西在跑 ※ 編輯: gR7P4zXH (1.163.75.161 臺灣), 08/16/2019 13:08:23
jlik12385 : 我懂我懂 大概跟我的作法一樣 08/16 13:15
KAOKAOKAO : 靠 還真沒試過 libvirt 這套加 PCI pass through 08/16 15:08
KAOKAOKAO : 看來這樣做甚至比 Virtualbox 好 08/16 15:08
KAOKAOKAO : VB 的話可以順利通過 loading 畫面 但load完就當 08/16 15:10
KAOKAOKAO : PlayOnLinux的話可以玩美服 08/16 15:11
KAOKAOKAO : 用wine自己兜的話整個安裝都怪怪的 後來放棄了 08/16 15:11
lycosidae : 好猛 08/16 16:50
※ 編輯: gR7P4zXH (111.248.22.103 臺灣), 08/16/2019 19:50:24
DennyXu : 我以為這些事常識 08/16 20:31