- Вопрос или проблема
- встроенный VGA используется только на ранних этапах загрузки
- выделенная графическая карта не показывает сообщения при загрузке с новыми ядрами
- настройка системы
- диагностический вывод
- Итак, в чем вопрос?
- Кратко
- Длинная версия
- Ответ или решение
- Введение
- Проблемы, с которыми вы столкнулись
- Анализ и диагностика
- Применение решения
- Заключение
- Рекомендации
Вопрос или проблема
В данный момент я настраиваю CUDA-рабочую станцию, работающую на Debian GNU/Linux.
Система оснащена двумя видеокартами nVidia (для CUDA), а также встроенным адаптером VGA.
В конечном итоге машина будет находиться в удаленном месте и управляться через IPMI, что означает, что я хотел бы использовать встроенный VGA в качестве основного устройства отображения (несмотря на то, что видеокарты nVidia имеют в общей сложности 8 выходов DP/HDMI, они не будут подключены; встроенный VGA также не будет подключен, но захватывается IPMI/BMC, чтобы я мог получить к нему доступ через KVM-over-IP).
Таким образом, мне нужно, чтобы консоль Linux framebuffer отображалась на VGA.
В настоящее время я сталкиваюсь с двумя проблемами:
встроенный VGA используется только на ранних этапах загрузки
После установки основного устройства вывода в BIOS на “встроенный” (с “выделенной графической карты”) встроенный VGA работает хорошо в ранней фазе загрузки: я вижу POST, могу получить доступ к BIOS, управлять загрузчиком UEFI (grub2
в моем случае) и запустить ОС. Ура!
Однако после этого вывод зависает, и я остаюсь с выводом grub2 (и ничем другим):
Загрузка Debian GNU/Linux
Загрузка Linux 6.1.0-5-amd64 ...
Загрузка первоначального ramdisk ...
И так остается до тех пор, пока система не выключится.
Это только проблема вывода, система загружается исправно (и я могу ssh
в машину и делать что угодно). Я также могу использовать прикрепленную USB-клавиатуру, чтобы войти через вход на tty1
и выдавать команды там… но экран остается замороженным (так что я не вижу, что я набираю и что отвечает система)
Я пробовал другие ядра (5.x, 6.x) и дистрибутивы (например, grml
, который использует isolinux вместо grub), но проблема сохраняется:
- я могу видеть загрузчик
- но как только начинает загружаться сама система, вывод зависает
Я пробовал добавлять noplymouth
, textonly
, text
и vga=ask
в командную строку ядра, но без успеха…
выделенная графическая карта не показывает сообщения при загрузке с новыми ядрами
Если я переключаюсь на использование одной из своих выделенных графических карт в качестве основного устройства (в BIOS), ситуация немного меняется.
С Debian/bullseye (текущей стабильной версией Debian) использование вывода с выделенной графикой работает безупречно. Однако, если я обновляю ядро до 6.x (либо с помощью Debian/bullseye-backports; либо обновлением до Debian/bookworm (будущая стабильная версия)), я больше не вижу никаких сообщений при загрузке или экрана входа.
Вместо этого мой экран только показывает это:
[ 2.418707] xhci_hcd 0000:23:00.0: инициализация 0000:23:00.0 не удалась, -16
[ 2.418805] xhci_hcd 0000:29:00.1: инициализация 0000:29:00.1 не удалась, -16
[ 2.418861] xhci_hcd 0000:29:00.3: инициализация 0000:29:00.3 не удалась, -16
/dev/nvme0n1p2: чистый, 78970/122003456 файлов, 8917355/487997184 блоков
Также я не могу переключаться на другие терминалы ((Ctrl+)Alt+F2). Но снова, ввод с клавиатуры фактически работает (только дисплей заморожен).
Я могу переключаться между рабочей консолью и неработающей, загружая ядро linux-5.x (работающее) или ядро linux-6.x (неработающее).
Несмотря на то что моя система оснащена двумя видеокартами nVidia, в данный момент не установлены выделенные (проприетарные) драйверы. Поэтому я вижу это поведение с чистой установкой Debian main
.
Тем не менее, в конечном итоге мне придется использовать Debian/bookworm (с ядром linux-6.x), поскольку мне нужны самые новые драйверы nVidia для использования карт CUDA. (и прежде чем вы спросите: проблема сохраняется даже если я установлю проприетарные драйверы).
Я не могу воспроизвести проблему на своем ноутбуке (который работает под управлением Debian/sid – таким образом имеет ядро 6.1.0-5-amd64; все tty работают как ожидалось) или на свежепоставленной ВМ.
ПРИМЕЧАНИЕ: У использования выделенной графической карты есть и другие недостатки: я не смогу получить доступ к ее выходу через IPMI/BMC, как только машина окажется в удаленном месте. Поэтому эта часть проблемы несколько академична…
настройка системы
компонент | название |
---|---|
материнская плата | ASUS Pro WS WRX80E-SAGE SE WIFI |
ЦП | AMD Ryzen Threadripper PRO 5965WX |
память | 132 ГБ |
встроенный VGA | ASPEED Technology, Inc. ASPEED Graphics Family (rev 41) |
выделенная графика | 2* NVIDIA Corporation AD102 [GeForce RTX 4090] (rev a1) |
ОС | Debian bullseye (свежая установка), или bookworm (apt dist-upgrade ) с bullseye |
Я провел тесты сразу после выполнения минимальной свежей установки Debian/bullseye, а затем обновился до Debian/bookworm.
Никакой X-сервер или подобное не установлено. Проприетарные драйверы не установлены.
диагностический вывод
после установки проприетарных nvidia
драйверов (которые я поставил к этому времени), вот некоторые важные системные выводы:
# uname -a
Linux petrou 6.1.0-5-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.1.12-1 (2023-02-15) x86_64 GNU/Linux
# dmesg | egrep -i "(vga|console|efifb)"
[ 0.078684] Консоль: цветное виртуальное устройство 80x25
[ 0.078873] printk: консоль [tty0] включена
[ 1.888692] pci 0000:28:00.0: BAR 0: назначен на efifb
[ 1.903739] pci 0000:41:00.0: vgaarb: установлен в качестве загрузочного VGA устройства
[ 1.903739] pci 0000:41:00.0: vgaarb: контроль моста возможен
[ 1.903739] pci 0000:41:00.0: vgaarb: VGA устройство добавлено: декодирует=io+mem, владеет=none, блокирует=none
[ 1.903739] pci 0000:28:00.0: vgaarb: установлен в качестве загрузочного VGA устройства (перекрывает предыдущее)
[ 1.903739] pci 0000:28:00.0: vgaarb: контроль моста возможен
[ 1.903739] pci 0000:28:00.0: vgaarb: VGA устройство добавлено: декодирует=io+mem, владеет=io+mem, блокирует=none
[ 1.903739] pci 0000:2b:00.0: vgaarb: контроль моста возможен
[ 1.903739] pci 0000:2b:00.0: vgaarb: VGA устройство добавлено: декодирует=io+mem, владеет=none, блокирует=none
[ 1.903739] vgaarb: загружен
[ 2.144244] efifb: поиск efifb
[ 2.144245] pci 0000:28:00.0: BAR переместился, обновление адреса efifb
[ 2.144247] efifb: не удается зарезервировать видеопамять по адресу 0x0
[ 2.144249] efifb: видеопамять @ 0x0 охватывает несколько областей памяти EFI
[ 5.273136] systemd[1]: Запущен systemd-ask-password-console.path - Отправка запросов на пароль в каталог консоли.
[ 5.277559] systemd[1]: Запуск keyboard-setup.service - Установка раскладки клавиатуры консоли...
[ 5.315244] systemd[1]: Завершено keyboard-setup.service - Установка раскладки клавиатуры консоли.
[ 5.521188] snd_hda_intel 0000:41:00.1: Обработка клиента звука vga_switcheroo
[ 5.521370] snd_hda_intel 0000:2b:00.1: Обработка клиента звука vga_switcheroo
[ 5.592959] nvidia 0000:41:00.0: vgaarb: изменены VGA декоды: старые декоды=io+mem, декоды=none: владеет=none
[ 5.639620] nvidia 0000:2b:00.0: vgaarb: изменены VGA декоды: старые декоды=io+mem, декоды=none: владеет=none
# lsmod | egrep -i "(vga|fb)"
# cat /proc/fb
# cat /etc/modprobe.d/blacklist-framebuffer.conf
cat: /etc/modprobe.d/blacklist-framebuffer.conf: Нет такого файла или каталога
# find /etc/modprobe.d/ -not -type d -exec grep blacklist {} +
/etc/modprobe.d/nvidia-blacklists-nouveau.conf:blacklist nouveau
# lspci | grep -i vga
28:00.0 VGA совместимый контроллер: ASPEED Technology, Inc. ASPEED Graphics Family (rev 41)
2b:00.0 VGA совместимый контроллер: NVIDIA Corporation AD102 [GeForce RTX 4090] (rev a1)
41:00.0 VGA совместимый контроллер: NVIDIA Corporation AD102 [GeForce RTX 4090] (rev a1)
# lspci -vvnn -s 28:00.0
28:00.0 VGA совместимый контроллер [0300]: ASPEED Technology, Inc. ASPEED Graphics Family [1a03:2000] (rev 41) (prog-if 00 [VGA контроллер])
Подсистема: ASPEED Technology, Inc. ASPEED Graphics Family [1a03:2000]
Управление: I/O+ Mem+ BusMaster- SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- DisINTx-
Статус: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=medium >TAbort- <TAbort- <MAbort- >SERR- <PERR- INTx-
Прерывание: pin A маршрутизировано на IRQ 75
IOMMU группа: 48
Регион 2: I/O порты на 1000 [размер=128]
Расширенный ROM на 000c0000 [виртуальный] [отключен] [размер=128K]
Возможности: [40] Управление энергопотреблением версия 3
Флаги: PMEClk- DSI- D1+ D2+ AuxCurrent=375mA PME(D0+,D1+,D2+,D3hot+,D3cold+)
Статус: D0 NoSoftRst- PME-Enable- DSel=0 DScale=0 PME-
Возможности: [50] MSI: Enable- Count=1/2 Maskable- 64bit+
Адрес: 0000000000000000 Данные: 0000
Ядровые модули: ast
Итак, в чем вопрос?
Что ж: Как я могу получить полный вывод консоли для моего терминала на встроенном VGA (или хотя бы на выделенной графической карте?)
Наконец, я нашел решение для своей проблемы.
Кратко
Добавление pci=nommconf
в командную строку ядра решило мои проблемы.
Длинная версия
Оказывается, была какая-то проблема с “Памятью, отображаемой в конфигурационном пространстве PCI”, которая каким-то образом нарушала работу как встроенной видеокарты, так и встроенного SATA-контроллера (что, как мне казалось, не имело отношения, поэтому я не упомянул это в своем вопросе; в общем: у меня есть два диска, NVMe/M.2 диск, который работает нормально, и дополнительный SATA диск, который вообще не отображался).
Проблема с тем, что SATA диск не отображался (по крайней мере, под Linux), похоже, является известной проблемой. Хотя этот форум-пост уже упоминает pci=nommconf
, я либо пропустил это, либо что-то не так сделал, когда применял это (или просто сдался с этой темой на форуме после неудачных попыток понижения версии BIOS, что привело к машине, которая даже не могла перейти в POST).
В любом случае, я нашел еще одно сообщение на форуме, в котором говорится, что им пришлось добавить следующие три параметра ядра, чтобы передать свою графику nvidia в ВМ (что меня не интересует, так как мне нужны карты nVidia на хосте):
amd-iommu=on
iommu=pt
pci=nommconf
(необязательно, для их проблемы)
Добавив все три параметра, я наконец получил все сообщения при загрузке на VGA-выводе (и на IPMI/BMC!, хотя этот вывод немного перегружен многословием без quiet
; но это помогает сбросить KVM-over-IP).
Добавление параметров также заставило мой SATA-диск магически появиться (и я мог отменить свой заказ на 2TB M.2 NVMe диск :-))
Оказывается, мне на самом деле не нужны первые два аргумента, так как amd-iommu=on
является значением по умолчанию (по крайней мере, на стандартных ядрах Debian), и мне не нужно pередавть (как iommu=pt
) в моем случае использования.
Судя по всему, соответствующие строки dmesg
(указывающие на то, что что-то было серьезно неправильно с отображением памяти efifb) были следующими:
[ 2.144244] efifb: поиск efifb
[ 2.144245] pci 0000:28:00.0: BAR переместился, обновление адреса efifb
[ 2.144247] efifb: не удается зарезервировать видеопамять по адресу 0x0
[ 2.144249] efifb: видеопамять @ 0x0 охватывает несколько областей памяти EFI
Ответ или решение
Без консольного вывода на Linux 6.x с материнской платой Asus WRX80E-SAGE: проблемы и решения
Введение
Настройка рабочей станции на базе CUDA с использованием материнской платы Asus WRX80E-SAGE и двух графических процессоров NVIDIA может быть сложной задачей, особенно когда дело доходит до правильного вывода консоли на экран. В данном случае мы столкнулись с серьезными проблемами вывода на консоль как для встроенного VGA, так и для дискретных графических карт.
Проблемы, с которыми вы столкнулись
-
Проблемы с выводом на встроенное VGA:
После настройки BIOS так, чтобы встроенное VGA было основным устройством вывода, проблемы начинаются после загрузки системы. На этапе загрузки виден выполнение GRUB, однако при инициализации ядра Linux (в данном случае версии 6.x) вывод замораживается на этапе загрузки системы, даже несмотря на то, что система продолжает работать. Это указывает на проблему с настройками консоли. -
Отсутствие вывода с дискретной графической карты:
При переключении на дискретную графическую карту в BIOS наблюдается другая проблема: загрузка проходит без каких-либо сообщений, и вывод остается статическим на экране с сообщениями об ошибках и без возможности переключаться между TTY.
Анализ и диагностика
Для начала была проведена диагностика системы с использованием команд, таких как dmesg
, чтобы проверить состояние устройства и выявить ошибки, связанные с видеовыводом. Сообщения в журнале указывали на проблемы, связанные с «пробросом» адреса видеопамяти и правилами устройства PCI, что могло в значительной мере повлиять на вывод консоли.
Применение решения
Решение было найдено путем добавления параметра pci=nommconf
в командную строку ядра. Этот параметр отключает поддержку Memory-Mapped PCI Configuration Space. В результате этого:
- Восстановился полный вывод консоли на встроенное VGA.
- Наблюдаемое поведение с дискретными графическими картами также улучшилось.
- Проблемы с SATA-накопителем были устранены, устройство стало видимым в системе.
Заключение
Добавление параметров amd-iommu=on
, iommu=pt
и pci=nommconf
может помочь решить как проблемы с загрузкой консоли, так и проблемы видимости устройств в системе. Несмотря на то что два первых параметра могут быть не всегда обязательны, третий оказался ключевым элементом для устранения описанных вами проблем. Провертка и тестирование различных конфигураций вашего оборудования и параметров ядра являются важными шагами в устранении проблем с отчетами и выводом консоли.
Рекомендации
- Тестирование конфигурации: Убедитесь, что вы протестировали различную конфигурацию BIOS и GRUB для поиска конфликта оборудования.
- Регулярное обновление системы: Следите за обновлениями ядра и используемого программного обеспечения, чтобы убедиться, что не возникли новые проблемы.
- Обратитесь к документации: Всегда полезно проверять официальные документы и форумы, связанные с вашим оборудованием, поскольку может оказаться, что проблемы известны, и могут быть предложены решения.
Эти шаги помогут минимизировать проблемы, связанные с консольным выводом через встроенные или дискретные графические карты и обеспечат стабильную работу вашей CUDA-рабочей станции.