Ubuntu 手动更新glibc导致内核崩溃(无法正常关机/开机启动失败)

您所在的位置:网站首页 mac内核崩溃怎么恢复 Ubuntu 手动更新glibc导致内核崩溃(无法正常关机/开机启动失败)

Ubuntu 手动更新glibc导致内核崩溃(无法正常关机/开机启动失败)

2024-07-14 12:12| 来源: 网络整理| 查看: 265

Ubuntu 手动更新glibc导致内核崩溃(无法正常关机/开机启动失败)

本人自从接触CSDN后从来都是只看不写,但是经过这次debug事件后觉得有必要写篇经验记录一下,同时也分享给大家。虽然本人用的是Linux虚拟机,可能有些操作比如更改启动项跟 Linux PC有些不同,但是数据恢复和回退的方法是一样的。

问题:Ubuntu 手动更新glibc导致内核崩溃,无法正常关机,开机启动失败,开机界面打印 init 相关的 Trace 系统:Ubuntu 14.04 (64位) 平台:VirtualBox 虚拟机(虽然是虚拟机,但是本人觉得就问题的解决方法来说,和Linux PC差别不大)

问题经过:由于本人使用笔记本电脑办公,用的Windows10系统,但是工作上经常需要使用Linux,在资源不够的情况下,使用虚拟机VirtualBox安装上Ubuntu来工作和学习。最近在学习Python后想继续往tensorflow深度学习这块学习,但是运行部分tensorflow的python实例后总是无法执行,提示glibc版本太低,本人的ubuntu 14.04默认是glibc-2.19,但是tensorflow的实例需要glibc-2.23及以上版本,所以本人按照网上的操作下载了glibc-2.23后进行手动升级,在编译完glibc-2.23后直接就执行了 make install 命令,当时没注意后面发生了什么事情(网上很多人说 cp, ls这些基本的命令都无法执行),再一次开机启动后,开机界面停止在一段错误的trace上,意思是init启动失败。

问题定位:本人对glibc了解的不多,感觉和c的环境有一些关联,然后网上百度这方面的升级问题,有人说glibc库与linux的一些底层模块执行和调用有很大的关系,所以升级了之后可能会导致这些底层模块执行出问题。

问题尝试:

由于开机无法成功,而且又无法正常关机,所以没法进入linux文件系统去做恢复,本人尝试开机按F12进入recover mode也无法进入系统。搜索了网上相关问题的结果,发现有三种声音:正常升级glibc成功、升级glibc失败系统崩溃后重装系统、更改开机启动项尝试备份重要的数据,但是唯独回退和恢复原始系统的结果很少。(说明还是要有经常备份的意识啊!)经过了几天的查找和尝试,本人最后选择先备份重要的数据,然后再看能不能回退到升级glibc之前的系统,毕竟有些自定义的设置比如VIM格式,终端命令的缩进啊,Python的下载和格式设置啊,anaconda的下载和安装啊,一些重要的库比如Opencv, tensorflow, 这些重新再来一遍真的让人受不了。

解决过程:

本人是先从备份数据出发,按照下面这位博主的方法: (ubuntu内核损坏或误删除时的系统修复),先更改Linux 的启动项,使用原始的ubuntu iso镜像(可以从清华服务器下载,速度很快),通过ubuntu live来进入启动盘中的ubuntu系统,然后可以访问已崩溃的ubuntu系统,进行数据备份和修复。本人重新下载了原生的ubuntu 14.04的iso文件,保存在本机中(如果是Linux PC的话需要保存到另外的U盘或者移动硬盘中,作为启动盘),然后在虚拟机的启动选项中选择 原生的iso文件,这样开机后会进入原生的Ubuntu界面,继续按照链接中的操作,选择 "Try Ubuntu“后,进入原生的Ubuntu 14.04系统,这时候会发现 /media/下面有个ubuntu的目录,而这正是出现问题后崩溃的Ubuntu文件系统,竟然可以访问了!先备份数据,将电脑接上U盘或者移动硬盘,在这里,用Linux PC的同学可能有的会出现识别不了的问题,这个可能跟权限有关,这部分需要自己百度解决的办法;而本人使用的Virtual虚拟机出现的问题是只能识别U盘而无法识别移动硬盘,这个跟虚拟机软件有关,对VirtualBox 来说需要安装一个扩展的插件Oracle_VM_VirtualBox_Extension_Pack 来支持USB3.0的外设,之后再进入原生的Ubuntu系统,添加USB设备后就可以识别了,然后就可以备份数据啦!回退glibc版本,恢复系统。按照上面的链接中操作(mount --bind 命令组装本机文件系统,重装内核),本人尝试了,但是还是无法恢复崩溃的系统。这时候,本人从之前的问题定位和解决过程中发现:手动升级glibc版本主要是 更改了/lib64下的 ld-linux-x86-64.so.2的软链接,本人对比了原生的Ubuntu中/lib64 路径下的文件,发现只有一个ld-linux-x86-64.so.2 而且指向的是 /lib/x86_64-linux-gnu/ld-2.19.so,原来如此!编译glibc最后的make install会更改/lib64/ld-linux-x86-64.so.2的目标文件!而原来的目标文件(/lib/x86_64-linux-gnu/ld-2.19.so)并没有被删除或覆盖,那么如果把 /lib64/ld-linux-x86-64.so.2指向的目标文件还原(回退到升级前的glibc版本,即指向 /lib/x86_64-linux-gnu/ld-2.19.so),是否就可以回退到升级glibc之前的系统了?想到就去做,反正已经备份了数据,尽管去折腾吧。本人于是使用ln -s 的命令将 /lib64/ld-linux-x86-64.so.2 重新指向了 /lib/x86_64-linux-gnu/ld-2.19.so,同时删除了/lib64下其他的文件(都是编译glibc后生成的) cd /media/ubuntu/*ubuntu-id*/ sudo ln -s ./lib/x86_64-linux-gnu/ld-2.19.so ./lib64/ld-linux-x86-64.so.2 cd ./lib64/ #查看软链接是否发生更改 ls -l ./ld-linux-x86-64.so.2 #删除编译glibc生成的其他库文件 rm lib* rm ld-2.23.so

OK,下面关机验证!

关机后,移除作为启动项的原生Ubuntu 14.04 的iso文件,然后开机,启动已崩溃的本地Ubuntu系统,看到经典的Ubuntu Logo的那一刻,仿佛看到了成功在对我招手!系统很顺利的启动成功,进入用户登录界面,输入密码后成功登录,检查恢复的文件系统,一日不见真是如隔三秋!

结论和反思:虽然问题只是涉及到glibc的升级问题以及如何备份和回退,但是扩展来看,类似glibc,其它库的版本升级的原因导致的内核崩溃也可以参考本篇文章来进行回退和恢复。感谢 https://blog.csdn.net/rainflood/article/details/64132793 的博主给我带来的启发,以及 Ubuntu 可以用live cd来启动第二个系统作为备份和修复已崩溃系统的平台,让我在对linux的理解和使用上更进一步,另外还是建议大家千万,千万,千万要养成经常备份重要数据的良好习惯!



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3