Назад | Перейти на главную страницу

Как вывести список всех устройств, эмулируемых в виртуальной машине QEMU?

Я создал виртуальную машину с помощью следующей команды в qemu с включенным KVM.

qemu-kvm -m 1024 -enable-kvm -hda /var/lib/libvirt/images/fedora.img

Я хотел бы знать, какие именно устройства эмулируются для этой виртуальной машины, включая хранилище и сеть (я могу видеть сетевой интерфейс, включенный внутри виртуальной машины с помощью ifconfig).

info qtree

Эта потрясающая команда монитора QEMU показывает красивое древовидное представление о том, как размещены все устройства QEMU.

Вы можете получить приглашение монитора QEMU через:

  • Ctrl + A C на -nographic
  • Ctrl + Alt +?, Где ? 1, 2, 3 и т. д. в графическом окне QEMU
  • -monitor telnet::45454,server,nowait а затем подключитесь к нему с помощью telnet 45454

Тогда, например, я могу видеть свое сетевое устройство как:

  dev: rtl8139, id ""                                                                                                                                                                                           
    mac = "52:54:00:12:34:56"                                                                                                                                                                                   
    vlan = <null>                                                                                                                                                                                               
    netdev = "net0"                                                                                                                                                                                             
    addr = 03.0                                                                                                                                                                                                 
    romfile = "efi-rtl8139.rom"                                                                                                                                                                                 
    rombar = 1 (0x1)                                                                                                                                                                                            
    multifunction = false                                                                                                                                                                                       
    command_serr_enable = true                                                                                                                                                                                  
    x-pcie-lnksta-dllla = true                                                                                                                                                                                  
    x-pcie-extcap-init = true                                                                                                                                                                                   
    class Ethernet controller, addr 00:03.0, pci id 10ec:8139 (sub 1af4:1100)                                                                                                                                   
    bar 0: i/o at 0xc000 [0xc0ff]                                                                                                                                                                               
    bar 1: mem at 0xfeb51000 [0xfeb510ff]                                                                                                                                                                       
    bar 6: mem at 0xffffffffffffffff [0x3fffe] 

и мое устройство хранения как:

    bus: virtio-bus
      type virtio-pci-bus
      dev: virtio-blk-device, id ""
        drive = "virtio0"
        logical_block_size = 512 (0x200)
        physical_block_size = 512 (0x200)
        min_io_size = 0 (0x0)
        opt_io_size = 0 (0x0)
        discard_granularity = 4294967295 (0xffffffff)
        write-cache = "auto"
        share-rw = false
        rerror = "auto"
        werror = "auto"
        cyls = 1040 (0x410)
        heads = 16 (0x10)
        secs = 63 (0x3f)
        serial = ""
        config-wce = true
        scsi = false
        request-merging = true
        num-queues = 1 (0x1)
        queue-size = 128 (0x80)
        iothread = ""
        indirect_desc = true
        event_idx = true
        notify_on_empty = true
        any_layout = true
        iommu_platform = false

и другие устройства PCI как:

  dev: edu, id ""
    addr = 06.0
    romfile = ""
    rombar = 1 (0x1)
    multifunction = false
    command_serr_enable = true
    x-pcie-lnksta-dllla = true
    x-pcie-extcap-init = true
    class Class 00ff, addr 00:06.0, pci id 1234:11e8 (sub 1af4:1100)
    bar 0: mem at 0xfea00000 [0xfeafffff]

Протестировано в QEMU v2.12.

Если у вас есть доступ к гостю, почему бы не использовать что-то вроде lspci. Если вы пытаетесь получить это от хоста, вам нужно выяснить, какие значения по умолчанию использует qemu. Это будет зависеть от того, какую версию вы используете.

Я бы посоветовал вам использовать libvirt вместо ручного запуска qemu. Это даст вам лучшие API для гостей и на самом деле предоставит вам эту информацию в разумном виде (вы можете просто использовать virsh dumpxml сбросить конфигурацию гостя, включая все подключенные аппаратные устройства).