标签 显卡 下的文章

视频点此

这个不是我想到的方法,因为这种笔记本想做到直通太麻烦了。不过机缘巧合,我在这个博客中看到了方法,尝试之后也成功了,遂来记录一下。

上面的博客有着非常详细的操作步骤及一些基本原理介绍,有兴趣可以阅读一下。不过在我尝试的过程中发现文章漏掉了一些步骤,再加上我的电脑与文章的博客不同,获取vBIOS的过程有些许出入,所以这里只记录一下操作过程,每一步的解释及更多扩展请看原博客。

我的电脑:HP暗影精灵一代,i7-6700hq+950M独显

事前准备:KVM虚拟机拥有一个UEFI启动的Win10,含有QXL显卡、实体机启动的win10、Linux宿主在使用英特尔核显,独显驱动禁用或驱动被卸载

一、隔离独显

  1. lspci -nn | grep NVIDIA,获得类似输出:

    01:00.0 3D controller [0302]: NVIDIA Corporation GP107M [GeForce GTX 1050 Mobile] [10de:1c8d] (rev a1)

    记录中括号[10de:1c8d]中的ID

  2. 编辑或创建/etc/modprobe.d/vfio.conf,内容书写 options vfio-pci ids=刚刚记录的ID
  3. 修改/etc/mkinitcpio.conf,在MODULES里增加vfio_pci vfio vfio_iommu_type1 vfio_virqfd
  4. mkinitcpio -P更新initramfs

二、增加英特尔虚拟核显

  1. 编辑/etc/default/grub,在GRUB_CMDLINE_LINUX中增加i915.enable_gvt=1 kvm.ignore_msrs=1 intel_iommu=on
  2. 编辑或创建/etc/modules-load.d/lantian.conf,增加三行

    kvmgt
    vfio-iommu-type1
    vfio-mdev
  3. grub-mkconfig -o /boot/grub/grub.cfg重新生成grub
  4. 重启
  5. lspci | grep "HD Graphics"记录最开始的PCI地址,如00:02.0
  6. 创建显卡

    sudo su
    echo "af5972fb-5530-41a7-0000-fd836204445b" > "/sys/devices/pci0000:00/0000:刚刚记录的PCI地址/mdev_supported_types/i915-GVTg_V5_4/create"

前面两部的成功性验证:

二.4重启之后,使用lspci -nnk查找英伟达,如果kernel in usevfio,则表明隔离NVIDIA成功;二.6第二行命令可以成功执行,则表明创建虚拟核显成功。

三、增加虚拟显卡进虚拟机

virsh edit 虚拟机名,在</device>前增加

<hostdev mode='subsystem' type='mdev' managed='no' model='vfio-pci' display='off'>
  <source>
    <address uuid='af5972fb-5530-41a7-0000-fd836204445b'/>
  </source>
</hostdev>

保存后启动虚拟机,如果在设备管理器中多了一个Microsoft 基本显示适配器,则说明增加成功,耐心等待驱动安装成功,便会显示出Intel核显名称了。

一旦驱动安装完成,关闭虚拟机,再次编辑配置。

  • 刚刚增加的hostdev标签,将display='off'更改为display='on'
  • 删除<graphics><video>两块,用如下内容替换

    <graphics type='spice'>
      <listen type='none'/>
      <image compression='off'/>
      <gl enable='yes'/>
    </graphics>
    <video>
      <model type='none'/>
    </video>
  • </domain>前增加

    <qemu:commandline>
        <qemu:arg value='-set'/>
        <qemu:arg value='device.hostdev0.ramfb=on'/>
        <qemu:arg value='-set'/>
        <qemu:arg value='device.hostdev0.driver=vfio-pci-nohotplug'/>
        <qemu:arg value='-set'/>
        <qemu:arg value='device.hostdev0.x-igd-opregion=on'/>
        <qemu:arg value='-set'/>
        <qemu:arg value='device.hostdev0.xres=1920'/>
        <qemu:arg value='-set'/>
        <qemu:arg value='device.hostdev0.yres=1080'/>
        <qemu:arg value='-set'/>
        <qemu:arg value='device.hostdev0.romfile=/vbios_gvt_uefi.rom'/>
        <qemu:env name='MESA_LOADER_DRIVER_OVERRIDE' value='i965'/>
    </qemu:commandline>

    其中,vbios_gvt_uefi.rom从这里下载,并对应修改上面的文件路径。

  • <domain type='kvm'>更改为<domain type='kvm' xmlns:qemu='http://libvirt.org/schemas/domain/qemu/1.0'>

