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