[libvirt-users] How does libvirt interaction with KVM to create a VM?

Dennis Chen xschen at tnsoft.com.cn
Fri Jun 29 06:18:17 UTC 2012


On 06/28/2012 06:26 PM, Daniel P. Berrange wrote:
> On Thu, Jun 28, 2012 at 05:21:57PM +0800, Dennis Chen wrote:
>> All,
>>
>> These days I am trying to understand the interaction relationship
>> between the libvirt and KVM kernel module, eg. kvm_intel.ko.
>>
>> We know that KVM kernel module expose an entry in form of device
>> file "/dev/kvm" which can be accessed by user space application to
>> control, for example, create a VM using KVM_CREATE_VM with help of
>> ioctl.
>>
>> Now let's say the tool virsh based upon libvirt, we can create a
>> guest domain with the command looks like:
>> #virsh create guest.xml
>> Obviously, the above command will create a VM. But when I try to
>> investigate the libvirt code, I can't find any code play with the
>> "/dev/kvm" to send KVM_CREATE_VM ioctl code to KVM kernel module.
>> But  I do found that the reference count of the kvm_intel.ko changed
>> before the virsh create command launched and after.
>>
>> So my question is: how does the libvirt interaction with KVM to
>> create a VM? Anybody can give me some tips about that, eg, the
>> corresponding codes in libvirt?
> The '/dev/kvm' device is the low level kernel interface for creating
> virtual domains. This is not actually used by libvirt at all. The
> QEMU binary has code that talks to /dev/kvm, so all libvirt does is
> to spawn a QEMU process which in turns creates the virtual machine
>
> All the libvirt code for this part is under $GIT/src/qemu/  in particular
> the qemu_command.c and qemu_process.c files
>
> Daniel
Thanks Daniel, now I understand that the libvirt code will play with 
QEMU binary, for example, qemu-system-x86_64, the latter will talk with 
KVM module .  But now the question is, I guess  qemuProcessStart() 
function was used to spawn a QEMU process, so I built a virsh from the 
source package with "-g -O0" flag, I want to gdb the virsh, but when I 
want to set a break point on qemuProcessStart(), I encounter issue:

#gdb virsh
(gdb) b main
Breakpoint 1 at 0x807d480: file virsh.c, line 20270.
(gdb) r
Starting program: /usr/bin/virsh
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/i386-linux-gnu/libthread_db.so.1".

Breakpoint 1, main (argc=1, argv=0xbffff294) at virsh.c:20270
20270    {
(gdb) b qemuProcessStart
Function "qemuProcessStart" not defined.
Make breakpoint pending on future shared library load? (y or [n]) y
Breakpoint 2 (qemuProcessStart) pending.

(gdb)c

virsh # create guest.xml
Domain vdo created from vdo.xml

virsh #

continue instruction above doesn't hit the pending Breakpoint 2...

So my question is, which kind of object file will be created from 
$GIT/src/qemu folder during the build process, is it a .so file and 
virsh will load it?

BRs
Dennis





More information about the libvirt-users mailing list