忙与服务器急救技术
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之外的磁盘挂载全部注释,然后重启。这种情况下能正常重启机器,然后就能远程修复剩下的问题。
- 本文作者: wengsy150943
-
版权声明: 本博客所有文章除特别声明外,均采用
BY-NC-SA
许可协议。转载请注明出处!