启动虚拟机,如果图像正常显示且设备管理器中只有英特尔核显,则说明截至目前,操作都是成功的。

四、获取显卡vBIOS

这部分在实体Windows下进行。

  1. 前往惠普支持官网,下载适合自己的惠普BIOS更新程序
  2. 百度下载MaxwellBiosTweaker备用
  3. 启动更新程序,选择第三项Copy
  4. 解压缩导出的所有bin文件(已知7z可成功解压)
  5. 进入解压出来的文件夹,打开到有.rom文件的文件夹
  6. 打开MaxwellBiosTweaker,依次将.rom拖入文件,如果程序成功显示各种内容,则这个文件是一个显卡BIOS文件
  7. 对于是显卡BIOS的文件, 对照显示的内容,找到是自己显卡的rom文件,复制出来备用

五、编译虚拟机UEFI固件

这部分回到Linux下进行。

# 根据 GitHub 上用户反馈,UEFI 固件编译完成后不能移动位置
# 所以要先找好存放的地方
cd /opt
# 使用root用户进行,避免sudo前缀
sudo su
git clone https://github.com/tianocore/edk2.git
# 安装编译过程中需要的依赖
pacman -S git python2 iasl nasm subversion perl-libwww vim dos2unix
yaourt -S gcc5
# 假设你导出的显卡 BIOS 存放在 /vbios.rom
cd edk2/OvmfPkg/AcpiPlatformDxe
xxd -i /vbios.rom vrom.h
# 编辑 vrom.h,把 unsigned char 数组(在第一行)的名字修改成 VROM_BIN
# 把文件末尾的长度变量(在最后一行)改名为 VROM_BIN_LEN,并记录下长度值,我的是 167936
wget https://github.com/jscinoz/optimus-vfio-docs/files/1842788/ssdt.txt -O ssdt.asl
# 编辑 ssdt.asl,修改第 37 行为 VROM_BIN_LEN 的值
# 然后执行下面这行命令,会报错但是没关系,只要 Ssdt.aml 有了就行
iasl -f ssdt.asl
xxd -c1 Ssdt.aml | tail -n +37 | cut -f2 -d' ' | paste -sd' ' | sed 's/ //g' | xxd -r -p > vrom_table.aml
xxd -i vrom_table.aml | sed 's/vrom_table_aml/vrom_table/g' > vrom_table.h
# 返回 edk2 的目录下打补丁
cd ../..
wget https://gist.github.com/jscinoz/c43a81882929ceaf7ec90afd820cd470/raw/139799c87fc806a966250e5686e15a28676fc84e/nvidia-hack.diff
dos2unix nvidia-hack.diff
dos2unix OvmfPkg/AcpiPlatformDxe/QemuFwCfgAcpi.c
patch -p1 < nvidia-hack.diff
# 开始编译 OVMF
make -C BaseTools
source edksetup.sh
# 修改 Conf/target.txt 中如下变量的值:
# - ACTIVE_PLATFORM       = OvmfPkg/OvmfPkgX64.dsc
# - TARGET_ARCH           = X64
# - TOOL_CHAIN_TAG        = GCC5
build
# 等待编译完成,确认 Build/OvmfX64/DEBUG_GCC5/FV 文件夹下有这两个文件:
# - OVMF_CODE.fd
# - OVMF_VARS.fd
# 然后替换你的虚拟机的 UEFI 参数,注意修改虚拟机名
cp Build/OvmfX64/DEBUG_GCC5/FV/OVMF_VARS.fd /var/lib/libvirt/qemu/nvram/虚拟机名_VARS.fd

六、增加独显进虚拟机

visrh edit 虚拟机名称,做如下配置

<!-- 把 os 一段改成这样,注意对应你的 OVMF_CODE.fd 路径 -->
<os>
  <type arch='x86_64' machine='pc-q35-4.2'>hvm</type>
  <loader readonly='yes' type='pflash'>/opt/edk2/Build/OvmfX64/DEBUG_GCC5/FV/OVMF_CODE.fd</loader>
  <nvram>最后复制的那个路径</nvram>
