Проброс сетевой карты Intel i210 в виртуальную машину (DDA)



  • Привет все. Не знаю на сколько попал в ветку или вообще форум, но не пинайте. Еще я не знаком с FreeBSD ни разу. Вопрос в следующем. Есть сервер, Hyper-V. Не получается запустить сетевую карту Intel I210 в pfSense. В данный момент она у меня работает, если на сервере создаю внешний виртуальный коммутатор. Но я хочу, пробросить его в виртуалку через DDA(Discrete Device Assignment), так как она у меня ни где кроме этой ВМ не используется. Вообщем делаю все по инструкции от Microsoft, и вроде все успешно проходит и сетевая карта назначается. Но при запуске pfSense, ее там нет, я уже много чего перепробовал. Подскажите в какую сторону копать. Немного входных данных:

    Хост: Hyper-V Server 2019 (на базе ASRock X470D4U)
    OS виртуалки: pfSense 2.4.4 (AMD64)
    Сетевая карта: Intel I210 (встроенная в материнку)

    Что уже попробовал и ход моих мыслей. Не найдя сетевую карту в системе, начал искать ошибки при запуске системы. Нашел следующие:

    igb0: <Intel(R) PRO/1000 Network Connection, Version 2.5.3-k> at device 0.0 on pci0
    igb0: Unable to map MSIX table
    igb0: Using an MSI interrupt
    igb0: Setup of Shared code falled
    device_attach: igb0 attach returned 6

    Проверил проброс в другую ВМ, на Windows 8.1. Там все сработало как надо, сетевая карта определилась как Intel (не виртуальный адпатер) и даже появился интернет с нее. Предположил что проблема в нехватки драйверов (хотя pfSense, вроде должен поддерживать intel’овские карты), скачал драйвера с офф. сайта для FreeBSD. Не смог собрать их на pfSense, по этому собрал их на другой машине с FreeBSD версией 11.2. Собралось без ошибок и я скопировал модуль ядра (if_igb.ko) на pfSense, положил в /boot/kernel/. Но не смог его запустить, появлялась ошибка:

    kldload: can’t load if_igb: module already loaded or in kernel

    Помучившись и не поняв почему так, просто добавил модуль в автозагрузку и он нормально подгрузился после перезагрузки. Он появляется в kldstat, но сетевая карта так и не появилась в системе. И при загрузке все те же сообщения про эту карту. Мне кажется, мне надо как-то сообщить системе, чтоб она использовало модуль ядра if_igb, но пока не знаю как это сделать. Буду благодарен за помощь.



  • Добрый
    @programmer_86
    Intel I210 еще с версии 2.2.x поддерживается https://forum.netgate.com/topic/98912/are-the-i210at-nics-supported-and-working/
    Разбирайтесь с "чудом" по имени Гипер-в. В БИОС vt-d (именно d) включено? БИОС обновляли?

    Зы. Еще раз убеждаюсь, что сие поделие (гипер-в) только для Вин ОС толком подходит. То-то для своего Ажура MS пользует никсы, а не свой собственный "продуХт".
    Зы2. Собственно, Вам https://www.linux.org.ru/forum/linux-hardware/15559080 и посоветовали , что пользовать вместо гипер-в.
    Могу помочь с настройкой Proxmox VE (KVM), если появится желание https://forum.netgate.com/topic/120102/proxmox-ceph-zfs-pfsense-и-все-все-все/

    Зы3. Про гипер-в + SR-IOV:
    https://community.mellanox.com/s/article/howto-configure-sr-iov-for-connectx-3-with-hyper-v--ethernet-x
    Внимательно со слов "7. Verify that SR-IOV is supported" и ниже.

    https://www.veeam.com/blog/ru/how-to-configure-hyperv-virtual-switch.html

    https://docs.microsoft.com/en-us/windows-server/virtualization/hyper-v/hyper-v-feature-compatibility-by-generation-and-guest

    Single root input/output virtualization (SR-IOV) - 64-bit Windows guests, starting with Windows Server 2012 and Windows 8.

    Может инф-ция и устарела, но bsd в списке не видно (



  • @programmer_86
    Здр
    драйвер ругается на что-то.
    На что конкретно , сложно сказать

    В документации на драйвер есть информация о нюансах настройки работы сетевой карты с HYPER-V



  • @Konstanti А как понять, что он подтянул именно мой скомпилированный драйвер? Мне просто хотяб понять, подтянул он его или нет



  • @werter Спасибо за ответ. Мне там тоже ответили про SR-IOV, но intel i210 не поддерживает SR-IOV. Мне нужен просто прямой проброс, как устройства целиком. Почитаю вечером про Proxmox VE (KVM)



  • @programmer_86
    А смысл Ваш драйвер тянуть ?
    Тот что встроен в ядро, вполне работоспособен
    По-моему , проблема не в драйвере , а в настройках гипервизора (но это мое мнение)
    Если знакомы с CИ , то можно поизучать 2 файла в исходниках драйвера
    e1000_api.c и if_igb.c
    во втором файле есть вот такой кусок кода

    /* Do Shared Code initialization */
    	if (e1000_setup_init_funcs(&adapter->hw, TRUE)) {
    		device_printf(dev, "Setup of Shared code failed\n");
    		error = ENXIO;
    		goto err_pci;
    	}
    

    а в первом листинг функции
    s32 e1000_setup_init_funcs(struct e1000_hw *hw, bool init_device)
    и все ошибки , какие генерит эта функция
    мб это Вам поможет

    что касается Вашего вопроса

    dmesg | grep igb
    igb0: <Intel(R) PRO/1000 Network Connection, Version - 2.5.3-k> port 0x1000-0x101f mem 0xdff60000-0xdff7ffff,0xdffe4000-0xdffe7fff irq 18 at device 20.0 on pci0
    igb0: Using MSIX interrupts with 3 vectors
    igb0: Ethernet address: 00:08:a2:0a:ff:72
    igb0: Bound queue 0 to cpu 0
    igb0: Bound queue 1 to cpu 1
    igb0: netmap queues/slots: TX 2/4096, RX 2/409
    


  • @programmer_86

    Вкл ли в БИОС vt-d? Это важно. БИОС свежий?



  • @werter Добрался до сервера, проверил, такой опции там нету. Я так понимаю она для intel, у меня AMD и мне надо было искать AMD-V, но такой тоже не нашел. Есть SVM Mode (в описании написано что-то про виртуализацию), он включен. Так же включен SR-IOV.



  • @programmer_86
    Да-да, я как тот Зоркий Глаз, на 3-ий день заметил ) Все верно. Вам нужно вкл. SVM Mode, IOMMU и можно SR-IOV.
    Матплата у вас знатная https://www.asrockrack.com/general/productdetail.asp?Model=X470D4U#Specifications и умеет
    PCIE6: Gen3 x16 link (splittable in x4/4/4/4). Что это дает? Можно купить (в будущем) вот такое JEYI iHyper SSD 4x M.2 NVMe to PCIe Adapter (JP84A) или ASRock Ultra Quad M.2 Card + 4 шт Silicon Power P34A80 (объем по вкусу) и получится оч. и оч. шустро )



  • @werter Простите, забыл ответить про BIOS, стоит последняя версия 3.30. В настройках еще для IOMMU поменял значение с Auto на Enabled. Перепроверил снова, не помогло. Про информацию с 4 m2, спасибо, про такое даже не думал)



  • @Konstanti Спасибо за информацию. Проверил мой драйвер реально подтянулся. Включил отладочную всю отладочную информацию в кодах и заново собрал драйвер. Получил следующий вывод при запуске:

    pcib0: <Hyper-V PCI Express Pass Through> on vmbus0
    pci0: <PCI bus> on pcib0
    igb_probe: begin
    igb_probe: begin
    igb_probe: begin
    igb0: <Intel(R) PRO/1000 Network Connection, Version - 2.5.9> at device 0.0 on pci0
    igb_attach: begin
    e1000_set_mac_type
    igb0: Unable to map MSIX table
    igb0:  Using an MSI interrupt
    e1000_set_mac_type
    e1000_init_mac_ops_generic
    e1000_init_phy_ops_generic
    e1000_init_nvm_ops_generic
    e1000_init_function_pointers_82575
    e1000_init_mac_params_82575
    e1000_init_mac_ops_generic
    e1000_init_nvm_params_i210
    e1000_init_nvm_params_82575
    e1000_get_flash_presence_i210
    e1000_init_phy_params_82575
    e1000_reset_mdicnfg_82580
    e1000_get_phy_id_82575
    e1000_get_phy_id
    e1000_read_phy_reg_gs40g
    e1000_acquire_phy_base
    e1000_acquire_swfw_sync_i210
    e1000_get_hw_semaphore_i210
    e1000_put_hw_semaphore_generic
    e1000_write_phy_reg_mdic
    MDI Write did not complete
    e1000_release_phy_base
    e1000_release_swfw_sync_i210
    e1000_get_hw_semaphore_i210
    e1000_put_hw_semaphore_generic
    PHY Initialization Error
    igb0: Setup of Shared code failed
    device_attach: igb0 attach returned 6
    


  • @programmer_86
    Здр
    Листинг показывает ошибку чтения/записи данных из MDI control register. Файл e1000_phy.c
    При этом документация freebsd говорит, что такого быть не должно, и в случае ошибки система должна впадать в панику.
    Почему происходит ошибка, сказать не могу. Знаний не хватает.

    Вопрос для самообразования - как включили вывод отладочной информации?



  • @programmer_86
    Не тратьте время на гипер-в. Есть вероятность, что это не последняя проблема. На linux (proxmox - это debian c модифиц. ядром от убунты) заработает без танцев с 99% вероятностью. Попробуйте альтернативу. Не понравится - вернетесь.



  • @Konstanti Отадку включил в коде, в файле e1000_osdep.h:

    /* Enable/disable debugging statements in shared code */
    #define DBG		0
    

    И еще нашел в файле if_igb.h:

    /* Defines for printing debug information */
    #define DEBUG_INIT  0
    #define DEBUG_IOCTL 0
    #define DEBUG_HW    0
    

    Ну а дальше опять пересобрал драйвер на FreeBSD и подсунул pfSense



  • @werter Уговорили, сегодня попробую поставить и отпишу по результатам))



  • @programmer_86
    Спс
    Да , вижу
    в этом же файле , собственно

    /* Register READ/WRITE macros */
    
    #define E1000_READ_REG(hw, reg) \
        bus_space_read_4(((struct e1000_osdep *)(hw)->back)->mem_bus_space_tag, \
            ((struct e1000_osdep *)(hw)->back)->mem_bus_space_handle, \
            E1000_REGISTER(hw, reg))
    
    #define E1000_WRITE_REG(hw, reg, value) \
        bus_space_write_4(((struct e1000_osdep *)(hw)->back)->mem_bus_space_tag, \
            ((struct e1000_osdep *)(hw)->back)->mem_bus_space_handle, \
            E1000_REGISTER(hw, reg), value)
    

    Описание этого безобразия
    https://www.freebsd.org/cgi/man.cgi?query=bus_space&sektion=9&manpath=FreeBSD+6.0-RELEASE

    These functions will never ail.  If they would fail (e.g. because of an argument error), 
    that indicates a software bug which should cause a panic. In that case, they will never return.
    


  • @programmer_86
    Для zfs не нужен железный raid (даже вреден) Если у вас он присутствует - развалите его перед установкой proxmox.
    При установке proxmox пользуйте ZFS , даже если у вас ОДИН диск (выберите zfs raid 0 в установщике).
    Лучше бы 4 диска и ZFS RAID 10, но это просто хотелки )

    Если чего - пишите в ЛС\чат.



  • @werter Установил ProxMox, начал настраивать все под PCI(e) Passthrough и кажется нашел камень преткновения из-за чего все это не работало. Как написано в инструкции то устройства должны находиться в разных IOMMU группах. У меня это условие не выполнено, очень жаль... О чем-то таком меня предупреждал Hyper-V где-то в начале, но я не придал этому значения. 2b94f078-c52f-4d80-9991-34530ea1545e-image.png



  • @programmer_86
    Проблема с IOMMU группами решаема. Отписал в чат.

    Зы. Выложу тут. "Страждущий" так и не ответил.

    1. Вкл в БИОС ВСЁ, что касается вирт-ции. Для АМД - это SVM, IOMMU. Для Интел - это vt-x, vt-d.
    2. Под root-ом:
    [ ! -d /etc/default/grub.d ] && mkdir -pv /etc/default/grub.d
    if dmesg | grep -E -q "(IOMMU|DMAR)"; then
      grep -iqw "vmx" /proc/cpuinfo && echo 'GRUB_CMDLINE_LINUX_DEFAULT="$GRUB_CMDLINE_LINUX_DEFAULT intel_iommu=on"' > /etc/default/grub.d/iommu.cfg
      grep -iqw "svm" /proc/cpuinfo && echo 'GRUB_CMDLINE_LINUX_DEFAULT="$GRUB_CMDLINE_LINUX_DEFAULT amd_iommu=on iommu=pt"' > /etc/default/grub.d/iommu.cfg
      echo 'GRUB_CMDLINE_LINUX_DEFAULT="$GRUB_CMDLINE_LINUX_DEFAULT pcie_acs_override=downstream,multifunction"' > /etc/default/grub.d/pcie_acs_override.cfg
    fi
    update-grub
    reboot
    

    Т.о. мы "развалили" IOMMU группу и теперь можно пробрасывать сет. карту (и не только) в ВМ.

    Установить Proxmox VE - это только половина дела. Его требуется "допиливать" под себя.



  • @werter Вчера лег рано и не увидел ваших сообщений. Сегодня все проверил, дополнительно почитал информацию и все заработало. Большое спасибо @werter, вы очень помогли. Сейчас все работает как часы!)))



  • @programmer_86
    При создании ВМ с пф выбирайте Virtio-SCSI в кач-ве контроллера hdd и scsi как жесткий диск.
    Обязательно галку на Discard в настройках hdd поставьте (+ после нужны еще кое-какие манипуляции в самой ВМ с пф для того, чтобы заработал Discard).
    Сетевые тоже virtio. И не забывать откл. HW offload в настройках сети на пф.
    В самом PVE вместо Linux bridge для сети рекомендую установить и пользовать Open vswitch. Он гораздо гибче в плане работы с сетью (особенно при работе с VLAN).


Log in to reply