less than 1 minute read

TL;DR: 解决方法见最下面

背景

这两天实验室的机器加装了显卡,结果装完后重启,服务器直接进入了紧急模式。工程师也修不了,最终折腾了半天,踩了不少坑才把机器修好。这里记录一下整个流程,并在最后给出各种急救操作的方法记录,必可活用于下一次(或者直接问GPT)。

踩坑过程

事情是这样的。某日,实验室的机器上要装一块显卡和一块SATA SSD硬盘。于是,在实验室看工程师哐哐哐把显卡装上去了,启动,没问题。然后顺路装驱动,结果驱动自检失败,显示 Error opening terminal: xterm. ,折腾了半天无果,遂放弃装驱动,选择直接装硬盘。结果硬盘装上去之后,系统直接进入紧急模式,挂载了磁盘也没用。工程师没办法,最后还是得自己试试。

问题定位

肉眼可见的问题有两个,一个是驱动装不上,一个是系统进紧急模式。但看不出两者的原因是否有关联。

首先,针对驱动问题,搜一下报错,可以找到相关的博客。但博客给出的方法,也即配置环境变量,并没什么用。不过在配环境变量的时候,我们会发现terminfo不存在路径,也就是说xterm似乎没正确安装。但紧急模式下机器不能直接联网,暂且搁置这个问题。

然后,我们看看能不能越过驱动来解决进入紧急模式的问题。首先需要知道为什么进入了紧急模式,查看日志。

journalctl -p 0..3

发现是如下问题:

i8842:No controller found
nouveau:Unknow parameter "nomodeset'
nouveau 0888:86:00.0:unknow chipset(192000a1)
power_meter ACP1080D:00:Ignoring unsafe software power cap

第一个是老问题,最后一个也可以无视。中间两个都和nouveau有关。nouveau是我们Linux机器上默认的显卡驱动,在换英伟达显卡的时候要把它卸掉,那会不会是因为两个驱动都没装导致的问题呢?我们先试试把驱动回滚回nouveau。

回滚驱动

回滚驱动很简单,把原来的驱动黑名单去掉就好。

vi /etc/modprobe.d/blacklist-nvidia-nouveau.conf

# 删除blacklist nouveau 和 options nouveau modeset=0两行

重启后依然无效。看来是显卡装上去之后,nouveau驱动就是会报这两个错。那重新把驱动禁掉?

vi /etc/default/grub

GRUB_CMDLINE_LINUX 行中添加以下参数:

rd.driver.blacklist=nouveau nouveau.modeset=0

然后重新生成initramfs文件

dracut --force

这个命令会持续一段时间,如果像我一样手贱把它强行终止掉,重启之后机器直接崩溃卡死。报错

error: file /initramfs-3.10.0-1160.80.1.e17.x86_64.img

幸好我们的机器有不只一个OS内核,强制重启之后切到另一个内核。重新生成initramfs文件。

sudo dracut -f /boot/initramfs-3.10.0-1160.80.1.el7.x86_64.img 3.10.0-1160.80.1.el7.x86_64
sudo grub2-mkconfig -o /boot/grub2/grub.cfg

折腾了半天,又回到原点,那就来看看怎么先把驱动装上。如上所述,xterm似乎没正确安装,那就看看怎么离线安装xterm。

离线安装程序

Xterm Download (APK, DEB, PKG, RPM, TGZ, TXZ, XBPS, XZ, ZST) (pkgs.org) 上找到对应的安装包,使用u盘离线拷贝过去。难顶的是,u盘插上去之后还要手动挂载。然后在挂载位置执行:

yum install *.rpm

结果依然无效。重新检查环境变量,发现terminfo路径下还是啥都没有。回忆一下,似乎是之前杀病毒的时候发现程序在这个目录下,于是把整个目录删了。那就从别的机器上把对应的内容拷过来。

修复缺失文件

看了一下健康机器上terminfo路径,是/lib/terminfo。那就直接把对应位置的全部东西复制过来,依然使用u盘大法。只能说最朴实粗暴的方法就是最有用的。驱动能正常自检安装了。但驱动装上了,重启依然进入紧急模式。这时日志里只剩下不用理会的两个报错。回想起以前进紧急模式的原因,一般都是磁盘损坏。于是决定死马当活马医,修一下磁盘。

修复磁盘

修复磁盘分三步:取消挂载、修复、重新挂载。简便起见,我们直接修改挂载文件。

vi /etc/fstab
# 注释全部挂载,除了root和根目录

然后重启,假如进入紧急模式的原因是磁盘损坏,那这时候就不会进入紧急模式了,因为损坏的磁盘都没挂载上。然后fsck -y 磁盘名,逐一修复即可,这里的磁盘名和挂载文件里的一样,是带路径的。

机房环境吐槽

机房的风扇声简直反人类。再加上那台机器启动一次巨慢,迭代试错的单次时间被拉得很长。人在里面一直呆着,就是一种折磨。于是在发现需要离线安装之后,就先回实验室拿其他机器实验了。等确定了方案再进去。

方法总结

查看启动日志,以及过滤飘红内容

journalctl -p 0..3

禁止显卡驱动

vi /etc/default/grub

GRUB_CMDLINE_LINUX 行中添加以下参数:

rd.driver.blacklist=nouveau nouveau.modeset=0

然后重新生成initramfs文件

dracut --force
sudo grub2-mkconfig -o /boot/grub2/grub.cfg
sudo reboot

离线安装python包

在一台能联网的同OS机器上,用pip下载对应的包,这里以requests为例。它会自己下载所有依赖包。

pip download requests

把这些东西拷贝到需要离线安装的机器上,执行

pip install *.whl
pip install *.tar.gz

yum换源,以及离线安装包

换源

编辑 /etc/yum.repos.d/CentOS-Base.repo 文件,或者直接下载,最好修改前保存一个副本。

mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup
curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo

然后清缓存

sudo yum clean all
sudo yum makecache

/etc/yum.repos.d/目录下可能有一些过期的配置文件(尤其在CentOS 7停止支持之后),需要酌情删除,否则清缓存的时候会因为这些配置文件找不到网址而失败。

离线安装

Xterm Download (APK, DEB, PKG, RPM, TGZ, TXZ, XBPS, XZ, ZST) (pkgs.org) 上找到对应的安装包,使用u盘离线拷贝过去。u盘插上去之后手动挂载。然后在挂载位置执行:

yum install *.rpm

磁盘修复和挂载

使用lsblk 查看所有磁盘,逐个修复未挂载的磁盘fsck -y 磁盘名/UUID=kid

如果不能直接解决问题,还可以先取消不必要挂载的磁盘,vi /etc/fstab 将其中除了根目录和boot之外的磁盘挂载全部注释,然后重启。这种情况下能正常重启机器,然后就能远程修复剩下的问题。

Updated: