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

时间:2013-11-14 18:10:37

标签: linux bios xorg

主要视频卡通常可以在BIOS中设置(选项主要VGA卡),它将是系统使用的第一张卡。

我的问题是如何以编程方式识别(使用shell脚本和实用程序更可取)我的两张显卡中哪一张是主卡?

编辑:我希望我不必详细说明为什么我需要这个,因为它有点复杂,但我会解释下面的问题。

我有一个配置向导,允许动态配置LiveCD中的多系统系统,有两个独立的显示器,键盘和鼠标,我的向导以这种方式工作:

  1. 为每个视频卡启动一个Xorg服务器(在使用正确的PCI总线ID生成xorg.conf之后)。
  2. 在每个Xorgs中使用配置消息启动 ui (按键并按鼠标)。每次都可以配置一个座位
  3. 配置完第一个席位后,向导关闭第一个Xorg并使用桌面环境在此席位中启动明确的Xorg(已经使用正确的键盘和鼠标设置)。
  4. 第二个座位现在可以配置(按键和鼠标),此次通过 3 后,座位二重复。
  5. 问题是:如果我在主显卡中启动第一个Xorg,一切正常,但如果我在二级卡中启动第一个Xorg,则会发生以下情况:

    传球1,2和3有效,但在第3传球结束时,当第一个座位的Xorg关闭时,第二个座位的Xorg闪烁并且不回来,只显示一个空白屏幕在顶部有一个 _ 光标,第一个座位的桌面加载,但我没有在第二个座位看到向导屏幕,如果我执行 kill,第一个Xorg就会回来-HUP ,我需要再次从它开始 ui

    所以,这就是为什么我需要在启动Xorg之前识别主显卡(抱歉我以前没有提到过)。我在不同的计算机上测试了这个系统,使用不同的视频卡,行为是一样的。我还在Ubuntu 12.04( raring 发行版的软件包)中测试了内核和Xorg的持续软件包。

3 个答案:

答案 0 :(得分:0)

假设X11正在运行,您可以假设主卡是Xorg使用的卡...那么您可以尝试

 ls -l /proc/$(pidof X)/fd |grep /dev/dri

在我的系统Debian / Sid / x86-64上使用Linux 3.12内核(在Intel3770K上有一个Nvidia卡也有它的VGA)我得到了/dev/dri/card0等等......

但是你应该解释为什么你在问什么以及你想要解决什么问题....为什么这对你很重要?

我完全不确定Linux是否有像BIOS知道的主显卡的概念。

可能hwinfo告诉你有关图形卡的所有信息。

答案 1 :(得分:0)

Linux中有几个命令行工具可以从BIOS中提供人类可读的信息。也许你可以在那里找到你的视频板,看看哪个是主要的。从我在输出中看到的,看起来并不像是#34;这是主视频",但我确实看到了很多信息。当视频卡A是主要时,您可以将该信息输出到文件,当B是主要时,再次将这些信息输出到文件,然后比较这两个文件,看看是否存在差异。

我使用的命令是dmidecode

,它给了我很多信息
sudo dmidecode | less

如果你看一下手册页:

man dmidecode

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

从那些您了解到/ dev / mem设备可以获得BIOS信息的人。虽然你需要是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使用的闪存中读取的内容。这是通过flashrom(您可能需要安装)完成的:

sudo flashrom --programmer internal --read my-flash.bin

在我的情况下,我的计算机上的ROM是2Gb的数据。非常大。但是,您可以确定您要查找的信息存在于该数据块中,因为这是BIOS保存数据的唯一方法,这些数据将在计算机关闭时保持不变。

答案 2 :(得分:0)

我找到了一种方法,当它们来自不同的供应商或至少具有不同的名称时,如何检查主 GPU。

在 KDE 中转到信息中心,然后打开图形 -> OpenGL。在Direct Rendering (GLX)Direct Rendering (EGL) 中,您可以看到一个Driver 块。您可以在那里看到供应商设备。它将命名主要的 GPU。

在此屏幕截图中,您可以看到 AMD gpu 是主要的: enter image description here

此外,您可以通过运行
以编程方式获取Vendorglxinfo | grep "OpenGL vendor string" | cut -f2 -d":" | xargs

我猜这个方法会在 kde 切换到 vulkan 进行渲染时停止工作(在 kde 6 中)。但目前我不知道另一种确定主 gpu 的方法。