本文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虛擬機,獲得更好的使用體驗。
2. 環境#
- 宿主機系統:Ubuntu LTS x86_64
- QEMU版本:8.0.4
- 虛擬機系統:Debian 12 x86_64
3. 確認電腦硬體支援虛擬化#
Intel和AMD的CPU大部分都支援虛擬化。
- 首先確認硬體支援虛擬化,這功能可以在UEFI開啟。重開機後用以下指令確認CPU是否支援虛擬化,回傳值不應為0
sudo grep -E -c '(vmx|svm)' /proc/cpuinfo
- 接著確認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系統。
到 Debian官網下載系統安裝ISO
建立存放虛擬機的目錄,將Debian的ISO放到這裡
mkdir -p ~/vms
cd ~/vms
- 使用qemu-img指令新增64GB虛擬磁碟
qemu-img create -f qcow2 debian.qcow2 64G
- QEMU預設是以SeaBIOS開機,UEFI開機則是要使用OVMF韌體。OVMF的目錄通常位於
/usr/share/OVMF/
,而我們要準備一個檔案,用於儲存虛擬機的UEFI設定,所以將OVMF_VARS_4M.fd
複製到目前的目錄:
cp /usr/share/OVMF/OVMF_VARS_4M.fd ~/vms
- 接著要使用qemu-system的指令開機,由於指令很長所以寫成一個指令稿:
vim startdebian.sh
- 填入以下內容,新增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. 開機安裝系統#
- 賦予指令稿執行權限
chmod +x startdebian.sh
- 使用指令稿開機。除非發生錯誤,否則QEMU不會輸出任何訊息。
./startdebian.sh
之後QEMU視窗會跳出來,就可以在裡面安裝系統了。
裝完系統後將虛擬機關機,編輯開機指令稿,移除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