Xen Demo C语言版

   对于xen的虚拟化管理,大家都在用什么呢?我真的想知道是不是大家都用xm来进行管理呢?至少我想大多数仅仅想了解一下的朋友可能用下xm也就算是了解了。而且在xen的用户手册里面也仅仅介绍了一下xm的使用方法,关于怎么使用它的c接口来管理虚拟化方面的介绍只字未提。

   我不仅仅想用xm这个工具来创建删除管理我的虚拟机,我想写点自己的程序来管理我的虚拟化程序。但是我发现这个真的比较难,究竟难在哪里呢?就我以前的经验,如果想使用一个库进行开发,我首先找找例子,然后看看api文档,最后实践。但是我通常做法的前两步我居然没有找到,翻遍了整个互联网,找到的就是一个不满意的api文档。而且说实话这个文档我觉得太简陋了,至少简陋到我看了还是不知道如何写一个创建虚拟机的c程序。没有办法,只能分析xm的源代码,对于我这个对python不怎么了解的人,想看它还是不容易的。不过功夫不负有心人,我终于实现了使用C代码创建一个HVM虚拟机的程序。现在就把它分享给大家。

   文中有些内容我也没有完全理解,只是从xen/tool/python下的xm和xend分析提炼出来的。还需要大家帮助一举吃透!新的内容待续,敬请关注!

 

