1============= 2zoned-storage 3============= 4 5Zoned Block Devices (ZBDs) divide the LBA space into block regions called zones 6that are larger than the LBA size. They can only allow sequential writes, which 7can reduce write amplification in SSDs, and potentially lead to higher 8throughput and increased capacity. More details about ZBDs can be found at: 9 10https://zonedstorage.io/docs/introduction/zoned-storage 11 121. Block layer APIs for zoned storage 13------------------------------------- 14QEMU block layer supports three zoned storage models: 15- BLK_Z_HM: The host-managed zoned model only allows sequential writes access 16to zones. It supports ZBD-specific I/O commands that can be used by a host to 17manage the zones of a device. 18- BLK_Z_HA: The host-aware zoned model allows random write operations in 19zones, making it backward compatible with regular block devices. 20- BLK_Z_NONE: The non-zoned model has no zones support. It includes both 21regular and drive-managed ZBD devices. ZBD-specific I/O commands are not 22supported. 23 24The block device information resides inside BlockDriverState. QEMU uses 25BlockLimits struct(BlockDriverState::bl) that is continuously accessed by the 26block layer while processing I/O requests. A BlockBackend has a root pointer to 27a BlockDriverState graph(for example, raw format on top of file-posix). The 28zoned storage information can be propagated from the leaf BlockDriverState all 29the way up to the BlockBackend. If the zoned storage model in file-posix is 30set to BLK_Z_HM, then block drivers will declare support for zoned host device. 31 32The block layer APIs support commands needed for zoned storage devices, 33including report zones, four zone operations, and zone append. 34 352. Emulating zoned storage controllers 36-------------------------------------- 37When the BlockBackend's BlockLimits model reports a zoned storage device, users 38like the virtio-blk emulation or the qemu-io-cmds.c utility can use block layer 39APIs for zoned storage emulation or testing. 40 41For example, to test zone_report on a null_blk device using qemu-io is:: 42 43 $ path/to/qemu-io --image-opts -n driver=host_device,filename=/dev/nullb0 -c "zrp offset nr_zones" 44 45To expose the host's zoned block device through virtio-blk, the command line 46can be (includes the -device parameter):: 47 48 -blockdev node-name=drive0,driver=host_device,filename=/dev/nullb0,cache.direct=on \ 49 -device virtio-blk-pci,drive=drive0 50 51Or only use the -drive parameter:: 52 53 -driver driver=host_device,file=/dev/nullb0,if=virtio,cache.direct=on 54 55Additionally, QEMU has several ways of supporting zoned storage, including: 56(1) Using virtio-scsi: --device scsi-block allows for the passing through of 57SCSI ZBC devices, enabling the attachment of ZBC or ZAC HDDs to QEMU. 58(2) PCI device pass-through: While NVMe ZNS emulation is available for testing 59purposes, it cannot yet pass through a zoned device from the host. To pass on 60the NVMe ZNS device to the guest, use VFIO PCI pass the entire NVMe PCI adapter 61through to the guest. Likewise, an HDD HBA can be passed on to QEMU all HDDs 62attached to the HBA. 63