1、推荐qemu启动参数修改对于qemu的启动参数,qemu使用了一些基本的框架函数完成相关的解析,方便后续开发人员增加功能。这部分的代码还是有点复杂,所以自己总结一下。qemu-kvm启动参数的一个例子,使用libvirt创建的一个虚拟机。/usr/libexec/qemu-kvm -name rhel6.5 -S-M pc-0.15 -enable-kvm -m 1024 -realtime mlock=off -smp 1,sockets=1,cores=1,threads=1 -uuid 8f338d83-41c1-9df6-d42f-851f13949359 -no-user-confi
2、g -nodefaults -chardev socket,id=charmonitor,path=/var/lib/libvirt/qemu/rhel6.5.monitor,server,nowait -mon chardev=charmonitor,id=monitor,mode=control -rtc base=utc -no-shutdown -boot c -drive file=/var/lib/libvirt/images/rhel6.5.img,if=none,id=drive-virtio-disk0,format=raw,cache=none -device virtio
3、-blk-pci,bus=pci.0,addr=0x5,drive=drive-virtio-disk0,id=virtio-disk0 -drive if=none,media=cdrom,id=drive-ide0-1-0,readonly=on,format=raw -device ide-drive,bus=ide.1,unit=0,drive=drive-ide0-1-0,id=ide0-1-0 -netdev tap,fd=23,id=hostnet0 -device e1000,netdev=hostnet0,id=net0,mac=52:54:00:61:00:e7,bus=p
4、ci.0,addr=0x3 -chardev pty,id=charserial0 -device isa-serial,chardev=charserial0,id=serial0-usb -device usb-tablet,id=input0-vnc 127.0.0.1:0 -vga cirrus -device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x6 qemu参数代码分析,以realtime这个参数为例进行说明:修改点一:qemu_add_opts(&qemu_realtime_opts);修改点二:static QemuOp
5、tsList qemu_realtime_opts = .name = realtime, .head = QTAILQ_HEAD_INITIALIZER(qemu_realtime_opts.head), .desc = .name = mlock, .type = QEMU_OPT_BOOL, , /* end of list */ ,;修改点三: case QEMU_OPTION_realtime: opts = qemu_opts_parse(qemu_find_opts(realtime), optarg, 0); if (!opts) exit(1); configure_real
6、time(opts); break;修改点四:static void configure_realtime(QemuOpts *opts) bool enable_mlock; enable_mlock = qemu_opt_get_bool(opts, mlock, true); if (enable_mlock) if (os_mlock() 0) fprintf(stderr, qemu: locking memory failedn); exit(1); 修改点五:qemu-option.hx中增加DEF(realtime, HAS_ARG, QEMU_OPTION_realtime,
7、 -realtime mlock=on|offn run qemu with realtime featuresn mlock=on|off controls mlock support (default: on)n, QEMU_ARCH_ALL)STEXIitem -realtime mlock=on|offfindex -realtimeRun qemu with realtime features.mlocking qemu and guest memory can be enabled via optionmlock=on(enabled by default).ETEXI下面分析一下
8、这些函数的处理流程:1.qemu_add_opts(&qemu_realtime_opts);qemu_add_opts函数在include/qemu/config-file.h中声明,在util/qemu-config.c中定义。在util/qemu-config.c中定义静态变量static QemuOptsList *vm_config_groups32;static QemuOptsList *drive_config_groups4;定义了数组,通过qemu_add_opts增加到vm_config_groups数组中。qemu_realtime_opts定义如下:static Qe
9、muOptsList qemu_realtime_opts = .name = realtime, .head = QTAILQ_HEAD_INITIALIZER(qemu_realtime_opts.head), .desc = .name = mlock, .type = QEMU_OPT_BOOL, , /* end of list */ ,;2.在vl.c的main函数中,调用lookup_opt,该函数根据argv当前执行的参数,查找qemu_options变量,返回对应的指针。返回的optarg和optind参数含义:optarg执行对应参数后对应的内容,比如-realtime后的
10、mlock=off.返回值的类型是QemuOption,对应的是和qemu-option.hx中名称一致的变量指针,qemu_options变量在lv.c中定义。static const QEMUOption qemu_options = h, 0, QEMU_OPTION_h, QEMU_ARCH_ALL ,#define QEMU_OPTIONS_GENERATE_OPTIONS#include qemu-options-wrapper.h NULL ,;typedef struct QEMUOption const char *name; int flags; int index; ui
11、nt32_t arch_mask; QEMUOption;#define HAS_ARG 0x0001#include qemu-options-wrapper.h中通过宏分别处理QEMU_OPTIONS_GENERATE_ENUM、QEMU_OPTIONS_GENERATE_HELP、QEMU_OPTIONS_GENERATE_OPTIONS。具体的内容在#include qemu-options.def通过宏处理后,qemu_options内容被填充。QEMU_OPTIONS_GENERATE_HELP在如下场景下使用。static void help(int exitcode) vers
12、ion(); printf(usage: %s options disk_imagenn disk_image is a raw hard disk image for IDE hard disk 0nn, error_get_progname();#define QEMU_OPTIONS_GENERATE_HELP#include qemu-options-wrapper.h printf(nDuring emulation, the following keys are useful:n ctrl-alt-f toggle full screenn ctrl-alt-n switch to
13、 virtual console nn ctrl-alt toggle mouse and keyboard grabn n When using -nographic, press ctrl-a h to get some help.n); exit(exitcode);枚举宏的定义在qemu-options.h中定义#ifndef _QEMU_OPTIONS_H_#define _QEMU_OPTIONS_H_enum #define QEMU_OPTIONS_GENERATE_ENUM#include qemu-options-wrapper.h;#endif3.qemu_find_op
14、ts代码流程,返回对应名称的QemuOptsList变量。QemuOptsList *qemu_find_opts(const char *group) QemuOptsList *ret; Error *local_err = NULL; ret = find_list(vm_config_groups, group, &local_err); if (error_is_set(&local_err) error_report(%s, error_get_pretty(local_err); error_free(local_err); return ret;调用qemu_opts_pars
15、e函数,根据QemuOptsList中定义的数据格式,生成QemuOpts变量,QemuOpts变量的格式定义如下:在include/qemu/option_int.hstruct QemuOpt const char *name; const char *str; const QemuOptDesc *desc; union bool boolean; uint64_t uint; value; QemuOpts *opts; QTAILQ_ENTRY(QemuOpt) next;struct QemuOpts char *id; QemuOptsList *list; Location loc; QTAILQ_HEAD(QemuOptHead, QemuOpt) head; QTAILQ_ENTRY(QemuOpts) next;最终可以调用qemu_opt_get_bool来获取参数的具体值。qemu参数框架已经根据定义的格式完成了解析。 (注:可编辑下载,若有不当之处,请指正,谢谢!)
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1