---
title: Ubuntu 显卡安装小记
date: 2023-08-06
modified: 2023-08-06
url: https://yuuu.org/post/ubuntu-gpu-driver
categories: ["折腾"]
tags: ["折腾"]
---
近日想在 ubuntu 上录一个屏，于是我安装了 obs，但是打开后才发现屏幕捕捉只是黑屏一片，只有一个鼠标可以显示。上网搜索一番才知道，大概是 ubuntu 的自带的显卡驱动 nouveau 的问题。所以最好的解决方法大概就是安装英伟达显卡的驱动。<!--more-->  
以我在 windows 上的操作逻辑，当然是直接在可视化界面中的「软件与更新」里面寻找显卡驱动，然后直接更新，可这就是悲剧的开始。在 ubuntu 中的「软件和更新」中选择了图中的「NVIDIA Server Driver metapackage 来自 nvidia-driver-535-server (专有)」进行更新。安装完成后，它要求重启来完成安装。可当重启后，却是只显示几行代码。我不懂'SGX'和'ucsi-ccg'是什么意思，但是看到 nvidia-gpu 和 error 的时候，我大概明白，应该是安装出的问题：英伟达显卡超时错误。

![1](https://cdn.yuuu.org/post-img/7/1.webp)

我尝试着用 alt + ctrl + f1 进入 tty1 虚拟控制台，但是毫无反应，重复用 alt + ctrl + f1/2/3/4/5/6 来试图进入 tty1/2/3/4/5/6，偶有几次成功，但是却会在数秒后无征兆退回最初的错误页面。几番尝试全都无果告终，重启好几次都只是卡在以上的界面。
网络上的解决教程几乎都是围绕着进入命令行开始修复的，却没有像我这般卡死在「外边」的。  
但是，我手里留有一个安装 ubuntu 的 u 盘。里面还有 ubuntu 的镜像。通过可以 live usb 中 try ubuntu 可以试用其中的 ubuntu 系统，虽然应该是一个最小安装的系统，但是也不妨碍我们用它来救救火。

## 修复驱动

插入 u 盘，选择该 u 盘并启动其中的 ubuntu 镜像。在最开始的页面中选择「试用 ubuntu」进入 ubuntu 系统。

接下来，打开终端，开始挂载安装本机中安装了 ubuntu 的硬盘。在此之前，先确定安装 ubuntu 的盘在哪个物理磁盘上。用`parted`指令或者`fdisk`均可。我电脑有两块 128GB 的 SSD 硬盘，有点容易搞混，parted 可以显示硬盘名字，增加区分度。

```bash
sudo fdisk -l
# 如果用fdisk还是不知道在哪个盘试试下面这个parted
sudo parted -l
```

![2](https://cdn.yuuu.org/post-img/7/2.webp)

如图所示，这里有两个盘，文件系统为`ntfs`的是 windows 系统所在的盘，`ext4`则是 ubuntu 系统所在的盘。
我所要挂载的盘是 /dev/sdb，各位要根据实际进行修改。

### 挂载硬盘和启用必要的虚拟文件系统

```bash
# 将硬盘上的 Ubuntu 根分区挂载到 `/mnt` 目录，访问和操作其中的文件和目录
sudo mount /dev/sdb /mnt
```

```bash
# 在 chroot 环境中访问和使用系统中的设备文件。
sudo mount --bind /dev /mnt/dev

# 在 chroot 环境中使用终端功能。
sudo mount --bind /dev/pts /mnt/dev/pts

# 在 chroot 环境中访问和操作系统内核和进程的相关信息。
sudo mount --bind /proc /mnt/proc

# 在 chroot 环境中访问和操作系统硬件和设备的相关信息。
sudo mount --bind /sys /mnt/sys
```

```bash
# 切换当前的根目录到 `/mnt`,
# 通过使用 chroot，我们可以在一个隔离的环境中运行命令，让其以为这个环境是真正的根目录，
# 从而可以进行系统操作、安装软件。
sudo chroot /mnt
```

综合起来，这些命令的逻辑是将硬盘上的 Ubuntu 根分区挂载到 `/mnt`，然后通过绑定虚拟文件系统和使用 chroot，创建一个隔离的环境，以便在其中操作和管理您的 Ubuntu 系统。这样做可以方便地进行修复、配置或管理系统，而不会影响到主机系统。

### 进入 chroot 进行修复

进到 chroot 环境中就可以正式开始修复了。先卸载可能已经安装了的 NVIDIA 驱动。

```bash
sudo apt-get purge nvidia-*  # 删除所有 NVIDIA 显卡驱动程序及其相关的软件包
sudo apt-get autoremove  # 移除系统上已经不再需要的软件包
```

然后安装回默认的 Nouveau 驱动

```bash
sudo apt-get install xserver-xorg-video-nouveau
```

我的电脑无法正常进入系统，也无法进入 tty 模式，可能在系统引导出了问题，这里我更新一下 grub，预防万一。正常情况下应该是不需要执行的。

```bash
update-grub
```

在 chroot 环境中完成修复后，退出 chroot

```bash
exit
```

### 卸载虚拟文件系统

退出 chroot 后，卸载之前挂载的虚拟文件系统：
相反的顺序卸载虚拟文件系统，以确保没有依赖关系。

```bash
sudo umount /mnt/sys
sudo umount /mnt/proc
sudo umount /mnt/dev/pts
sudo umount /mnt/dev
```

最后，卸载硬盘分区。

```bash
sudo umount /mnt
```

现在就可以关闭系统，卸载 u 盘，然后重启了。

```bash
sudo reboot
```

重启后看到了久违的系统桌面，总算是救援成功。🥳

## 安装英伟达显卡驱动

虽然电脑是救回来了，但我还是想安装显卡驱动，这个该怎么做？
既然系统内自带的“软件和更新”程序没法正常更新，我打算手动安装驱动。

### 下载驱动和附加组件

在[官方驱动 | NVIDIA](https://www.nvidia.cn/Download/index.aspx?lang=cn)可以通过条件选取选择到适合自己的驱动。
不知道显卡驱动的话，可以用以下指令查看。

```bash
lspci | grep -i vga
```

通过下载我们会得到一个.run 的文件。这个文件先放好，一会用上。

### 安装组件和清理驱动

现在我们安装一些必备/可选的驱动，考虑到各种问题，我还是把一些大概用不上但是可能用的上的组件给加上了。

```bash
sudo apt-get update   # 更新软件列表

sudo apt-get install g++ # 安装gcc套件

sudo apt-get install gcc  # 安装gcc套件

sudo apt-get install make  # 安装make

sudo apt install linux-headers-$(uname -r) # 安装内核头文件 (可选)

sudo apt install xorg # 安装 X Window System(可选)

sudo apt install libgl1-mesa-dev # 安装 OpenGL 库和开发工具(可选)
```

卸载所有英伟达显卡驱动，为了避免之前安装的驱动对我们造成影响。

```bash
sudo apt-get remove --purge nvidia*
```

### 禁用 nouveau

接下来禁用 nouveau，在 blacklist 中禁用。

> `/etc/modprobe.d/blacklist.conf` 是一个配置文件，用于在 Linux 系统中禁用或屏蔽特定的内核模块（驱动程序）加载。  
> 在 Linux 系统中，内核模块是用于支持硬件设备、文件系统或其他核心功能的一种动态加载的软件组件。`/etc/modprobe.d/blacklist.conf` 文件允许您指定要禁用的内核模块，以防止其加载。  
> 当您在 `/etc/modprobe.d/blacklist.conf` 文件中添加一个模块的条目时，系统会在启动时检查该文件，并在加载内核模块时跳过指定的模块。这对于解决某些硬件或软件相关的问题非常有用，例如禁用冲突的驱动程序或不需要的功能模块。  
> 在该文件中，每个禁用的内核模块条目通常以 `blacklist` 关键字开头，后跟要禁用的模块的名称。

```bash
# 打开并编辑blacklist.conf
sudo gedit /etc/modprobe.d/blacklist.conf
```

加入以下两行，禁用 Nouveau 驱动程序

```bash
# 禁用 Nouveau 驱动程序，阻止 Nouveau 驱动程序在系统启动时加载
blacklist nouveau
# 禁用 Nouveau 驱动程序的内核模式设置
options nouveau modeset=0
```

最后更新一下 initramfs，主要还是担心之前的引导问题。

```bash
sudo update-initramfs -u  # -u参数表示 "update"
```

> 在 Linux 系统启动时，initramfs 是一个非常小的文件系统，它包含了一些基本的工具、驱动程序和文件，用于在正式的根文件系统被挂载之前进行初始化和准备工作。它的主要目的是为了确保系统能够正确地启动并加载所需的驱动程序和文件系统。  
> initramfs 中包含了用于加载真正的根文件系统所需的驱动程序、模块、配置文件和其他必要的工具。它允许系统在启动过程中进行硬件检测、初始化设备、加载必要的驱动程序和模块，以及解决其他启动过程中可能遇到的问题。  
> 一旦 initramfs 完成了启动过程中的初始化和准备工作，它会将控制权转交给真正的根文件系统，然后真正的根文件系统会被挂载到系统上，从而完成整个启动过程。

重启后看看是否可以进入系统，此时进入「软件与更新」，则会提示说我们在使用备用驱动。
![3](https://cdn.yuuu.org/post-img/7/3.webp)

### 开始安装驱动

接下来就是进入命令行了。可以使用`sudo telinit 3` 和 `init 3` 在 Linux 系统中切换运行级别（也称为运行模式），他们的效果是一样的。

```bash
sudo init 3
# or
sudo telinit 3
```

> **补课^啥是运行级别**
> 在 Linux 中，运行级别是指操作系统处于不同状态下的配置集合。不同的运行级别可以定义不同的服务和功能。以下是一些常见的运行级别：
> 0 - 关机状态：系统已经关闭或将要关闭。  
> 1 - 单用户模式：只有一个用户（通常是 root）可以登录，用于系统维护和修复。  
> 2 - 多用户模式，没有网络：多用户模式，但没有网络连接。  
> 3 - 多用户模式，有网络：多用户模式，并且启动了网络服务。  
> 4 - 保留模式：未分配特定用途，可以根据需要进行自定义配置。  
> 5 - 图形用户界面模式：启动图形用户界面（如 X Window System）。  
> 6 - 重启状态：用于重新启动系统。  

对了，在运行前先看看 nouveau 还运不运行，不输出就是不运行了。

```bash
lsmod | grep nouveau
```

接下来就很简单了，cd 到下载了驱动的目录，先增加可执行权限，然后运行。

```bash
# 给你下载的驱动赋予可执行权限，才可以安装
sudo chmod +x NVIDIA-Linux-x86_64-535.86.05.run   
# 安装 (前面已经安装了openGL，加后缀不安装opengl)
sudo ./NVIDIA-Linux-x86_64-535.86.05.run --no-opengl-files   
```

现在，页面大概会变成蓝底白字选项为红色。接下来按照页面的引导继续完成安装即可。
而在命令行安装 NVIDIA 显卡驱动时，通常会有一些选项需要你选择。以下是常见的一些选项及其含义：  
**这些选项可能随时间而变化**

1. **Install NVIDIA's 32-bit compatibility libraries? (YES/NO):**
   - 如果你计划运行 32 位的应用程序或库，或者有其他依赖于 32 位库的需求，可以选择 YES。
   - 如果不需要支持 32 位应用程序或库，可以选择 NO。
2. **Do you want to run the nvidia-xconfig utility to automatically update your X configuration file so that the NVIDIA X driver will be used when you restart X? (YES/NO):**
   - 如果你希望自动更新 X 配置文件，以便在重新启动 X 时使用 NVIDIA 驱动，可以选择 YES。
   - 如果你希望手动配置 X 驱动，或者不确定是否需要此功能，可以选择 NO。
3. **Would you like to run the nvidia-persistenced daemon? (YES/NO):**
   - `nvidia-persistenced` 守护程序可以在系统启动时自动加载 NVIDIA 驱动并处理 GPU 的持久性状态。如果你希望启用此功能，可以选择 YES。
   - 如果不需要此功能，可以选择 NO。
4. **Would you like to enable support for OpenGL rendering? (YES/NO):**
   - 如果你需要支持 OpenGL 渲染，可以选择 YES。
   - 如果不需要 OpenGL 渲染支持，可以选择 NO。
5. **Would you like to run the nvidia-bug-report.sh script to collect data about your system to assist NVIDIA in providing a better driver? (YES/NO):**
   - 如果你愿意为 NVIDIA 提供更好的驱动支持，可以选择 YES，这将帮助他们收集系统信息以进行问题排查和优化。
   - 如果不希望提供数据，可以选择 NO。

选择好需要的选项后，正常情况下安装应该是成功了，接下来就是重启了。
我是 gdm3 显示管理器，所以用以下指令重启显示管理器，然后再用`sudo init 5`回到图形化界面，如果还不行就重启计算机。

```bash
sudo service gdm3 restart #重启gdm3
sudo init 5 #切换回图形界面
sudo reboot #重启
```

输入`nvidia-smi`和`nvidia-settings`可以出现以下画面即为成功。

```bash
nvidia-smi
nvidia-settings
```

![4](https://cdn.yuuu.org/post-img/7/4.webp)

![5](https://cdn.yuuu.org/post-img/7/5.webp)

至此，安装终于结束，电脑也用上了英伟达显卡。太不容易了。然而，在要不是不可以在「软件与更新」里面直接安装，我又为何要绕这么多弯路来这么安装呢？😶‍🌫️

## 后记

### 可能遇到的错误

1. 缺少 GNU 编译器套装。  
   安装 `gcc`和`g++`，可以试着重复安装。  
   **关键字：cc、gcc**

2. Nouveau 影响英伟达驱动安装。  
   它们两个在同一系统会冲突，禁用 Nouveau 驱动即可。  
   **关键字：Nouveau、driver**

3. 缺少 make 工具。  
   安装`make`即可，可以试着重复安装。  
   **关键字：make、tool**

### 遭遇

本人将这块硬盘装在了 amd 显卡的电脑上，虽然能启动，但是一直在黑屏，无奈之下只好重装了系统。至此，再也不用烦恼英伟达的显卡驱动问题了。

### 参考链接

[如何安装 NVIDIA 显卡驱动？](https://www.zhihu.com/question/485307010/answer/3016763009)
[Ubuntu18-22.04 安装和干净卸载 nvidia 显卡驱动——超详细、最简单](https://blog.csdn.net/Perfect886/article/details/119109380)
[NVIDIA 驱动安装 - 从问题到解决 (Linux/Ubuntu)](https://zhuanlan.zhihu.com/p/115758882)
