⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 buscreate.c

📁 系统迁移的源代码: http://www.diku.dk/hjemmesider/ansatte/jacobg/
💻 C
字号:
#include <xenctrl.h>#include <xenguest.h>#include <stdio.h>#include <errno.h>#include <stdlib.h>#include <string.h>#include <xs.h>#include <fcntl.h>#include "configfile.h"#include "xenutil.h"#include "evtchn.h"int xc;struct xs_handle *xs;xs_transaction_t t;int evtchn_fd;#define xs_w(a,b) xs_write(xs,t,a,b,strlen(b))//#define xs_w(a,b) printf("%s <- %s\n",a,b); xs_write(xs,t,a,b,strlen(b))#define xs_begin() t = xs_transaction_start(xs)#define xs_end() xs_transaction_end(xs,t,0)void setup_console(uint32_t domid, int rconsole, unsigned long mfn_console){	char s[256];	char s2[256];	char* home = xs_get_domain_path(xs,domid);	printf("%d\n",domid);	xs_begin();	sprintf(s,"%s/domid",home);	sprintf(s2,"%d",domid);	xs_w(s,s2);	sprintf(s,"%s/console/ring-ref",home);	sprintf(s2,"%lu",mfn_console);	xs_w(s, s2 );	sprintf(s,"%s/console/port",home);	sprintf(s2,"%d",rconsole);	xs_w(s, s2 );	xs_end();}void setup_vif(uint32_t domid, int uuid){	char s[256];	char s2[256];	struct xs_permissions xsperms[2];	char* home = xs_get_domain_path(xs,domid);	char* dom0_home = xs_get_domain_path(xs,0);	char backend[256];	char frontend[256];	xsperms[0].id = domid;	xsperms[0].perms = XS_PERM_READ | XS_PERM_WRITE;	sprintf(backend,"%s/backend/vif/%d/%d",dom0_home,domid,uuid);	sprintf(frontend, "%s/device/vif/%d",home,uuid);#if 1	xs_begin();	xs_mkdir(xs,t,backend);	xs_set_permissions(xs, t, backend, xsperms, 1);	//xs_end();#endif	//xs_begin();	sprintf(s,"%s/handle",frontend);	sprintf(s2,"%d",uuid);	xs_w(s, s2);	sprintf(s,"%s/mac",frontend);	xs_w(s, "aa:00:00:11:a6:02");	sprintf(s, "%s/backend-id", frontend);	xs_w(s, "0");		sprintf(s,"%s/backend",frontend);	xs_w(s, backend );	sprintf(s, "%s/state", frontend);	xs_w(s, "1");#if 0	xs_end();	xs_begin();#endif	sprintf(s,"%s/handle",backend);	sprintf(s2,"%d",uuid);	xs_w(s, s2);		sprintf(s,"%s/mac",backend);	xs_w(s, "aa:00:00:11:a6:02");	sprintf(s,"%s/script",backend);	xs_w(s, "/bin/test");	sprintf(s,"%s/frontend",backend);	xs_w(s, frontend );	sprintf(s,"%s/frontend-id",backend);	sprintf(s2,"%d",domid);	xs_w(s, s2 );	sprintf(s, "%s/state", backend);	xs_w(s, "1");	sprintf(s, "%s/handle", backend);	sprintf(s2,"%d",uuid);	xs_w(s, s2);	//sprintf(s, "%s/online", backend);	//xs_w(s, "1");	xs_end();}void setup_vbd(uint32_t domid, struct vbd* vbd){	char s[256];	char s2[256];	char pdev[8];	char vdev[8];	char backend[256];	char frontend[256];	char node[16];	struct xs_permissions xsperms[2];	char* home = xs_get_domain_path(xs,domid);	char* dom0_home = xs_get_domain_path(xs,0);	xsperms[0].id = domid;	xsperms[0].perms = XS_PERM_READ | XS_PERM_WRITE;	sprintf(pdev,"%u:%u",vbd->pdev>>8, vbd->pdev & 0xff);	sprintf(backend,"%s/backend/vbd/%d/%d",dom0_home,domid,vbd->vdev);	sprintf(frontend, "%s/device/vbd/%d",home,vbd->vdev);	xs_begin();	xs_mkdir(xs,t,backend);	xs_set_permissions(xs, t, backend, xsperms, 1);	sprintf(s,"%s/backend",frontend);	xs_w(s, backend );	sprintf(s, "%s/backend-id", frontend);	xs_w(s, "0");	sprintf(s, "%s/state", frontend);	xs_w(s, "1");		sprintf(s, "%s/virtual-device", frontend);	sprintf(vdev,"%u",vbd->vdev);	xs_w(s, vdev );	sprintf(s,"%s/domain",backend);	sprintf(s2,"%d",domid);	xs_w(s, s2);	sprintf(s,"%s/frontend",backend);	xs_w(s, frontend );	sprintf(s,"%s/frontend-id",backend);	sprintf(s2,"%d",domid);	xs_w(s, s2 );	sprintf(s, "%s/state", backend);	xs_w(s, "1");	sprintf(s, "%s/physical-device",backend);	xs_w(s, pdev );	sprintf(s, "%s/mode",backend);	xs_w(s, vbd->mode);	sprintf(node,"/dev/hda%d",vbd->vdev-0x300);#if 0	sprintf(s, "%s/dev",backend);	xs_w(s, node);	sprintf(s, "%s/node",backend);	xs_w(s, node);#endif	xs_end();}void usage(void){	puts("\ncreate: create a new Xen domain, with settings read from file\n");	puts("usage: create [-p] configfile\n");	puts("flags:");	puts("      -p : purge all unpriv domains first\n");	exit(-1);}int main(int argc,char** argv){	char kernel[256] = "";	char ramdisk[256] = "";	char cmdline[256] = "";	char cmdline2[256] = "";	char ip[16], ip2[16];	int console = 0;	int vif = 0;	int num_vbds;	struct vbd vbds[16];	int mem_mb = 16;	int maxmem_mb = 16;	int flag_purge=0;	int uuid;	int arg_pos=1;	int i;	char* cfgfile;	uint32_t domid = 0;	int rconsole = 0;	int rstore = 0;	unsigned long mfn_store, mfn_console;	struct xs_permissions xsperms[2];	char* home; 	xen_domain_handle_t xen_handle = {0,};	if(argc<2) usage();	xc = xc_interface_open();	if(xc<0) goto xc_failed;	xs = xs_daemon_open();	if(xs<0) goto xs_failed;	evtchn_fd = open("/dev/xen/evtchn", O_RDWR);		//char pdev[] = "3:2";	//char pdev[16] = "";	//char vdev[] = "769";	for(i=1; i<argc-1; i++)	{		if(argv[i][0]=='-') 		{			switch(argv[i][1])			{				case 'p':					flag_purge=1;					arg_pos++;					break;				default:					usage();			}		}			}	cfgfile = argv[arg_pos++];	read_config(cfgfile, ip, ip2, ramdisk, kernel, cmdline, &mem_mb, &maxmem_mb,			&console,&vif,&num_vbds,vbds);	if(flag_purge) purge_all_unpriv_domains(xc);	xc_domain_create(xc, ACM_DEFAULT_SSID, xen_handle, &domid);	if(arg_pos<argc) 	{		sprintf(cmdline2,cmdline,argv[arg_pos]);		puts(cmdline2);		uuid = atoi(argv[arg_pos]);	}	else 	{		strcpy(cmdline2,cmdline);		uuid = 10000+domid*100;	}	xc_domain_setmaxmem(xc,domid, maxmem_mb << 10);	xc_domain_memory_increase_reservation(xc,domid, mem_mb << 8, 0,0,0);	printf("%d\n",domid);	// 2) Build domain	rconsole = xc_evtchn_alloc_unbound(xc,domid,DOMID_SELF);	rstore = xc_evtchn_alloc_unbound(xc,domid,DOMID_SELF);	if(rstore<0 || rconsole<0) goto out;#if 0int xc_linux_build(int xc_handle,                   uint32_t domid,                   const char *image_name,                   const char *initrd_name,                   const char *cmdline,                   const char *features,                   unsigned long flags,                   unsigned int store_evtchn,                   unsigned long *store_mfn,                   unsigned int console_evtchn,                   unsigned long *console_mfn)#endif	xc_domain_max_vcpus(xc,domid,1);	if( xc_linux_build(xc, domid, kernel, ramdisk, cmdline2,NULL, 0, 			rstore, &mfn_store, rconsole, &mfn_console))		goto out;	if(!xs_introduce_domain(xs, domid, mfn_store, rstore))		goto out;	xsperms[0].id = domid;	xsperms[0].perms = XS_PERM_READ | XS_PERM_WRITE;	if(console) setup_console(domid, rconsole, mfn_console);	home = xs_get_domain_path(xs,domid);	xs_begin();	xs_set_permissions(xs, t, home, xsperms, 1);	xs_end();	for(i=0; i<num_vbds; i++)	{		setup_vbd(domid,&vbds[i]);	}	if(vif) setup_vif(domid,0);	xc_domain_unpause(xc,domid);out:	xs_daemon_close(xs);xs_failed:	xc_interface_close(xc);xc_failed:	return 0;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -