[РЕШЕНО] Проблема c запуском Cisco vIOS в QEMU

Столкнулся с проблемой запуска Cisco IOSv_15.5(3)M в QEMU. Запускаю следующей командой:

$ qemu-system-x86_64 \
  -m 1024 \
  -nographic \
  -smp cores=2,sockets=8 \
  -enable-kvm \
  -drive file="IOSv-L3.qcow2",if=ide \
  -net socket,connect=localhost:9002,vlan=10 \
  -net nic,vlan=10,model=e1000,macaddr=00:01:00:ff:03:01

Версии ОС и QEMU:

$ uname -a
Linux osiris 4.6.4-1-ARCH #1 SMP PREEMPT Mon Jul 11 19:12:32 CEST 2016 x86_64 GNU/Linux

$ qemu-system-x86_64 --version
QEMU emulator version 2.6.0, Copyright (c) 2003-2008 Fabrice Bellard

На выходе получаю следующее сообщение (последние строки крутятся в цикле и загрузка на этом останавливается)

Cisco IOSv (revision 1.0) with  with 1021185K/25600K bytes of memory.Installed image archive

Processor board ID 9GVPXCRKO5K8655EEJU85
1 Gigabit Ethernet interface
DRAM configuration is 72 bits wide with parity disabled.
256K bytes of non-volatile configuration memory.
2097144K bytes of ATA System CompactFlash 0 (Read/Write)
0K bytes of ATA CompactFlash 1 (Read/Write)
0K bytes of ATA CompactFlash 2 (Read/Write)
0K bytes of ATA CompactFlash 3 (Read/Write)

e1000: Reading register at offset: 0x00002410. It is not fully implemented.
e1000: Reading register at offset: 0x00002418. It is not fully implemented.
e1000: Reading register at offset: 0x00002410. It is not fully implemented.
e1000: Reading register at offset: 0x00002418. It is not fully implemented.

Гугл ничего внятного найти не смог. Какие у кого нибудь будут идеи по этому поводу?
artes
последние строки крутятся в цикле и загрузка на этом останавливается
artes
Какие у кого нибудь будут идеи по этому поводу?
Похоже ты уже с этой проблемой бьешся не один месяц …..
Судя по логам можно предположить, что проблема в драйвере e1000 , похоже в чтении регистров. Если посмотреть параметры этого драйвера, то там есть параметр debug
$ modinfo -p e1000 | grep debug
debug:Debug level (0=none,...,16=all) (int)
Можно попробвать загрузиться с этим параметром, может подкинет больше информации
Ну и всегда имеется тяжелая артилерия - strace, sysdig - то же могут подкинуть информации и для понимания и для дальнейшего гугления ...
Ошибки не исчезают с опытом - они просто умнеют
Загрузил модуль e1000 с параметром debug=16, но не уверен что debug активировался исходя из вывода команды systool

$ sudo modprobe e1000 debug=16
$ systool -v -m e1000
Module = "e1000"

  Attributes:
    coresize            = "122880"
    initsize            = "0"
    initstate           = "live"
    refcnt              = "0"
    srcversion          = "9695902D12379E95A2112CA"
    taint               = ""
    uevent              = <store method only>
    version             = "7.3.21-k8-NAPI"

  Parameters:
    copybreak           = "256"

  Sections:
    .bss                = "0xffffffffa0817f80"
    .data               = "0xffffffffa0816000"
    .data..read_mostly  = "0xffffffffa0817c18"
    .data.unlikely      = "0xffffffffa0817c1c"
    .exit.text          = "0xffffffffa080fa39"
    .gnu.linkonce.this_module= "0xffffffffa0817c40"
    .init.text          = "0xffffffffa07bd000"
    .note.gnu.build-id  = "0xffffffffa0810000"
    .parainstructions   = "0xffffffffa0814ab8"
    .rodata             = "0xffffffffa0810040"
    .rodata.str1.1      = "0xffffffffa08120c0"
    .rodata.str1.8      = "0xffffffffa0812ca8"
    .smp_locks          = "0xffffffffa0812c10"
    .strtab             = "0xffffffffa07c1e70"
    .symtab             = "0xffffffffa07be000"
    .text               = "0xffffffffa07fc000"
    .text.unlikely      = "0xffffffffa080f426"
    __bug_table         = "0xffffffffa0814b74"
    __mcount_loc        = "0xffffffffa0814e80"
    __param             = "0xffffffffa0814c28"
    __verbose           = "0xffffffffa08169a8"

Тем не менее всё равно решил попробовать. Внес небольшие изменения в схему:
1. Привязал сетевой интерфейс Cisco к tap0 (схема стабильная и не раз опробованная)
2. Поменял на более новый vIOS (в надежде что данная проблема уйдет)