</os>
<!-- 把 features 一段改成这样,就是让 QEMU 隐藏虚拟机的特征 -->
<features>
  <acpi/>
  <apic/>
  <hyperv>
    <relaxed state='on'/>
    <vapic state='on'/>
    <spinlocks state='on' retries='8191'/>
    <vendor_id state='on' value='GenuineIntel'/>
  </hyperv>
  <kvm>
    <hidden state='on'/>
  </kvm>
  <vmport state='off'/>
</features>
<!-- 添加显卡直通的 PCIe 设备,必须放在核显 hostdev 的后面 -->
<hostdev mode='subsystem' type='pci' managed='yes'>
  <source>
    <address domain='0x0000' bus='0x01' slot='0x00' function='0x0'/>
  </source>
  <rom bar='off'/>
  <!-- 注意这里的 PCIe 总线地址必须是 01:00.0,一点都不能差 -->
  <!-- 如果保存时提示 PCIe 总线地址冲突,就把其它设备的 <address> 全部删掉 -->
  <!-- 这样 Libvirt 会重新分配一遍 PCIe 地址 -->
  <address type='pci' domain='0x0000' bus='0x01' slot='0x00' function='0x0' multifunction='on'/>
</hostdev>
<!-- 在 </qemu:commandline> 之前添加这些参数 -->
<qemu:arg value='-set'/>
<!-- 下面的两个id为 lspci -nn中的那两个id -->
<qemu:arg value='device.hostdev1.x-pci-vendor-id=0x10de'/>
<qemu:arg value='-set'/>
<qemu:arg value='device.hostdev1.x-pci-device-id=0x1c8d'/>
<qemu:arg value='-set'/>
<!-- 下面的两个id为 lspci -nnk中,subsystem显示的id那两个 -->
<qemu:arg value='device.hostdev1.x-pci-sub-vendor-id=0x17aa'/>
<qemu:arg value='-set'/>
<qemu:arg value='device.hostdev1.x-pci-sub-device-id=0x39d1'/>
<qemu:arg value='-acpitable'/>
<qemu:arg value='file=/ssdt1.dat'/>

最后一行的ssdt1.dat从这里下载,并将路径对应修改。

启动虚拟机,等Win10自动安装驱动。

如果不出意外的话,直通就完成了。

视频点此

“Linux不能玩游戏!”

就我真想给你一巴掌……

哦,如果你只是玩儿腾讯游戏,那就把这一巴掌打回来吧还是……

今天就简单的来聊聊Gaming on Linux.

其实我经常会提到一句话:

你对Linux的认识还停留在十年前。

游戏就是一个很明显的例子。就连我往期内容也有人说不能玩游戏。如果你也是这么认为的,那推荐去看看Steam Play的那期内容,你会对这个问题有一个新的认识。

不过,还有一些不在Steam内的游戏,有没有办法玩耍呢?

有。而且还能让你在一个平台管理你所有平台的游戏。这就是Lutris。接下来主要介绍一下它的安装过程。

先来参照 https://github.com/lutris/lutris/wiki/Installing-drivers将显卡驱动的包补全。这地方就显示出来pop OS作为游戏系统的优势了:它把显卡的相关包都实现做了配置,你大可跳过显卡这一步。

接下来安装Lutris和相关包。因为是开源程序,所以直接通过源来一键安装即可:

pacman -S dxvk wine-staging lutris
  • dxvk: DX到vulkan的翻译层
  • wine-staging:有些发行版叫winehq-staging。而且有些发行版不包含这个包,需要去winehq官网对照步骤增加源

安装好这些之后,再前往https://github.com/lutris/lutris/wiki/Wine-Dependencies安装剩余的一些可选依赖。到此,lutris就可以正常运作了。不过,还有一些额外的配置,虽然配不配两可,但配置之后可以提升百分之二三十的性能。来看看。

  • 安装gamemode:Debian源里边会存在,arch分支则通过aur安装。包名就叫gamemode
  • 查找库文件路径:无论通过文件管理器还是命令,只要找到libgamemodeauto.so.0,将完整路径复制备用。
    查找文件的命令find /usr -name 'libgamemode*'
  • 现在,打开Lutris,点击左上图标- Preferences,切换到System Options,在Enviroment variables增加一项

    • Key = LD_PRELOAD
    • Value = 前面复制的路径

到此,gamemode配置完成。如果你还想进一步优化性能,可以参考https://github.com/lutris/lutris/wiki/Performance-Tweaks的最后两节,在上述位置中增加变量。

在上述全局配置完毕后,如果想再进一步提升性能,则可以选择tkg版本的wine,这个系列的wine启用了ESync,对性能的提升同样不容小觑。但若发挥ESync的效果,需要对系统内核进行一下调整。

  • 通过命令ulimit -Hn可以查看当前系统是否已经启用ESync。只要返回的数值不小于524288,那么就无需继续配置了。(systemd 240以后的版本默认是启用的)否则继续操作
  • 编辑/etc/systemd/system.conf,在结尾增加DefaultLimitNOFILE=524288
  • 编辑/etc/systemd/user.conf,在结尾增加DefaultLimitNOFILE=524288
  • 重启,再通过命令ulimit -Hn验证,应该就完成了

还有一些其他的配置,如果你想的话,可以去https://github.com/lutris/lutris/wiki/阅读。

到此,一个系统显卡双调优的、几乎支持全平台的游戏主机产生了。在lutris里,你可以导入你的Steam列表、GOG列表、甚至是你的KDE内置小游戏都可以被导入其中。自然,你也可以通过这个软件安装一些Steam平台以外的Windows游戏。安装也很简单:

  • 前往lutris官网
  • 切换到Games标签页
  • 搜索你想安装的游戏,进入其页面
  • 点击Install

然后,什么都不用管了,lutris会自动配置、下载、安装。

借这个机会,再来说两个关于显卡的问题。

第一、显卡加速组件。

更多的会是opencl和cuda这两种。如果你是英伟达显卡,那么cuda不会像win的驱动那样随安装包附带,需要另行安装。而cuda对驱动版本有对应关系,所以如果你需要cuda,那最好就不要从英伟达官网下载驱动,直接通过源来安装即可(以archlinux为例):pacman -S nvidia cuda

opencl同样如此。但因为AMD和Intel的驱动均为开源驱动(或者说是不需要闭源驱动。因为开源性能更强),驱动版本和opencl包总是同步更新的所以这两个平台无需考虑版本对应问题,直接通过源来安装即可:

pacman -S opencl-headers
pacman -S opencl-mesa lib32-opencl-mesa

至于英伟达,与cuda一样,不要手工从官网下载驱动安装,因为这样一来驱动版本可能会跟不上opencl的版本造成版本不对应。所以一切组件均通过源安装即可:pacman -S opencl-nvidia lib32-opencl-nvidia # 这里假设nvidia驱动已经从源安装

第二、英伟达驱动更新后,库连接被打破

如果你是从源里边安装的驱动,一般不会出现这种问题。但出现这种问题也无需担心,只需要通过ln -s手工建立软连接即可。

大多数现代Linux桌面系统都预装了Nvidia驱动程序——一种新的开源图形设备驱动程序。因此,一般不需要安装闭源驱动——只要没有那么强烈的独显性能需求。

但如果想完全发挥独显的性能,闭源驱动 便派上用场了。一些Linux发行版提供了预打包的专有驱动程序放在了源中,使得安装驱动程序非常容易。

也可以自行前往英伟达官网获取驱动,然后手动安装。但这样可能需要更多的手工干预,所以只要硬件不是特别的新 ,通常源中的版本已经足够了。

再次警告

从第三方源(如Nvidia.com或通过PPA存储库的专有Nvidia驱动)安装Nvidia驱动程序可能会导致系统不稳定。因此,如果不是必须的,建议继续使用开源的新版本驱动程序。

如何逐步安装最新的Nvidia专有驱动

1、检查Nvidia VGA型号

第一步是检查Nvidia VGA卡型号。对于大多数Linux发行版,通过下述代码获得

$ lspci -vnn | grep VGA
01:00.0 VGA compatible controller [0300]: NVIDIA Corporation GP106 [GeForce GTX 1060 6GB] [10de:1c03] (rev a1) (prog-if 00 [VGA controller])

从上面的输出可以看出我们的系统配备了 GTX 1060 6GB 显卡。

2、检查当前安装的VGA驱动程序

使用下面的命令查看当前加载的VGA驱动程序以及VGA卡型号的信息:

$ lspci -k | grep -EA3 'VGA|3D|Display'
01:00.0 VGA compatible controller: NVIDIA Corporation GP106 [GeForce GTX 1060 6GB] (rev a1)
        Subsystem: ASUSTeK Computer Inc. GP106 [GeForce GTX 1060 6GB]
        Kernel driver in use: nouveau
        Kernel modules: nvidiafb, nouveau

可以看到,目前使用的是nouveau 驱动程序和内核模块。如果安装有专有驱动,则上述命令的输出可能如下所示:

$ lspci -k | grep -EA3 'VGA|3D|Display'
01:00.0 VGA compatible controller: NVIDIA Corporation GP106 [GeForce GTX 1060 6GB] (rev a1)
        Subsystem: ASUSTeK Computer Inc. GP106 [GeForce GTX 1060 6GB]
        Kernel driver in use: nvidia
        Kernel modules: nvidiafb, nouveau, nvidia_drm, nvidia

3、检查当前的Nvidia驱动程序版本:

在继续进行最新的驱动程序安装之前,请检查当前版本的位置:

$ nvidia-settings --version
nvidia-settings:  version 430.50

4、接下来安装专有驱动:

暂不讨论手工安装和GUI安装

几乎所有操作都要求sudo权限

对于Intel和NVIDIA双显卡,可能需要额外配置(bumblebee/xrandr等)

接下来的方法适用于

完成后重启,安装结束。

视频点此

先说结果:在官网将Win10对应驱动更改为DCH版本后,Windows对比Arch系就一样了;更改之前或更早的Windows版本,Arch系更容易;对于其他Linux分支,何时都是更困难的。

这次的内容主要是回答之前有朋友问到的问题。所以主要来看Manjaro和Debian 10。

不过,为了回答这个题目,先来简单解释一下Windows要怎么装。

装好Win10后,Windows Update会自动安装DCH版本驱动。待驱动安装完毕,去往Windows应用商店搜索安装英伟达控制面板。安装结束。

其他版本的WIndows,则需要去往英伟达官网,在驱动中心下载后安装。

好了,Windows的安装方法说完了,现在来看Manjaro。

问我这个问题的朋友的原话是

nvidia-dkms装不上

可能是因为用了自定义内核吧所以需要这个。不过manjaro同Arch是不同的,它优化并维护着自己的驱动仓库,所以不需要也没必要考虑nvidia-dkms。Manjaro安装只需三步:

  1. 打开终端
  2. 输入:sudo mhwd -a pci nonfree 0300
  3. 回车

不必嫌难,因为不需要你理解什么意思。只需照着敲进去,回车,你的驱动和控制面板便安装好了。

哦,当然,也可以使用图形界面,但是可能没有终端直接:

  1. 打开设置
  2. 找到Manjaro设置管理器,打开
  3. 切换到硬件配置
  4. 对NVIDIA项目,勾选non-free
  5. 点击Install

好了,简单地操作到此结束。接下来看困难的Debian10。这是另一位朋友问的,原话如下

1.nVidia开源驱动与闭源驱动的bumblebee配置及xrandr配置

2.运行nvidia-xconfig后重启黑屏的原因及解决办法

3.显卡切换面板支持怎么弄? (目前Debian10,i5-8250u+MX250,一直无法切换显卡,只能用显卡运行程序(optirun))

先来说闭源驱动安装。

  1. 启用闭源源——我没写错。Debian的源分为开源和闭源两类,默认情况下用户只能检索到开源程序。所以这里需要启用“闭源”源

    1. sudo模式编辑/etc/apt/sources.list
    2. 在每一行后面增加contrib non-free
    3. 保存后,更新缓存:sudo apt update && sudo apt upgrade
  2. 安装头文件——黑屏的一个可能就因为这里:sudo apt-get install module-assistant
  3. 编译它们:sudo m-a prepare
  4. 安装探测程序查看自己需要装哪个驱动包

    1. 安装nvidia-detect:sudo apt -y install nvidia-detect
    2. 运行nvidia-detect,得到推荐选项。如:

      # nvidia-detect
      Detected NVIDIA GPUs:
      01:00.0 VGA compatible controller [0300]: NVIDIA Corporation GP106 [GeForce GTX 1060 6GB] [10de:1c03] (rev a1)
      
      Checking card:  NVIDIA Corporation GP106 [GeForce GTX 1060 6GB] (rev a1)
      Your card is supported by the default drivers and legacy driver series 390.
      It is recommended to install the
          nvidia-driver
      package.
  5. 根据推荐,输入命令完成驱动的安装:sudo apt install nvidia-driver

