Perintah Baris QEMU/KVM: NVMe Emulation; Linux, FreeBSD & Windows 11 Sebagai Sistem Tetamu (Guest OSs)
Virtual Machines / Mesin Maya
Hajat di hati hendak emulate pemacu NVMe
, maka kuturuti hati ini. Memandangkan pemacu simpanan kita memang jenis M.2 NVMe
, boleh tahan laju dan berdesup jugalah perginya.
Dah alang-alang kan, kita cuba jugalah emulate di external HDD.
Hah, boleh tu memanglah boleh! Kit dah namanya pon HDD yak! Tak ande ler laju mana belaghinya ter. Tapinya nak ngabokan boleh le kita cuba mengajukkan ter. Kitnya entohlah. Macam perasaannya ter tak berapa nok sampei gitulah nak digambokan.
Pendek katanya, proses nak mengajuk pemacu ini memerlukan hos yang memiliki jenis pemacu ini jugalah. Barulah kena penggunaannya.
Em tak apelah jadilah ter koi memulakan kalam di sini. Sekadar mewujudkan muqaddimahnya. Mengkala baca dek oghang asing ni, ha bior lantokkan dia terpinga nok teranseleit pun tak dapat.
Untuk distro Arch Linux
, pasang pakej-pakej yang diperlukan dengan arahan berikut:-
bash
sudo pacman -S qemu-base qemu-audio-spice qemu-hw-display-qxl qemu-ui-spice-app virt-viewer
Saya tidak biasa dengan distro selainnya. Mohon dirujuk kepada dokumentasi yang disediakan oleh distribusi masing-masing.
Pakej-pakej di atas sudah mencukupi bagi saya untuk memasang mesin maya yang beroperasi dengan distribusi Linux
, FreeBSD
, mahupun sistem Windows
. Tanpa berlengah lagi, saya teruskan perbincangan dengan arahan QEMU
bersama opsyen-opsyen yang relevan bagi memuatkan ketiga-tiga jenis sistem operasi.
Saya sediakan opsyen Qemu yang seragam buat ketiga-tiga jenis sistem pengoperasian dan baris tambahan untuk disuaikan dengan setiap satunya.
Sebelum itu, salin OVMF_VARS.fd
atau OVMF_VARS.4m.fd
(bergantung kepada keserasian dengan sistem pengoperasian) ke dalam direktori yang dikhususkan untuk setiap OS bagi pengasingan UEFI firware.
bash
cp /usr/share/edk2/x64/OVMF_VARS.4m.fd ~/qemu/linux/firmware # Linux
cp /usr/share/edk2/x64/OVMF_VARS.fd ~/qemu/bsd/firmware # FreeBSD
cp /usr/share/edk2/x64/OVMF_VARS.4m.fd ~/qemu/win11/firmware # Windows 11
Perintah dengan opsyen-opsyen seragam
bash
qemu-system-x86_64 -enable-kvm \
-machine type=q35,vmport=off,usb=on \
-usb -device usb-tablet -device virtio-balloon -daemonize \
-vga qxl -display gtk,gl=on,show-cursor=on \
-display spice-app,gl=on -device virtio-serial-pci \
-spice unix=on,addr=/tmp/vm_spice.socket,disable-ticketing=on \
Opsyen untuk bootloader firmware (UEFI
)
FreeBSD:
bash
-drive if=pflash,format=raw,readonly=on,file=/usr/share/edk2/x64/OVMF_CODE.fd \
-drive if=pflash,format=raw,file=$HOME/qemu/bsd/firmware/OVMF_VARS.fd \
Linux dan Windows 11:
bash
-drive if=pflash,format=raw,readonly=on,file=/usr/share/edk2/x64/OVMF_CODE.4m.fd \
-drive if=pflash,format=raw,file=$HOME/qemu/linux/firmware/OVMF_VARS.4m.fd \
Opsyen untuk peruntukan memori dan CPU
Linux & FreeBSD:
bash
-m 2G -cpu host -smp 4 \
Windows 11:
bash
-m 6G -cpu host,hv_relaxed,hv_spinlocks=0x1fff,hv_vapic,hv_time -smp 12 \
Opsyen untuk sambungan Internet
Linux & FreeBSD:
bash
-nic user,model=virtio-net-pci,id=nic0,hostfwd=tcp::60022-:22 \
Windows 11:
bash
-nic user,model=virtio-net-pci,id=nic0,smb=$HOME/qemu/share/win \
- Opsyen
hostfwd
adalah untuk memanjangkan port SSH dari sistem hos; - manakala opsyen
smb
adalah untuk perkongsian direktori/fail (akses dari Windows ke laluan direktori yang ditetapkan di sistem hos).
Opsyen untuk resolusi auto bagi paparan grafik dan clipboard
Bagi Linux dan Windows 11 sahaja:
bash
-device virtserialport,chardev=spicechannel0,name=com.redhat.spice.0 \
-chardev spicevmc,id=spicechannel0,name=vdagent \
Opsyen wajib bagi Windows 11
bash
-chardev socket,id=chrtpm,path=$HOME/tmp/mytpm/swtpm-sock \
-tpmdev emulator,id=tpm0,chardev=chrtpm -device tpm-tis,tpmdev=tpm0 \
Windows
:- Windows sendiri.
- virtio-win.iso yang disumbangkan oleh komuniti Fedora.
Opsyen untuk memuatkan cakera (NVMe
) dan fail-fail ISO
Linux & FreeBSD:
bash
-device nvme,serial=myvirtdev,drive=nvm \
-drive index=0,media=disk,if=none,id=nvm,aio=native,cache.direct=on,file=$HOME/qemu/bsd/disks/disk.img \
-drive index=1,media=cdrom,file=$HOME/qemu/bsd/isos/Live.iso
Windows 11:
bash
-device nvme,serial=myvirtdev,drive=nvm \
-drive index=0,media=disk,if=none,id=nvm,aio=native,cache.direct=on,file=$HOME/qemu/win11/disks/disk.img \
-drive index=1,media=cdrom,file=$HOME/qemu/win11/isos/Win11_23H2_English_x64.iso \
-drive index=2,media=cdrom,file=$HOME/qemu/win11/isos/virtio-win-0.1.240.iso
- 🎗 Sunting laluan-laluan yang berkenaan seadanya (baris-baris yang diwarnakan).
- Ambil perhatian bahawa bahagian ini mengandungi baris terakhir bagi keseluruhan perintah baris untuk menjalankan VM. Opsyen-opsyen lain sekiranya diperlukan, maka tambahkannya sebelum seksyen ini.
Opsyen tambahan sekiranya perlu
- Untuk audio:
bash
-device intel-hda -device hda-duplex -device hda-micro \
- Untuk memanjangkan port USB:
bash
-device ich9-usb-ehci1,id=usb \
-device ich9-usb-uhci1,masterbus=usb.0,firstport=0,multifunction=on \
-device ich9-usb-uhci2,masterbus=usb.0,firstport=2 \
-device ich9-usb-uhci3,masterbus=usb.0,firstport=4 \
-chardev spicevmc,name=usbredir,id=usbredirchardev1 -device usb-redir,chardev=usbredirchardev1,id=usbredirdev1 \
-chardev spicevmc,name=usbredir,id=usbredirchardev2 -device usb-redir,chardev=usbredirchardev2,id=usbredirdev2 \
-chardev spicevmc,name=usbredir,id=usbredirchardev3 -device usb-redir,chardev=usbredirchardev3,id=usbredirdev3 \
NOTA TAMBAHAN:
Nota tambahan untuk Linux (UEFI):
- Assign bilangan
CPU Cores
dengan-smp
. Komputer riba saya memiliki CPU dengan6-core
, bermakna jumlahThreads
-nya ialah12
. Maka saya tugaskan bilangan Cores-nya sebanyak4
(quad-core) untuk kesemua jenis sistem pengoperasian tetamu ini, jumlah yang popular gitu (serasa diri inilah). Kalau tidak dinyatakan, sistem tetamu hanya akan memiliki1-core
sahaja. - Tambah
-boot [options]
sekiranya perlu kepada keutamaan susunan jenis media semasa proses booting. - Boleh setup SSH server di VM dan connect ke dalam SSH VM melalui baris ‘
ssh -p 60022 user@127.0.0.1
’ di sistem hos dengan memanjangkan port TCP hos melalui opsyen ‘-nic user,hostfwd=tcp::60022-:22
’. - Baris tambahan ‘
-virtfs local,path=$HOME/path_to_shared-folder,mount_tag=hostshare,security_model=none,id=fsdev0
’ boleh digunakan untuk perkongsian data antara sistem hos dan tetamu sekiranya tidak mahu menggunakan SSH connection atau SSHFS. Kemudian, mount di VM dengan baris perintah ‘mount -m -t 9p -o trans=virtio,version=9p2000.L hostshare /mnt/shared
’.
Nota tambahan untuk FreeBSD (UEFI):
spice-vdagent
untuk fungsi menyalin dan menampal dari Hos > Tetamu > Hos (clipboard
) sepertinya tidak available untuk FreeBSD. Compiling from source has also failed.- Saya gunakan File System
ZFS
(single stripe device) untuk VM ini. - Ada konfigurasi tambahan yang mesti dilakukan untuk masuk ke dalam
Xorg
. Sila rujuk [Tutorial: FreeBSD 12 on KVM + UEFI (OVMF) = Working Xorg] ini.
Selepas memasang pakej xorg
dan juga window manager atau desktop environment pilihan hati, mulakan dengan konfigurasi Xorg
sebagai root.
bash
Xorg -configure
Ambil perhatian kepada output yang memaparkan ralat di bahagian bawah sekali. Jika tiada sebarang konfigurasi lanjut dibuat, log masuk ke Xorg
akan gagal.
X.Org X Server 1.20.14
X Protocol Version 11, Revision 0
Build Operating System: FreeBSD 13.0-RELEASE-p11 amd64
Current Operating System: FreeBSD freebsdvm 13.1-RELEASE FreeBSD 13.1-RELEASE releng/13.1-n250148-fc952ac2212 GENERIC amd64
Build Date: 07 June 2022 01:52:09AM
Current version of pixman: 0.40.0
Before reporting problems, check http://wiki.x.org
to make sure that you have the latest version.
Markers: (--) probed, (**) from config file, (==) default setting,
(++) from command line, (!!) notice, (II) informational,
(WW) warning, (EE) error, (NI) not implemented, (??) unknown.
(==) Log file: "/var/log/Xorg.0.log", Time: Sat Jun 18 23:32:06 2022
List of video drivers:
scfb
modesetting
vesa
scfb trace: probe start
(++) Using config file: "/root/xorg.conf.new"
(==) Using system config directory "/usr/local/share/X11/xorg.conf.d"
Xorg detected your mouse at device /dev/sysmouse.
Please check your config if the mouse is still not
operational, as by default Xorg tries to autodetect
the protocol.
Your xorg.conf file is /root/xorg.conf.new
To test the server, run 'X -config /root/xorg.conf.new'
(EE) Server terminated with error (2). Closing log file.
Langkahnya adalah dengan menyalin dan menampal xorg.conf.new
ke dalam direktori /usr/local/etc/X11
dan namakan semula fail sebagai xorg.conf
.
bash
cp xorg.conf.new /usr/local/etc/X11/xorg.conf
Buka fail yang telah disalin ke direktori yang berkenaan itu dengan editor yang disukai, serta gantikan baris Driver "modesetting"
di bawah Section "Device"
kepada Driver "scfb"
.
Section "Device"
...
Identifier "Card0"
#Driver "modesetting"
Driver "scfb"
BusID "PCI:0:1:0"
EndSection
Setelah itu, bolehlah cuba log masuk ke dalam pengurus tetingkap / Desktop Environment yang dipasang.
Bagaimana mahu mengubah Resolusi Skrin?
Di sinilah EDK2-OVMF untuk UEFI memainkan peranan yang amat berguna! Masih ingat lagi tindakan menyalin/usr/share/edk2/OVMF_VARS.fd
di atas? Fail itulah yang akan menjadi paparan OVMF Settings (ala-ala BIOS-lah peranannya) untuk disunting tetapan resolusi skrinnya. Kerana itulah digalakkan untuk menyalinnya ke tempat lain supaya tidak mengganggu tetapan pakej lalai.F2
untuk melihat paparan OVMF
ini. Pergi ke bahagian Device Manager
.

OVMF Platform Configuration
.


F10
atau pilih Commit Changes and Exit
. Escape untuk kembali ke skrin utama.

Reset
dan Enter. VM FreeBSD akan boot dengan resolusi skrin baharu ini.

Neofetch
dalam Guest FreeBSD dengan XFCE4
sebagai Desktop Environment. Baru perasan yang nombor dalam kurungan selepas maklumat berkenaan CPU itu i.e. "AMD bla bla with Radeon Graphics (4)" merujuk kepada bilangan Cores
(Lebih tepat lagi ialah Threads
).

QEMU NVMe Ctrl
.

FreeBSD
dari Hos Arch Linux
.

Nota tambahan untuk Windows 11:
Ada beberapa perkara yang perlu dilakukan untuk memasang VM Windows 11
. Hal ini adalah diakibatkan oleh cip komputer (microcontroller) yang dilekatkan kepada motherboard di dalam kebanyakan peranti moden sekarang ini yang dinamakan sebagai Trusted Platform Module (TPM).
Perlu pasang pakej swtpm
terlebih dahulu sama ada dari git
stefanberger / swtpm atau dari distribusi masing-masing. Arch Linux
ada menyediakan pakej ini dalam repositori community.
Perintah baris untuk SWTPM:
bash
swtpm socket --tpmstate dir=$HOME/tmp/mytpm \
--ctrl type=unixio,path=$HOME/tmp/mytpm/swtpm-sock \
--log level=20 --tpm2
- Di terminal baru, gunakan perintah baris QEMU sebagaimana di atas untuk pemasangan.
Tanpa sebarang intervensi, ralat di bawah ini pasti akan keluar:-
Ralat ini boleh diselesaikan dengan command regedit
. Caranya adalah seperti berikut, terima kasih kepada ProgrammingKnowledge2
yang menyediakan tutorial-nya di Fix: This PC can’t run Windows 11 error | How to Fix Cannot Install Windows 11 on VirtualBox.
Jalankan semula QEMU
dan apabila sampai di bahagian ini, tekan kekunci ‘Shift + F10
’.
Kemudian, masukkan perintah regedit
.
Bahagian ini akan dipaparkan,
Pergi ke ‘Computer\HKEY_LOCAL_MACHINE\SYSTEM\Setup
’. Kemudian, right-click di Setup, dan tambah kunci baru; (New > Key)
. Masukkan nama kunci LabConfig
.
Setelah itu, right-click dekat LabConfig
, pilih DWORD (32-bit) Value
, masukkan nama BypassTPMCheck
.
Right-click pula BypassTPMCheck
itu, dan modify dengan menggantikan nilai ‘0’ kepada ‘1’.
Tambah lagi DWORD (32-bit) Value
dengan memasukkan nama BypassSecureBootCheck
serta modify nilai data kepada ‘1’ seperti di atas.
Tiada lagi ralat yang menyatakan bahawa PC tidak dapat menjalankan Windows 11 kerana tidak menepati syarat/keperluan minimum.
NVMe
ini secara automatik. Tidak perlu lagi Load driver
untuk mengakses cakera simpanan dengan pemacu virtio
.QEMU NVMe Ctrl
.