$ brctl show
bridge name     bridge id               STP enabled     interfaces
br0             8000.002354ed7e4c       no              eth0
                                                        tap0
$ qemu-system-x86_64 \
  -m 1024 \
  -nographic \
  -smp cores=2,sockets=8 \
  -enable-kvm \
  -drive file="vios-adventerprisek9-m-15.6.2T.qcow2",if=virtio \
  -net nic,vlan=0,macaddr=00:aa:00:00:03:01,model=e1000 \
  -net tap,ifname=tap0,vlan=0,script=no,downscript=no

К сожаления ничего не изменилось и проблема осталась

Booted IOSv. Boot args: [/vios-adventerprisek9-m]

Smart Init is enabled

              Restricted Rights Legend

Use, duplication, or disclosure by the Government is
subject to restrictions as set forth in subparagraph
(c) of the Commercial Computer Software - Restricted
Rights clause at FAR sec. 52.227-19 and subparagraph
(c) (1) (ii) of the Rights in Technical Data and Computer
Software clause at DFARS sec. 252.227-7013.

           cisco Systems, Inc.
           170 West Tasman Drive
           San Jose, California 95134-1706
Cisco IOS Software, IOSv Software (VIOS-ADVENTERPRISEK9-M), Version 15.6(2)T, RELEASE SOFTWARE (fc2)
Technical Support: http://www.cisco.com/techsupport
Copyright (c) 1986-2016 by Cisco Systems, Inc.
Compiled Tue 22-Mar-16 16:19 by prod_rel_team
This product contains cryptographic features and is subject to United
States and local country laws governing import, export, transfer and
use. Delivery of Cisco cryptographic products does not imply
third-party authority to import, export, distribute or use encryption.
Importers, exporters, distributors and users are responsible for
compliance with U.S. and local country laws. By using this product you
agree to comply with applicable laws and regulations. If you are unable
to comply with U.S. and local laws, return this product immediately.

A summary of U.S. laws governing Cisco cryptographic products may be found at:
http://www.cisco.com/wwl/export/crypto/tool/stqrg.html

If you require further assistance please contact us by sending email to
[email protected].

Cisco IOSv (revision 1.0) with  with 1021177K/25600K bytes of memory.Installed image archive
e1000: Reading register at offset: 0x00002410. It is not fully implemented.
e1000: Reading register at offset: 0x00002418. It is not fully implemented.

Processor board ID 95F1YHINODNGKNAH3GLYQ
1 Gigabit Ethernet interface
DRAM configuration is 72 bits wide with parity disabled.
256K bytes of non-volatile configuration memory.
2097152K bytes of ATA System CompactFlash 0 (Read/Write)
0K bytes of ATA CompactFlash 1 (Read/Write)
0K bytes of ATA CompactFlash 2 (Read/Write)
0K bytes of ATA CompactFlash 3 (Read/Write)
e1000: Reading register at offset: 0x00002410. It is not fully implemented.
e1000: Reading register at offset: 0x00002418. It is not fully implemented.
e1000: Reading register at offset: 0x00002410. It is not fully implemented.
e1000: Reading register at offset: 0x00002418. It is not fully implemented.

И на всякий случай, вдруг полезно будет

$ dmesg
...
[  523.701545] e1000: Intel(R) PRO/1000 Network Driver - version 7.3.21-k8-NAPI
[  523.701548] e1000: Copyright (c) 1999-2006 Intel Corporation.
[  554.652536] IPv6: ADDRCONF(NETDEV_CHANGE): tap0: link becomes ready
[  554.652575] br0: port 2(tap0) entered blocking state
[  554.652577] br0: port 2(tap0) entered forwarding state
[  555.234045] kvm: zapping shadow pages for mmio generation wraparound
[  555.234823] kvm: zapping shadow pages for mmio generation wraparound
[  620.832080] br0: port 2(tap0) entered disabled state
[  701.664149] br0: port 2(tap0) entered blocking state
[  701.664154] br0: port 2(tap0) entered forwarding state
[  702.144847] kvm: zapping shadow pages for mmio generation wraparound
[  702.145724] kvm: zapping shadow pages for mmio generation wraparound
[  750.833637] br0: port 2(tap0) entered disabled state

Может нужно какие нибудь манипуляции с модулями kvm и kvm_intel?

$ systool -v -m kvm
Module = "kvm"

  Attributes:
    coresize            = "499712"
    initsize            = "0"
    initstate           = "live"
    refcnt              = "1"
    taint               = ""
    uevent              = <store method only>

  Parameters:
    allow_unsafe_assigned_interrupts= "N"
    halt_poll_ns        = "400000"
    halt_poll_ns_grow   = "2"
    halt_poll_ns_shrink = "0"
    ignore_msrs         = "N"
    kvmclock_periodic_sync= "Y"
    lapic_timer_advance_ns= "0"
    min_timer_period_us = "500"
    mmu_audit           = "N"
    tsc_tolerance_ppm   = "250"
    vector_hashing      = "Y"

$ systool -v -m kvm_intel
Module = "kvm_intel"

  Attributes:
    coresize            = "184320"
    initsize            = "0"
    initstate           = "live"
    refcnt              = "0"
    taint               = ""
    uevent              = <store method only>

  Parameters:
    emulate_invalid_guest_state= "Y"
    enable_apicv        = "N"
    enable_shadow_vmcs  = "N"
    ept                 = "Y"
    eptad               = "N"
    fasteoi             = "Y"
    flexpriority        = "Y"
    nested              = "Y"
    ple_gap             = "0"
    ple_window_grow     = "2"
    ple_window_max      = "1073741823"
    ple_window_shrink   = "0"
    ple_window          = "4096"
    pml                 = "N"
    unrestricted_guest  = "N"
    vmm_exclusive       = "Y"
    vpid                = "Y"
artes
Загрузил модуль e1000 с параметром debug=16, но не уверен что debug активировался исходя из вывода команды systool
Параметры загруженного модуля лучше смотреть в /sys/module/.../e1000/ parameters/, но иногда там этих параметров и нет — тогда лучше смотреть загружаемый параметр при загрузке модуля с опцией v
modprobe -r e1000
modprobe -v e1000 debug=16
Но глядя на
artes
br0: port 2(tap0) entered disabled state
можно предположить, что дело не в модуле, а в настройках интерфейса…...
Ошибки не исчезают с опытом - они просто умнеют
Сделал как Вы посоветовали.
$ sudo modprobe -r e1000
$ sudo modprobe -v e1000 debug=16
insmod /lib/modules/4.6.4-1-ARCH/kernel/drivers/net/ethernet/intel/e1000/e1000.ko.gz debug=1

Ничего не изменилось
$ cat /sys/module/e1000/parameters/copybreak
256
$ ls -al /sys/module/e1000/parameters/
-rw-r--r-- 1 root root 4096 авг 11 23:18 copybreak

$ systool -v -m e1000
Module = "e1000"

  Attributes:
    coresize            = "122880"
    initsize            = "0"
    initstate           = "live"
    refcnt              = "0"
    srcversion          = "9695902D12379E95A2112CA"
    taint               = ""
    uevent              = <store method only>
    version             = "7.3.21-k8-NAPI"

  Parameters:
    copybreak           = "256"

[  750.833637] br0: port 2(tap0) entered disabled state
Это когда я процесс qemu убиваю, тогда и появляется эта запись.
С tap-интерфейсами режим однозначно рабочий. Пробовал его на ios-xr, juniper vsrx, а так же со всеми виртуальными машинами. Проблема вылезла только на vios.
Причем есть одна особенность, как только мне почти вслепую получается из vios выключить интерфейс, сообщения прекращаются, но возобновляются при обратном его включении.

