过去,您可以在切换到文本控制台、终止 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 文档, 你必须:
下载或安装vbetool。现在大多数发行版都包含此实用程序,并且通常是挂起/恢复工具的一部分。
在您的内核配置中,确保 CONFIG_FRAMEBUFFER_CONSOLE 设置为“y”或“m”。启用一个或多个您最喜欢的帧缓冲区驱动程序。
启动到文本模式并以 root 身份运行:
vbetool vbestate save > <vga state file>
上述命令将图形硬件的寄存器内容保存到<vga状态文件>。您只需执行此步骤一次,因为状态文件可以重复使用。
如果 fbcon 被编译为模块,则通过执行以下操作加载 fbcon:
modprobe fbcon
现在分离 fbcon:
vbetool vbestate restore < <vga state file> && \ echo 0 > /sys/class/vtconsole/vtcon1/bind
就这样,您回到了 VGA 模式。如果您将 fbcon 编译为模块,则可以通过 卸载它
rmmod fbcon
。重新连接 fbcon:
echo 1 > /sys/class/vtconsole/vtcon1/bind
一旦 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 也是先决条件(以防您仍然错过某些内容)。