注册 登录  
 加关注
查看详情
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

Aspirer's blog

停止维护,新博客地址:http://aspirer.wang/

 
 
 

日志

 
 

qemu-monitor-command & qemu monitor in openstack  

2013-08-07 16:04:58|  分类: 学习心得 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

instance-name.monitor的用途
首先我们注意到openstack中创建的每台KVM虚拟机,都会在/var/lib/libvirt/qemu/目录下生成一个instance-name.monitor socket文件
这个文件的用途是什么?
libvirt.xml里面以及用virsh dumpxml命令都看不到这个文件的配置,它是怎么创建出来的?

wangpan@xx-yy-zz-8:~$ sudo ls /var/lib/libvirt/qemu/ -l
srwxr-xr-x 1 libvirt-qemu kvm             0 Aug 30  2012 instance-000000a4.monitor
srwxr-xr-x 1 libvirt-qemu kvm             0 Sep 17  2012 instance-000001ec.monitor
srwxr-xr-x 1 libvirt-qemu kvm             0 Oct  9  2012 instance-00000217.monitor

用途:用来查看qemu运行状态以及与qemu进行交互,管理虚拟机,提供类似qemu命令行方式启动虚拟机的与虚拟机的交互操作
怎么创建的:可以查看libvirt的运行时配置文件/var/run/libvirt/qemu/instance-name.xml,打开可以看到如下内容:
<monitor path='/var/lib/libvirt/qemu/instance-00000611.monitor' json='1' type='unix'/>
但是我们在openstack生成的libvirt.xml中又看不到这项配置,那它到底是怎么生成的?
普通列表项目看了libvirt的源码,在创建虚拟机的qemuProcessstart()的时候会先准备qemu监控字符设备‘MonitorChr’:

VIR_DEBUG("Preparing monitor state");
if (qemuProcessPrepareMonitorChr(driver, priv->monConfig, vm->def->name) < 0)
    goto cleanup;

这里就会增加monitor字符设备,类型为unix domain socket,文件路径为libvirt libdir+vm-name+.monitor,具体代码如下:

int
qemuProcessPrepareMonitorChr(struct qemud_driver *driver,
                             virDomainChrSourceDefPtr monConfig,
                             const char *vm)
{
    monConfig->type = VIR_DOMAIN_CHR_TYPE_UNIX;
    monConfig->data.nix.listen = true;
    if (virAsprintf(&monConfig->data.nix.path, "%s/%s.monitor",
                    driver->libDir, vm) < 0) {
        virReportOOMError();
        return -1;
    }
    return 0;
}

最后libvirt生成qemu命令行参数的时候会把这个配置加进去:

VIR_DEBUG("Building emulator command line");
if (!(cmd = qemuBuildCommandLine(conn, driver, vm->def, priv->monConfig,
                                 priv->monJSON != 0, priv->qemuCaps,
                                 migrateFrom, stdin_fd, snapshot, vmop)))
    goto cleanup;
qemuBuildCommandLine():
......
if (monitor_chr) { /*monitor_chr就是priv->monConfig,所以这里走if分支*/
      char *chrdev;
      /* Use -chardev if it's available */
      if (qemuCapsGet(qemuCaps, QEMU_CAPS_CHARDEV)) {
          virCommandAddArg(cmd, "-chardev");
          if (!(chrdev = qemuBuildChrChardevStr(monitor_chr, "monitor",
                                                qemuCaps)))
              goto error;
          virCommandAddArg(cmd, chrdev);
          VIR_FREE(chrdev);
          virCommandAddArg(cmd, "-mon");
          virCommandAddArgFormat(cmd,
                                 "chardev=charmonitor,id=monitor,mode=%s",
                                 monitor_json ? "control" : "readline");
      } else {
          const char *prefix = NULL;
          if (monitor_json)
              prefix = "control,";
          virCommandAddArg(cmd, "-monitor");
          if (!(chrdev = qemuBuildChrArgStr(monitor_chr, prefix)))
              goto error;
          virCommandAddArg(cmd, chrdev);
          VIR_FREE(chrdev);
      }
  }

最终生成的qemu命令行信息为:
-chardev socket,id=charmonitor,path=/var/lib/libvirt/qemu/instance-00000611.monitor,server,nowait -mon chardev=charmonitor,id=monitor,mode=control


使用qemu-monitor-command查询、管理虚拟机
libvirt提供了qemu-monitor-command命令行及API,下面以命令行方式为例进行介绍:

$ sudo virsh help qemu-monitor-command
NAME
  qemu-monitor-command - QEMU Monitor Command
SYNOPSIS
  qemu-monitor-command <domain> [--hmp] {[--cmd] <string>}...
DESCRIPTION
  QEMU Monitor Command
OPTIONS
  [--domain] <string>  domain name, id or uuid
  --hmp            command is in human monitor protocol
  [--cmd] <string>  command
$ sudo virsh qemu-monitor-command ${instance-name} --hmp 'info commands'
info balloon  -- show balloon information
info block  -- show the block devices
info block-jobs  -- show progress of ongoing block device operations
info blockstats  -- show block device statistics
info capture  -- show capture information
info chardev  -- show the character devices
info cpus  -- show infos for each CPU
info history  -- show the command line history
info irq  -- show the interrupts statistics (if available)
info jit  -- show dynamic compiler info
info kvm  -- show KVM information
info mem  -- show the active virtual memory mappings
info mice  -- show which guest mouse is receiving events
info migrate  -- show migration status
info mtree  -- show memory tree
info name  -- show the current VM name
info network  -- show the network state
info numa  -- show NUMA information
info pci  -- show PCI info
info pcmcia  -- show guest PCMCIA status
info pic  -- show i8259 (PIC) state
info profile  -- show profiling information
info qdm  -- show qdev device model list
info qtree  -- show device tree
info registers  -- show the cpu registers
info roms  -- show roms
info snapshots  -- show the currently saved VM snapshots
info spice  -- show the spice server status
info status  -- show the current VM status (running|paused)
info tlb  -- show virtual to physical memory mappings
info trace-events  -- show available trace-events & their state
info usb  -- show guest USB devices
info usbhost  -- show host USB devices
info usernet  -- show user network stack connection states
info uuid  -- show the current VM UUID
info version  -- show the version of QEMU
info vnc  -- show the vnc server status
$ sudo virsh qemu-monitor-command instance-00000611 --hmp 'info vnc'
Server:
     address: 114.113.199.8:5900
        auth: none
Client: none

还有一些其他的管理类的操作,这里不一一列举,可参考:

另外在openstack Folsom版本中没有看到有用到这个monitor,没有看到这个Libvirt API被调用,不知道后续会不会有用处?个人感觉应该不会用到,因为这个monitor是libvirt自己生成的,跟openstack其实没有关系。
  评论这张
 
阅读(2752)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018