kb_how_to_trace_into_libvirt_driver

看libvirt 源码,有些地方对应不起来,跟踪一下“virsh shutdown "命令的流程,理解了libvirt的整体框架。


jun:~/bin # virsh list

 Id    Name                           State
----------------------------------------------------
 5     sles10sp4                      running


jun:~/bin # ps aux | grep libvirtd
root      7204  0.0  0.2 955388 13308 ?        Ssl  10:11   0:01 /usr/sbin/libvirtd --listen
 

jun:/usr/src/debug/libvirt-1.1.2/daemon # gdb virsh
(gdb) set args shutdown 5  
(gdb) b main
Breakpoint 1 at 0x1f340: file virsh.c, line 3137.
(gdb) b remoteDomainShutdown                          ---> 只能跟踪到remote driver
(gdb) c        





jun:/var/log/libvirt/qemu # gdb  
(gdb) attach 7204
(gdb) bt
#0  0x00007fd608303b3d in poll () from /lib64/libc.so.6
#1  0x00007fd60886b68b in poll (__timeout=-1, __nfds=12, __fds=<optimized out>) at /usr/include/bits/poll2.h:46
#2  virEventPollRunOnce () at util/vireventpoll.c:628
#3  0x00007fd60886a36d in virEventRunDefaultImpl () at util/virevent.c:273
#4  0x00007fd60897934d in virNetServerRun (srv=0x7fd609c1b700) at rpc/virnetserver.c:1117
#5  0x00007fd60932f25c in main (argc=<optimized out>, argv=<optimized out>) at libvirtd.c:1513
(gdb) b  qemuDomainShutdown
Breakpoint 1 at 0x7fd5f922ac90: file qemu/qemu_driver.c, line 1893.
(gdb) c
Continuing.
Detaching after fork from child process 31094.
Detaching after fork from child process 31100.
[Switching to Thread 0x7fd5ff9a7700 (LWP 7278)]

Breakpoint 1, qemuDomainShutdown (dom=0x7fd5d0001190) at qemu/qemu_driver.c:1893
1893        return qemuDomainShutdownFlags(dom, 0);
(gdb) s
qemuDomainShutdownFlags (dom=0x7fd5d0001190, flags=0) at qemu/qemu_driver.c:1800
1800    static int qemuDomainShutdownFlags(virDomainPtr dom, unsigned int flags) {
(gdb)

qemu driver 使用Qemu现有的管理协议QMP, 基于JSON的格式。

看xen driver 的代码,会清楚一点:借助xend http interface 来进行管理

int
xenDaemonDomainShutdown(virConnectPtr conn, virDomainDefPtr def)
{
    if (def->id < 0) {
        virReportError(VIR_ERR_OPERATION_INVALID,
                       _("Domain %s isn't running."), def->name);
        return -1;
    }

    return xend_op(conn, def->name, "op", "shutdown", "reason", "poweroff", NULL);  //发送http post 报文给xend服务器进程
}


总结:

1.virsh 命令发送command 到 remote driver ,

2.remote driver 然后调用远程调用 (xdr协议)  到libvirtd 守护进程

3.libvirtd接收到command 分发到具体的 driver  如xen, qemu 等









 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值