void creat_vm()
{
int             xcHandle = 0;
unsigned char   domain_handle[16] = "asdfasdf";
long deltaCushionAtCkPtInMB;
BOOL memoryWasAvailableInBalloon;
unsigned long slackMem = 3;
int store_port;
unsigned int domid = 1;
struct xen_domctl_sched_credit sdom;

TAILQ_INIT(&store_event_hdr);
totalWatches = 0;
mutex_init(&store_mtx, "Store");
uuid_parse("c540f382-07cb-40d0-b573-27ba03fd690f", domain_handle);
xcHandle = xenctl_handle_acquire();


xc_domain_create(xcHandle,ACM_DEFAULT_SSID,domain_handle,XEN_DOMCTL_CDF_hvm_guest,&domid);
store_port = xc_evtchn_alloc_unbound(xcHandle, 1, 0);
xc_domain_max_vcpus(xcHandle, 1,2);

 

//为dom0增加内存,因为增加了domU后,dom0中会为这次增加的domU付出一部分内存的开销。为了保证dom0有足够的内存需要为它增加内存。之下的两个函数为自定义函数。
dmc_ensure_dom0_memory_cushion(jc_errAndLog_get_globalVersion_stdout(),   "prep for guest start"
                                    ,   1,   120,      8,      &deltaCushionAtCkPtInMB,   &memoryWasAvailableInBalloon);
dmc_increase_dom0_memory(jc_errAndLog_get_globalVersion_stdout(),   "memory for guest"
                                ,   1,   10240,   120,   &memoryWasAvailableInBalloon);

xc_domain_setmaxmem(xcHandle, 1, 512*1024);
xc_shadow_control(xcHandle, 1, XEN_DOMCTL_SHADOW_OP_SET_ALLOCATION, NULL, 0, &slackMem, 0, NULL);
xc_hvm_build(xcHandle, 1, 256,"/bin/hvmloader");
xc_domain_set_time_offset(xcHandle, 1, 2);
xc_map_foreign_range(xcHandle, 1, XC_PAGE_SIZE,PROT_READ | PROT_WRITE, HVM_INFO_PFN);

xc_set_hvm_param(xcHandle, 1, HVM_PARAM_PAE_ENABLED, 1);
xc_set_hvm_param(xcHandle, 1, HVM_PARAM_STORE_EVTCHN,1);
xc_set_hvm_param(xcHandle, 1, HVM_PARAM_HPET_ENABLED, 0);
xc_set_hvm_param(xcHandle, 1, 16,1);
xc_set_hvm_param(xcHandle, 1, 9, 0);
xc_set_hvm_param(xcHandle, 1, HVM_PARAM_TIMER_MODE, 0);

xsHandle = xs_daemon_open();

//stroe_write是自定义函数,目的是在xenstore的树上增加必要的条目。

store_write( "/local/domain/1",  NULL);
store_write( "/local/domain/1/vm",  "/vm/c540f382-07cb-40d0-b573-27ba03fd690f");
store_write( "/vm/c540f382-07cb-40d0-b573-27ba03fd690f/uuid",  "c540f382-07cb-40d0-b573-27ba03fd690f");
store_write( "/vm/c540f382-07cb-40d0-b573-27ba03fd690f/image/ostype",  "hvm");
store_write( "/vm/c540f382-07cb-40d0-b573-27ba03fd690f/image/kernel",  "/bin/hvmloader");
store_write( "/vm/c540f382-07cb-40d0-b573-27ba03fd690f/image/cmdline",  "");
store_write( "/vm/c540f382-07cb-40d0-b573-27ba03fd690f/image/ramdisk",  "");
store_write( "/vm/c540f382-07cb-40d0-b573-27ba03fd690f/on_poweroff",  "destroy");
store_write( "/vm/c540f382-07cb-40d0-b573-27ba03fd690f/on_poweroff_limit",  "2147483647");
store_write( "/vm/c540f382-07cb-40d0-b573-27ba03fd690f/on_reboot",  "restart");
store_write( "/vm/c540f382-07cb-40d0-b573-27ba03fd690f/on_reboot_limit",  "2147483647");
store_write( "/vm/c540f382-07cb-40d0-b573-27ba03fd690f/on_crash",  "destroy");
store_write( "/vm/c540f382-07cb-40d0-b573-27ba03fd690f/on_crash_limit",  "2147483647");
store_write( "/vm/c540f382-07cb-40d0-b573-27ba03fd690f/start_time",  "1248776805.82");
store_write( "/vm/c540f382-07cb-40d0-b573-27ba03fd690f/image/device-model",  "/bin/qemu-dm");
store_write( "/vm/c540f382-07cb-40d0-b573-27ba03fd690f/image/display",  "");
store_write( "/local/domain/1/host/cpu_khz",  "1595926");
store_write( "/local/domain/1/domid",  "12");
store_write( "/vm/c540f382-07cb-40d0-b573-27ba03fd690f/memory",  "256");
store_write( "/vm/c540f382-07cb-40d0-b573-27ba03fd690f/maxmem",  "256");
store_write( "/local/domain/1/memory/target",  "262144");
store_write( "/vm/c540f382-07cb-40d0-b573-27ba03fd690f/rtc/timeoffset",  "2");
store_write( "/vm/c540f382-07cb-40d0-b573-27ba03fd690f/vcpus",  "1");
store_write( "/vm/c540f382-07cb-40d0-b573-27ba03fd690f/vcpu_avail",  "1");
store_write( "/local/domain/1/store/port",  "1");
store_write( "/local/domain/1/name",  "SLSE10-sp1");
store_write( "/vm/c540f382-07cb-40d0-b573-27ba03fd690f/name",  "SLSE10-sp1");
store_write( "/local/domain/0/backend/vbd/1/768",  "");
store_write( "/local/domain/1/device/vbd/768",  "");
store_write( "/local/domain/1/device/vbd/768/backend-id",  "0");
store_write( "/local/domain/1/device/vbd/768/virtual-device",  "768");
store_write( "/local/domain/1/device/vbd/768/device-type",  "disk");
store_write( "/local/domain/1/device/vbd/768/state",  "1");
store_write( "/local/domain/1/device/vbd/768/backend",  "/local/domain/0/backend/vbd/1/768");
store_write( "/local/domain/1/device/vbd/768/probe-limit",  "-1");
store_write( "/local/domain/0/backend/vbd/1/768/domain",  "SLSE10-sp1");
store_write( "/local/domain/0/backend/vbd/1/768/frontend",  "/local/domain/1/device/vbd/768");
store_write( "/local/domain/0/backend/vbd/1/768/uuid",  "0d8dc6dc-211b-45fc-b5c9-239a413253c4");
store_write( "/local/domain/0/backend/vbd/1/768/dev",  "hda");
store_write( "/local/domain/0/backend/vbd/1/768/state",  "5");

//下面的设备名,就是作为你domU存储的块文件或者块设备的全路径.

store_write( "/local/domain/0/backend/vbd/1/768/params",  "设备名");
store_write( "/local/domain/0/backend/vbd/1/768/mode",  "w");
store_write( "/local/domain/0/backend/vbd/1/768/online",  "1");
store_write( "/local/domain/0/backend/vbd/1/768/frontend-id",  "1");
store_write( "/local/domain/0/backend/vbd/1/768/type",  "phy");
store_write( "/local/domain/0/backend/vbd/1/768/physical-device",  "fd:5");
store_write( "/local/domain/0/backend/vbd/1/5696",  "");
store_write( "/local/domain/1/device/vbd/5696",  "");
store_write( "/local/domain/1/device/vbd/5696/backend-id",  "0");
store_write( "/local/domain/1/device/vbd/5696/virtual-device",  "5696");
store_write( "/local/domain/1/device/vbd/5696/device-type",  "cdrom");
store_write( "/local/domain/1/device/vbd/5696/state",  "1");
store_write( "/local/domain/1/device/vbd/5696/backend",  "/local/domain/0/backend/vbd/1/5696");
store_write( "/local/domain/1/device/vbd/5696/probe-limit", " -1");
store_write( "/local/domain/1/device/vbd/5696/cdrom-shared-witheject",  "1");
store_write( "/local/domain/1/device/vbd/5696/cdrom-owner",  "0");
store_write( "/local/domain/0/backend/vbd/1/5696/domain",  "SLSE10-sp1");
store_write( "/local/domain/0/backend/vbd/1/5696/frontend",  "/local/domain/1/device/vbd/5696");
store_write( "/local/domain/0/backend/vbd/1/5696/uuid",  "9187c893-9751-4c95-8cbe-52a6d56071be");
store_write( "/local/domain/0/backend/vbd/1/5696/dev",  "hdd");
store_write( "/local/domain/0/backend/vbd/1/5696/state", "1");
store_write( "/local/domain/0/backend/vbd/1/5696/params",  "/dev/cdrom");
store_write( "/local/domain/0/backend/vbd/1/5696/mode",  "r");
store_write( "/local/domain/0/backend/vbd/1/5696/online",  "1");
store_write( "/local/domain/0/backend/vbd/1/5696/frontend-id",  "1");
store_write( "/local/domain/0/backend/vbd/1/5696/type",  "phy");
store_write( "/local/domain/0/backend/vbd/1/5696/physical-device",  "16:40");
store_write("/local/domain/1/console/port", "2");
store_write("/local/domain/1/console/limit", "1048576");
store_write("/local/domain/1/console/type", "ioemu");
store_write("/local/domain/1/console/port", "2" );
store_write("/local/domain/1/console/limit", "1048576");
store_write("/local/domain/1/console/type", "ioemu");
store_write("/local/domain/1/device-misc/console/nextDeviceID", "1");
store_write("/local/domain/1/device-misc/console/nextDeviceID", "1");
store_write("/local/domain/1/device/console/0/state", "1");
store_write("/local/domain/1/device/console/0/backend-id", "0");
store_write("/local/domain/1/device/console/0/backend", "/local/domain/0/backend/console/1/0");
store_write("/local/domain/0/backend/console/1/0/domain", "Xm-HVM");
store_write("/local/domain/0/backend/console/1/0/protocol", "vt100");
store_write("/local/domain/0/backend/console/1/0/uuid", "28e709a3-dd2b-d464-7496-9d6423458c80");
store_write("/local/domain/0/backend/console/1/0/frontend", "/local/domain/2/device/console/0");
store_write("/local/domain/0/backend/console/1/0/state", "1");
store_write("/local/domain/0/backend/console/1/0/location", "3");
store_write("/local/domain/0/backend/console/1/0/online", "1");
store_write("/local/domain/0/backend/console/1/0/frontend-id", "1");
store_write("/vm/127a82e9-f60d-8efd-64f8-0c3d253916b8/device/console/0/frontend", "/local/domain/1/device/console/0");
store_write("/vm/127a82e9-f60d-8efd-64f8-0c3d253916b8/device/console/0/frontend-id", "2");
store_write("/vm/c540f382-07cb-40d0-b573-27ba03fd690f/device/console/0/backend-id", "0");
store_write("/vm/c540f382-07cb-40d0-b573-27ba03fd690f/device/console/0/backend", "/local/domain/0/backend/console/1/0");

 

 

xc_cpuid_apply_policy(xcHandle, 1 );
sdom.weight = 256;
sdom.cap = 0;
xc_sched_credit_domain_set(xcHandle, 1, &sdom);

store_write("/vm/c540f382-07cb-40d0-b573-27ba03fd690f/image/dmargs", "-M xenfv -d 1 -m 256 -monitor pty -vnc :1 -k en-us -vcpus 1 -acpi -domain-name SLSE10-sp1 -net nic,vlan=1,macaddr=00:0f:4b:29:35:1d,model=rtl8139 -net tap,vlan=1,bridge=test -boot c");

 

//对于一些IO设备是通过qemu-dm模拟的。

system("/bin/qemu-dm -M xenfv -d 1 -videoram 4 -m 256 -monitor pty -vnc :1 -k en-us -vcpus 1 -acpi -domain-name SLSE10-sp1 -net nic,vlan=1,macaddr=00:0f:4b:29:35:1d,model=rtl8139 -net tap,vlan=1,bridge=test -boot c &");
xc_domain_unpause(xcHandle, 1);
return ;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值