libvirt使用虚拟机的串口和控制台

qemu提供了控制台console和串口serial用来与虚拟机进行交互通讯。本文讲述如何通过console进入虚拟机的控制台,以及如何通过serial与虚拟机进行串口通讯。
(文章来自作者维护的社区微信公众号【虚拟化云计算】)
目前有两个微信群《kvm虚拟化》和《openstack》,扫描二维码点击“云-交流”,进群交流提问
libvirt给虚拟机创建serial和console
    <serial type='pty'>
      <target type='isa-serial' port='0'>
        <model name='isa-serial'/>
      </target>
    </serial>
       <serial type='pty'>
          <target type='isa-serial' port='1'>
            <model name='isa-serial'/>
          </target>
       </serial>
    <console type='pty'>
      <target type='serial' port='0'/>
    </console>
       <console type='pty'>
           <target type='virtio' port='1'/>
       </console>
说明:
可以有多个pty类型的serial,每一个serial对应的pty设备都被重定向到/dev/pts/下的一个设备。
可以有多个pyt类型的console,每一个console对应的pty设备都被重定向到/dev/pts/下的一个设备。
只有第一个console可以是serial类型,或者说只能有一个console是serial类型的。其他console可以是virtio的。
如果console类型是serial类型的,则qemu不再创建console设备,因为与第一个serial设备表示同一个设备。即serial0既表示一个serial又表示一个console。
 
在虚拟机内部
给虚拟机添加了virtio类型的console设备后,在虚拟机内部对应设备文件/dev/hvc*
给虚拟机天机了serial类型的serial设备后,在虚拟机内部对应设备文件/dev/ttyS*
 
在主机上进入虚拟机的控制台
# virsh console cvm --devname serial0
也可以连接其他的console:# console cvm --devname console1
说明:
devname 是console设备的名称。
要进入虚拟机的控制台只能通过console设备,不能通过serial设备(可以通过serial0,因为serial0也是一个console设备)
要通过virtio类型的console进入虚拟机的console,不需要对虚拟机做任何修改,要通过serial类型的console进入虚拟机的console,需要 在虚拟机的cmdline中添加console=ttyS0
 
串口在主机上的重定向
虚拟机的串口在主机端可以实现重定向功能,用来方便的与虚拟机进行串口通信,例如:
重定向到Pseudo TTY,即/dev/pts/*
    <serial type='pty'>
      <target type='isa-serial' port='1'>
        <model name='isa-serial'/>
      </target>
    </serial>
这样就可以通过对PseudoTTY的读写来与虚拟机的串口进行通信了。
另外还可以重定向到file、virtual console、null、Host device proxy、Named pipe、TCP client/server、UDP network console、UNIX domain socket client/server、Spice channel、Nmdm device。
 
以重定向到PseudoTTY的方式演示串口通讯:
给虚拟机添加一个pty类型的串口(第一个pty串口默认给console使用,这里用第二个串口)
    <serial type='pty'>
      <target type='isa-serial' port='0'>
        <model name='isa-serial'/>
      </target>
    </serial>
    <serial type='pty'>
      <target type='isa-serial' port='1'>
        <model name='isa-serial'/>
      </target>
    </serial>
主机端:
虚拟机内部:
可以看到两端可以直接交互通讯。
 
对应的qemu中添加一个pty类型的serial:
-chardev pty,id=charserial0 -device isa-serial,chardev=charserial0,id=serial0
对应的qemu中添加一个pty类型target是virtio的console:
-chardev pty,id=charconsole1 -device virtconsole,chardev=charconsole1,id=console1
serial和console被重定向到哪个pts,在qemu启动虚拟机日志中可查看:
 

关注本公众号,了解更多关于云计算虚拟化的知识。

 
  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Java libvirt是一个用于管理虚拟化平台(例如KVM、Xen、VMware等)的库。你可以使用它来获取虚拟状态、网络流量、CPU使用率、内存使用、磁盘大小数据。以下是一个简单的Java代码示例,演示如何使用libvirt获取虚拟信息: ```java import org.libvirt.*; public class VMInfo { public static void main(String[] args) throws Exception { Connect conn = new Connect("qemu:///system", false); Domain domain = conn.domainLookupByName("vm-name"); // 获取虚拟状态 int state = domain.getInfo().state; System.out.println("VM State: " + DomainState.stateToString(state)); // 获取网络流量 long rxBytes = domain.interfaceStats("vnet0").rx_bytes; long txBytes = domain.interfaceStats("vnet0").tx_bytes; System.out.println("RX Bytes: " + rxBytes + ", TX Bytes: " + txBytes); // 获取CPU使用率 int ncpus = domain.getInfo().nrVirtCpu; long[] cpuTimeStart = domain.getCPUStats(-1); Thread.sleep(1000); long[] cpuTimeEnd = domain.getCPUStats(-1); double cpuUsage = 0; for (int i = 0; i < ncpus; i++) { cpuUsage += (double) (cpuTimeEnd[i] - cpuTimeStart[i]) / 10000000; } cpuUsage /= ncpus; System.out.println("CPU Usage: " + cpuUsage + "%"); // 获取内存使用 long memoryUsage = domain.memoryStats().get("actual").getValue(); System.out.println("Memory Usage: " + memoryUsage + " bytes"); // 获取磁盘大小 long diskCapacity = domain.blockInfo("/dev/sda").capacity; System.out.println("Disk Capacity: " + diskCapacity + " bytes"); domain.free(); conn.close(); } } ``` 在本示例中,我们使用`Connect`类创建了一个到本地虚拟化环境的连接。然后,使用`domainLookupByName()`方法查找特定名称的虚拟,并使用`getInfo()`方法获取其状态信息。接下来,我们使用`interfaceStats()`方法获取虚拟的网络流量,使用`getCPUStats()`方法获取虚拟的CPU使用率,使用`memoryStats()`方法获取虚拟的内存使用情况,使用`blockInfo()`方法获取虚拟的磁盘信息。最后,我们释放了资源并关闭了连接。 请注意,这只是一个简单的示例,实际应用程序可能需要更多的错误处理和适当的资源管理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值