如何使用 kmod-nvidia 驱动程序进行启动

如何使用 kmod-nvidia 驱动程序进行启动

我在一台使用 NVIDIA GeForce GTX 660 Ti 显卡构建的计算机上安装了 Fedora 21。当我最初安装系统时,在运行它时遇到了大量问题,直到我kmod-nvidia从 RPMFusion 安装了软件包。从那时起,我对操作系统本身的体验就一直顺利。

但是,在内核选择屏幕和启动过程中,我可以看出它正在使用基本图形驱动程序,因为当它提示我输入解密密码时,它使用基本文本界面(与出现的普通文本框相比)主题plymouth)。此外,在输入我的解密短语后,它还会加载条形图而不是 Fedora 气球。

这显然不是一个主要问题,但它让我好奇了一段时间,因为我知道我的系统具有功能强大的驱动程序,但我只是不知道如何让它们尽早加载到系统中。

当我最初诊断和修复我的系统时,我遵循本指南来自如果非真则假。

任何帮助表示赞赏!

答案1

以下是我如何从 rpmfusion nonfree 获取 kmod-nvidia 软件,并在配置为“安全启动”/UEFI 的计算机上与 Fedora 26 一起使用。在针对 nvidia 内核模块运行 modprobe 时,我收到错误“所需密钥不可用”。

保持 UEFI 安全启动启用并运行专有的 nvidia 驱动程序是可能的,而且不太难。

  • 安装 rpmfusion 免费和非免费存储库后,安装 kmod-nvidia:dnf install kmod-nvidia
  • 通过进行 openssl 配置并运行以下命令来创建自签名证书和密钥:

    cd /root #or somewhere reasonably safe
    cat > mokutil-openssl.conf << XYZZY
    [ req ]
    default_bits = 4096
    distinguished_name = req_distinguished_name
    string_mask = utf8only
    x509_extensions = exts
    prompt = no
    
    [ req_distinguished_name ]
    O = username
    CN = username
    emailAddress = [email protected]
    
    [ exts ]
    basicConstraints=critical,CA:FALSE
    keyUsage=digitalSignature
    subjectKeyIdentifier=hash
    authorityKeyIdentifier=keyid
    XYZZY
    
    # create the certificate & key
    openssl req -x509 -new -nodes -utf8 -sha256 -days 7300 -config ./mokutil-openssl.conf -outform DER -out mokutil.der -keyout mokutil.key -batch
    # to verify the certificate:
    openssl x509 -inform DER -in ./mokutil.der -noout -text |less
    
  • 接下来,使用提供的实用程序对新的 nvidia 内核模块进行签名:

    cd /lib/modules/$(uname -r)/extra/nvidia
    /usr/src/kernels/$(uname -r)/scripts/sign-file sha256 /root/mokutil.key /root/mokutil.der nvidia.ko
    /usr/src/kernels/$(uname -r)/scripts/sign-file sha256 /root/mokutil.key /root/mokutil.der nvidia-drm.ko 
    /usr/src/kernels/$(uname -r)/scripts/sign-file sha256 /root/mokutil.key /root/mokutil.der nvidia-modeset.ko 
    /usr/src/kernels/$(uname -r)/scripts/sign-file sha256 /root/mokutil.key /root/mokutil.der nvidia-uvm.ko 
    
  • 证书需要添加到BIOS才可信:

    # first, we stage the new certificate to be added to the BIOS on 
    # the next reboot.  You will be prompted to enter a password when
    # running the utility; the BIOS will ask for the same password on 
    # reboot.
    mokutil --import ./mokutil.der
    
    # This command shows whether or not mokutil was able to stage the
    # new certificate for import into the BIOS.  If the process is 
    # unsuccessful, you may have to enter the BIOS and import the key
    # manually from its interface, perhaps from a USB stick.  If this
    # command returns your certificate, you should reboot.  The BIOS 
    # will prompt you to take action and enter in the password you
    # input in the previous step.
    mokutil -N
    
    # This command shows which certificates are trusted by the BIOS.
    # There will be one installed by the manufacturer and if 
    mokutil --list-enrolled 
    
  • 如果一切顺利,您的机器应该已经加载了新模块。您可以检查lsmod |grep nvidia

  • 安装新内核时,您必须再次对模块进行签名。

我找到了大部分信息这里,但签名实用程序不需要使用 perl 调用。我还签署了 kmod-nvidia 构建过程输出的所有四个模块。

答案2

Liczyrzepa 的回答(对我很有帮助)让我制作了一个小脚本,每次 Fedora 推出新内核(即一直!)时都会对我的所有“额外”模块进行签名,但当 Fedora 开始发布时,这个脚本就失败了.ko.xz 模块。

由于我收到的错误消息引导我在花园小路上走了一段时间,我想我应该在此处添加修改后的脚本,希望它可能有用。请注意,Liczyrzepa 答案的“一次性”部分,即生成密钥并将其安装在 BIOS 中,同样适用。


#!/bin/bash
signfile=/usr/src/kernels/$(uname -r)/scripts/sign-file
key=/root/mokutil.key
der=/root/mokutil.der
for moddir in /lib/modules/$(uname -r)/extra/*
do
   cd $moddir
   echo "entered $moddir"
   for module in *.ko*;   do 
     module_basename=${module:0:-3}
     module_suffix=${module: -3}
     if [[ "$module_suffix" == ".xz" ]]; then
          unxz $module
          $signfile sha256 "${key}" "${der}" "${module_basename}"
          xz -f ${module_basename}
     else
          $signfile sha256 "${key}" "${der}" "${module_basename}"
     fi
   echo "signed $module" 
   done
done

相关内容