?? buscreate.c
字號(hào):
#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;}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -