Skip to main content
  1. Posts/

How to Use QEMU to Emulate Storages Devices

·5 mins·
libvirt kvm libvirt
Table of Contents

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

Related

Mengatasi Error Disk SCSI Tidak Terdeteksi di KVM Libvirt
·1 min
libvirt kvm libvirt
KVM guest with SSD and NVMe in Libvirt
·3 mins
libvirt kvm libvirt
QEMU-IMG Cheatsheet
·4 mins
libvirt kvm libvirt
KVM Hypervisor Features
·1 min
libvirt kvm libvirt
Disable Virtualization Engine in Libvirt
·2 mins
libvirt kvm libvirt
Error: Failed to Attach Device, No More Available PCI Slots
·2 mins
libvirt kvm libvirt