如何在Linux上以编程方式识别主要的视频卡?

3
主视频卡通常可以在BIOS中设置(选项“主VGA卡”),它将是系统使用的第一张卡。
我的问题是如何通过编程(最好使用shell脚本和实用程序)识别我的两个视频卡中哪一个是主卡?
编辑:我希望我不必解释为什么我需要这个,因为它有点复杂,但我将在下面解释问题。
我有一个“配置向导”,它允许在LiveCD中动态配置多座位系统,具有两个独立的显示器、键盘和鼠标,我的“向导”以以下方式工作:
1.针对每个视频卡启动一个Xorg服务器(在生成具有正确PCI总线ID的xorg.conf之后)。 2.在每个Xorg中启动一个ui,并显示配置消息(按键和按鼠标)。每次只能配置一个座位。 3.在第一个座位配置完成后,“向导”关闭第一个Xorg,并在此座位中启动具有桌面环境(已具有正确键盘和鼠标设置)的最终Xorg。 4.现在可以配置第二个座位(按键和鼠标),完成此操作后,重复步骤3进行第二个座位。
问题是:如果我在辅助视频卡上启动第一个Xorg,一切都正常,但如果我在主视频卡上启动第一个Xorg,就会发生以下情况:
通过1、2和3步骤,但在第3步结束时,当第一个座位的Xorg关闭时,第二个座位的Xorg闪烁并且不会回来,只显示一个带有_光标的空白屏幕,第一个座位的桌面加载,但我看不到第二个座位中的向导屏幕,只有在执行kill -HUP后,第一个Xorg才会回来,我需要从它重新启动ui。
因此,在启动Xorg之前,我需要识别主视频卡(抱歉我之前没有提到这一点)。我在不同的计算机上测试了这个系统,使用不同的视频卡,行为都是相同的。我还在Ubuntu 12.04中使用了最新的内核和Xorg软件包进行了测试(raring版本的软件包)。

我详细说明了我的问题,请查看编辑。 - Juliao
1
当你使用一台具有内置显卡(IGP)的系统时,会发生什么情况?在需要完整强度GPU的功率时,例如启用节能模式的笔记本电脑。 - JimR
@JimR,也许我没有理解你的问题,但我测试过的所有系统都有一个内置VGA和一个PCI VGA,但是主要VGA可以在BIOS中配置,并且我可以使用命令“lspci”获取VGA列表,因此VGA的顺序始终相同在lspci中,如果主VGA是lspci中的第一个,则可以正常工作;否则将无法工作。我没有在具有双VGA的笔记本电脑上测试此系统,我没有这样的电脑,而且这也不是我的目的。 - Juliao
1
@Msum:我认为JimR在市场术语中考虑的是例如Nvidia Optimus... - Basile Starynkevitch
@BasileStarynkevitch:你说得对。 :) 我想不出那个营销名称,就算是要我命也想不出来。 - JimR
显示剩余4条评论
3个回答

1
在Linux中有几个命令行工具可以从BIOS中提供人类可读的信息。也许你可以在其中找到你的视频板,并查看哪个是主要的。从我的输出中看,似乎没有什么说“这是主要视频”的东西,但我确实看到了很多信息。当A视频卡是主要时,你可以将该信息输出到文件中,再次当B是主要时,然后比较这两个文件,看是否有差异。
我使用的命令,它给我很多信息,是dmidecode:
sudo dmidecode | less

如果您查看手册页面:

man dmidecode

你会注意到程序员提供了一些其他类似的工具,例如biosdecodevpddecode

通过这些工具,你可以了解到BIOS信息可以从/dev/mem设备中获取。虽然你需要以root身份读取它,但如果你知道地址(我不知道),那么你可以进入那里并根据需要进行查找来找出哪个信息被定义为主要视频卡。

运行dmidecode,关于我的主板还有一些细节:

