记一次错误卸载软件包导致Linux系统崩溃的修复解决过程

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介:

首先问题产生的缘由很简单,是我一同事在安装oracle一套软件时,按照要求需要binutils软件包的32位版本,然而在Oracle Linux已经装有64位,按理说是可以安装i686的,我猜应该是32位的版本低于这个已有的64位所以导致冲突而安装失败,因此同事就用yum remove binutils,这个命令也奇葩,由于是root权限导致依赖于它的200多个软件包也被卸载,最终导致网络断开,系统崩溃,在vSphere虚拟机上重新启动发现再也起不来。下面看问题:

1. Kernel panic - not syncing: Attempted to kill init!


这个错误时在重新启动Oracle Linux一开始就出现,查阅的相关资料得知Kernel panic问题一般是由驱动模块终端处理终端问题导致的(不懂。。。),一开始我以为是驱动程序依赖于binutils导致被卸载,因此第一反应是想办法把缺失的软件装回去。实际上,是由于安全访问控制模块selinux的问题,参考类似问题。于是检查vi /etc/selinux/config时发现SELINUX=disables,拼写错误,应为disabled
当再次启动没再出现该错误时,我高兴的认为原来这么简单就帮同事解决了,事实这根本还没到200多个软件包缺失而导致系统崩溃那一步。

2. 系统启动加载条完成后,一直hang住不动

这无疑要使用LiveCD修复系统了,参考Ultimate method to install package from linux rescue modeUsing Rescue Mode to Fix..Problems。因为知道出问题前做过什么操作,下面直接上解决问题的过程。

2.1 将系统DVD安装镜像加载到光驱

再次重启就自动进入安装界面,我们当然选择rescue mode

一路按照提示确定(可以不配置network,这里就不贴图了,很简单),最终会提供给用户一个shell终端,对应的是从DVD光驱加载进来的系统,执行chroot /mnt/sysimage才会进入到原损坏的Linux系统,还好yumrpm命令还可以使用,悲剧的是我并不知道yum remove命令卸载了哪些软件包。

2.2 安装缺失的软件包

这里得谢天谢地yum命令的安装卸载日志/var/log/yum.log,这个日志里清楚的记录了installederased的所有软件包,用rpm是不可能了,因为270多个包的依赖关系难以解决,只能通过yum方式,而由于rescue模式没有配置网络,因此只能使用本地镜像源。

在rescue系统下挂载光驱到待修复系统中的/media目录
bash-4.1# mount /dev/cdrom /mnt/sysimage/media

chroot进入待修复系统
bash-4.1# chroot /mnt/sysimage

手动编辑一个仓库源(真实待修复的系统)
sh-4.1# cd /etc/yum.repos.d/ && vi Oracle-Media.repo
[DVD-media]
name=oracle-$releasever - Media
baseurl=file:///media
gpgcheck=0
enabled=1
AI 代码解读

建议只留Oracle-Media.repo文件,其他的.repo文件都mv成.bak,以防连接不了这些源而报错,虽然报错关系不大。
获取被依赖erased掉的软件列表

你可以将yum.log中多余的部分去掉,筛选出应该重新安装的packages:
sh-4.1# cp /var/log/yum.log{,.bak}
sh-4.1# less /var/log/yum.log.bak
Oct 29 20:17:34 Erased: gcc-c++
Oct 29 20:18:44 Erased: gcc
Oct 29 20:22:59 Erased: xorg-x11-drivers
...
Oct 29 20:24:46 Erased: iputils
Oct 29 20:24:46 Erased: udev
Oct 29 20:24:46 Erased: initscripts
Oct 29 20:24:46 Erased: hwdata
Oct 29 20:24:46 Erased: module-init-tools
Oct 29 20:24:48 Erased: binutils

下面一条命令应该要彻底解决问题了
sh-4.1# awk '{print "yum install -y ",$5}' /var/log/yum.log.bak |sh > /root/yum_install.log
AI 代码解读

保险起见,可以查看一下产生的日志文件。此时重启(记得拿出光盘)应该是修复问题了。但我遇见的问题还没完。

3. An error occurred during the file system check


显然,文件系统损坏。根据提示输入root密码后可以进入到shell中,网上有办法说执行fsck命令来修复分区,又说且不能是mounted状态,但无论我怎么去fsck.ext4 /dev/mapper/vg_fusion_lv_u1,提示

