Вопрос или проблема
У меня свежая установка Ubuntu с USB. Когда я загружаю ПК, он сразу переходит к GNU Grub, и при выборе Ubuntu я получаю следующие сообщения.
[Firmware Bug]: AMD-Vi: IOAPIC[0] not in IVRS table
[Firmware Bug]: AMD-Vi: No southbridge IOAPIC found in IVRS table
AMD-Vi: Disabling interrupt remapping
Я могу попасть на рабочий стол Ubuntu через “Дополнительные параметры для Ubuntu” > “Ubuntu, с Linux 4.2.0-30-generic (режим восстановления)” > “resume”, но процессор работает почти на 100% и это нестабильно.
Характеристики ПК:
-
AMD A6-6400K
-
MSI A68HI Mini ITX FM2+ Материнская плата
Я думаю, что причина постоянного использования процессора на 100% отличается от сообщения, которое вы видите.
О сообщении об ошибке
Теперь о AMD-Vi: IOAPIC[0] not in IVRS table
и AMD-Vi: No southbridge IOAPIC found in IVRS table
ошибках. Эти сообщения означают, что ваша настройка CMOS/BIOS настроена на включение IOMMU, но BIOS не имеет таблицы IVRS, которая описывает, какой адрес у IOMMU и контроллера SMBus. IVRS = Структура отчета виртуализации ввода/вывода. См. также: http://support.amd.com/TechDocs/48882_IOMMU.pdf
Что такое IOMMU?
IOMMU — это аппаратный блок, который сегодня является частью процессора. Он позволяет сопоставить виртуальные адреса, видимые устройством, с физическими адресами.
Зачем нужен IOMMU?
- IOMMU обеспечивает лучшую безопасность и защищает ваш компьютер от некоторых атак, к которым могут иметь доступ через шины вроде PCIe и FireWire.
- Вы можете предоставить физическое устройство PCIe виртуальной машине (передача PCI).
- Это требуется для SR-IOV (VNF)
Исправление “AMD-Vi: IOAPIC[0] not in IVRS table”
- Обновите прошивку материнской платы
Правильное исправление должно быть предоставлено производителем оборудования материнской платы. Если у вас есть обновление BIOS/прошивки для вашей материнской платы, установите его, так как это может решить проблему. К сожалению, для моей материнской платы (Asus Crosshair V Formula) IVRS сломана даже в последнем обновлении BIOS/прошивки (версия 1703, дата выпуска: 17.10.2012).
- Обходной путь в Linux
Если производитель MB не предлагает исправления, вы можете исправить это в Linux, указав в параметрах запуска ядра, где расположены эти устройства, используя параметр ivrs_ioapic
.
Вот шаги, чтобы сделать это. Более подробно см. здесь: https://ubuntuforums.org/showthread.php?t=2254677
Загрузите свое ядро, добавив amd_iommu_dump=1
в параметры ядра. Вы можете сделать это через меню grub во время загрузки.
В журнале ядра вы увидите несколько строк типа:
$ dmesg |grep 'DEV_SPECIAL(IOAPIC\|not in IVRS table'
[ 0.133756] AMD-Vi: DEV_SPECIAL(IOAPIC[0]) devid: 00:14.0
[ 0.133995] AMD-Vi: DEV_SPECIAL(IOAPIC[255]) devid: 00:00.1
[ 0.134116] [Firmware Bug]: AMD-Vi: IOAPIC[5] not in IVRS table
[ 0.134235] [Firmware Bug]: AMD-Vi: IOAPIC[6] not in IVRS table
$
Запишите индексы из IOAPIC
. В этом случае они 5
и 6
. Обратите внимание на devid, где 00:14.0
правильно, а 00:00.1
неправильно.
Найдите адрес шины для этих устройств и запишите адреса (00:00.2
и 00:14.0
)
$ lspci -nn | egrep "SMBus | IOMMU"
00:00.2 IOMMU [0806]: Advanced Micro Devices, Inc. [AMD/ATI] RD890S/RD990 I/O Memory Management Unit (IOMMU) [1002:5a23]
00:14.0 SMBus [0c05]: Advanced Micro Devices, Inc. [AMD/ATI] SBx00 SMBus Controller [1002:4385] (rev 42)
$
Теперь добавьте в параметры ядра: ivrs_ioapic[5]=00:14.0 ivrs_ioapic[6]=00:00.2
, где индекс 5
и 6
были найдены в выводе dmesg, а значения взяты из вывода lspci. Новые версии ядра требуют нового синтаксиса: ivrs_ioapic=5@0000:00:14.0 ivrs_ioapic=6@0000:00:00.2
Вы можете сделать это постоянным, отредактировав файл /etc/default/grub
, затем запустите grub2-mkconfig -o /boot/grub2/grub.cfg
.
- Отключите IOMMU в конфигурации UEFI/BIOS
Отключение IOMMU дает небольшое повышение производительности. Но нежелательно отключать его для безопасности и стабильности системы. IOMMU требуется для некоторых настроек виртуализации (передача PCI, SR-IOV), и отключение его не является вариантом.
Я обновил прошивку своей материнской платы, и это, кажется, исправило проблему.
.
Ответ или решение
Ошибки, которые вы наблюдаете при загрузке Ubuntu, вызваны неправильным описанием IVRS (Input-Output Virtualization Reporting Structure) в прошивке вашего материнской платы. Это сообщение указывает на то, что IVRS таблица не содержит правильной информации о IOAPIC (Input-Output Advanced Programmable Interrupt Controller) и, возможно, других важных элементах, что приводит к отключению IOMMU (I/O Memory Management Unit).
Теория
IOMMU — это аппаратный блок, ставший частью современных процессоров, включая AMD. Его основная функция заключается в отображении виртуальных адресов, видимых устройством (например, PCIe-устройство), в физические адреса памяти. Это обеспечивает несколько важных преимуществ:
- Безопасность: IOMMU обеспечивает дополнительный уровень защиты от атак на уровне аппаратного обеспечения, например, через шины PCIe или FireWire.
- Виртуализация: Оно позволяет использовать PCI passthrough, что дает возможность виртуальным машинам напрямую управлять аппаратными устройствами.
- Современные технологии виртуализации: Например, SR-IOV (Single-Root I/O Virtualization), что требуется для более эффективной работы виртуализованных сетевых функций (VNF).
Когда в IVRS таблице нет полного или корректного представления об устройстве, связанном с IOMMU, система будет иметь проблемы с управлением прерываниями, что может вызывать нестабильность и высокую загрузку процессора.
Пример
Пример сообщения с ошибкой может выглядеть следующим образом:
[Firmware Bug]: AMD-Vi: IOAPIC[0] not in IVRS table
[Firmware Bug]: AMD-Vi: No southbridge IOAPIC found in IVRS table
AMD-Vi: Disabling interrupt remapping
Применение
1. Обновление прошивки материнской платы
Самым первым и, возможно, наилучшим решением будет обновить прошивку вашей материнской платы. Производители часто выпускают обновления для устранения известных проблем, и обновление BIOS/UEFI может решить проблему с IVRS таблицей. Однако не всегда производители предоставляют исправления для всех моделей.
2. Обходное решение в Linux
Если обновление прошивки не решает проблему, вы можете попробовать обойти эту проблему, вручную указав в Linux, где находятся необходимые устройства. Это делается с помощью параметра ядра ivrs_ioapic
.
Шаги:
- Во время загрузки в меню GRUB добавьте параметр
amd_iommu_dump=1
к параметрам загрузки ядра, чтобы получить больше информации об устройстве в логах ядра. - После загрузки системы выполните команду
dmesg
, чтобы собрать информацию и найдите строки, указывающие на проблемные устройства. - Используя команду
lspci -nn
, определите точные адреса этих устройств. - Измените параметры ядра, добавив, например,
ivrs_ioapic=5@0000:00:14.0 ivrs_ioapic=6@0000:00:00.2
, основываясь на информации, полученной в предыдущих шагах. - Чтобы сделать изменения постоянными, отредактируйте файл
/etc/default/grub
, добавив новую строчку в строку сGRUB_CMDLINE_LINUX
, затем выполнитеupdate-grub
для применения изменений.
3. Отключение IOMMU в BIOS/UEFI
Этот шаг можно рассматривать как крайний, так как отключение IOMMU может повысить риск безопасности и ограничить функциональность системы, связанной с виртуализацией. Тем не менее, если обновление BIOS и изменения в конфигурации Linux не привели к решению проблемы, отключение IOMMU может временно помочь избавиться от нагрузки на процессор и ошибок.
Вывод:
Проблемы с IVRS и IOMMU требуют тщательного подхода к диагностике и решению. Оптимальным будет обновление прошивки с последующими оптимизациями настроек Linux. Понимание функции IOMMU и его значимости для вашей системы станет основой для глубокого анализа и разрешения подобных проблем в будущем.