快轉到主要內容

Linux系統QEMU/KVM指令教學,安裝UEFI開機的虛擬機

分類   資訊科技 虛擬機與容器技術
標籤   Linux QEMU-KVM QEMU
🗓️ 民國113年 甲辰年
✍ 切換正體/簡體字
目錄

本文Ivon介紹如何在Ubuntu安裝QEMU套件,並示範用qemu-system指令安裝一個UEFI開機的Debian虛擬機。

1. 什麼是QEMU?
#

若要在Linux高效率執行虛擬機,你一定會使用到QEMU這套軟體。

「QEMU」為Fabrice Bellard等人開發的模擬器,屬於自由軟體,可以模擬各種架構的電腦和週邊硬體裝置,讓你安裝Linux、Windows、macOS等各種系統的虛擬機。此外QEMU還是跨平台軟體,設計強調可移植性,故本軟體能在Linux、Windows、macOS、Android、iOS執行。

QEMU的模擬分為「QEMU System Emulation」和「QEMU User Mode 」兩種模式,前者是模擬完整的作業系統,也就是本文要介紹的項目。QEMU System Emulation會將主機板、音效卡、網路卡等週邊硬體裝置都模擬出來,就好像在模擬一台真實電腦一樣,從而讓我們能在上面安裝作業系統。

不過光模擬電腦硬體是不夠的!Linux版的QEMU能配合「KVM」核心模組加速,組成QEMU/KVM,讓虛擬機達成近乎原生速度的執行效能。KVM非常重要,關乎虛擬機的使用體驗,所以一定要開。沒有KVM的話QEMU就只是個速度很慢的電腦模擬器罷了。

順帶一提,原版QEMU得打指令操作,雖然彈性高但選項眾多且繁雜。如果你是Linux系統用戶,沒有必要用qemu指令,你可以改用 Libvirt + Virt Manager圖形界面來管理QEMU/KVM虛擬機,獲得更好的使用體驗。

使用Virt Manager安裝Windows 11虛擬機,免打指令

2. 環境
#

  • 宿主機系統:Ubuntu LTS x86_64
  • QEMU版本:8.0.4
  • 虛擬機系統:Debian 12 x86_64

3. 確認電腦硬體支援虛擬化
#

Intel和AMD的CPU大部分都支援虛擬化。

  1. 首先確認硬體支援虛擬化,這功能可以在UEFI開啟。重開機後用以下指令確認CPU是否支援虛擬化,回傳值不應為0
sudo grep -E -c '(vmx|svm)' /proc/cpuinfo
  1. 接著確認Linux的KVM核心模組有無載入
sudo lsmod | grep kvm

註:雖然QEMU可以模擬其他架構的電腦,但KVM只給同架構的虛擬機加速,例如x86_64架構的電腦跑x86_64架構的虛擬機。若在x86_64架構的電腦模擬ARM64架構的電腦是無法使用KVM的。

4. 安裝QEMU套件
#

Ubuntu用以下指令安裝QEMU套件與相關工具、模擬UEFI韌體的OVMF、模擬TPM的swtpm

sudo apt install qemu-system qemu-utils qemu-system-common ovmf swtpm

說明:qemu-system套件包含了所有架構的模擬器,包括ARM、MIPS、PPC、S390、SPARC、x86。如果只要模擬x86_64架構的電腦那麼裝qemu-system-x86-64就夠了。

5. UEFI開機的虛擬機指令
#

這裡我們要安裝一個Debian系統的虛擬機,並用UEFI開機。本處的指令也能用來安裝Windows 11以前的Windows系統。

  1. Debian官網下載系統安裝ISO

  2. 建立存放虛擬機的目錄,將Debian的ISO放到這裡

mkdir -p ~/vms
cd ~/vms
  1. 使用qemu-img指令新增64GB虛擬磁碟
qemu-img create -f qcow2 debian.qcow2 64G
  1. QEMU預設是以SeaBIOS開機,UEFI開機則是要使用OVMF韌體。OVMF的目錄通常位於/usr/share/OVMF/,而我們要準備一個檔案,用於儲存虛擬機的UEFI設定,所以將OVMF_VARS_4M.fd複製到目前的目錄:
cp /usr/share/OVMF/OVMF_VARS_4M.fd  ~/vms
  1. 接著要使用qemu-system的指令開機,由於指令很長所以寫成一個指令稿:
vim startdebian.sh
  1. 填入以下內容,新增UEFI開機的Q35機器。末尾的\是將指令引數切成多行。
