On 06/28/2012 07:03 PM, Alex Jia wrote:
On 06/28/2012 05:21 PM, 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?
http://libvirt.org/git/?p=libvirt.git;a=blob;f=src/qemu/qemu_driver.c;h=2...
114 /* device for kvm ioctls */
115 #define KVM_DEVICE "/dev/kvm"
1022 static int kvmGetMaxVCPUs(void) {
1023 int maxvcpus = 1;
1024
1025 int r, fd;
1026
1027 fd = open(KVM_DEVICE, O_RDONLY);
1028 if (fd< 0) {
1029 virReportSystemError(errno, _("Unable to open %s"),
KVM_DEVICE);
1030 return -1;
1031 }
1032
1033 r = ioctl(fd, KVM_CHECK_EXTENSION, KVM_CAP_NR_VCPUS);
1034 if (r> 0)
1035 maxvcpus = r;
1036
1037 VIR_FORCE_CLOSE(fd);
1038 return maxvcpus;
1039 }
Yes, I noticed the code above in libvirt, but it's not related with my
question in the first message...
http://libvirt.org/git/?p=libvirt.git;a=blob;f=src/qemu/qemu_process.c;h=...
Please see qemuProcessStart() implemetation:
3288 int qemuProcessStart(virConnectPtr conn,
3289 struct qemud_driver *driver,
3290 virDomainObjPtr vm,
3291 const char *migrateFrom,
3292 int stdin_fd,
3293 const char *stdin_path,
3294 virDomainSnapshotObjPtr snapshot,
3295 enum virNetDevVPortProfileOp vmop,
3296 unsigned int flags)
......
> BRs.
> Dennis
>
> _______________________________________________
> libvirt-users mailing list
> libvirt-users(a)redhat.com
>
https://www.redhat.com/mailman/listinfo/libvirt-users I guess the
qemuProcessStart() is used to spawn a QEMU process, but
seems that lot's of tricks in its implementation, essentially, does this
function spawn the qemu process looks like, eg:
StartProcess("/usr/bin/qemu-system-x86_64", ...);
BRs,
Dennis