10. Linux驱动 - Ubuntu驱动签名

嵌入式Linux

在一般得嵌入式Linux中,默认驱动签名是不打开的,所以驱动程序编写完成后,直接sudo insmod xxx.ko 就可以使用了。
但是在Ubuntu等成品系统中,因为安全和引导问题,大多是开启的,所以所有的驱动都要经过签名才能使用。

Ubuntu驱动签名历史

内核从3.7后开始支持模块签名,这个功能使能以后,内核只允许安装特定key签名的模块。
在安全启动模式下,是不能加载未签名或由未注册的密钥签名的内核模块的。

系统配置

内核在编译的时候,启动相关配置(.config),内核才会启动内核签名功能

# /boot/config-$(uname -r)
# 启用内核签名
CONFIG_MODULE_SIG=y
# 表示开启了签名机制,但是这时候模块签名或不签名都可以使用
CONFIG_MODULE_SIG_FORCE=y
# 模块必须有正确的签名才能正常使用
CONFIG_MODULE_SIG_ALL=y

如何查看驱动是否加入签名

查看驱动程序,最后面数据是否是MODULE_SIG_STRING("~Module signature appended~\n")

# 有驱动签名
root:~$ hexdump -C ./crc32c-intel.ko | tail
000055f0  c6 5b 16 42 16 79 2a f8  5e bb b1 50 cf 7f 2b 73  |.[.B.y*.^..P..+s|
00005600  b6 0d 26 0e 63 f9 2f 46  2a 11 b7 61 b4 8d 61 46  |..&.c./F*..a..aF|
00005610  13 16 5f 09 97 c9 a9 84  61 0a a4 bc 60 03 48 92  |.._.....a...`.H.|
00005620  c3 62 20 03 43 36 eb c6  44 3a d4 fd 1c 03 14 ff  |.b .C6..D:......|
00005630  d5 c8 03 5a 07 5f 58 30  1e 7f d4 66 59 b4 14 c2  |...Z._X0...fY...|
00005640  98 b8 b2 6a 45 d6 13 54  cc 01 04 01 2b 14 00 00  |...jE..T....+...|
00005650  00 00 00 01 82 7e 4d 6f  64 75 6c 65 20 73 69 67  |.....~Module sig|
00005660  6e 61 74 75 72 65 20 61  70 70 65 6e 64 65 64 7e  |nature appended~|
00005670  0a                                                |.|
00005671

# 无驱动签名 
root:~$ hexdump -C ./ahci.ko | tail
00017370  00 00 00 00 00 00 00 00  c1 00 00 00 01 00 00 00  |................|
00017380  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
00017390  10 6a 01 00 00 00 00 00  14 00 00 00 00 00 00 00  |.j..............|
000173a0  00 00 00 00 00 00 00 00  04 00 00 00 00 00 00 00  |................|
000173b0  00 00 00 00 00 00 00 00  51 00 00 00 03 00 00 00  |........Q.......|
000173c0  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
000173d0  24 6a 01 00 00 00 00 00  4d 01 00 00 00 00 00 00  |$j......M.......|
000173e0  00 00 00 00 00 00 00 00  01 00 00 00 00 00 00 00  |................|

签名Demo

假设驱动 hello.ko 已经写好,然后按照如下步骤进行签名:

  1. 生成密钥
    需要生成私钥(sig.key)和公钥(sig.der), 证书名字为 hello driver sign
    openssl req -new -x509 -newkey rsa:2048 -keyout sign.key -outform DER -out sign.der -nodes -days 36500 -subj "/CN=hello driver sign"
  2. 导入密钥到MOK证书列表
    sudo mokutil --import ./sign.der, 通过mokutil --list-enrolled 来查看证书是否导入成功
  3. 对驱动签名
    /usr/src/linux-headers-xxxx/scripts/sign-file sha256 sign.key sign.der hello.ko, 然后通过hexdump -C hello.ko | tail 查看是否有Module signature appended
  4. 安装和加载模块
    sudo insmode hello.ko, sudo modprobe -a hello.ko, sudo lsmod | grep hello

参考链接:

  • https://www.cnblogs.com/imagineAct/p/11296563.html
  • https://askubuntu.com/questions/1023036/how-to-install-nvidia-driver-with-secure-boot-enabled/1049479#1049479
  • https://sourceware.org/systemtap/wiki/SecureBoot
  • https://www.jianshu.com/p/215eee5dbb05
<think>嗯,用户想在Ubuntu系统上下载并安装驱动程序,特别是NVIDIA显卡驱动。首先,我得回忆一下安装驱动的一般步骤。根据之前的引用资料,用户提到了三种方法,可能需要分别介绍。 首先,用户可能需要确认自己的显卡型号,因为不同的显卡可能需要不同的驱动版本。使用lspci命令应该可以查看。然后,系统默认可能使用开源驱动nouveau,所以在安装专有驱动前可能需要禁用这个驱动。不过引用中提到的几种安装方法里,有的可能不需要手动禁用,比如使用Ubuntu自带的“软件和更新”工具安装的话,系统会自动处理。 然后,用户可能更适合哪种安装方法呢?引用1提到了三种方法:使用软件和更新、使用PPA源、手动安装。对于新手来说,第一种方法最简单,图形界面操作,不容易出错。而手动安装可能适合需要特定版本的用户,但风险更高。需要注意安装依赖项,比如build-essential和cmake,这些在引用1里有提到。 另外,安装完成后需要重启系统,如引用2中说的sudo reboot。还有,引用3提到有些用户可能已经通过发行版提供的包安装了驱动,这时候可能需要先卸载原有驱动,或者选择更合适的安装方式。比如,使用Ubuntu官方源的驱动可能集成更好。 还有,用户可能也关心核显驱动,比如Intel的,引用4提到可以下载专门的安装器,但这里用户的问题主要是关于NVIDIA驱动,所以可能不需要深入讨论核显,除非用户有混合显卡的情况。 另外,要提醒用户安装后验证驱动是否成功,比如使用nvidia-smi命令。如果有问题,可能需要进入恢复模式或者卸载驱动重新安装。比如,如果安装后出现黑屏,可能需要通过SSH连接或者进入tty终端来修复。 总结步骤应该是:1. 检查硬件信息;2. 选择安装方法(推荐图形界面或命令行工具);3. 安装依赖;4. 执行安装;5. 重启并验证。同时,需要注意不同方法的优缺点,比如稳定性和版本新旧。 可能用户遇到的问题包括:驱动冲突、安装后无法进入图形界面、如何卸载旧驱动等。在回答中需要涵盖这些常见问题的解决方法,或者至少给出提示。比如,在手动安装时,可能需要关闭Secure Boot,或者处理nouveau驱动的黑名单。 最后,生成的相关问题应该围绕安装后的性能分析、不同安装方法的比较、以及解决常见安装问题的方法。比如如何选择驱动版本,或者处理安装失败的情况。</think>### 分步指南:Ubuntu系统下载并安装驱动程序 #### 一、确认硬件信息 1. **查看显卡型号** 在终端输入以下命令,获取NVIDIA显卡型号: ```bash lspci | grep -i nvidia ``` 输出示例: `01:00.0 VGA compatible controller: NVIDIA Corporation GA106 [GeForce RTX 3060 Lite Hash Rate] (rev a1)` 记录型号中的关键字段(如`GA106`)。 2. **检查当前驱动状态** 输入以下命令,若显示`NVIDIA-SMI has failed`则表示未安装驱动: ```bash nvidia-smi ``` --- #### 二、安装方法选择(3种常用方式) ##### 方法1:通过「软件和更新」安装(推荐新手) 1. 打开`软件和更新` → 选择`附加驱动`标签页 2. 在列表中选择推荐的驱动版本(如`NVIDIA 535`) 3. 点击`应用更改`,系统会自动下载并安装[^3] 4. **重启生效**: ```bash sudo reboot ``` ##### 方法2:使用PPA源安装(获取最新驱动) 1. 添加官方PPA源: ```bash sudo add-apt-repository ppa:graphics-drivers/ppa sudo apt update ``` 2. 查看可用驱动版本: ```bash ubuntu-drivers devices ``` 3. 选择带`recommended`标记的版本安装(如`nvidia-driver-550`): ```bash sudo apt install nvidia-driver-550 ``` 4. **重启系统**: ```bash sudo reboot ``` ##### 方法3:手动安装.run文件(特定版本需求) 1. 到[NVIDIA官网](https://www.nvidia.com/Download/index.aspx)下载对应驱动文件(如`NVIDIA-Linux-x86_64-550.40.run`) 2. **关闭图形界面**: ```bash sudo systemctl isolate multi-user.target ``` 3. 赋予执行权限并安装: ```bash chmod +x NVIDIA-Linux-x86_64-*.run sudo ./NVIDIA-Linux-x86_64-*.run ``` 4. **重建内核模块**: ```bash sudo update-initramfs -u ``` --- #### 三、验证安装 1. 执行以下命令确认驱动版本: ```bash nvidia-smi ``` 正常输出应包含GPU型号、驱动版本和CUDA版本信息: ``` +---------------------------------------------------------------------------------------+ | NVIDIA-SMI 535.129.03 Driver Version: 535.129.03 CUDA Version: 12.2 | |-----------------------------------------+----------------------+----------------------+ ``` 2. 检查显示配置: ```bash nvidia-settings ``` --- #### 四、常见问题处理 1. **安装后黑屏** - 进入恢复模式 → 选择`root shell` - 卸载驱动: ```bash sudo apt purge nvidia-* ``` - 重新安装推荐版本 2. **依赖缺失错误** 安装编译工具链(引用1): ```bash sudo apt install -y build-essential cmake libglvnd-dev ``` 3. **Secure Boot冲突** 在BIOS中禁用Secure Boot,或为驱动签名[^4]。 --- ###
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值