1 Star 0 Fork 11

coder_lw / wiki

forked from deepinwiki / wiki 
加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
linux驱动管理.md 19.50 KB
一键复制 编辑 原始数据 按行查看 历史

linux 驱动管理

前言

不管是系统运维工程师,还是普通用户,都需要对硬件进行管理,否则系统无法正常运行,也就没法正常使用了。

硬件是绕不过的弯,尤其在今天,linux对硬件的兼容性还是不强的。九成linux爱好者,遇到的问题都是硬件引起的。

显卡

xorg是linux图形桌面服务“x window system”的一个开源实现。x window可以理解为一组规范,比如http协议,而xorg是具体的网站服务器IIS之类的。

识别显卡

  1. lspci |grep -e VGA -e 3D 硬件识别
  2. xrandr --listproviders 显示输出设备
  3. lspci -nnk -s 1:0.0 显示pci 1:0.0的驱动和内核模块
  4. glxinfo | head -5 显示图形卡技术信息
  5. inxi -G

寻找驱动包

  1. apt search xf86-video 列出开源显卡驱动

系统选择显卡驱动步骤:

  1. 特定驱动
  2. xserver-xorg-video-fbdev 优先替补
  3. xserver-xorg-video-vesa 通用驱动,无加速
  4. modesetting 都没有,就回退到此程序的设置

AMD显卡

  1. xserver-xorg-video-amdgpu 开源驱动
  2. xserver-xorg-video-ati 开源驱,旧硬件
    1. xserver-xorg-video-r128 r128显卡
    2. xserver-xorg-video-radeon radeon显卡
      1. firmware-amd-graphics 修补固件
      2. firmware-linux-nonfree 修补固件
    3. xserver-xorg-video-mach64mach64显卡
  3. amd官方催化剂驱动: catalyst/amdgpu pro

intel 显卡

  1. xserver-xorg-video-intel 开源驱动

