QEMU源码全解析1 —— QEMU参数解析(1)

本文内容参考:

《趣谈Linux操作系统》 —— 刘超,极客时间

《QEMU/KVM》源码解析与应用 —— 李强,机械工业出版社

特此致谢!

一、QEMU参数解析

要分析QEMU源码,首先得从QEMU的命令行讲起。笔者前系列QEMU相关的文章中给出过一些QEMU命令,比如:

$ qemu-system-x86_64 -enable-kvm -m 8G -smp 4 -boot once=d -drive file=./Ubuntu22.img -cdrom ../iso_images/ubuntu-22.10-desktop-amd64.iso

本节对QEMU命令行参数解析进行简要介绍,帮助读者将QEMU命令行参数与其代码中的实现联系起来。QEMU的命令解析,就是下边这样一长串内容,在softmmu/vl.c中的void qemu_init(int argc, char **argv)中:

    qemu_add_opts(&qemu_drive_opts);
    qemu_add_drive_opts(&qemu_legacy_drive_opts);
    qemu_add_drive_opts(&qemu_common_drive_opts);
    qemu_add_drive_opts(&qemu_drive_opts);
    qemu_add_drive_opts(&bdrv_runtime_opts);
    qemu_add_opts(&qemu_chardev_opts);
    qemu_add_opts(&qemu_device_opts);
    qemu_add_opts(&qemu_netdev_opts);
    qemu_add_opts(&qemu_nic_opts);
    qemu_add_opts(&qemu_net_opts);
    qemu_add_opts(&qemu_rtc_opts);
    qemu_add_opts(&qemu_global_opts);
    qemu_add_opts(&qemu_mon_opts);
    qemu_add_opts(&qemu_trace_opts);
    qemu_plugin_add_opts();
    qemu_add_opts(&qemu_option_rom_opts);
    qemu_add_opts(&qemu_accel_opts);
    qemu_add_opts(&qemu_mem_opts);
    qemu_add_opts(&qemu_smp_opts);
    qemu_add_opts(&qemu_boot_opts);
    qemu_add_opts(&qemu_add_fd_opts);
    qemu_add_opts(&qemu_object_opts);
    qemu_add_opts(&qemu_tpmdev_opts);
    qemu_add_opts(&qemu_overcommit_opts);
    qemu_add_opts(&qemu_msg_opts);
    qemu_add_opts(&qemu_name_opts);
    qemu_add_opts(&qemu_numa_opts);
    qemu_add_opts(&qemu_icount_opts);
    qemu_add_opts(&qemu_semihosting_config_opts);
    qemu_add_opts(&qemu_fw_cfg_opts);
    qemu_add_opts(&qemu_action_opts);

当然,也有不少qemu_add_opts分散在其它一些文件中,在此不一一列出,只抓主线。

有人会说了,这opts也忒多点了吧?的确是这样。上边给出的示例命令参数不算太少,但与下边这个命令行参数相比就是“小巫见大巫”了。

$ qemu-system-x86_64 -enable-kvm 
                                           -name instance-00000024 
                                           -machine pc-i440fx-trusty,accel=kvm,usb=off 
                                           -cpu SandyBridge,+erms,+smep,+fsgsbase,+pdpe1gb,+rdrand,+f16c,+osxsave,+dca,+pcid,+pdcm,+xtpr,+tm2+est,+smx,+vmx,+ds_cpl,+monitor,+dtes64,+pbe,+tm,+ht,+ss,+acpi,+ds,+vme 
                                           -m 2048 
                                           -smp 1,sockets=1,cores=1,threads=1 
                                           ……
                                           -rtc base=utc,driftfix=slew 
                                           -drive file=/var/lib/nova/instances/1f8e6f7e-5a70-4780-89c1-464dc0e7f308/disk,if=none,id=drive-virtio-disk0,format=qcow2,cache=none 
                                           -device virtio-blk-pci,scsi=off,bus=pci.0,addr=0x4,drive=drive-virtio-disk0,id=virtio-disk0,bootindex=1 
                                           -netdev tap,fd=32,id=hostnet0,vhost=on,vhostfd=37 
                                           -device virtio-net-pci,netdev=hostnet0,id=net0,mac=fa:16:3e:d1:2d:99,bus=pci1.0,addr=0x3 
                                           -chrdev file,id=charserial0,path=/var/lib/nova/instances/1f8e6f7e-5a70-4780-89c1-464dc0e7f308/console.log 
                                           -vnc 0.0.0.0:12 
                                           -device cirrus-vga,id-video0,bus=pci.0,addr=0x2

