Mungkin Anda mengenal storage device atau block device yang biasa digunakan untuk menjalankan VM di QEMU seperti ide
, scsi
, sata
dan virtio
. Namun dari
beberapa pilihan tersebut, terdapat juga tipe lain yang akan dibahas pada artikel kali ini.
MegaRAID SAS
MegaRAID SAS adalah produk hardware dan software yang digunakan untuk mengelola array disk yang menggunakan interface SAS (Serial Attached SCSI) atau SATA (Serial ATA). MegaRAID SAS dapat meningkatkan kinerja, keandalan, dan keamanan data dengan menyediakan berbagai tingkat RAID.
Ada dua tipe yang tersedia di QEMU yaitu megasas
dan megasas-gen2
.
Berikut adalah contoh implementasi dengan dua disk SCSI ke megasas.
qemu-system-x86_64 -machine pc-q35-6.2 -accel kvm -vnc :0 -smp 2 -m 2048M \
-net nic -net user,hostfwd=tcp::5022-:22 \
-hda ol7.qcow2 -serial stdio \
-device megasas-gen2,id=scsi0 \
-device scsi-hd,drive=drive0,bus=scsi0.0,channel=0,scsi-id=0,lun=0 \
-drive file=disk1.qcow2,if=none,id=drive0 \
-device scsi-hd,drive=drive1,bus=scsi0.0,channel=0,scsi-id=1,lun=0 \
-drive file=disk2.qcow2,if=none,id=drive1
Jika menggunakan libvirt, definisi XML akan menjadi.
<qemu:commandline>
<qemu:arg value='-device'/>
<qemu:arg value='megasas,id=scsi1'/>
<qemu:arg value='-drive'/>
<qemu:arg value='file=disk1.qcow2,format=qcow2,if=none,id=drive0'/>
<qemu:arg value='-device'/>
<qemu:arg value='scsi-hd,bus=scsi1.0,channel=0,scsi-id=0,lun=0,drive=drive0,write-cache=on'/>
<qemu:arg value='-drive'/>
<qemu:arg value='file=disk2.qcow2,format=qcow2,if=none,id=drive1'/>
<qemu:arg value='-device'/>
<qemu:arg value='scsi-hd,bus=scsi1.0,channel=0,scsi-id=1,lun=0,drive=drive1,write-cache=on'/>
</qemu:commandline>
Untuk memastikan controller MegaRAID telah terpasang gunakan perintah berikut.
# lspci | grep -i megaraid
00:03.0 RAID bus controller: Broadcom / LSI MegaRAID SAS 2108 [Liberator]
NVDIMM
NVDIMM (Non-Volatile Memory Module) adalah jenis memori yang tetap menyimpan isinya bahkan ketika PC atau server Anda dimatikan.
Berikut contoh implementasi NVDIMM.
qemu-system-x86_64 -machine pc,nvdimm,accel=kvm -vnc :0 -smp 4 -m 4096M \
-net nic -net user,hostfwd=tcp::5023-:22 \
-hda ol7.qcow2 -serial stdio \
-m 2G,maxmem=10G,slots=4 \
-object memory-backend-file,share,id=md1,mem-path=nvdimm.img,size=6G \
-device nvdimm,memdev=md1,id=nvdimm1
Jika menggunakan libvirt, definisi XML akan menjadi.
<domain>
...
<maxMemory slots='2' unit='GiB'>10</maxMemory>
<memory unit='GiB'>4</memory>
<currentMemory unit='GiB'>2</currentMemory>
<cpu mode='host-model' check='partial'>
<numa>
<cell id='0' cpus='0-1' memory='2' unit='GiB'/>
</numa>
</cpu>
...
<devices>
...
</devices>
<qemu:commandline>
<qemu:arg value='-M'/>
<qemu:arg value='nvdimm=on'/>
<qemu:arg value='-object'/>
<qemu:arg value='memory-backend-file,share=on,id=md1,mem-path=nvdimm.img,size=6G'/>
<qemu:arg value='-device'/>
<qemu:arg value='nvdimm,memdev=md1,id=nvdimm1'/>
</qemu:commandline>
</domain>
Bila berhasil maka Anda akan menemukan block device pmem
# lsblk | grep -i pmem
pmem0 259:0 0 3G 0 disk
NVMe
NVMe (Non-Volatile Memory Express) adalah protokol penyimpanan baru dan canggih yang memberikan kecepatan transfer yang lebih tinggi serta latensi yang lebih rendah dengan memanfaatkan jalur data PCIe agar perangkat penyimpanan dapat berkomunikasi langsung dengan CPU.
Di QEMU ada beberapa tipe yang dapat digunakan seperti nvme
, nvme-ns
, dan nvme-subsys
nvme
qemu-system-x86_64 -machine pc-q35-6.2 -accel kvm -vnc :0 -smp 2 -m 2048M \
-net nic -net user,hostfwd=tcp::5023-:22 \
-hda ol7.qcow2 -serial stdio \
-device nvme,drive=nvme0,serial=deadbeaf1,num_queues=8 \
-drive file=disk.qcow2,if=none,id=nvme0
nvme-ns
qemu-system-x86_64 -machine pc-q35-6.2 -accel kvm -vnc :0 -smp 2 -m 2048M \
-net nic -net user,hostfwd=tcp::5023-:22 \
-hda ol7.qcow2 -serial stdio \
-device nvme,serial=deadbeaf1,num_queues=8 \
-drive file=disk1.qcow2,if=none,id=nvme0n1 \
-device nvme-ns,drive=nvme0n1 \
-drive file=disk2.qcow2,if=none,id=nvme0n2 \
-device nvme-ns,drive=nvme0n2
nvme-subsys
qemu-system-x86_64 -machine pc-q35-6.2 -accel kvm -vnc :0 -smp 2 -m 2048M \
-net nic -net user,hostfwd=tcp::5023-:22 \
-hda ol7.qcow2 -serial stdio \
-device nvme-subsys,id=subsys0 \
-device nvme,serial=deadbeaf1,num_queues=8,subsys=subsys0 \
-device nvme,serial=deadbeaf1,num_queues=8,subsys=subsys0 \
-drive file=disk1.qcow2,if=none,id=nvme0 \
-device nvme-ns,drive=nvme0 \
-drive file=disk2.qcow2,if=none,id=nvme1 \
-device nvme-ns,drive=nvme1
Jika menggunakan libvirt, definisi XML akan menjadi.
<qemu:commandline>
<qemu:arg value='-device'/>
<qemu:arg value='nvme,drive=nvme0,serial=deadbeaf1,num_queues=8'/>
<qemu:arg value='-drive'/>
<qemu:arg value='file=disk1.qcow2,format=qcow2,if=none,id=nvme0'/>
</qemu:commandline>
PVSCSI
PVSCSI, atau VMware Paravirtual SCSI adalah controller penyimpanan berkinerja tinggi yang dapat menghasilkan troughput yang lebih besar dan penggunaan CPU yang lebih rendah. Controller ini sangat cocok untuk lingkungan yang menjalankan aplikasi intensif I/O, terutama dalam lingkungan SAN (Storage Area Network).
Contoh penerapan pvscsi.
qemu-system-x86_64 -machine pc-q35-6.2 -accel kvm -vnc :0 -smp 2 -m 2048M \
-net nic -net user,hostfwd=tcp::5023-:22 \
-hda ol7.qcow2 -serial stdio \
-device pvscsi,id=scsi0 \
-drive file=disk1.qcow2,if=none,id=drive1 \
-device scsi-hd,bus=scsi0.0,drive=drive1,rotation_rate=1
Jika menggunakan libvirt, definisi XML akan menjadi.
<qemu:commandline>
<qemu:arg value='-device'/>
<qemu:arg value='pvscsi,id=scsi1'/>
<qemu:arg value='-drive'/>
<qemu:arg value='file=disk1.qcow2,format=qcow2,if=none,id=drive1'/>
<qemu:arg value='-device'/>
<qemu:arg value='scsi-hd,bus=scsi1.0,drive=drive1,rotation_rate=1'/>
</qemu:commandline>
Virtio-SCSI
Virtio-SCSI adalah controller penyimpanan paravirtual yang memberikan dukungan multiqueue
serta dapat menangani ratusan perangkat dibandingkan
dengan virtio-blk
yang hanya dapat menangani sekitar 28 perangkat.
Contoh penerapan virtio-scsi 4 I/O queues dengan 2 disk.
qemu-system-x86_64 -machine pc-q35-6.2 -accel kvm -vnc :0 -smp 2 -m 2048M \
-net nic -net user,hostfwd=tcp::5023-:22 \
-hda ol7.qcow2 -serial stdio \
-device virtio-scsi-pci,id=scsi0,num_queues=4 \
-device scsi-hd,drive=drive0,bus=scsi0.0,channel=0,scsi-id=0,lun=0 \
-drive file=disk1.qcow2,if=none,id=drive0 \
-device scsi-hd,drive=drive1,bus=scsi0.0,channel=0,scsi-id=0,lun=1 \
-drive file=disk2.qcow2,if=none,id=drive1
Jika menggunakan libvirt, definisi XML akan menjadi.
<qemu:commandline>
<qemu:arg value='-device'/>
<qemu:arg value='virtio-scsi,id=scsi1,num_queues=4'/>
<qemu:arg value='-drive'/>
<qemu:arg value='file=disk1.qcow2,if=none,id=drive0'/>
<qemu:arg value='-device'/>
<qemu:arg value='scsi-hd,drive=drive0,bus=scsi1.0,channel=0,scsi-id=0,lun=0'/>
<qemu:arg value='-drive'/>
<qemu:arg value='file=disk2.qcow2,if=none,id=drive1'/>
<qemu:arg value='-device'/>
<qemu:arg value='scsi-hd,drive=drive1,bus=scsi1.0,channel=0,scsi-id=0,lun=0'/>
</qemu:commandline>
<disk type="file" device="disk">
<driver name="qemu" type="qcow2" cache="none" queues="4"/>
<source file="disk1.qcow2"/>
<target dev="sda" bus="scsi"/>
</disk>
<disk type="file" device="disk">
<driver name="qemu" type="qcow2" cache="none" queues="4"/>
<source file="disk2.qcow2"/>
<target dev="sdb" bus="scsi"/>
</disk>
<controller type="scsi" model="virtio-scsi">
<driver queues="4"/>
</controller>
Untuk mengecek multiqueue pada disk.
# ls /sys/block/vda/mq/
0 1 2 3
Atau bisa dengan melihat isi file /proc/interrupts
# cat /proc/interrupts
24: 0 0 0 0 PCI-MSI 65536-edge virtio0-config
25: 3 0 0 0 PCI-MSI 65537-edge virtio0-req.0
26: 0 31 0 0 PCI-MSI 65538-edge virtio0-req.1
27: 0 0 33 0 PCI-MSI 65539-edge virtio0-req.2
28: 0 0 0 0 PCI-MSI 65540-edge virtio0-req.3
Terakhir update konfigurasi grub kernel seperti berikut.
GRUB_CMDLINE_LINUX="... scsi_mod.use_blk_mq=1"
Virtio-blk
Virtio-blk adalah controller yang sering digunakan dalam lingkungan virtualiasi dengan QEMU KVM. Virtio-blk lebih cepat jika dibanding dengan Virtio-SCSI dan mendukung
multiqueue
, namun virtio-blk tidak mendukung perangkat non-disk seperti CD-ROM.
Contoh penerapan virtio-blk 4 I/O queues.
qemu-system-x86_64 -machine pc-q35-6.2 -accel kvm -vnc :0 -smp 2 -m 2048M \
-net nic -net user,hostfwd=tcp::5023-:22 \
-hda ol7.qcow2 -serial stdio \
-device virtio-blk-pci,drive=drive0,num-queues=4 \
-drive file=disk.qcow2,if=none,id=drive0
Jika menggunakan libvirt, definisi XML akan menjadi.
<qemu:commandline>
<qemu:arg value='-drive'/>
<qemu:arg value='file=disk.qcow2,if=none,id=drive0'/>
<qemu:arg value='-device'/>
<qemu:arg value='virtio-blk-pci,drive=drive0,num-queues=4'/>
</qemu:commandline>
<disk type="file" device="disk">
<driver name="qemu" type="qcow2" cache="none" queues="4"/>
<source file="disk.qcow2"/>
<target dev="vda" bus="virtio"/>
</disk>
USB Storage
Ada beberapa tipe USB yang dapat digunakan untuk storage devices seperti usb-storage
,usb-uas
, dan usb-bot
usb-storage
qemu-system-x86_64 -machine pc-q35-6.2 -accel kvm -vnc :0 -smp 2 -m 2048M \
-net nic -net user,hostfwd=tcp::5023-:22 \
-hda ol7.qcow2 -serial stdio \
-drive file=disk.qcow2,if=none,id=drive0 \
-device nec-usb-xhci,id=xhci \
-device usb-storage,bus=xhci.0,port=1,drive=drive0
usb-uas
qemu-system-x86_64 -machine pc-q35-6.2 -accel kvm -vnc :0 -smp 2 -m 2048M \
-net nic -net user,hostfwd=tcp::5023-:22 \
-hda ol7.qcow2 -serial stdio \
-device nec-usb-xhci,p2=15,p3=15,id=xhci \
-device usb-uas,bus=xhci.0,id=uas \
-drive file=disk.qcow2,if=none,id=drive0 \
-device scsi-hd,drive=drive0,lun=0,bus=uas.0 \
-drive file=disk.qcow2,if=none,id=drive1 \
-device scsi-hd,drive=drive1,lun=0,bus=uas.0
usb-bot
qemu-system-x86_64 -machine pc-q35-6.2 -accel kvm -vnc :0 -smp 2 -m 2048M \
-net nic -net user,hostfwd=tcp::5023-:22 \
-hda ol7.qcow2 -serial stdio \
-device nec-usb-xhci,p2=15,p3=15,id=xhci \
-device usb-bot,bus=xhci.0,id=bot \
-drive file=disk.qcow2,if=none,id=drive0 \
-device scsi-hd,drive=drive0,lun=0,bus=bot.0 \
-drive file=disk.qcow2,if=none,id=drive1 \
-device scsi-hd,drive=drive1,lun=0,bus=bot.0
Jika menggunakan libvirt, definisi XML akan menjadi.
<qemu:commandline>
<qemu:arg value='-drive'/>
<qemu:arg value='file=disk.qcow2,if=none,id=drive0'/>
<qemu:arg value='-device'/>
<qemu:arg value='usb-storage,bus=usb.0,port=5,drive=drive0'/>
</qemu:commandline>
Referensi