Description of problem: Trying to convert with domxml-from-native to xml: ----------------------------------------------------------------- /usr/local/bin/qemu-system-x86_64 -m 2G -cpu qemu64 -smp 4 -enable-kvm -no-reboot \ -net nic,vlan=0,model=virtio \ -net tap,vlan=0,ifname=tap745,script=/etc/qemu-ifup,downscript=no \ -drive file=./rootfs_fedora_cd.img,media=cdrom \ -drive file=./pilvi_step1.img,media=cdrom \ -nographic \ -kernel ./bzImage-2.6.38.fc15.r49745 \ -append "root=/dev/sr0 ro ip=192.168.44.105:192.168.44.101:192.168.44.101:255.255.255.0:pilvi-vm:eth0:off mounts=192.168.44.101:/home/khd734/test/exports/var,/var,nfs,nolock,rw console=ttyS0 earlyprintk=ttyS0 selinux=0" \ -name pilvi-vm ------------------------------------------------------------------ Got domxml-from-native: error - internal error cannot parse memory level '2G' Version-Release number of selected component (if applicable): Libvirt 0.9.6 How reproducible: Always Steps to Reproduce: Try to convert this config. Actual results: Got domxml-from-native: error - internal error cannot parse memory level '2G' Expected results: This config works from console, suppose it is expected that it should be converted without failures in domxml-from-native. Additional info:
Have changed -m 2G to -m 2048 - helped. After conversion: --------------------------------------------------------------------------- <domain type='qemu' xmlns:qemu='http://libvirt.org/schemas/domain/qemu/1.0'> <name>unnamed</name> <uuid>8eb76e3e-52fc-6469-4725-31653c3f4c60</uuid> <memory>2097152</memory> <currentMemory>2097152</currentMemory> <vcpu>4</vcpu> <os> <type arch='x86_64'>hvm</type> </os> <features> <acpi/> </features> <cpu match='exact'> <model>qemu64</model> </cpu> <clock offset='utc'/> <on_poweroff>destroy</on_poweroff> <on_reboot>destroy</on_reboot> <on_crash>destroy</on_crash> <devices> <emulator>/usr/local/bin/qemu-system-x86_64</emulator> <input type='mouse' bus='ps2'/> <graphics type='sdl'/> <video> <model type='cirrus' vram='9216' heads='1'/> </video> <memballoon model='virtio'/> </devices> <qemu:commandline> <qemu:arg value='-enable-kvm'/> <qemu:arg value='\ -net'/> <qemu:arg value='nic,vlan=0,model=virtio'/> <qemu:arg value='\ -net'/> <qemu:arg value='tap,vlan=0,ifname=tap745,script=/etc/qemu-ifup,downscript=no'/> <qemu:arg value='\ -drive'/> <qemu:arg value='file=./rootfs_fedora_cd.img,media=cdrom'/> <qemu:arg value='\ -drive'/> <qemu:arg value='file=./pilvi_step1.img,media=cdrom'/> <qemu:arg value='\ -nographic'/> <qemu:arg value='\ -kernel'/> <qemu:arg value='./bzImage-2.6.38.fc15.r49745'/> <qemu:arg value='\ -append'/> <qemu:arg value='root=/dev/sr0 ro ip=192.168.44.105:192.168.44.101:192.168.44.101:255.255.255.0:pilvi-vm:eth0:off mounts=192.168.44.101:/home/khd734/test/exports/var,/var,nfs,nolock,rw console=ttyS0 earlyprintk=ttyS0 selinux=0'/> <qemu:arg value='\ -name'/> <qemu:arg value='pilvi-vm'/> </qemu:commandline> </domain> ----------------------------------------------------------------------------- Have not found : xmlns:qemu='http://libvirt.org/schemas/domain/qemu/1.0
Have tried to bring up VM with this xml config and got: libvir: QEMU error : internal error guest CPU is not compatible with host CPU But again original native startup string successfuly bringing up VM.
After removing all backslashes "\" from original native string: have got an error during domxml-from-native conversion: error: internal error missing index/unit/bus parameter in drive 'file=./rootfs_fedora_cd.img, media=cdrom'
The index/unit/bus stuff is tracked in bug 1205925 We can use this just to track the memory 2G issue
A super simple reproducer from libvirt.git: $ cat cmd.sh qemu-kvm -m 2G $ sudo ./tools/virsh domxml-from-native qemu-argv cmd.sh error: internal error: cannot parse memory level '2G' The error comes from src/qemu/qemu_parse_command.c qemuParseCommandLine function. The parsing only expects a straight number, not any characters. However libvirt already has a function to help parse numbers like that: /* Scale an integer VALUE in-place by an optional case-insensitive * SUFFIX, defaulting to SCALE if suffix is NULL or empty (scale is * typically 1 or 1024). Recognized suffixes include 'b' or 'bytes', * as well as power-of-two scaling via binary abbreviations ('KiB', * 'MiB', ...) or their one-letter counterpart ('k', 'M', ...), and * power-of-ten scaling via SI abbreviations ('KB', 'MB', ...). * Ensure that the result does not exceed LIMIT. Return 0 on success, * -1 with error message raised on failure. */ int virScaleInteger(unsigned long long *value, const char *suffix, unsigned long long scale, unsigned long long limit) See tools/vsh.c vshCommandOptScaledInt function for an easy example of how to invoke that function. Then it just needs to be adapted for the qemu code. Also you'll want to add a tests/qemuargv2xmltest.c test case
Fixed upstream now: commit 701b0f1867055bce3b29d27d23c6935ce94086af Author: Nishith Shah <nishithshah.2211> Date: Fri May 20 07:09:03 2016 +0000 qemu: parse: Handle suffixes for -m memory According to QEMU docs, the '-m' option for specifying RAM is by default in MiB, and a suffix of "M" or "G" may be passed for values in MiB and GiB respectively. This commit adds support and a test for the same. Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=812295 Signed-off-by: Nishith Shah <nishithshah.2211>