bersama catatan peribadi & teknikalnya.

Perintah Baris QEMU/KVM: NVMe Emulation; Linux, FreeBSD & Windows 11 Sebagai Sistem Tetamu (Guest OSs)

Virtual Machines / Mesin Maya


geeky stuff
#qemu | #kvm | #SSH | #virtio | #nvme

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.


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.

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

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:

    -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:

    -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 \

🎗 Sunting laluan ke firmware seadanya (baris diwarnakan).


Opsyen untuk peruntukan memori dan CPU

Linux & FreeBSD:

    -m 2G -cpu host -smp 4 \

Windows 11:

    -m 6G -cpu host,hv_relaxed,hv_spinlocks=0x1fff,hv_vapic,hv_time -smp 12 \

Opsyen untuk sambungan Internet

Linux & FreeBSD:

    -nic user,model=virtio-net-pci,id=nic0,hostfwd=tcp::60022-:22 \

Windows 11:

    -nic user,model=virtio-net-pci,id=nic0,smb=$HOME/qemu/share/win \

  1. Opsyen hostfwd adalah untuk memanjangkan port SSH dari sistem hos;
  2. 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:

    -device virtserialport,chardev=spicechannel0,name=com.redhat.spice.0 \
    -chardev spicevmc,id=spicechannel0,name=vdagent \

Opsyen wajib bagi Windows 11

    -chardev socket,id=chrtpm,path=$HOME/tmp/mytpm/swtpm-sock \
    -tpmdev emulator,id=tpm0,chardev=chrtpm -device tpm-tis,tpmdev=tpm0 \

Opsyen untuk memuatkan cakera (NVMe) dan fail-fail ISO

Linux & FreeBSD:

    -device nvme,serial=deadbeef,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:

    -device nvme,serial=deadbeef,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).


Opsyen tambahan sekiranya perlu

  • Untuk audio:
    -device intel-hda -device hda-duplex -device hda-micro \

  • Untuk memanjangkan port USB:
    -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:
1) Linux (UEFI)
2) FreeBSD (UEFI)
3) Windows 11

Nota tambahan untuk Linux (UEFI):

  • Assign bilangan CPU Cores dengan -smp. Komputer riba saya memiliki CPU dengan 6-core, bermakna jumlah Threads-nya ialah 12. Maka saya tugaskan bilangan Cores-nya sebanyak 4 (quad-core) untuk kesemua jenis sistem pengoperasian tetamu ini, jumlah yang popular gitu (serasa diri inilah). Kalau tidak dinyatakan, sistem tetamu hanya akan memiliki 1-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 user@127.0.0.1 -p 60022' 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.

    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.

    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.
Apabila boot semula VM FreeBSD, tekan kekunci 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). :expressionless:
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:

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.

Installer akan mengesan cakera simpanan NVMe ini secara automatik. Tidak perlu lagi Load driver untuk mengakses cakera simpanan dengan pemacu virtio.
Windows 11 mengesan cakera sebagai 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 dengan model=rtl8139 selain daripada model virtio-net-pci:-
    -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 di Task Manager > Performance > CPU. Virtual processors itu adalah merujuk kepada bilangan Cores 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 manakala Logical processors pula ialah jumlah Threads.
  • Menurut ArchWiki, ada pelbagai cara bagi mendapatkan paparan grafik yang tinggi kualitinya atau hampir sama dengan persembahan sistem sebenar.
    Untuk distribusi Linux, GPU virtio sudah agak matang namun bagi Windows pula, terlalu sedikit maklumat diperolehi yang melibatkan GPU ini.
    Katanya, kaedah paling popular sekarang ialah kaedah PCI GPU Passthrough jika ingin mendapatkan persembahan yang hampir sama dengan sistem sebenar. Walaubagaimanapun, 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 aplikasi 3D dari VM.
    Jadinya saya tunjukkan imej perbezaan paparan antara kad grafik qxl dan virtio sajalah untuk VM Windows 11 ini.
    Kedua-duanya menunjukkan paparan skrin dengan Resolusi 1920x1080 dan skrin berskala 125% (Kena besarkan sikitlah bagi terang gitu pemandangannya).
    Paparan skrin penuh VM:
    Paparan skrin TIDAK penuh VM:
    Paparan 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 grafik QXL. Jadi QXL ialah pemenang di sini.



Kali terakhir dikemaskini:
Top