qemu_command: Generate command line for MTP filesystem

The source tag sets the rootdir property of the device, which is
the directory exposed to the guest via the MTP device. The target
tag sets the desc property.  This device supports read-only mode
as well. Like virtiofs, it does not support additional access
modes.

Signed-off-by: Rayhan Faizel <rayhan.faizel@gmail.com>
Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
Reviewed-by: Michal Privoznik <mprivozn@redhat.com>
This commit is contained in:
Rayhan Faizel 2024-03-19 16:16:30 +01:00 committed by Michal Privoznik
parent 5c70a7e328
commit c836887a02
5 changed files with 139 additions and 1 deletions

View File

@ -2311,6 +2311,33 @@ qemuBuildDisksCommandLine(virCommand *cmd,
}
static int
qemuBuildMTPCommandLine(virCommand *cmd,
virDomainFSDef *fs,
const virDomainDef *def,
virQEMUCaps *qemuCaps)
{
g_autoptr(virJSONValue) props = NULL;
if (virJSONValueObjectAdd(&props,
"s:driver", "usb-mtp",
"s:id", fs->info.alias,
"s:rootdir", fs->src->path,
"s:desc", fs->dst,
"b:readonly", fs->readonly,
NULL) < 0)
return -1;
if (qemuBuildDeviceAddressProps(props, def, &fs->info) < 0)
return -1;
if (qemuBuildDeviceCommandlineFromJSON(cmd, props, def, qemuCaps) < 0)
return -1;
return 0;
}
virJSONValue *
qemuBuildVHostUserFsDevProps(virDomainFSDef *fs,
const virDomainDef *def,
@ -2494,10 +2521,15 @@ qemuBuildFilesystemCommandLine(virCommand *cmd,
return -1;
break;
case VIR_DOMAIN_FS_DRIVER_TYPE_MTP:
/* Media Transfer Protocol over USB */
if (qemuBuildMTPCommandLine(cmd, def->fss[i], def, qemuCaps) < 0)
return -1;
break;
case VIR_DOMAIN_FS_DRIVER_TYPE_LOOP:
case VIR_DOMAIN_FS_DRIVER_TYPE_NBD:
case VIR_DOMAIN_FS_DRIVER_TYPE_PLOOP:
case VIR_DOMAIN_FS_DRIVER_TYPE_MTP:
case VIR_DOMAIN_FS_DRIVER_TYPE_LAST:
break;
}

View File

@ -0,0 +1,35 @@
LC_ALL=C \
PATH=/bin \
HOME=/var/lib/libvirt/qemu/domain--1-QEMUGuest1 \
USER=test \
LOGNAME=test \
XDG_DATA_HOME=/var/lib/libvirt/qemu/domain--1-QEMUGuest1/.local/share \
XDG_CACHE_HOME=/var/lib/libvirt/qemu/domain--1-QEMUGuest1/.cache \
XDG_CONFIG_HOME=/var/lib/libvirt/qemu/domain--1-QEMUGuest1/.config \
/usr/bin/qemu-system-x86_64 \
-name guest=QEMUGuest1,debug-threads=on \
-S \
-object '{"qom-type":"secret","id":"masterKey0","format":"raw","file":"/var/lib/libvirt/qemu/domain--1-QEMUGuest1/master-key.aes"}' \
-machine pc,usb=off,dump-guest-core=off,memory-backend=pc.ram,acpi=off \
-accel tcg \
-cpu qemu64 \
-m size=4194304k \
-object '{"qom-type":"memory-backend-ram","id":"pc.ram","size":4294967296}' \
-overcommit mem-lock=off \
-smp 1,sockets=1,cores=1,threads=1 \
-uuid 2d4d4b20-b19b-4713-af0a-bf1cab8b455b \
-display none \
-no-user-config \
-nodefaults \
-chardev socket,id=charmonitor,fd=1729,server=on,wait=off \
-mon chardev=charmonitor,id=monitor,mode=control \
-rtc base=utc \
-no-shutdown \
-boot strict=on \
-device '{"driver":"piix3-usb-uhci","id":"usb","bus":"pci.0","addr":"0x1.0x2"}' \
-device '{"driver":"usb-mtp","id":"fs0","rootdir":"/tmp/testdir1","desc":"readwrite-fs","readonly":false,"bus":"usb.0","port":"1"}' \
-device '{"driver":"usb-mtp","id":"fs1","rootdir":"/tmp/testdir2","desc":"readonly-fs","readonly":true,"bus":"usb.0","port":"2"}' \
-audiodev '{"id":"audio1","driver":"none"}' \
-device '{"driver":"virtio-balloon-pci","id":"balloon0","bus":"pci.0","addr":"0x2"}' \
-sandbox on,obsolete=deny,elevateprivileges=deny,spawn=deny,resourcecontrol=deny \
-msg timestamp=on

View File

@ -0,0 +1,42 @@
<domain type='qemu'>
<name>QEMUGuest1</name>
<uuid>2d4d4b20-b19b-4713-af0a-bf1cab8b455b</uuid>
<memory unit='KiB'>4194304</memory>
<currentMemory unit='KiB'>4194304</currentMemory>
<vcpu placement='static'>1</vcpu>
<os>
<type arch='x86_64' machine='pc'>hvm</type>
<boot dev='hd'/>
</os>
<cpu mode='custom' match='exact' check='none'>
<model fallback='forbid'>qemu64</model>
</cpu>
<clock offset='utc'/>
<on_poweroff>destroy</on_poweroff>
<on_reboot>restart</on_reboot>
<on_crash>destroy</on_crash>
<devices>
<emulator>/usr/bin/qemu-system-x86_64</emulator>
<controller type='usb' index='0' model='piix3-uhci'>
<address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x2'/>
</controller>
<controller type='pci' index='0' model='pci-root'/>
<filesystem type='mount' accessmode='passthrough'>
<driver type='mtp'/>
<source dir='/tmp/testdir1'/>
<target dir='readwrite-fs'/>
</filesystem>
<filesystem type='mount' accessmode='passthrough'>
<driver type='mtp'/>
<source dir='/tmp/testdir2'/>
<target dir='readonly-fs'/>
<readonly/>
</filesystem>
<input type='mouse' bus='ps2'/>
<input type='keyboard' bus='ps2'/>
<audio id='1' type='none'/>
<memballoon model='virtio'>
<address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/>
</memballoon>
</devices>
</domain>

View File

@ -0,0 +1,27 @@
<domain type='qemu'>
<name>QEMUGuest1</name>
<uuid>2d4d4b20-b19b-4713-af0a-bf1cab8b455b</uuid>
<memory unit='KiB'>4194304</memory>
<currentMemory unit='KiB'>4194304</currentMemory>
<vcpu placement='static'>1</vcpu>
<os>
<type arch='x86_64' machine='pc'>hvm</type>
<boot dev='hd'/>
</os>
<devices>
<emulator>/usr/bin/qemu-system-x86_64</emulator>
<controller type='usb' index='0' model='piix3-uhci'/>
<filesystem type='mount'>
<driver type='mtp'/>
<source dir='/tmp/testdir1'/>
<target dir='readwrite-fs'/>
</filesystem>
<filesystem type='mount'>
<driver type='mtp'/>
<source dir='/tmp/testdir2'/>
<target dir='readonly-fs'/>
<readonly/>
</filesystem>
<memballoon model='virtio'/>
</devices>
</domain>

View File

@ -2966,6 +2966,8 @@ mymain(void)
DO_TEST_CAPS_LATEST("tap-vhost-incorrect");
DO_TEST_CAPS_LATEST("tap-vhost");
DO_TEST_CAPS_LATEST("mtp-usb-device")
/* check that all input files were actually used here */
if (testConfXMLCheck(existingTestCases) < 0)
ret = -1;