#!/bin/bash
qemu-system-x86_64 \
-machine q35 \
-drive if=pflash,format=raw,readonly=on,file=/usr/share/OVMF/OVMF_CODE_4M.secboot.fd \
-drive if=pflash,format=raw,file=OVMF_VARS_4M.fd \
-accel kvm \
-cpu host \
-smp sockets=1,cores=4,threads=1 \
-m 4096 \
-netdev user,id=n1 -device virtio-net,netdev=n1 \
-vga std \
-display gtk \
-device intel-hda \
-usbdevice tablet \
-boot menu=on -drive file=debian.qcow2 \
-cdrom debian-12.7.0-amd64-DVD-1.iso

指令解釋(請勿使用此處的程式碼,因為我加了註解指令格式就亂掉了):

# 模擬x86_64架構
qemu-system-x86_64 \

# 模擬Q35晶片組
-machine q35 \

# 使用UEFI韌體,所有變更會寫入到目前目錄的OVMF_VARS_4M.fd檔案
-drive if=pflash,format=raw,readonly=on,file=/usr/share/OVMF/OVMF_CODE_4M.secboot.fd \
-drive if=pflash,format=raw,file=OVMF_VARS_4M.fd \

# 啟用KVM加速
-accel kvm \

# 使用宿主機的CPU型號
-cpu host \

# 設定CPU拓撲,應該與宿主機的CPU型號一致,例如1插座4核心1執行緒
-smp sockets=1,cores=4,threads=1 \

# 分配4096MB的RAM
-m 4096 \

# 設定虛擬機網路卡為virtio-net
-netdev user,id=n1 -device virtio-net,netdev=n1 \

# 設定虛擬機顯示卡
-vga std \

# 啟動QEMU GTK視窗
-display gtk \

# (選擇性)啟動VNC伺服器,方便從SSH遠端安裝
#- vnc :0 \

# 設定音效卡為Intel HDA
-device intel-hda \

# 設定滑鼠與鍵盤
-usbdevice tablet \

# 系統虛擬磁碟
-boot menu=on -drive file=debian.qcow2 \

# 系統安裝ISO
-cdrom debian-12.7.0-amd64-DVD-1.iso

6. 開機安裝系統
#

  1. 賦予指令稿執行權限
chmod +x startdebian.sh
  1. 使用指令稿開機。除非發生錯誤,否則QEMU不會輸出任何訊息。
./startdebian.sh
  1. 之後QEMU視窗會跳出來,就可以在裡面安裝系統了。

  2. 裝完系統後將虛擬機關機,編輯開機指令稿,移除CDROM這行-cdrom ...,這樣之後開機就會直接進入虛擬機系統了。

7. QEMU虛擬機使用技巧
#

QEMU指令太多了,請到本文的「參考資料」翻閱相關文章。

虛擬機網路IP問題
#

QEMU預設是讓虛擬機跑在自己的內網,外部無法存取。這個時候請使用forward功能。例如以下參數能將虛擬機內部的22/tcp通訊埠重新導向到宿主機的2022/tcp,這樣就能連線到虛擬機內的SSH了。

-netdev user,id=n1,hostfwd=tcp::2222-:22 -device virtio-net,netdev=n1

虛擬機3D加速
#

除了GPU直通外,QEMU尚有半虛擬化的GPU加速可用。

比如,使用virglrenderer達成3D加速。目前只支援Linux宿主機+Linux虛擬機的搭配。

-device virtio-gpu-gl -display gtk,gl=on

參考資料
#

相關文章

Linux KVM啟用巢狀虛擬化,在虛擬機裡面跑虛擬機
分類   資訊科技 虛擬機與容器技術
標籤   Libvirt QEMU-KVM Linux
QEMU/KVM虛擬機繞過遊戲Easy Anti-Cheat的方法,隱藏KVM狀態
分類   資訊科技 虛擬機與容器技術
標籤   QEMU-KVM Linux Windows
Android-x86 QEMU虛擬機安裝教學,在Linux上執行手機APP,支援GPU加速的VM
分類   資訊科技 虛擬機與容器技術
標籤   Android-X86 Linux QEMU-KVM VirGL Scrcpy

留言板

此處提供二種留言板。點選按鈕,選擇您覺得方便的留言板。要討論程式碼請用Giscus,匿名討論請用Disqus。

這是Giscus留言板,需要Github帳號才能留言。支援markdown語法,若要上傳圖片請貼Imgur或Postimages。您的留言會在Github Discussions向所有人公開。

這是Disqus留言板,您可能會看到Disqus強制投放的廣告。為防止垃圾內容,有時留言可能會被系統判定需審核,導致延遲顯示,請見諒。若要上傳圖片請善用圖床網站。