[libvirt] How to connect to console of domain on PowerPC?

Yin Olivia-R63875 r63875 at freescale.com
Mon Feb 4 02:22:03 UTC 2013


Hi,

I tried to use libvirt to run KVM/QEMU on Freescale PowerPC platforms.

So far there's only one serial device (spapr-vty) defined in QEMU to work as console for IBM PSeries platform.
There's no serial device support in QEMU for Freescale PowerPC (ePAPR).


libvirt/src/qemu/qemu_command.c

/* This function generates the correct '-device' string for character
 * devices of each architecture.
 */
char *
qemuBuildChrDeviceStr(virDomainChrDefPtr serial,
                       virBitmapPtr qemuCaps,
                       char *os_arch,
                       char *machine)
{
    virBuffer cmd = VIR_BUFFER_INITIALIZER;

    if (STREQ(os_arch, "ppc64") && STREQ(machine, "pseries")) {
        if (serial->deviceType == VIR_DOMAIN_CHR_DEVICE_TYPE_SERIAL &&
            serial->source.type == VIR_DOMAIN_CHR_TYPE_PTY &&
            serial->info.type == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_SPAPRVIO) {
            virBufferAsprintf(&cmd, "spapr-vty,chardev=char%s",
                              serial->info.alias);
            if (qemuBuildDeviceAddressStr(&cmd, &serial->info, qemuCaps) < 0)
                goto error;
        }
    } else
        virBufferAsprintf(&cmd, "isa-serial,chardev=char%s,id=%s",
                          serial->info.alias, serial->info.alias);

    if (virBufferError(&cmd)) {
        virReportOOMError();
        goto error;
    }

    return virBufferContentAndReset(&cmd);

 error:
    virBufferFreeAndReset(&cmd);
    return NULL;
}

We usually connect guest with telnet. 
For instance,
/usr/bin/qemu-system-ppc -name demo -M ppce500v2 -enable-kvm -m 256 -nographic -kernel /media/ram/uImage -initrd /media/ram/ramdisk -append "root=/dev/ram rw console=ttyS0,115200" -serial tcp::4445,server

Then to run 'telnet 10.193.20.xxx 4445' could connect the guest.


The temporary workaround is not add '-device' string after '-serial' option.

diff -Nur libvirt-0.10.1.orig/src/qemu/qemu_command.c libvirt-0.10.1/src/qemu/qemu_command.c
--- libvirt-0.10.1.orig/src/qemu/qemu_command.c 2012-08-30 15:35:18.000000000 +0530
+++ libvirt-0.10.1/src/qemu/qemu_command.c      2012-10-05 17:19:32.060368755 +0530
@@ -5501,13 +5501,15 @@
                 virCommandAddArg(cmd, devstr);
                 VIR_FREE(devstr);

-                virCommandAddArg(cmd, "-device");
-                if (!(devstr = qemuBuildChrDeviceStr(serial, qemuCaps,
+                if (!STREQ(def->os.arch, "ppc")) {
+                    virCommandAddArg(cmd, "-device");
+                    if (!(devstr = qemuBuildChrDeviceStr(serial, 
+ qemuCaps,
                                                      def->os.arch,
                                                      def->os.machine)))
-                   goto error;
-                virCommandAddArg(cmd, devstr);
-                VIR_FREE(devstr);
+                    goto error;
+                    virCommandAddArg(cmd, devstr);
+                    VIR_FREE(devstr);
+                }
             } else {
                 virCommandAddArg(cmd, "-serial");
                 if (!(devstr = qemuBuildChrArgStr(&serial->source, NULL)))

Applying the above patch to libvirt, all the other domain control commands could work except 'virsh console domain'.

# cat >demo.args <<EOF
> /usr/bin/qemu-system-ppc -name demo -M ppce500v2 -enable-kvm -m 256 
> -nographic -kernel /media/ram/uImage -initrd /media/ram/ramdisk 
> -append "root=/dev/ram rw console=ttyS0,115200" -serial 
> tcp::4445,server -net nic EOF

# vi demo.args
/usr/bin/qemu-system-ppc -name demo -M ppce500v2 -enable-kvm -m 256 -nographic -kernel /media/ram/uImage -initrd /media/ram/ramdisk -append "root=/dev/ram rw console=ttyS0,115200" -serial tcp::4445,server -net nic

# virsh domxml-from-native qemu-argv demo.args >demo.xml # vi demo.xml <domain type='kvm'>
  <name>demo</name>
  <uuid>985d7154-83c8-0763-cbac-ecd159eee8a6</uuid>
  <memory unit='KiB'>262144</memory>
  <currentMemory unit='KiB'>262144</currentMemory>
  <vcpu placement='static'>1</vcpu>
  <os>
    <type arch='ppc' machine='ppce500v2'>hvm</type>
    <kernel>/media/ram/uImage</kernel>
    <initrd>/media/ram/ramdisk</initrd>
    <cmdline>root=/dev/ram rw console=ttyS0,115200</cmdline>
  </os>
  <clock offset='utc'/>
  <on_poweroff>destroy</on_poweroff>
  <on_reboot>restart</on_reboot>
  <on_crash>destroy</on_crash>
  <devices>
    <emulator>/usr/bin/qemu-system-ppc</emulator>
    <serial type='tcp'>
      <source mode='bind' host='' service='4445'/>
      <protocol type='raw'/>
      <target port='0'/>
    </serial>
    <console type='tcp'>
      <source mode='bind' host='' service='4445'/>
      <protocol type='raw'/>
      <target type='serial' port='0'/>
    </console>
    <memballoon model='virtio'/>
  </devices>
</domain>

# virsh -c qemu:///system define demo.xml # virsh -c qemu:///system start demo


But it seemed that can't connect to the console.
# virsh -c qemu:///system console demo
Connected to domain test
Escape character is ^]
error: internal error character device (null) is not using a PTY


I tried also use '-serial pty' option,
/usr/bin/qemu-system-ppc -name test -M ppce500v2 -enable-kvm -m 256 -nographic -kernel /media/ram/uImage -initrd /media/ram/ramdisk -append "root=/dev/ram rw console=ttyS0,115200" -serial pty

Then there's no other output after the below message:

# virsh -c qemu:///system console demo
Connected to domain test
Escape character is ^]


It seemed not libvirt group issue.

I also tried the LXC.
It could connect to the console if <init>/bin/sh/</init> instead of <init>/sbin/init</init>


Best Regards,
Olivia





More information about the libvir-list mailing list