我目前正在设置在 Debian GNU/Linux 上运行的 CUDA 工作站。
该系统配备两张 nVidia GFX 卡(用于 CUDA 产品),并配有板载 VGA 适配器。
最后,机器将位于远程位置并通过 IPMI 进行管理,这意味着我希望将板载 VGA 作为我的主要显示设备(虽然 nVidia 卡确实总共具有 8 个 DP/HDMI 输出,但它们不会连接;板载 VGA 也不会连接,但会被 IPMI/BMC 捕获,因此我可以通过 KVM-over-IP 访问它)。
所以我需要的是 Linux 帧缓冲控制台显示在 VGA 上。
目前我面临两个问题:
板载 VGA 仅在启动初期使用
在 BIOS 中将主要输出设备设置为“板载”(从“专用显卡”)后,板载 VGA 在早期启动阶段运行良好:我可以看到 POST、访问 BIOS、处理 UEFI 引导加载程序(grub2
在我的情况下)并启动操作系统。太棒了!
但在此之后,输出冻结了,只剩下 grub2-printout(没有其他内容):
Booting Debian GNU/Linux
Loading Linux 6.1.0-5-amd64 ...
Loading initial ramdisk ...
这种情况会一直持续,直到系统崩溃。
这只是一个输出问题,系统启动正常(我可以ssh
进入机器并执行任何操作)。我还可以使用连接的 USB 键盘通过登录登录tty1
并在那里发出命令……但屏幕保持冻结(所以我看不到我输入的内容以及系统回答的内容)
我尝试过其他内核(5.x、6.x)和发行版(例如grml
,它使用 isolinux 而不是 grub),但问题仍然存在:
- 我可以查看引导加载程序
- 但一旦实际系统启动,输出就会冻结
我尝试添加noplymouth
,textonly
,text
和vga=ask
到内核命令行,但无济于事......
专用 GFX 卡未显示新内核的启动信息
如果我切换到使用我的一张专用 GFX 卡作为主要设备(在 BIOS 中),情况会略有不同。
使用 Debian/bullseye(当前版本)稳定的Debian 版本),使用专用的 GFX 输出工作正常。但是,如果我将内核升级到 6.x(通过 Debian/bullseye-backports;或升级到 Debian/bookworm(即将推出的稳定版本),我将不再看到任何启动消息或登录屏幕。
相反我的屏幕仅有的显示如下:
[ 2.418707] xhci_hcd 0000:23:00.0: init 0000:23:00.0 fail, -16
[ 2.418805] xhci_hcd 0000:29:00.1: init 0000:29:00.1 fail, -16
[ 2.418861] xhci_hcd 0000:29:00.3: init 0000:29:00.3 fail, -16
/dev/nvme0n1p2: clean, 78970/122003456 files, 8917355/487997184 blocks
另外,我无法切换到其他终端 (( Ctrl+) Alt+ F2)。但键盘输入实际上可以工作(只有显示冻结)。
我可以通过启动 linux-5.x 内核(工作)和 linux-6.x 内核(损坏)在工作控制台和非工作控制台之间切换。
虽然我的系统配备了 2 个 nVidia GFX 卡,但目前没有安装专用 (专有) 驱动程序。因此,我在原始 Debianmain
安装中看到了这种情况。
然而,最终我将不得不使用 Debian/bookworm(带有 linux-6.x 内核),因为我需要最新的 nVidia 驱动程序才能使用 CUDA 卡。(在您问之前:如果我安装专有驱动程序,问题仍然存在)。
我无法在我的笔记本电脑(运行 Debian/sid - 因此具有内核 6.1.0-5-amd64;所有 tty 均按预期工作)或新安装的虚拟机上重现该问题。
注意:无论如何,使用专用 GFX 卡还有其他缺点:一旦机器位于远程位置,我就无法通过 IPMI/BMC 访问其输出。所以这部分问题有点学术性...
系统设置
成分 | 姓名 |
---|---|
母板 | 华硕 Pro WS WRX80E-SAGE SE WIFI |
中央处理器 | AMD 锐龙 Threadripper PRO 5965WX |
记忆 | 132GB |
板载 VGA | ASPEED Technology, Inc. ASPEED 显卡系列 (rev 41) |
专用 GFX | 2* NVIDIA 公司 AD102 [GeForce RTX 4090](rev a1) |
操作系统 | Debian bullseye(全新安装),resp bookworm(apt dist-upgrade )来自 bullseye |
我在完成 Debian/bullseye 的全新最小安装,然后升级到 Debian/bookworm 之后立即进行了测试。
没有安装 X-server 或类似服务器。没有安装专有驱动程序。
诊断输出
安装专有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] Console: colour dummy device 80x25
[ 0.078873] printk: console [tty0] enabled
[ 1.888692] pci 0000:28:00.0: BAR 0: assigned to efifb
[ 1.903739] pci 0000:41:00.0: vgaarb: setting as boot VGA device
[ 1.903739] pci 0000:41:00.0: vgaarb: bridge control possible
[ 1.903739] pci 0000:41:00.0: vgaarb: VGA device added: decodes=io+mem,owns=none,locks=none
[ 1.903739] pci 0000:28:00.0: vgaarb: setting as boot VGA device (overriding previous)
[ 1.903739] pci 0000:28:00.0: vgaarb: bridge control possible
[ 1.903739] pci 0000:28:00.0: vgaarb: VGA device added: decodes=io+mem,owns=io+mem,locks=none
[ 1.903739] pci 0000:2b:00.0: vgaarb: bridge control possible
[ 1.903739] pci 0000:2b:00.0: vgaarb: VGA device added: decodes=io+mem,owns=none,locks=none
[ 1.903739] vgaarb: loaded
[ 2.144244] efifb: probing for efifb
[ 2.144245] pci 0000:28:00.0: BAR has moved, updating efifb address
[ 2.144247] efifb: cannot reserve video memory at 0x0
[ 2.144249] efifb: video memory @ 0x0 spans multiple EFI memory regions
[ 5.273136] systemd[1]: Started systemd-ask-password-console.path - Dispatch Password Requests to Console Directory Watch.
[ 5.277559] systemd[1]: Starting keyboard-setup.service - Set the console keyboard layout...
[ 5.315244] systemd[1]: Finished keyboard-setup.service - Set the console keyboard layout.
[ 5.521188] snd_hda_intel 0000:41:00.1: Handle vga_switcheroo audio client
[ 5.521370] snd_hda_intel 0000:2b:00.1: Handle vga_switcheroo audio client
[ 5.592959] nvidia 0000:41:00.0: vgaarb: changed VGA decodes: olddecodes=io+mem,decodes=none:owns=none
[ 5.639620] nvidia 0000:2b:00.0: vgaarb: changed VGA decodes: olddecodes=io+mem,decodes=none:owns=none
# lsmod | egrep -i "(vga|fb)"
# cat /proc/fb
# cat /etc/modprobe.d/blacklist-framebuffer.conf
cat: /etc/modprobe.d/blacklist-framebuffer.conf: No such file or directory
# 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 compatible controller: ASPEED Technology, Inc. ASPEED Graphics Family (rev 41)
2b:00.0 VGA compatible controller: NVIDIA Corporation AD102 [GeForce RTX 4090] (rev a1)
41:00.0 VGA compatible controller: NVIDIA Corporation AD102 [GeForce RTX 4090] (rev a1)
# lspci -vvnn -s 28:00.0
28:00.0 VGA compatible controller [0300]: ASPEED Technology, Inc. ASPEED Graphics Family [1a03:2000] (rev 41) (prog-if 00 [VGA controller])
Subsystem: ASPEED Technology, Inc. ASPEED Graphics Family [1a03:2000]
Control: I/O+ Mem+ BusMaster- SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- DisINTx-
Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=medium >TAbort- <TAbort- <MAbort- >SERR- <PERR- INTx-
Interrupt: pin A routed to IRQ 75
IOMMU group: 48
Region 2: I/O ports at 1000 [size=128]
Expansion ROM at 000c0000 [virtual] [disabled] [size=128K]
Capabilities: [40] Power Management version 3
Flags: PMEClk- DSI- D1+ D2+ AuxCurrent=375mA PME(D0+,D1+,D2+,D3hot+,D3cold+)
Status: D0 NoSoftRst- PME-Enable- DSel=0 DScale=0 PME-
Capabilities: [50] MSI: Enable- Count=1/2 Maskable- 64bit+
Address: 0000000000000000 Data: 0000
Kernel modules: ast
那么问题是什么?
好吧:如何在我的板载 VGA(或至少在专用的 GFX 卡上)获取终端的完整控制台输出?
答案1
最后我找到了解决问题的方法。
总结
添加pci=nommconf
内核命令行解决了我的问题。
较长版本
事实证明,“内存映射 PCI 配置空间”存在一些问题,它以某种方式对板载 VGA 卡和板载 SATA 控制器造成了严重破坏(我认为这是无关的,所以我没有在我的 Q 中提到它;简而言之:我有两个磁盘,一个运行良好的 NVMe/M.2 磁盘,以及一个额外的 SATA 磁盘,它没有显示出来根本)。
SATA 磁盘没有显示(至少在 Linux 下)似乎是已知问题。虽然这个论坛帖子已经提到了pci=nommconf
,但我要么错过了,要么在应用它时做错了什么(或者我在尝试降级我的 BIOS 失败后放弃了那个论坛主题,导致机器甚至不再开机自检)。
无论如何,我发现又一个论坛帖子其中提到他们必须添加以下三个内核参数才能将他们的 nvidia GPU 传递到虚拟机(我对此不感兴趣,因为无论如何我都需要主机上的 nVidia 卡):
amd-iommu=on
iommu=pt
pci=nommconf
(可选,针对他们的问题)
添加所有三个参数后,我终于在 VGA 输出(以及 IPMI/BMC!)上获得了所有启动消息,尽管这个消息因无“安静”的冗长而略微显得难以承受;但它有助于重置 KVM-over-IP。
添加参数也让我的 SATA 磁盘神奇地出现了(而且我可以取消订购 2TB M.2 NVMe 磁盘 :-))
事实证明我并不需要前两个参数,因为amd-iommu=on
无论如何它们都是默认的(至少在 Debian 内核上),我也不需要页屁股吨iommu=pt
在我的用例中通过( )。
据我所知,相关dmesg
行(表明 efi-framebuffer 的内存映射存在严重错误)如下:
[ 2.144244] efifb: probing for efifb
[ 2.144245] pci 0000:28:00.0: BAR has moved, updating efifb address
[ 2.144247] efifb: cannot reserve video memory at 0x0
[ 2.144249] efifb: video memory @ 0x0 spans multiple EFI memory regions