现在你能够理解为什么有那么多qemu_add_opts了吧?少了真不够解析这些参数的。

那么以上这些参数都是什么意思呢?下边一一进行详细介绍。

  • enable-kvm

表示启用硬件辅助虚拟化。

  • -name instance-00000024

表示虚拟机的名称。

  • -machine pci-i440fx-trusty,accel=kvm,usb=off

machine代表计算机体系结构。qemu会模拟多种体系结构,常用的有普通PC机,即x86的32位或64位体系结构;苹果Mac电脑的PowerPC体系结构;Sun的SPARC体系结构;MIPS的体系结构等。如果使用KVM hardware-assisted virtualization,使用的是纯模拟,则有参数accel=tcg, -no-kvm。

  • -cpu SandyBridge,+erms,+smep,+fsgsbase,+pdpe1gb,+rdrand,+f16c,+osxsave,+dca,+pcid,+pdcm,+xtpr,+tm2+est,+smx,+vmx,+ds_cpl,+monitor,+dtes64,+pbe,+tm,+ht,+ss,+acpi,+ds,+vme

表示设置CPU,SandyBridge是Intel处理器,后面的家伙都是添加的CPU参数,这些参数会显示在/proc/cpuinfo里面。

  • -m 2048

表示使用内存的大小。

  • -smp 1,sockets=1,cores=1,threads=1

SMP是对称多处理器,也即UMA,和NUMA对应。qemu仿真了1个vcpu、1个socket、1个core、1个threads的处理器。

socket、core、threads都是什么概念呢?socket就是主板上插入CPU的槽的数目,也即常说的“路”。core就是平时经常说的“核”,如双核、四核等。thread指的是每个core的硬件线程数,即超线程。

  • -rtc base=utc,driftfix=slew

表示系统时间由参数-rtc指定。

  • -device cirrus-vga,id=video0,bus=pci.0,addr=0x2

表示显示器用参数-vga设置,默认为cirrus,它模拟了CL-GD5446PCI VGA卡。

  • -netdev tap,fd=32,id=hostnet0,vhost=on,vhostfd=37 

HOST角度的网卡相关设置。

  • -device virtio-net-pci,netdev=hostnet0,id=net0,mac=fa:16:3e:d1:2d:99,bus=pci1.0,addr=0x3 

GUEST角度的网卡相关设置。

注:网卡设备使用-net参数和-device参数进行设置。

  • -drive file=/var/lib/nova/instances/1f8e6f7e-5a70-4780-89c1-464dc0e7f308/disk,if=none,id=drive-virtio-disk0,format=qcow2,cache=none

HOST角度的硬盘相关设置。

  • -device virtio-blk-pci,scsi=off,bus=pci.0,addr=0x4,drive=drive-virtio-disk0,id=virtio-disk0,bootindex=1

GUEST角度的硬盘相关设置。

注:硬盘设备使用-hda、-hdb,或者-drive和-device参数进行设置。

  • -vnc 0.0.0.0:12

设置VNC。

上述命令行中的参数基本就解析完了。当然,这也仅仅是其中一部分而已。不要望而却步,当前不需要全部看懂,只需要大概了解就可以了。

那么这么多参数是如何被QEMU解析的呢?且看下回分解。

猜你喜欢

转载自blog.csdn.net/phmatthaus/article/details/131505960
今日推荐