Conectar-se à instância do KVM usando o virsh quando a imagem é lançada através do Eucalyptus?

2

Estou usando o Eucalyptus no Ubuntu 10.04 para configurar uma nuvem privada. Às vezes, não consigo fazer ssh nas instâncias de VM e gostaria de poder me conectar diretamente ao console da instância da VM. No entanto, por padrão, isso parece não funcionar através do virsh:

$ sudo virsh -c qemu:///system console i-486B085E
No console available for domain

Existe alguma maneira de permitir isso, por exemplo, alterando a maneira como o Eucalyptus gera o arquivo XML que é passado para o libvirt?

Aqui está o arquivo libvirt.xml que o Eucalyptus gera:

$ cat /var/lib/eucalyptus/instances/admin/i-486B085E/libvirt.xml
<domain type='kvm'>
    <name>i-486B085E</name>
    <os>
    <type>hvm</type>
        <kernel>/var/lib/eucalyptus/instances//admin/i-486B085E/kernel</kernel>
        <initrd>/var/lib/eucalyptus/instances//admin/i-486B085E/ramdisk</initrd>
        <cmdline>root=/dev/sda1 console=ttyS0</cmdline>
    </os>
    <features>
        <acpi/>
    </features>
    <memory>262144</memory>
    <vcpu>1</vcpu>
    <devices>
        <disk type='file'>
            <source file='/var/lib/eucalyptus/instances//admin/i-486B085E/disk'/>
            <target dev='sda'/>
        </disk>
        <interface type='bridge'>
            <source bridge='eucabr10'/>
            <mac address='d0:0d:48:6B:08:5E'/>
            <model type='e1000'/>
        </interface>
        <serial type="file">
            <source path='/var/lib/eucalyptus/instances//admin/i-486B085E/console.log'/>
            <target port='1'/>
        </serial>
    </devices>
</domain>

Aqui está a saída do virsh dumpxml:

$ sudo virsh dumpxml i-486B085E
<domain type='kvm' id='3'>
  <name>i-486B085E</name>
  <uuid>3b762376-4de1-f6ac-7327-9df520fa4862</uuid>
  <memory>262144</memory>
  <currentMemory>262144</currentMemory>
  <vcpu>1</vcpu>
  <os>
    <type arch='x86_64' machine='pc-0.12'>hvm</type>
    <kernel>/var/lib/eucalyptus/instances//admin/i-486B085E/kernel</kernel>
    <initrd>/var/lib/eucalyptus/instances//admin/i-486B085E/ramdisk</initrd>
    <cmdline>root=/dev/sda1 console=ttyS0</cmdline>
    <boot dev='hd'/>
  </os>
  <features>
    <acpi/>
  </features>
  <clock offset='utc'/>
  <on_poweroff>destroy</on_poweroff>
  <on_reboot>restart</on_reboot>
  <on_crash>destroy</on_crash>
  <devices>
    <emulator>/usr/bin/kvm</emulator>
    <disk type='file' device='disk'>
      <source file='/var/lib/eucalyptus/instances//admin/i-486B085E/disk'/>
      <target dev='sda' bus='scsi'/>
    </disk>
    <interface type='bridge'>
      <mac address='d0:0d:48:6b:08:5e'/>
      <source bridge='eucabr10'/>
      <target dev='vnet0'/>
      <model type='e1000'/>
    </interface>
    <serial type='file'>
      <source path='/var/lib/eucalyptus/instances//admin/i-486B085E/console.log'/>
      <target port='0'/>
    </serial>
    <console type='file'>
      <source path='/var/lib/eucalyptus/instances//admin/i-486B085E/console.log'/>
      <target port='0'/>
    </console>
  </devices>
  <seclabel type='dynamic' model='apparmor'>
    <label>libvirt-3b762376-4de1-f6ac-7327-9df520fa4862</label>
    <imagelabel>libvirt-3b762376-4de1-f6ac-7327-9df520fa4862</imagelabel>
  </seclabel>
</domain>

Aqui está a linha de comando completa do KVM que acaba sendo chamada:

/usr/bin/kvm -S -M pc-0.12 -enable-kvm -m 256 -smp 1 -name i-486B085E -uuid 3b762376-4de1-f6ac-7327-9df520fa4862 -nographic -chardev socket,id=monitor,path=/var/lib/libvirt/qemu/i-486B085E.monitor,server,nowait -monitor chardev:monitor -boot c -kernel /var/lib/eucalyptus/instances//admin/i-486B085E/kernel -initrd /var/lib/eucalyptus/instances//admin/i-486B085E/ramdisk -append root=/dev/sda1 console=ttyS0 -drive file=/var/lib/eucalyptus/instances//admin/i-486B085E/disk,if=scsi,index=0,boot=on -net nic,macaddr=d0:0d:48:6b:08:5e,vlan=0,model=e1000,name=e1000.0 -net tap,fd=55,vlan=0,name=tap.0 -chardev file,id=serial0,path=/var/lib/eucalyptus/instances//admin/i-486B085E/console.log -serial chardev:serial0 -parallel none -usb
    
por Lorin Hochstein 21.09.2010 / 22:56

2 respostas

2

Parece que isso mudou com o advento do Eucalyptus 3 e acima - aqui está uma solução atualizada, para salvar qualquer um o agravamento que eu passei esta manhã.

Usando uma combinação de informações encontradas nesses dois links: link link

No seu controlador de nós, edite /etc/eucalyptus/libvirt.xsl para que fique assim:

    <xsl:choose>
            <xsl:when test="(/instance/hypervisor/@type = 'kvm' or /instance/hypervisor/@type = 'qemu')">
                <serial type="pty">
                    <target port="0"/>
                </serial>
            </xsl:when>
            <xsl:when test="/instance/hypervisor/@type = 'xen' and /instance/os/@platform = 'windows'">
                <serial type="pty">
                    <source path="/dev/pts/3"/>
                    <target port="0"/>
                </serial>
                <input type="tablet" bus="usb"/>
                <input type="mouse" bus="ps2"/>
            </xsl:when>
            <xsl:when test="/instance/hypervisor/@type = 'xen' and /instance/backing/root/@type = 'ebs'">
                <console type="pty"/>
                    <target port="0"/>
            </xsl:when>
    </xsl:choose>
            <!-- <graphics type='vnc' port='-1' autoport='yes' keymap='en-us' -->
        </devices>
    </domain>
</xsl:template>

Alterando as definições de série e de console para o tipo "pty" e o destino "0".

Pare e inicie qualquer máquina virtual em execução e, em seguida, você deve ser capaz de 'virsh console' para eles, como de costume.

    
por 05.10.2015 / 13:24
1

Eu descobri ... Você precisa editar o arquivo / usr / share / eucalyptus / gen_kvm_libvirt_xml. Aqui está o diff:

--- /usr/share/eucalyptus/gen_kvm_libvirt_xml.bak   2010-09-28 14:54:20.259266161 -0400
+++ /usr/share/eucalyptus/gen_kvm_libvirt_xml   2010-09-28 15:01:25.269265897 -0400
@@ -109,9 +109,9 @@
             <mac address='PRIVMACADDR'/>
             <model type='e1000'/>
         </interface>
-        <serial type="file">
-            <source path='BASEPATH/console.log'/>
-            <target port='1'/>
+        <serial type='pty'>
+          <source path='/dev/pts/2'/>
+          <target port='0'/>
         </serial>
     </devices>
 </domain>
    
por 07.10.2010 / 19:48