卸载 KMS 驱动程序/无需重新启动即可替换 NVIDIA Linux 驱动程序

卸载 KMS 驱动程序/无需重新启动即可替换 NVIDIA Linux 驱动程序

过去,您可以在切换到文本控制台、终止 X.org 并卸载 ( rmmod) 相应的 NVIDIA 模块并安装新驱动程序后,轻松地即时替换 NVIDIA 专有驱动程序。

然而现在 NVIDIA 建议运行支持 KMS 的驱动程序,options nvidia-drm modeset=1这使得无法卸载内核模块(“设备正忙”)。

Linux 内核允许通过运行以下命令从文本控制台解除图形驱动程序的绑定:

echo 0 > /sys/class/vtconsole/vtcon1/bind

然而,此命令会导致所有文本控制台完全失效。他们只是冻结,系统继续运行。

看起来在这个命令之后,需要运行另一个命令来使内核重新启用内置驱动程序,这些驱动程序在 NVIDIA 驱动程序之前驱动文本控制台,只是互联网上没有这方面的信息。

这个问题是不是仅限 NVIDIA 驱动程序。如果知道如何卸载开源 KMS 驱动程序(无论是 Intel、AMD 还是 Nouveau),那就太好了。

这是我在启动时看到的内容:

Console: colour dummy device 80x25
printk: console [tty0] enabled
fbcon: Deferring console take-over
fbcon: Taking over console
Console: switching to colour frame buffer device 128x48

这是我的.config

CONFIG_SYSFB=y
CONFIG_SYSFB_SIMPLEFB=y
CONFIG_DRM_FBDEV_EMULATION=y
CONFIG_DRM_FBDEV_OVERALLOC=200
CONFIG_FB_CMDLINE=y
CONFIG_FB_NOTIFY=y
CONFIG_FB=y
CONFIG_FB_DEFERRED_IO=y
CONFIG_FB_VESA=y
CONFIG_FB_EFI=y
CONFIG_FB_SIMPLE=y

这是我的内容/sys

$ find /sys -iname '*fb*'
/sys/class/graphics/fb0
/sys/class/graphics/fbcon
/sys/devices/platform/simple-framebuffer.0/graphics/fb0
/sys/devices/virtual/graphics/fbcon
/sys/module/drm_kms_helper/parameters/drm_fbdev_overalloc
/sys/module/drm_kms_helper/parameters/fbdev_emulation
/sys/module/fb
/sys/module/fb/parameters/lockless_register_fb

答案1

根据内核 fbcon 文档, 你必须:

  1. 下载或安装vbetool。现在大多数发行版都包含此实用程序,并且通常是挂起/恢复工具的一部分。

  2. 在您的内核配置中,确保 CONFIG_FRAMEBUFFER_CONSOLE 设置为“y”或“m”。启用一个或多个您最喜欢的帧缓冲区驱动程序。

  3. 启动到文本模式并以 root 身份运行:

     vbetool vbestate save > <vga state file>
    

    上述命令将图形硬件的寄存器内容保存到<vga状态文件>。您只需执行此步骤一次,因为状态文件可以重复使用。

  4. 如果 fbcon 被编译为模块,则通过执行以下操作加载 fbcon:

    modprobe fbcon
    
  5. 现在分离 fbcon:

    vbetool vbestate restore < <vga state file> && \
    echo 0 > /sys/class/vtconsole/vtcon1/bind
    
  6. 就这样,您回到了 VGA 模式。如果您将 fbcon 编译为模块,则可以通过 卸载它rmmod fbcon

  7. 重新连接 fbcon:

    echo 1 > /sys/class/vtconsole/vtcon1/bind
    
  8. 一旦 fbcon 解除绑定,所有注册到系统的驱动程序也将解除绑定。这意味着 fbcon 和各个帧缓冲区驱动程序可以随意卸载或重新加载。重新加载驱动程序或 fbcon 将自动将控制台、fbcon 和驱动程序绑定在一起。卸载所有驱动程序而不卸载 fbcon 将使控制台无法绑定 fbcon。

该文档还提供了一个示例脚本(您需要确保具备先决条件):

#!/bin/bash
# Unbind fbcon

# Change this to where your actual vgastate file is located
# Or Use VGASTATE=$1 to indicate the state file at runtime
VGASTATE=/tmp/vgastate

# path to vbetool
VBETOOL=/usr/local/bin


for (( i = 0; i < 16; i++))
do
  if test -x /sys/class/vtconsole/vtcon$i; then
      if [ `cat /sys/class/vtconsole/vtcon$i/name | grep -c "frame buffer"` \
           = 1 ]; then
        if test -x $VBETOOL/vbetool; then
           echo Unbinding vtcon$i
           $VBETOOL/vbetool vbestate restore < $VGASTATE
           echo 0 > /sys/class/vtconsole/vtcon$i/bind
        fi
      fi
  fi
done

虽然,如果执行这些步骤后仍然挂起,ipaqmaster 确实处理了很多阻塞情况这个脚本gpuLockHandler函数中。

此外,在Nouveau KMS 文档,CONFIG_VT_HW_CONSOLE_BINDING 也是先决条件(以防您仍然错过某些内容)。

相关内容