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

📄 test_bindings.c

📁 xen虚拟机源代码安装包
💻 C
📖 第 1 页 / 共 2 页
字号:
    xen_vm_free(new_vm);    CLEANUP;    return 0;}/** * Creation of a new VM, using the Named Parameters idiom.  Allocate the * xen_vm_record here, but the sets through the library.  Either * allocation patterns can be used, as long as the allocation and free are * paired correctly. */static xen_vm create_new_vm(xen_session *session, bool hvm){    xen_string_string_map *vcpus_params = xen_string_string_map_alloc(1);    vcpus_params->contents[0].key = strdup("weight");    vcpus_params->contents[0].val = strdup("300");    xen_string_string_map *hvm_boot_params;    if (hvm)    {        hvm_boot_params = xen_string_string_map_alloc(1);        hvm_boot_params->contents[0].key = strdup("order");        hvm_boot_params->contents[0].val = strdup("cd");    }    else    {        hvm_boot_params = NULL;    }    xen_vm_record vm_record =        {            .name_label = hvm ? "NewHVM" : "NewPV",            .name_description = hvm ? "New HVM VM" : "New PV VM",            .user_version = 1,            .is_a_template = false,            .memory_static_max = 256 * 1024 * 1024,            .memory_dynamic_max = 256 * 1024 * 1024,            .memory_dynamic_min = 128 * 1024 * 1024,            .memory_static_min = 128 * 1024 * 1024,            .vcpus_params = vcpus_params,            .vcpus_max = 4,            .vcpus_at_startup = 2,            .actions_after_shutdown = XEN_ON_NORMAL_EXIT_DESTROY,            .actions_after_reboot = XEN_ON_NORMAL_EXIT_RESTART,            .actions_after_crash = XEN_ON_CRASH_BEHAVIOUR_RESTART,            .hvm_boot_policy = hvm ? "BIOS order" : NULL,            .hvm_boot_params = hvm ? hvm_boot_params : NULL,            .pv_bootloader   = hvm ? NULL : "pygrub",            .pv_kernel       = hvm ? NULL : "/boot/vmlinuz-2.6.16.33-xen",        };    xen_vm vm;    xen_vm_create(session, &vm, &vm_record);    xen_string_string_map_free(vcpus_params);    xen_string_string_map_free(hvm_boot_params);    if (!session->ok)    {        fprintf(stderr, "VM creation failed.\n");        print_error(session);        return NULL;    }    /*     * Create a new disk for the new VM.     */    xen_sr_set *srs;    if (!xen_sr_get_by_name_label(session, &srs, "QCoW") ||        srs->size < 1)    {        fprintf(stderr, "SR lookup failed.\n");        print_error(session);        xen_vm_free(vm);        return NULL;    }    xen_sr_record_opt sr_record =        {            .u.handle = srs->contents[0]        };    xen_vdi_record vdi0_record =        {            .name_label = "MyRootFS",            .name_description = "MyRootFS description",            .sr = &sr_record,            .virtual_size = (INT64_C(1) << 30),  // 1GiB            .type = XEN_VDI_TYPE_SYSTEM,            .sharable = false,            .read_only = false        };        xen_vdi vdi0;    if (!xen_vdi_create(session, &vdi0, &vdi0_record))    {        fprintf(stderr, "VDI creation failed.\n");        print_error(session);        xen_sr_set_free(srs);        xen_vm_free(vm);        return NULL;    }    xen_vm_record_opt vm_record_opt =        {            .u.handle = vm        };    xen_vdi_record_opt vdi0_record_opt =        {            .u.handle = vdi0        };    xen_vbd_record vbd0_record =        {            .vm = &vm_record_opt,            .vdi = &vdi0_record_opt,            .device = "xvda1",            .mode = XEN_VBD_MODE_RW,            .bootable = 1,        };    xen_vbd vbd0;    if (!xen_vbd_create(session, &vbd0, &vbd0_record))    {        fprintf(stderr, "VBD creation failed.\n");        print_error(session);        xen_vdi_free(vdi0);        xen_sr_set_free(srs);        xen_vm_free(vm);        return NULL;    }    xen_console vnc_console = NULL;    if (hvm) {        xen_console_record vnc_console_record =            {                .protocol = XEN_CONSOLE_PROTOCOL_RFB,                .vm = &vm_record_opt,            };        if (!xen_console_create(session, &vnc_console, &vnc_console_record))        {            fprintf(stderr, "VNC console creation failed.\n");            print_error(session);            xen_vbd_free(vbd0);            xen_vdi_free(vdi0);            xen_sr_set_free(srs);            xen_vm_free(vm);            return NULL;        }    }    char *vm_uuid;    char *vdi0_uuid;    char *vbd0_uuid;    char *vnc_uuid = NULL;    xen_vm_get_uuid(session,  &vm_uuid,   vm);    xen_vdi_get_uuid(session, &vdi0_uuid, vdi0);    xen_vbd_get_uuid(session, &vbd0_uuid, vbd0);     if (hvm) {        xen_console_get_uuid(session, &vnc_uuid, vnc_console);    }    if (!session->ok)    {        fprintf(stderr, "get_uuid call failed.\n");        print_error(session);        xen_uuid_free(vm_uuid);        xen_uuid_free(vdi0_uuid);        xen_uuid_free(vbd0_uuid);        xen_uuid_free(vnc_uuid);        xen_vbd_free(vbd0);        xen_vdi_free(vdi0);        xen_console_free(vnc_console);        xen_sr_set_free(srs);        xen_vm_free(vm);        return NULL;    }    if (hvm) {        printf("Created a new HVM VM, with UUID %s, VDI UUID %s, VBD "               "UUID %s, and VNC console UUID %s.\n",               vm_uuid, vdi0_uuid, vbd0_uuid, vnc_uuid);    }    else {        printf("Created a new PV VM, with UUID %s, VDI UUID %s, and VBD "               "UUID %s.\n",               vm_uuid, vdi0_uuid, vbd0_uuid);    }    xen_uuid_free(vm_uuid);    xen_uuid_free(vdi0_uuid);    xen_uuid_free(vbd0_uuid);    xen_uuid_free(vnc_uuid);    xen_vbd_free(vbd0);    xen_vdi_free(vdi0);    xen_console_free(vnc_console);    xen_sr_set_free(srs);    return vm;}/** * Print the power state for the given VM. */static void print_vm_power_state(xen_session *session, xen_vm vm){    char *vm_uuid;    enum xen_vm_power_state power_state;    if (!xen_vm_get_uuid(session, &vm_uuid, vm))    {        print_error(session);        return;    }    if (!xen_vm_get_power_state(session, &power_state, vm))    {        xen_uuid_free(vm_uuid);        print_error(session);        return;    }    printf("VM %s power state is %s.\n", vm_uuid,           xen_vm_power_state_to_string(power_state));    xen_uuid_free(vm_uuid);    fflush(stdout);}/** * Workaround for whinging GCCs, as suggested by strftime(3). */static size_t my_strftime(char *s, size_t max, const char *fmt,                          const struct tm *tm){    return strftime(s, max, fmt, tm);}/** * Print some session details. */static void print_session_info(xen_session *session){    xen_session_record *record;    if (!xen_session_get_record(session, &record, session))    {        print_error(session);        return;    }    printf("Session UUID: %s.\n", record->uuid);    printf("Session user: %s.\n", record->this_user);    char time[256];    struct tm *tm = localtime(&record->last_active);    my_strftime(time, 256, "Session last active: %c, local time.\n", tm);    printf(time);    char *uuid = NULL;    char *this_user = NULL;    xen_session_get_uuid(session, &uuid, session);    xen_session_get_this_user(session, &this_user, session);    if (!session->ok)    {        free(uuid);        free(this_user);        xen_session_record_free(record);        print_error(session);        return;    }    assert(!strcmp(record->uuid, uuid));    assert(!strcmp(record->this_user, this_user));    free(uuid);    free(this_user);    xen_session_record_free(record);    fflush(stdout);}static int pstrcmp(const void *p1, const void *p2){    return strcmp(*(char **)p1, *(char **)p2);}/** * Print the list of supported methods. */static void print_methods(xen_session *session){    xen_string_set *methods;    if (!xen_host_list_methods(session, &methods))    {        print_error(session);        goto done;    }    printf("%zd.\n", methods->size);    qsort(methods->contents, methods->size, sizeof(char *), pstrcmp);    printf("Supported methods:\n");    for (size_t i = 0; i < methods->size; i++)    {        printf("  %s\n", methods->contents[i]);    }    fflush(stdout);done:    xen_string_set_free(methods);}/** * Print the metrics for the given VM. */static void print_vm_metrics(xen_session *session, xen_vm vm){    xen_vm_metrics vm_metrics;    if (!xen_vm_get_metrics(session, &vm_metrics, vm))    {        print_error(session);        return;    }    xen_vm_metrics_record *vm_metrics_record;    if (!xen_vm_metrics_get_record(session, &vm_metrics_record, vm_metrics))    {        xen_vm_metrics_free(vm_metrics);        print_error(session);        return;    }    char time[256];    struct tm *tm = localtime(&vm_metrics_record->last_updated);    my_strftime(time, 256, "Metrics updated at %c, local time.\n", tm);    printf(time);    tm = localtime(&vm_metrics_record->start_time);    my_strftime(time, 256, "VM running since %c, local time.\n", tm);    printf(time);    for (size_t i = 0; i < vm_metrics_record->vcpus_utilisation->size; i++)    {        printf("%"PRId64" -> %lf.\n",               vm_metrics_record->vcpus_utilisation->contents[i].key,               vm_metrics_record->vcpus_utilisation->contents[i].val);    }    printf("VCPU -> PCPU mapping:\n");    for (size_t i = 0; i < vm_metrics_record->vcpus_cpu->size; i++)    {        printf("  %"PRId64" -> %"PRId64".\n",               vm_metrics_record->vcpus_cpu->contents[i].key,               vm_metrics_record->vcpus_cpu->contents[i].val);    }    printf("Live scheduling parameters:\n");    for (size_t i = 0; i < vm_metrics_record->vcpus_params->size; i++)    {        printf("  %s -> %s.\n",               vm_metrics_record->vcpus_params->contents[i].key,               vm_metrics_record->vcpus_params->contents[i].val);    }    for (size_t i = 0; i < vm_metrics_record->vcpus_flags->size; i++)    {        printf("%"PRId64" -> ",               vm_metrics_record->vcpus_flags->contents[i].key);        xen_string_set *s = vm_metrics_record->vcpus_flags->contents[i].val;        for (size_t j = 0; j < s->size; j++)        {            printf("%s", s->contents[j]);            if (j + 1 != s->size)            {                printf(", ");            }        }        printf("\n");    }    xen_vm_metrics_record_free(vm_metrics_record);    xen_vm_metrics_free(vm_metrics);    fflush(stdout);}

⌨️ 快捷键说明

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