Kalau perasan, saya tetapkan soket
swtpm
untuk dilangsungkan ke dalam$HOME/tmp
kerana saya malas nak buat direktori baru i.e.mytpm
sebagai root. Pilihan masing-masing. Boleh langsungkan soket ini ke direktori/tmp
sekiranya itu yang dimahukan.Jika mengalami kesulitan untuk mendapatkan Internet connection, boleh gunakan opsyen
-nic
denganmodel=rtl8139
selain daripada modelvirtio-net-pci
:-bash
-nic user,ipv6=off,model=rtl8139,mac=84:1b:77:c9:03:a6,id=nic0,smb=$HOME/path_to_shared-folder \
Semak model yang available di Terminal:
$ qemu-system-x86_64 -nic model=help Supported NIC models: e1000 e1000-82544gc e1000-82545em e1000e i82550 i82551 i82557a i82557b i82557c i82558a i82558b i82559a i82559b i82559c i82559er i82562 i82801 ne2k_pci pcnet rtl8139 tulip virtio-net-pci virtio-net-pci-non-transitional virtio-net-pci-transitional vmxnet3
Lihat maklumat mengenai jumlah
Cores
diTask Manager > Performance > CPU
.Virtual processors
itu adalah merujuk kepada bilanganCores
yang telah diberikan kepada sistem tetamu ini iaitu 4.Jikalau Windows 11 ini ialah sebuah sistem pengoperasian sebenar di dalam peranti, maka bahagian ini akan memaparkan maklumat CPU dengan perincian
Cores
manakalaLogical processors
pula ialah jumlahThreads
.Folder yang dikongsi melalui
samba
boleh dicapai dengan menambah lokasi network:This PC Add a network location Next Choose a custom network location Next
Internet or network address: Next
Type a name for this network location: Next FinishMenurut
ArchWiki
, ada pelbagai cara bagi mendapatkan paparan grafik yang tinggi kualitinya atau hampir sama dengan persembahan sistem sebenar.
Untuk distribusiLinux
, GPUvirtio
sudah agak matang namun bagiWindows
pula, terlalu sedikit maklumat diperolehi yang melibatkan GPU ini.
Katanya, kaedah paling popular sekarang ialah kaedahPCI GPU Passthrough
jika ingin mendapatkan persembahan yang hampir sama dengan sistem sebenar. Walau bagaimanapun, tak kuasalah saya hendak mencuba kaedah ini semata sebabnya renyah bebenar caranya dan juga tak ada keperluan bagi saya. Saya tidak bermain games mahupun mempunyai kerja yang melibatkan sebarang penggunaan aplikasi3D
dari VM.
Jadinya saya tunjukkan imej perbezaan paparan antara kad grafikqxl
danvirtio
sajalah untukVM Windows 11
ini.
Kedua-duanya menunjukkan paparan skrin denganResolusi 1920x1080
danskrin berskala 125%
(Kena besarkan sikitlah bagi terang gitu pemandangannya).QXLPaparan skrin penuh VM:Paparan skrin TIDAK penuh VM:VirtIOPaparan skrin penuh VM:Paparan skrin TIDAK penuh VM:Kesimpulannya:
Hurm… Macam hampir kelihatan sama saja paparan skrinnya apabila dalam mod penuh. Namun di luar skrin penuh, kad grafik
VirtIO
tidak mampu melaras skrin secara automatik berbanding kad grafikQXL
. JadiQXL
ialah pemenang di sini.