记一次误删linux系统目录导致yum不可用的问题

文章目录

yum命令报错详情

报错原因分析

解决过程

一. yum命令报错详情

在操作linux时,发现测试环境某集群所有机器的yum命令忽然报错

#比如如下命令:
yum list
yum install <package_name>

详细报错信息如下:

There was a problem importing one of the Python modules
required to run yum. The error leading to this problem was:

   No module named yum

Please install a package which provides this module, or
verify that the module is installed correctly.

It's possible that the above module doesn't match the
current version of Python, which is:
2.7.5 (default, Apr  2 2020, 13:16:51)
[GCC 4.8.5 20150623 (Red Hat 4.8.5-39)]

If you cannot solve this problem yourself, please go to
the yum faq at:
  http://yum.baseurl.org/wiki/Faq

二. 报错原因分析

谷歌相关资料.发现大部分回答都是说yum和python版本不一致导致的.
原因: yum和pathon是依赖关系,yum本质上是python的一个模块
打开/usr/bin/yum,我们可以看到其实它执行的是python,并且导入了yum模块

所以他们的解决方案是修改yum文件

vim /usr/bin/yum
# 将文件头的#!/usr/bin/python修改为对应的Python版本   

我思考了一下,之前yum命令都是正常的,也没有重装过python或升级过Python的版本

所以认为不是该原因,也就没有按照相关的提示操作

后面排查发现,yum命令出现问题前执行的某个脚本里有这样的一行命令:

rm -rf /usr/lib/*

这个命令又写在循环里,导致这个集群所有机器出现问题
真是好家伙,还好是没人折腾的测试集群,不然我得琢磨着跑路了~

三. 解决过程

关于该问题,最简单的解决办法就是:
从其它的集群找到一台正常的主机,将**/usr/lib/**下的文件通过scp命令拷贝过去

漫长的等待过后,拷贝完成

3.1 新的报错

拷贝结束后,执行yum命令

发现还是不能正常使用,报错如下:

Loaded plugins: fastestmirror, priorities
Traceback (most recent call last):
  File "/usr/bin/yum", line 29, in <module>
    yummain.user_main(sys.argv[1:], exit_code=True)
  File "/usr/share/yum-cli/yummain.py", line 375, in user_main
    errcode = main(args)
  File "/usr/share/yum-cli/yummain.py", line 170, in main
    base.getOptionsConfig(args)
  File "/usr/share/yum-cli/cli.py", line 296, in getOptionsConfig
    (opts, self.cmds) = self.optparser.setupYumConfig(args=args)
  File "/usr/share/yum-cli/cli.py", line 2368, in setupYumConfig
    if not self.base.conf.usercache and os.geteuid() != 0:
AttributeError: 'YumConf' object has no attribute 'usercache'

根据报错提示谷歌,基本上没找到类似的解决方法

只能按照报错提示查看相关源码
没发现什么有用的信息…(估计主要原因是我对python没什么了解)

使用pdb排查问题

接下来,想到之前写java时,往往借助debug排查问题,那么Python,能否使用debug帮助我理解yum运行代码呢?
谷歌了一下python的debug
发现可以使用pdb这种方式

在排查过程中,我主要用到了以下几条pdb命令,如下:

s : 执行下一条命令,主要用来跳转到执行函数的代码
n : 执行下一条语句,如果是函数调用,则执行函数
l : 列出源码
p 变量名: 查看变量内容

具体使用pdb调试可参考以下博客:

Python 调试器之pdb

实操如下:

首先修改/usr/bin/yum文件,引入pdb依赖,使用pdb调试

# 在该文件第三行和第三十行添加如下内容,使用pdb调试,  
# 使我们可以通过debug的形式进入到yum启动的主要方法yummain.user_main(sys.argv[1:], exit_code=True)
import pdb # 第三行添加
pdb.set_trace() # 第30行添加

修改后的/usr/bin/yum文件内容如下:

#!/usr/bin/python
import sys
import pdb
try:
    import yum
except ImportError:
    print >> sys.stderr, """\
There was a problem importing one of the Python modules
required to run yum. The error leading to this problem was:

   %s

Please install a package which provides this module, or
verify that the module is installed correctly.

It's possible that the above module doesn't match the
current version of Python, which is:
%s

If you cannot solve this problem yourself, please go to
the yum faq at:
  http://yum.baseurl.org/wiki/Faq

""" % (sys.exc_value, sys.version)
    sys.exit(1)

sys.path.insert(0, '/usr/share/yum-cli')
try:
    import yummain
    pdb.set_trace()
    yummain.user_main(sys.argv[1:], exit_code=True)
except KeyboardInterrupt, e:
    print >> sys.stderr, "\n\nExiting on user cancel."
    sys.exit(1)

接下来执行yum脚本,开始进行调试,命令如下:

python /usr/bin/yum 

通过 s, n,l 组合拳,以及在关键的部分通过p命令获取变量值
逐步缩小范围,排查过程比较恶心,不多加赘述,重点关注报错代码相关的方法可加快调试效率

最后将报错范围定位到 /usr/share/yum-cli/cli.py文件的setYumConfig()方法

到这里,我找到了一台能正常执行yum命令的服务器,通过同样的办法,
在setYumConfig()方法这里一点一点对比执行差异

发现,同样的输出内容,居然对应了不同的代码行数

如下图所示:(异常的yum对应源码)
记一次误删linux系统目录导致yum不可用的问题
正常的Yum对应的源码
记一次误删linux系统目录导致yum不可用的问题
说明了机器覆盖过来的yum实际上是不一样的!

因此,问题找到!

**用正常机器的/usr/share/yum-cli将异常机器的该文件夹覆盖,问题解决! **

覆盖之后,发现,yum命令正常执行

记一次误删linux系统目录导致yum不可用的问题


因为一条危险的命令,半天的时间心惊肉跳,总算把问题修复

全是泪!!!

操作还是要仔细小心,不管是生产环境还是测试环境.否则就是在给自己挖坑啊

最后,提醒大家

慎用rm -rf !!!

慎用rm -rf !!!

慎用rm -rf !!!

上一篇:ORACLE Multitenant专题--2 远程克隆PDB


下一篇:生成类库项目时同时生成的pdb文件是什么东东?