nvidia 显卡

  1. xserver-xorg-video-nouveau 开源驱动(性能较差`
  2. nvidia-driver 闭源驱动(性能较好)
  3. xserver-xorg-video-nvidia debian封装的闭源驱动

安装步骤

  1. apt purge nvidia* 清除nvidia私有驱动(如果有安装过)
  2. 编辑apt源/etc/apt/sources.list添加参数contrib non-free
  3. 安装linux内核头文件,一般格式是:linux-headers-xxxx(uname -r查看)
  4. apt update 获取更新信息
  5. apt install xxx 选择上面合适的驱动安装
  6. 重启加载新驱动

大黄蜂方案

大黄蜂bumblebee是一套开源的双显卡方案,以核显输出,独立显卡gpu协作的模式运作。协作通过调用optirun 或primusrun来执行需要独立gpu的程序。命令格式一般为: vblank_mode=0 optirun xxx。vblank_mode环境变量关闭垂直同步。

  1. sudo apt install nvidia-driver 安装nvidia显卡驱动
  2. sudo apt install bumblebee-nvidia 调用闭源nvidia显卡gpu,如果闭源不存在会调用nouveau 是一套开源nvidia驱动。
  3. gpasswd -a bumblebee username 大黄蜂驱动需要将用户加入bumblebee用户组才能调用。将username改为你的帐号
  4. 重启。

prime方案

这是另一套双卡方案。在另一个gpu上执行程序只需要添加环境变量:

DRI_PRIME=1 xxx

以上在开源驱动得到比较好的支持。

xrandr

xrandr 工具可以帮助prime方案的实现。

xrandr --listproviders  #列出当前的显示接口(可以理解为显卡),和接口能力

其中能力特性:

  1. source output : 源输出(提供者),就是将图像输出到另一个接口的能力。
  2. sink output: 接收器输出,接收其他接口图像作为输出的能力
  3. source offload: 源卸载, 提供输出窗口化图像到另一个接口的能力。
  4. sink offload:接收器卸载,提供接收其他接口图像作为窗口化输出的能力。

流程: source --图像--> sink --图像--> 显示器

简而言之,就是虽然都是:输出source,接收sink,但是分全局的,还是局部两种。可见,局部是更高级的能力,nvidia显卡当前驱动并不支持,只支持source output,也就是将自身图像完全替换掉接收器,接收器只是作为连接显示器的中介,自身不再参与进行复杂的gpu运算。

(吐槽星人:不过老实说,这个命名是有点奇怪,也许是翻译的缘故很容易搞不清什么源,什么输出。)

为什么要这么麻烦的设计,因为笔记本只有一个连接显示器的接口,独立显卡和cpu内置显卡共用一个接口。为了省电,一般都是用内置显卡,玩游戏的时候才调用独立显卡。(这种能力就叫显卡offload),这种能力的简化版本就是显卡output.可见简化版本不会智能省电,对用户来说只是切换不同显卡的开关而已。

绑定设定:

全局图像源替换

xrandr --setprovideroutputsource prov source 设置输出源来自哪个接口。source值为0x0时相当于关闭接收器 prov 的显示输出

参数中的 prov 是物理接口(即连接显示器的物理接口),source 信号主接口(即渲染图形的工作接口)。

这个设置的意思是将 prov 接口的输入源指定为 source 接口。prov 接口应该具备 sink output 特性。而 source 接口应该具备 source output 特性。

因此,要让这个命令生效的前提,就是先在 xorg.conf 中设定让 source 接口作为工作接口,让 prov 接口作为备用接口,这两个接口应该同时启用。

例子: xrandr --setprovideroutputsource intel nvidia

如 intel 集显连接到显示器,nvidia 独显没有连接到物理显示器,默认系统会让 intel 显卡工作,而 nvidia 显卡不工作。但是可以通过xorg.conf 设置让 nvidia 工作,intel 备选,然后用这条命令将 nvidia 显卡渲染的画面传递到 intel 显卡,然后通过物理连接的显示器输出画面。

局部图像源替换

xrandr --setprovideroffloadsink prov sink 绑定提供者和接受者,sink为0x0即解除绑定。

注意这个和上一个命令格式的微妙区别(位置刚好调换)。sink 为0x0时,解除绑定。

这里的 prov 应该具备 source offload 特性,而 sink 接口应该具备 sink offload 特性。

例子: xrandr --setprovideroffloadsink nvidia intel

这个模式更加智能和高级(甚至你都不需要使用这个命令来设置),他不需要设置 xorg.conf 让上一个例子的 nvidia 作为主接口,而只需要设置 nvidia 让他的输出源和 intel (主接口)关联起来。

通常执行程序使用的是 intel 渲染画面,某个窗口程序使用 DRI_PRIME=1 xxx 即调用 nvidia 渲染 xxx 的画面,然后将画面输出到 intel 的该窗口区域,和其他由 intel 渲染的部分组合起来输出到显示器。

需要注意的是,nvidia 官方驱动要在 435.17 版本之后才支持这个特性,而且,他也不能使用环境变量 "DRI_PRIME=1" 来指定独显渲染,而需要安装 nvidia 的工具包(arch 系统是 nvidia-prime 包),使用 prime-run xxx 来渲染 xxx 程序。

案例

演练:

xrandr --listproviders #查看当前的显卡配置

显示:

Providers: number : 1
Provider 0: id: 0x1b9 cap: 0x1, Source Output crtcs: 4 outputs: 3 associated providers: 0 name:NVIDIA-0

翻译一下就是:一共发现1个显卡。有个显卡叫 NVIDIA-0, 编号0,id 0x1b9,支持source output特性,四个输出,三个相关者。

从名字可以看出是nvidia独立显卡,该显卡支持source output特性。其实我的cpu是intel的,有个内置显卡,但是没有显示出来,这是为什么?因为我是台式机,把显示器直接连接到nvidia独立显卡上了。内置的显卡没有连接,它会自动关闭。

就算可以强制开启,也是没有意义的,因为nvidia显卡不能作为接收方,所以必须先把显示器接到主板的输出接口上,使用内置显卡作为输出端。

具体过程有点复杂,以下方案是给有一定动手能力的人参考:

一、linux的图形界面是通过/etc/X11/xorg.conf来配置的,如果要重新配置(比如我需要切换到intel接口),最好是把这个文件给删了。

sudo mv /etc/X11/xorg.conf /etc/X11/xorg.conf.bak #改名备份

二、确认屏蔽掉nouveau 驱动

sudo nano -w /etc/modprobe.d/nvidia.conf

添加如下内容

blacklist nouveau

三、获取两个显卡的硬件信息:

lspci 

显示类似如下信息:

...
00:02.0 VGA compatible controller: Intel Corporation Xeon E3-1200 v3/4th Gen Core Processor Integrated Graphics Controller (rev 06)
...
01:00.0 VGA compatible controller: NVIDIA Corporation GM107 [GeForce GTX 750 Ti] (rev a2)
....

也就是intel的pci是"PCI:0:2:0";而Nvidia显卡的pci是“PCI:1:0:0",注意这个写法的特征,将来编辑xorg.conf配置文件需要这个。

四、编写配置文件/etc/X11/xorg.conf

sudo nano /etc/X11/xorg.conf 

内容如下:

Section "ServerLayout"
    Identifier     "Layout0"
    Screen      0  "Screen0"
	Inactive	"IntelCart"
EndSection

Section "Device"
    Identifier     "NvidiaCart"
    Driver         "nvidia"
    BusID	"PCI:1:0:0" #极为重要,替换为你的配置
EndSection

Section "Device"
	Identifier	"IntelCart"
	Driver		"modesetting"
	BusID		"PCI:0:2:0"#替换
EndSection

Section "Screen"
    Identifier     "Screen0"
    Device         "NvidiaCart"
	Option		"AllowEmptyInitialConfiguration" #重点
EndSection
  1. 以上配置可以启动X服务,但是显示器没有输出,所以会黑屏,必须要在启动X服务的时候,执行如下命令。但是黑屏了你也执行不了,所以以下步骤很关键:我的方法是修改/etc/lightdm/lightdm.conf 这个文件,deepin默认用它来启动x服务,在里面可以配置启动脚本:
sudo nano -w /etc/lightdm/lightdm.conf

修改其中一行:#display-setup-script=,改成如下内容:

display-setup-script=sh -c "xrandr --setprovideroutputsource modesetting NVIDIA-0;xrandr --auto"

重启,完毕。

如果你重启正常,那么可以接下来处理一下问题:默认是垂直同步的,我们想fps更高,怎么办?

nvidia server settings

Sync to VBlank 关闭即可。

sudo apt install mesa-utils #安装测试工具
glxgears #测试速度,按Esc键退出

glxgears

xorg.conf

xorg 的配置文件,一般情况是不需要手工编写,驱动会协调运作。但是对于复杂的情况,比如双显卡,多个显示器等,就需要手工编写,以提供足够的配置信息格 xorg 系统。

基本由不同的节点组成,结构如下(不区分大小写):

Section "节点类型"
    选项 参数 参数 
    Option 组件定义参数
    ......
EndSection

节点类型:

  1. Files : 路径
    1. FontPath: 字体路径<标识符>:[属性]:pri=<优先级>,服务器路径<trans> / <主机名> : <端口号>
    2. ModulePath: 模块路径
    3. XkbDir:键盘布局路径
  2. ServerFlags : 服务器选项
    1. DefaultServerLayout: 默认布局
    2. NoTrapSignals: 调试退出
    3. UseSIGIO:
    4. DontVTSwitch: 不启用虚拟终端按键组合 Ctrl + Alt +Fn
    5. DontZap: 不启用 Ctrl + Alt + Backspace
    6. DontZoom: 不启用 Ctrl +Alt + Plus/Minus
    7. DisableVidModeExtension:禁用 Vidmode 扩展
    8. AllowNonLocalXvidtune:允许 vidmode
    9. AllowMouseOpenFail: 不报告鼠标故障
    10. BlankTime:屏保时间
    11. StandbyTime:待机时间
    12. SuspendTime: 睡眠时间
    13. Offtime: 关闭时间
    14. Pixmap: 色彩深度
    15. NoPM:禁用电源管理
    16. Xinerama:禁用 xinerama 扩展
    17. AIGLX:启用aiglx
    18. DRI2: 启用dri2
    19. GlxVisuals:启用glx特性
    20. UseDefaultFontPath: 默认字体路径
    21. IgnoreABI:忽略程序二进制兼容
    22. AutoAddDevices:自动添加设备
    23. AutoEnableDevices:自动启用设备
    24. Log:日志
  3. Module : 动态模块加载
    1. Load: 加载模块名
    2. Disable: 禁用模块名
    3. SubSection: 子节点,添加初始化参数
  4. Extensions : 扩展启用
  5. InputDevice : 输入设备
    1. Identifier: 标识
    2. Driver: 驱动,常用 evdev
    3. Option
      1. AutoServerLayout:添加到布局
      2. CorePointer:核心鼠标(过时)
      3. CoreKeyboard:核心键盘(过时)
      4. AlwaysCore:(过时)
      5. SendCoreEvents:(过时)
      6. Floating:浮动
      7. TransformationMatrix:格式转换矩阵
      8. AccelerationProfile: 加速模式
      9. ConstantDeceleration: 减速模式
      10. AccelerationScheme: 算法
      11. AccelerationNumerator: 因子
      12. AccelerationDenominator
      13. AccelerationThreshold
  6. InputClass : 输入类别
    1. Identifier: 标识
    2. Driver:驱动
    3. MatchProduct: 产品名匹配
    4. MatchVendor: 供应商匹配
    5. MatchDevicePath: 设备匹配
    6. MatchOS:系统匹配
    7. MatchPnPID:匹配pnp
    8. MatchUSBID:匹配usb id
    9. MatchDriver: 匹配驱动
    10. MatchTag:匹配标签
    11. MatchLayout: 匹配布局
    12. MatchIsKeyboard "bool"
    13. MatchIsPointer "bool"
    14. MatchIsJoystick "bool"
    15. MatchIsTablet "bool"
    16. MatchIsTouchpad "bool"
    17. MatchIsTouchscreen "bool"
  7. Device : 图形设备
    1. Identifier:标识
    2. Driver:驱动
    3. BusID:总线id
    4. Screen:屏幕
    5. Chipset:芯片组
    6. Ramdac:
    7. DacSpeed:
    8. Clocks:频率
    9. ClockChip:
    10. VideoRam:显存
    11. BiosBase:视频基地址
    12. MemBase:帧缓冲地址
    13. IOBase:IO基地址
    14. ChipID:芯片id
    15. ChipRev:修订号
    16. TextClockFreq:文本模式频率
    17. Option
  8. VideoAdaptor : 视频适配器
  9. Monitor : 监视器
    1. Identifier: 标识
    2. VendorName:供应商
    3. ModelName:型号
    4. HorizSync:水平刷新率
    5. VertRefresh:垂直刷新率
    6. DisplaySize:宽高
    7. Gamma:伽玛矫正
    8. UseModes:使用模式
    9. Mode:模式名
      1. DotClock: 时钟
      2. HTimings:水平时序
      3. VTimings:垂直时序
      4. Flags: 标志
      5. hSkew:
      6. VScan: 扫描线
    10. ModeLine:模式名(精简)
    11. Option
      1. Monitor-outputname:输出名
      2. DPMS:电源管理
      3. SyncOnGreen:同步引脚信号
      4. Primary:主监视器
      5. PreferredMode:首选模式
      6. Position:位置
      7. LeftOf:位于左侧
      8. RightOf:位于右侧
      9. Above:位于上方
      10. Below:位于下方
      11. Enable:启用
      12. DefaultModes:启用监视器内置模式
      13. MinClock:最小时钟
      14. MaxClock:最大时钟
      15. Ignore:忽略
      16. Rotate:旋转
  10. Modes : 视频模式
  11. Screen : 屏幕
    1. Identifier: 标识
    2. Device: 图形设备
    3. Monitor: 监视器
    4. VideoAdaptor: 视频适配器
    5. DefaultDepth:默认颜色深度
    6. DefaultFbBpp:帧缓冲颜色深度
    7. Option
      1. Accel:加速
      2. InitPrimary:软引导
      3. NoInt10: 禁用Int10模块
      4. NoMTRR:禁用MTRR
    8. SubSection "Display": 显示子节点
      1. Depth:深度
      2. FbBpp:帧缓冲格式
      3. Weight:权重
      4. Virtual:虚拟分辨率
      5. ViewPort:初始左上角
      6. Modes:模式
      7. Visual:显示色彩类型
      8. Black:黑底
      9. White:白字
  12. ServerLayout : 布局
    1. Identifier:标识
    2. Screen:屏幕,编号 id 位置
    3. InputDevice:输入设备
    4. option
      1. IsolateDevice:隔离设备
      2. SingleCard:单卡模式
  13. DRI : DRI选项
  14. Vendor : 供应商选项
  15. Keyboard : 键盘(过时)
  16. Pointer : 鼠标(过时)
  17. Input : (过时) 总体关系是: 图形设备 + 监视器 => 屏幕 + 输入设备 => 布局

声卡

KDE桌面中声音管理是 phonon,有两个后端处理,分别是:

  1. phonon GStreamer ,如果没有用sudo apt install phonon4qt5-backend-gstreamer安装
  2. phonon VLC 通过主菜单的:系统设置/多媒体/后端可以查看。

不过默认的gstreamer不支持mp3,很多应用程序无法播放mp3,修补的方法是安装以下解码器:

  1. sudo apt install gstreamer1.0-libav
  2. sudo apt install gstreamer1.0-plugins-good
  3. sudo apt install gstreamer1.0-plugins-ugly
  4. sudo apt install gstreamer1.0-plugins-bad

usb网卡

很多网卡驱动都需要另外安装,以下演示我的一个usb网卡的安装过程。

一、lsusb :运行两次,一个是插入usb网卡前,一次是插入网卡后,这样可以判断usb是那个型号。如:

htqx@lv6sjxpc:~$ lsusb
Bus 002 Device 002: ID 8087:8001 Intel Corp. 
Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 001 Device 002: ID 8087:8009 Intel Corp. 
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 004 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 003 Device 004: ID 093a:2510 Pixart Imaging, Inc. Optical Mouse
Bus 003 Device 002: ID 05e3:0723 Genesys Logic, Inc. GL827L SD/MMC/MS Flash Card Reader
Bus 003 Device 005: ID 2f68:0082  
Bus 003 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
htqx@lv6sjxpc:~$ lsusb
Bus 002 Device 002: ID 8087:8001 Intel Corp. 
Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 001 Device 002: ID 8087:8009 Intel Corp. 
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 004 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 003 Device 004: ID 093a:2510 Pixart Imaging, Inc. Optical Mouse
Bus 003 Device 006: ID 2357:0101  #这个是新增的
Bus 003 Device 002: ID 05e3:0723 Genesys Logic, Inc. GL827L SD/MMC/MS Flash Card Reader  
Bus 003 Device 005: ID 2f68:0082                                                         
Bus 003 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub     

二、根据这个型号百度,即2357:0101,网上会有人提供驱动源代码。找到然后下载。或者在这个网站找到供应商信息:https://devicehunt.com/search/type/usb/vendor/0BDA/device/any

  1. 找到的网站1:https://wikidevi.com/wiki/TP-LINK_Archer_T4U,得知型号是:TP-LINK Archer T4u;芯片是rtl8812au。
  2. 源码:https://github.com/abperiasamy/rtl8812AU_8821AU_linux.git

三、解压缩驱动包,进入目录,查看README.md这个文档,里面有指导安装命令。然后:make 编译,记住,编译的前提是你安装了linux当前内核的头文件。用uname -r查看内核版本,并安装对应的头文件。

四、sudo make install 安装。

五、重启,或者用sudo modprobe -a rtl8812au立即装载驱动模块。

如果该驱动包里面有dkms.conf文件,表示支持动态模块,可以用dkms自动化管理,那就更好,因为它可以在你升级内核的时候,自动编译驱动模块。根据README.md的说明:

  1. sudo make -f Makefile.dkms install
  2. sudo dkms status #查看安装情况
  3. 重启或者sudo modprobe -a rtl8812au

网卡驱动安装完毕,如何检验是否正常?

  1. ip a 列出网络接口,一般无线网卡是wl开头。
  2. 一般桌面右下角的网络连接工具可以操作wifi。以kde为例这工具叫kde5-nm-connection-edit

参考

  1. debian 安装amd显卡驱动:https://wiki.debian.org/AtiHowTo
  2. arch linux kde wiki: https://wiki.archlinux.org/index.php/KDE#MP3_files_cannot_be_played_when_using_the_GStreamer_Phonon_backend
  3. Linux 启动参数介绍: https://www.cnblogs.com/super-king/p/3296344.html
  4. arch prime: https://wiki.archlinux.org/index.php/PRIME
  5. nvidia官方文档:https://us.download.nvidia.cn/XFree86/Linux-x86/375.26/README/randr14.html
1
https://gitee.com/coder_lw/wiki.git
git@gitee.com:coder_lw/wiki.git
coder_lw
wiki
wiki
master

搜索帮助