Может проблема в этих сообщениях ?
[  702.144847] kvm: zapping shadow pages for mmio generation wraparound
[  702.145724] kvm: zapping shadow pages for mmio generation wraparound
Но пока разумного объяснения не нашел
Хотел понять — откуда выскакивает «It is not fully implemented» - для чего запустил поиск данной строки в файлах исходников Linux …. и ничего, что относится к данной проблеме, не нашлось..... (нашлась всего одна строчка в файле linux-х.х.х/drivers/scsi/arm/acornscsi.c: ....)
Ошибки не исчезают с опытом - они просто умнеют
в файле drivers/net/ethernet/intel/e1000/e1000_hw.c есть упоминания регистров, которые фигурируют в сообщениях, но больше понять и найти ничего не смог.
. . .
#define E1000_RDFH     0x02410  /* RX Data FIFO Head - RW */
#define E1000_RDFT     0x02418  /* RX Data FIFO Tail - RW */
. . .
#define E1000_82542_RDFH     E1000_RDFH
#define E1000_82542_RDFT     E1000_RDFT
. . .
artes
в файле drivers/net/ethernet/intel/e1000/e1000_hw.c есть упоминания регистров, которые фигурируют в сообщениях, но больше понять и найти ничего не смог.
Задело, что не могу найти данную строку в исходниках …..
Начал с модуля e1000, он вшит в ядро, нашел, распаковал.... ничего там нет …. Но такого быть не может, если выскакивает сообщение, значит ошибка обрабатывается … нужно только найти кто это обрабатывает ….
Дал в инете расширенный поиск ….. и напал на один патч, в котором и выскочила данная строчка (... в принципе можно было и допереть, что дело в qemu, а не в модуле .....)
 if (mac_reg_access[index] & MAC_ACCESS_PARTIAL) {
+                DBGOUT(GENERAL, "Reading register at offset: 0x%08x. "
+                       "It is not fully implemented.\n", index<<2);
и немного прояснилось …. у меня нет пакета qemu, пришлось скачать …. а после распаковки и анализа бинарника /usr/bin/qemu-system-i386 (/usr/bin/qemu-system-x86_64) нашел в нем нужную строчку (за не имением исходников пришлось применять специнструмент....)
$ rabin2 -z ~/TEMP/usr/bin/qemu-system-i386 | grep 'It is not fully implemented'
vaddr=0x004cc6b0 paddr=0x004cc6b0 ordinal=9872 sz=76 len=75 section=.rodata type=ascii string=e1000: Writing to register at offset: 0x%08x. It is not fully implemented.\n
vaddr=0x004cc6fc paddr=0x004cc6fc ordinal=9873 sz=73 len=72 section=.rodata type=ascii string=e1000: Reading register at offset: 0x%08x. It is not fully implemented.\n
Посмотрим один из найденных адресов 0x004cc6b0 …..
$ r2 ~/TEMP/usr/bin/qemu-system-i386
 -- Disassemble in intel syntax with 'e asm.syntax = intel'.
[0x000e28dc]> pd @0x004cc6b0
            ;-- str.e1000:_Writing_to_register_at_offset:_0x_08x._It_is_not_fully_implemented._n:
            0x004cc6b0     .string "e1000: Writing to register at offset: 0x%08x. It is not fully implemented.\\n" ; len=76
            ;-- str.e1000:_Reading_register_at_offset:_0x_08x._It_is_not_fully_implemented._n:
            0x004cc6fc     .string "e1000: Reading register at offset: 0x%08x. It is not fully implemented.\\n" ; len=73
            0x004cc745      0000           add byte [eax], al
            0x004cc747  ~   006531         add byte [ebp + 0x31], ah
            ;-- str.e1000:_TCP_segmentation_error_n:
            0x004cc748     .string "e1000: TCP segmentation error\\n" ; len=31
       …..... и так далее ….. 
Ну смотреть это бесполезно — нужно обращаться к исходникам, чтобы понять причину, но, главное, излечить это вряд ли удастся …..
Ошибки не исчезают с опытом - они просто умнеют
Исходный код qemu я брал с офф. сайта. Точнее пробовал пересобрать пакет через abs, играясь параметрами cflags, а она собственно его скачивает с офф. сайта.

Нашел функцию которая выводит это сообщение в файле qemu-2.6.0/hw/net/e1000.c
static uint64_t
e1000_mmio_read(void *opaque, hwaddr addr, unsigned size)
{
    E1000State *s = opaque;
    unsigned int index = (addr & 0x1ffff) >> 2;

    if (index < NREADOPS && macreg_readops[index]) {
        if (!(mac_reg_access[index] & MAC_ACCESS_FLAG_NEEDED)
            || (s->compat_flags & (mac_reg_access[index] >> 2))) {
            if (mac_reg_access[index] & MAC_ACCESS_PARTIAL) {
                DBGOUT(GENERAL, "Reading register at offset: 0x%08x. "
                       "It is not fully implemented.\n", index<<2);
            }
            return macreg_readops[index](s, index);
        } else {    /* "flag needed" bit is set, but the flag is not active */
            DBGOUT(MMIO, "MMIO read attempt of disabled reg. addr=0x%08x\n",
                   index<<2);
        }
    } else {
        DBGOUT(UNKNOWN, "MMIO unknown read addr=0x%08x\n", index<<2);
    }
    return 0;
}

На С писал очень давно, практически в другой жизни, но насколько я понял какая то проблема с mac-адресом?
artes
насколько я понял какая то проблема с mac-адресом?
Сам код совпадает с патчем, приведенным выше, а в начале патча идет пояснение … толковать перевод остерегаюсь, так как спецом в этой части не являюсь и смысл понял частично …..... Но понял одно, проблему собственными силами не решить...
Похоже патч устраняет не все проблемы …..
UPD … мне кажется, что вся проблема в типе данных uint8_t, который используется (а это завязано и на mac-адрес и на регистры), но могу и ошибаться ...
Ошибки не исчезают с опытом - они просто умнеют
 
Зарегистрироваться или войдите чтобы оставить сообщение.