Ubuntu

通過 Eucalyptus 啟動映像時使用 virsh 連接到 KVM 實例?

  • October 5, 2015

我在 Ubuntu 10.04 上使用Eucalyptus來設置私有云。有時我無法通過 ssh 連接到 VM 實例,我希望能夠直接連接到 VM 實例的控制台。但是,預設情況下,這似乎不適用於 virsh:

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

有沒有辦法實現這一點,例如,通過改變 Eucalyptus 生成傳遞給 libvirt 的 XML 文件的方式?

這是 Eucalyptus 生成的 libvirt.xml 文件:

$ 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>

這是 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>

這是最終被呼叫的完整 KVM 命令行:

/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

隨著 Eucalyptus 3 及更高版本的出現,這種情況似乎發生了變化——這是一個更新的解決方案,可以避免我今天早上所經歷的惡化。

使用在這兩個連結中找到的資訊組合:http: //gobertelli.blogspot.co.uk/2012/08/customize-instance-libvirt-environment.html https://www.redhat.com/archives/libvirt- users/2012-May/msg00048.html

在您的節點控制器上,編輯 /etc/eucalyptus/libvirt.xsl 使其如下所示:

   <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>

將串列和控制台定義都更改為類型“pty”和目標“0”。

停止並啟動任何正在執行的虛擬機,然後您應該能夠像往常一樣將“virsh 控制台”添加到它們中。

引用自:https://serverfault.com/questions/183337