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:-
bashsudo pacman -S qemu-base qemu-audio-spice qemu-hw-display-qxl qemu-ui-spice-app virt-viewerSaya 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.
bashcp /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
bashqemu-system-x86_64 -enable-kvm -daemonize \
-machine type=q35,vmport=off \
-spice unix=on,addr=/tmp/vm_spice.socket,disable-ticketing=on \ -daemonize digunakan untuk menjalankan QEMU sebagai proses latar belakang (daemon).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 paparan grafik
bash -usb -device usb-tablet -device virtio-balloon \
-vga qxl -display gtk,gl=on,show-cursor=on \
-display spice-app,gl=on -device virtio-serial-pci \ 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 \ 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
hostfwdmengalihkan port dari sistem hos ke VM, membolehkan sistem hos menyambung ke VM melaluiSSHpada port 60022; - manakala opsyen
smbadalah untuk perkongsian direktori/fail (akses dari Windows ke laluan direktori yang ditetapkan di sistem hos).
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.isoWindows 11:
Windows:- Windows sendiri.
- virtio-win.iso yang disumbangkan oleh komuniti Fedora.
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 mengalihkan 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 \Opsyen di atas memerlukan pemasangan pakej qemu-hw-usb-redirect.
Nota Tambahan
(Umum)
- Tugaskan bilangan
CPU Coresdengan-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-coresahaja. - Tambah
-boot [options]sekiranya perlu kepada keutamaan susunan jenis media semasa proses booting. - Boleh set up pelayan SSH di VM dan sambung melalui SSH ke dalam VM dengan arahan ‘
ssh -p 60022 user@localhost’ di sistem hos. Semestinyalocalhostdi sini merujuk kepada alamat IP127.0.0.1.
Nota tambahan untuk Linux (UEFI)
- Baris tambahan ‘
-virtfs local,security_model=none,id=fsdev0,path=$HOME/path_to_shared-folder,mount_tag=hostshare’ 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-vdagentuntuk 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.
bashXorg -configureAmbil 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.
bashcp xorg.conf.new /usr/local/etc/X11/xorg.confBuka 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"
EndSectionSetelah 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.
Maju pula ke bahagian OVMF Platform Configuration.
Ubah tetapan framebuffer UEFI ke resolusi tertinggi.
Simpan tetapan yang dibuat sama ada dengan menekan kekunci F10 atau pilih Commit Changes and Exit. Escape untuk kembali ke skrin utama.
Pergi ke Reset dan Enter. VM FreeBSD akan boot dengan resolusi skrin baharu ini.
Tangkap layar 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).
FreeBSD mengesan cakera sebagai QEMU NVMe Ctrl.
SSH Connection ke dalam Tetamu 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:
bashswtpm 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
swtpmuntuk dilangsungkan ke dalam$HOME/tmpkerana saya malas nak buat direktori baru i.e.mytpmsebagai root. Pilihan masing-masing. Boleh langsungkan soket ini ke direktori/tmpsekiranya itu yang dimahukan.Jika mengalami kesulitan untuk mendapatkan Internet connection, boleh gunakan opsyen
-nicdenganmodel=rtl8139selain 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 vmxnet3Lihat maklumat mengenai jumlah
CoresdiTask Manager > Performance > CPU.Virtual processorsitu adalah merujuk kepada bilanganCoresyang 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 CoresmanakalaLogical processorspula ialah jumlahThreads.Folder yang dikongsi melalui
sambaboleh 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, GPUvirtiosudah agak matang namun bagiWindowspula, terlalu sedikit maklumat diperolehi yang melibatkan GPU ini.
Katanya, kaedah paling popular sekarang ialah kaedahPCI GPU Passthroughjika 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 aplikasi3Ddari VM.
Jadinya saya tunjukkan imej perbezaan paparan antara kad grafikqxldanvirtiosajalah untukVM Windows 11ini.
Kedua-duanya menunjukkan paparan skrin denganResolusi 1920x1080danskrin 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
VirtIOtidak mampu melaras skrin secara automatik berbanding kad grafikQXL. JadiQXLialah pemenang di sini.