然后,bumblebee我以前专门说过,这里便不赘述了;而xrandr、nvidia-xconfig与bumblebee是一种“互斥”的状态,如果bumblebee配置好了则不需调整xrandr及nvidia-xconfig,否则需要。而xrandr的写法我以前同样提过,所以请参考安装KDE桌面的内容,出现在大概在12分钟位置。

这也是我现在宁可挖坑也不把一次的内容做的很多的原因:标题表现不出来涉及到的所有内容,就很麻烦。

至于nvidia-xconfig,只要xrandr配置正常,nvidia-xconfig可能不需要单独生成。如果不行,也只需终端sudo运行一次便会自动生成配置文件,此时应该就不会有什么问题了。

如果xrandr和nvidia-xconfig都配置过了但还是黑屏,那么问题可能出现在gdm上面因为这里貌似有一个bug但没有解决。尝试换成sddm或lightdm,或者使用bumblebee去代替xrandr和nvidia-xconfig

第三件事儿,很不幸,Debian现在是没有切换面板的。也就是说,要么完全使用闭源驱动提供的PRIME,即无论何时都使用独显驱动,要么就是大黄蜂,在需要使用独显的时候通过optirun实现独显加载。

到这里,问题便说完了。顺便呢,也希望能让你发现Linux和你印象中的差别吧。同时呢,也希望你能意识到:发行版的选择其实也是门学问。

视频点此

之前的内容中,我提到了Arch中高级的英特尔、英伟达切换方案。如果你还记得,就应该知道,当时我说了一句“Hybrid项目不用管,用前两个就够了”。

Hybrid,翻译成“混合”。但是林纳斯曾说过一句名言:

So, NVIDIA, fxxk you!

不禁让我感到疑惑:这个Hybrid真的有用吗?

为了寻找这个答案,我翻阅了这个显卡切换项目的git。其中一则issue引起了我的兴趣

issue

其中提到的链接第二段是这么说的:

The NVIDIA 435.17 driver has a new PRIME render offload implementation supported for Vulkan and OpenGL (with GLX). This PRIME offloading is about using one GPU for display but having the actual rendering be done on a secondary GPU, as is common with many of today's high-end notebooks that have Intel integrated graphics paired with a discrete NVIDIA GPU.

NVIDIA的Linux驱动终于开始支持双显卡了。虽然依旧闭源,但至虽然开始针对Linux的驱动进行改进,但这其实也说明不了太大的问题,直到又看到了这个新闻

NVIDIA,也开始涉足开源领域了。

为什么说也?

IBM收购RedHat、Steam开始专门提供Linux支持、微软加入Linux基金会、腾讯宣布开源……这些都算得上是英伟达的前人。尚不必说一直推崇开源的英特尔、有自知之明主动开源的AMD了。

所以,开源到底好在哪儿了?

首先,要明白一个问题:开源是什么意思?

字面理解,就是开放源代码。但是,这不代表你可以任意使用,更不意味着开源就是免费。它有很多方式可以实现盈利:双重许可、有偿技术支持、软硬件一体化…开源不是做慈善,更不是反开源的一个理由。

然后,就可以来说说开源的优势了。

我记得我在之前关于N卡A卡的内容里就说过一个优势:让更多人参与到程序的优化中。付出同样的成本,得到更多更全面的维护,“白嫖”谁不爱?

这是对于作者的,那对于用户,开源的优势在哪儿?

可以直接看到源码。一款闭源软件,你既不知道其构成,又只能从部分渠道得知它的安全性。而开源让你真正的“眼见为实”。就像前一阵子Deepin被传代码内植入了监视代码,直接被中国监视。虽然是谣言,官方也解释过CNZZ代码段的作用,但多少的可以说明开源这种看得到的安全。

完全定制。能得到源代码,这便使完全修剪成为了可能。

北京地铁为例。房山线老车的车内屏幕使用XP系统(也可能是CE),因为现在车均崩溃,你可以很方便的看到界面细节。这也是XP时代的一个典型代表:在那个时候,很多设备选择了XP或者CE作为嵌入式系统。但伴随着设备多样化,Linux逐渐受到重视,就像9号线站台屏。因为Linux本身占用就不高,加上Linux的开源性,可以做到完全的修剪,进一步减少占用、节约硬件成本。

但是,这种随意性使得它有个对应的问题:“百家争鸣”。

Windows只有Windows,而Linux有各种各样的Linux。这就使得原作者对项目控制能力有了限制。

所以说,就像微软从“Linux是毒瘤”到现在“我们是一家开源公司”的转变,开源随着科技发展正逐渐的被重视起来,设备的多样性也在催化着开源的完善、壮大。

这个文章有点儿啰嗦…要看解决方案到底是什么的,就直接拉到文章最后一节


笔记本,Intel核显+NVIDIA独显,解决方案?

只安装NVIDIA独显闭源驱动?大黄蜂切换?nouveau?

正确的方式是什么?


一、为什么放弃了大黄蜂

本身我一直推荐用户通过大黄蜂+bbswitch来实现双显卡切换。但直到前些日子我打算玩儿{{theHunter:Call of the Wild:猎人:野性的呼唤}},它不能运行了。

我知道这个游戏是Windows专属,所以它是通过Proton来实现运作的。但是根据protondb.com给出的数据,这个游戏的支持度是很好的。

怪哉!

实在没有办法,只好用steam play bumblebee为关键词搜索,偶然看到了个描述(原网页懒得找了):大黄蜂不支持dxvk

原来问题在这里。

那就不得不放弃大黄蜂了。

二、选啥方案

只安装闭源驱动?

性能是好,但是太费电啊…

nouveau?

省电,还能自动切换,但独显性能太渣了啊…况且好像还不能执行CUDA?

Ubuntu有着Linux世界里边最好的I+N双显卡解决方案,叫做PRIME。这个方案是通过在显卡管理器中更改配置文件达到使用核显或独显的目的的。Arch有没有类似的?

三、找到了可能是最好的方案

ArchWiki一查,还真有:nvidia-xrun

很明显,这个方案比Ubuntu的PRIME方案复杂了太多太多。而且使用时还需要切换到一个字符界面。但它确实能提供完整的英伟达显卡性能,在不使用的时候也可以关闭。

顺着这篇wiki,我又来到了Graphics索引页面。然后看到了一个名字为NVIDIA Optimus的Wiki项。要知道,Arch下面的显卡方案往往都被归类为Optimus。所以点进这个Wiki看一看

emmm... nouveau, Bumblebee, nvidia-xrun。没什么特别的。

难道就只有这种通过tty载入独显驱动一条路了吗?

不!任何时候都请记住:养成查看英文页面的好习惯。

看到变化了吗?看到英文页面的5.4小节了吗?就是它!只需从托盘右键选择一个显卡,就可以自动注销并切换!比Ubuntu需要打开显卡管理器—选择配置文件—手动注销再登录还要简便!而且还不需要xrun那样事先配置一堆文件!简直是赶超Ubuntu驱动管理的最佳选择!

四、配它

简单到什么程度?只需装几个软件包,再点几下鼠标即可完成:

pacman -S nvidia bbswitch    
# nvidia: 英伟达闭源驱动。如果使用自定义内核,或者不想驱动崩掉,那就安装nvidia-dkms
# bbswitch: 切换使用的节能工具。如果使用自定义内核,那就安装bbswitch-dkms

yaourt -S optimus-manager-qt
# 托盘程序(可视化切换及设置)。会自动安装核心程序
# 如果配置有archlinuxcn源,那么同样可以使用pacman来安装
# 如果使用KDE桌面,另有optimus-manager-qt-kde可供选择

现在重启,应该就能看到托盘多出了一个小图标了。右键点击它,选择设置—OptimusSwitching method选择Bbswitch,确定保存。

完成了。以后只需要右键这个图标,选择对应的配置方案,便可进行切换了。


所以,总结一句话:

一定记得看英文页面


注:

  • 根据项目readme,仅支持Arch分支的发行版
  • manjaro由于自带电源管理和自己的大黄蜂驱动方案(一样的残缺),需要对照git项目,删除/修改指定的配置文件以完成部署

对应的git项目 点这里

如果发现默认设置还是不能启动proton游戏,尝试如图配置