centos驱动程序如何恢复
小樊
41
2025-12-21 15:54:03
CentOS 驱动程序恢复实用指南
一、先判断故障场景
- 出现 NVIDIA-SMI has failed because it couldn’t communicate with the NVIDIA driver:多见于内核升级后,NVIDIA 内核模块未随新内核加载,或 DKMS 未重建模块。
- 更新内核后系统无法启动或找不到磁盘:常见于 initramfs 未包含新内核所需驱动(如存储控制器从 mpt2sas 升级到 mpt3sas)。
- 网卡不识别(ifconfig 只有 lo):多为网卡驱动缺失,需先确认 Ethernet controller 型号并准备编译环境。
- 有备份时:优先从备份恢复配置,再重建 initramfs 并重启。
二、通用恢复流程
- 进入可用环境
- 优先切到旧内核启动(GRUB 菜单选择 Advanced options for CentOS 中的旧内核),以便系统可进入并修复。
- 备份当前配置(为回滚留余地)
- 备份模块与 initramfs 配置:
- sudo cp -r /etc/modprobe.d /path/to/backup/modprobe.d_backup
- sudo cp -r /etc/modules-load.d /path/to/backup/modules-load.d_backup
- sudo cp /etc/dracut.conf /path/to/backup/dracut.conf_backup
- sudo cp -r /etc/dracut.modules.d /path/to/backup/dracut.modules.d_backup
- 导出关键驱动信息:
- sudo yum install -y lshw
- sudo lshw -C display | grep driver > /path/to/backup/driver_info.txt
- 重建 initramfs(确保新内核能加载必要驱动)
- 通用:sudo dracut -f
- 指定内核:sudo dracut -f /boot/initramfs-$(uname -r).img $(uname -r)
- 重建后重启并验证
- 重启:sudo reboot
- 验证模块:lsmod | grep <驱动名>;必要时检查日志:journalctl -xe
三、场景化修复步骤
- NVIDIA 显卡驱动恢复
- 安装 DKMS(若之前未装):sudo yum install -y dkms
- 确认驱动版本:ls /usr/src | grep nvidia(如 nvidia-470.103.01)
- 重建内核模块:sudo dkms install -m nvidia -v 470.103.01
- 验证:nvidia-smi
- 若之前装过 CUDA 且需重装指定版本:
- 卸载冲突版本:sudo yum remove “nvidia” “cublas” “cuda*”
- 重启后切到多用户目标并卸载可能残留模块:
- systemctl isolate multi-user.target
- modprobe -r nvidia-drm
- 再安装所需版本(如通过 ELRepo 或 NVIDIA 官方 run 文件)。
- 内核升级后无法启动(initramfs 缺驱动)
- 确认缺失的驱动模块(示例为存储控制器 mpt3sas):
- lsinitrd -k 4.4.46 | grep mpt[23]sas(旧内核有、 新内核无则异常)
- 将驱动打入 initramfs(二选一):
- 修改 /etc/dracut.conf:add_drivers+=“mpt3sas”,然后重建:dracut -f /boot/initramfs-4.4.46.img 4.4.46
- 或一次性强制加入:dracut --force --add-drivers mpt3sas --kver=4.4.46
- 复查并重启:lsinitrd -k 4.4.46 | grep mpt[23]sas 有输出再重启。
- 网卡驱动缺失(ifconfig 只有 lo)
- 确认网卡型号:lspci | grep -i ethernet
- 准备编译环境(离线可用 CentOS ISO 制作本地 yum 源):
- 挂载 ISO:sudo mount -o loop /path/to/CentOS-*.iso /mnt
- 创建本地源:sudo cat >/etc/yum.repos.d/local.repo <<‘EOF’
[local]
name=CentOS Local
baseurl=file:///mnt
enabled=1
gpgcheck=0
EOF
- 安装编译工具与内核头文件:sudo yum --disablerepo=‘*’ --enablerepo=‘local’ install -y gcc kernel-devel-$(uname -r)
- 获取并编译安装对应网卡驱动(按厂商源码包 README 执行 make && make install),加载模块后重启网络服务或系统。
四、验证与回滚建议
- 验证
- NVIDIA:nvidia-smi、cat /proc/driver/nvidia/gpus/*/information 2>/dev/null
- 存储/网卡:lsmod | grep <驱动名>;ip a;lspci -k | grep -A3 -i <设备名>
- 启动阶段:journalctl -b | grep -i dracut;必要时检查 /var/log/messages
- 回滚
- 配置回滚:将之前备份的 /etc/modprobe.d、/etc/modules-load.d、/etc/dracut.conf、/etc/dracut.modules.d 拷回原路径,执行 dracut -f 重建 initramfs 后重启。
- 内核回滚:GRUB 选择旧内核启动;或在确认新内核无用后移除:sudo yum remove kernel-<版本>。
- NVIDIA 版本回滚:卸载当前版本后安装旧版(如通过 ELRepo 指定版本,或官方 run 文件)。
五、预防与注意事项
- 使用 DKMS 管理专有内核模块,避免内核升级后模块丢失。
- 内核升级前备份关键配置,并在升级后第一时间重建 initramfs。
- 离线环境提前准备 gcc、kernel-devel 与本地 yum 源,便于驱动编译。
- 变更前确保有可回退路径(旧内核、配置与驱动备份),并在变更后及时重启验证。