作者gR7P4zXH (tpn7gpdx)
看板LoL
標題[閒聊] 教學:如何在Linux上玩LOL
時間Fri Aug 16 01:34:45 2019
# 如何在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