WARNING!!!  The filesystem is mounted.   if you continue you ***WILL*** 
cause ***SEVERE*** filesystem damage`

Do you really want to continue (y/n)? yes

fsck.ext4: No such file or directory while trying to open /dev/mapper/vg_fusion_lv_u1

The superblock could not be read or does not describe a correct ext2 
filesystem.  If the device is valid and it really contains an ext2 
filesystem (and not swap or ufs or something else), then the superblock 
is corrupt, and you might try running e2fsck with an alternate superblock:
    e2fsck -b 8193 <device>
AI 代码解读

听起来好像还挺严重的,我之前猜想的是不是反复的开关电源来重启导致lvm文件系统corrupt,但事实我发现/dev/mapper/vg_fusion_lv_u1不存在,但lv_fusion_lv_root却完好,执行lvdisplay发现这个命令根本不存在,这才发现原来lvm2软件没有安装(难道是第2部分安装少许出错?)。
这下容易多了,反正现在系统不借助rescue mode就可以起来,重新安装软件包,但是此时的整个文件系统是read only,有两个办法可以解决:

  1. mount -o remount,rw /
    重新挂载根分区为读写,vi /etc/fstab注释掉挂载/u1的那条记录,此时会正常启动,只是有一个文件系统没有挂载,但可以正常安装缺失的lvm2软件,不妨多执行几遍2.2的安装命令。然后手动挂载mount /dev/mapper/vg_fusion_lv_u1 /u1应该就没问题了。记得改回/etc/fstab。
  2. 2.2步骤类似,进入rescue modechroot,重新执行awk '{print "yum install -y ",$5}' /var/log/yum.log.bak |sh > /root/yum_install.log,确保没有报错且已安装lvm。

这下问题总是解决了,避免了删除系统的灾难(测试环境)。

4. 总结

回头去看这三个问题,其他它们是各自独立的

  • 第1个问题,是由于设置selinux有人拼写错误,哪怕没做后续的任何操作,重启系统就会启动不了,是早已存在到目前才发现。也有人说遇见过同样的Kernel panic错误但尝试各种办法都难以解决的,这就看具体问题具体分析了。
  • 第2个问题,是真真切切错误卸载重要软件包,导致系统崩溃,修复系统的方法自然也就是利用原镜像在rescue mode下把该装的都装回去,前提是yum.log日志存在,万幸没有执行过yum clean all
  • 第3个问,题实际文件系统并没有损坏,还是lvm2缺失,但是此处必须小心,免得SEVERE filesystem damage,那么修复过程就没意义了。

以后处理其他系统故障时也可使用类似的方法修复,Redhat、CentOS、OracleLinux、Ubuntu等都适用。

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
目录
打赏
0
0
0
0
35
分享
相关文章
Linux系统资源管理:多角度查看内存使用情况。
要知道,透过内存管理的窗口,我们可以洞察到Linux系统运行的真实身姿,如同解剖学家透过微观镜,洞察生命的奥秘。记住,不要惧怕那些高深的命令和参数,他们只是你掌握系统"魔法棒"的钥匙,熟练掌握后,你就可以骄傲地说:Linux,我来了!
70 27
|
11天前
|
Linux系统ext4磁盘扩容实践指南
这个过程就像是给你的房子建一个新的储物间。你需要先找到空地(创建新的分区),然后建造储物间(格式化为ext4文件系统),最后将储物间添加到你的房子中(将新的分区添加到文件系统中)。完成这些步骤后,你就有了一个更大的储物空间。
64 10
|
2月前
|
Linux系统之whereis命令的基本使用
Linux系统之whereis命令的基本使用
106 24
Linux系统之whereis命令的基本使用
|
23天前
|
Linux系统中如何查看CPU信息
本文介绍了查看CPU核心信息的方法,包括使用`lscpu`命令和读取`/proc/cpuinfo`文件。`lscpu`能快速提供逻辑CPU数量、物理核心数、插槽数等基本信息;而`/proc/cpuinfo`则包含更详细的配置数据,如核心ID和处理器编号。此外,还介绍了如何通过`lscpu`和`dmidecode`命令获取CPU型号、制造商及序列号,并解释了CPU频率与缓存大小的相关信息。最后,详细解析了`lscpu`命令输出的各项参数含义,帮助用户更好地理解CPU的具体配置。
71 8
深度体验阿里云系统控制台:SysOM 让 Linux 服务器监控变得如此简单
作为一名经历过无数个凌晨三点被服务器报警电话惊醒的运维工程师,我对监控工具有着近乎苛刻的要求。记得去年那次大型活动,我们的主站流量暴增,服务器内存莫名其妙地飙升到90%以上,却找不到原因。如果当时有一款像阿里云 SysOM 这样直观的监控工具,也许我就不用熬通宵排查问题了。今天,我想分享一下我使用 SysOM 的亲身体验,特别是它那令人印象深刻的内存诊断功能。
|
12天前
|
微服务2——MongoDB单机部署4——Linux系统中的安装启动和连接
本节主要介绍了在Linux系统中安装、启动和连接MongoDB的详细步骤。首先从官网下载MongoDB压缩包并解压至指定目录,接着创建数据和日志存储目录,并配置`mongod.conf`文件以设定日志路径、数据存储路径及绑定IP等参数。之后通过配置文件启动MongoDB服务,并使用`mongo`命令或Compass工具进行连接测试。此外,还提供了防火墙配置建议以及服务停止的两种方法:快速关闭(直接杀死进程)和标准关闭(通过客户端命令安全关闭)。最后补充了数据损坏时的修复操作,确保数据库的稳定运行。
45 0
|
4月前
|
Linux缓存管理:如何安全地清理系统缓存
在Linux系统中,内存管理至关重要。本文详细介绍了如何安全地清理系统缓存,特别是通过使用`/proc/sys/vm/drop_caches`接口。内容包括清理缓存的原因、步骤、注意事项和最佳实践,帮助你在必要时优化系统性能。
339 78
Linux软件包管理工具概览
在Linux系统中,dpkg、apt、rpm、yum和dnf是几种常见的包管理工具,它们分别属于不同的Linux发行版或家族,并有着各自的诞生顺序和特点。下面将按照这些工具的诞生顺序,并结合Debian、Red Hat、CentOS、Ubuntu和Kali等系统,进行详细的介绍。
49 4
Linux系统查看操作系统版本信息、CPU信息、模块信息
在Linux系统中,常用命令可帮助用户查看操作系统版本、CPU信息和模块信息
212 23
嵌入式Linux系统编程 — 5.3 times、clock函数获取进程时间
在嵌入式Linux系统编程中,`times`和 `clock`函数是获取进程时间的两个重要工具。`times`函数提供了更详细的进程和子进程时间信息,而 `clock`函数则提供了更简单的处理器时间获取方法。根据具体需求选择合适的函数,可以更有效地进行性能分析和资源管理。通过本文的介绍,希望能帮助您更好地理解和使用这两个函数,提高嵌入式系统编程的效率和效果。
158 13