Handle 0x0002, DMI type 2, 15 bytes
Base Board Information
  Manufacturer: Supermicro
  Product Name: X9SCI/X9SCA
  Version: 1.01
  Serial Number: ZM25U44192
  Asset Tag: To be filled by O.E.M.
  Features:
    Board is a hosting board
    Board is replaceable
  Location In Chassis: To be filled by O.E.M.
  Chassis Handle: 0x0003
  Type: Motherboard
  Contained Object Handles: 0

这里有一个视频条目:

Handle 0x000E, DMI type 10, 6 bytes
On Board Device Information
  Type: Video
  Status: Enabled
  Description:    To Be Filled By O.E.M.

然后另一个条目看起来像这样:

Handle 0x0036, DMI type 41, 11 bytes
Onboard Device
   Reference Designation:  Onboard IGD
   Type: Video
   Status: Enabled
   Type Instance: 1
   Bus Address: 0000:00:02.0

这也可能是您需要从BIOS使用的Flash内存中读取的内容。使用flashrom(您可能需要安装)来完成此操作:
sudo flashrom --programmer internal --read my-flash.bin

在我的情况下,计算机上的ROM是2GB的数据。所以相当大。但是,你可以确定你要查找的信息存在于该数据块中,因为这是BIOS保存数据并在计算机关闭时保留数据的唯一方法。

1
假设X11正在运行,您可以认为主要的显卡是由Xorg使用的...然后您可以尝试。
 ls -l /proc/$(pidof X)/fd |grep /dev/dri

在我的系统Debian/Sid/x86-64上,使用Linux 3.12内核(其中有一张Nvidia显卡和一个Intel3770K的VGA),我得到了/dev/dri/card0等输出...但你应该解释一下为什么要问这个问题以及你想解决什么问题...这对你来说为什么很重要?我不确定Linux是否有像BIOS那样的主要图形卡概念。也许hwinfo可以告诉你关于你的图形卡的一切。

抱歉之前我没有引用,但在启动Xorg之前,我需要知道哪张是主要的显卡。我已经详细说明了我的问题,请查看编辑内容。 - Juliao
1
今天我进行了更多的测试,但仍然没有成功。/proc/dri/0中的信息可能是答案,但遗憾的是不可靠,在一台机器上,/proc/dri/0/name和/proc/dri/1/name都有vgas的信息,在另一台机器上则没有任何信息,cat /proc/dri/0/name返回一个空字符串。hwinfo提供了一些尴尬的信息,hwinfo --gfxcard在最后一行显示信息_Primary display adapter: #33_,但适配器#33并不是主要的,查看/proc/dri,卡1而不是卡0是主要的。 - Juliao
在我的测试中,我发现/proc/dri/0并不意味着它是主要的vga卡,无论我在BIOS中更改主视频卡,该信息始终在我的机器测试中保持不变。在_hwinfo_中,主显示适配器也始终相同,因此,这些选项都没有答案,仍然没有办法在Linux中检测到主要视频卡。 - Juliao
在Arch Linux中,你需要用$(pidof Xorg)替换$(pidof X)。是的,如果有多个显卡连接到多个显示器上,那么就会有两张卡的链接。而且,card0并不意味着主GPU。我的英特尔GPU始终保持为card0,而AMD则保持为card1,即使我在UEFI中更改了主GPU选项。 - Ashark

1
我发现一种方法可以检查不同供应商或至少具有不同名称的主要GPU。
在KDE中,进入“信息中心”,然后打开“图形”->“OpenGL”。在“直接渲染(GLX)”和“直接渲染(EGL)”中,您可以看到一个“驱动程序”块。您可以在那里看到“供应商”和“设备”。它将命名主要的GPU。
在这个屏幕截图中,您可以看到AMD gpu是主要的: enter image description here 此外,您可以通过运行以下命令以编程方式获取“供应商”值:
glxinfo | grep "OpenGL vendor string" | cut -f2 -d":" | xargs
我想当kde切换到vulkan进行渲染时(在kde 6中),此方法将停止工作。但是目前我不知道确定主要gpu的另一种方法。

我不确定这是否与优先级有关,但是drm_info | grep nodes返回了两次“可用节点:primary、render”,针对两个GPU。因此看起来不是那个问题。 - Ashark

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接