如何优雅的搞垮服务器,再优雅的救活
故事事故是这样的
新开发的 jar 包部署在老服务器上,版本是 Red Hat Enterprise Linux AS release 4 (Nahant Update 5),提示需要高版本 jdk,高版本 jdk 提示 glibc 版本太低得升级,是的,就像套娃。
使用编译源码的方式将 glibc 由 2.3 升级到 2.9,升级完 ls 命令不好使了。 用 LD_PRELOAD 方法解决了 ls 命令不好使的问题后还挺有成就感的呢!
轻度强迫症的我当然要重启,然后
就没有然后了。。
操作系统起不来了。各种尝试,最好的结果是卡死在
再也不往下走了。007 的服务器被 996 的程序员干进了 ICU。
看到了吧,搞垮服务器可以显得很无辜。删库显得太刻意了,会被人指责性格有问题。
抢救思路
像《信条》一样进行一次逆过程,把 glibc 相关的静态库、动态库都用原来的低版本覆盖回来。cp 覆盖和安装 rpm 覆盖一起上。
必要条件
能进机房,直接操作服务器,因为 ssh 此时已经连不上了。
有相同版本的 Linux 系统光盘,Linux 抢救模式需要光盘引导。
有相同版本的 Linux 系统的 iso 镜像文件,用来获取 rpm 【或者替代方法】
有相同版本的 Linux 系统的服务器或者虚拟机,用来下载.a 文件 【或者替代方法】
准备工作
rpm 安装包
将 iso 文件解压,在
目录下就包括所有需要的 rpm 包。
需要准备的安装包是下面这些:
.a 静态库文件
到好用的版本一致的服务器对应目录下载下面的库文件
目录/lib
目录/usr/lib
将这些安装包和静态库放入一个 U 盘中,U 盘插到服务器上。
抢救过程
进入光盘系统
将光盘放入光驱。
开机快速按 F2,进入
通过+-号调整开机启动顺序,将 CD-ROM 调整到最上面
按回车,系统重新启动,进入光盘引导界面
按 F5,进入
输入 linux rescue
按回车,稍等一会,进入
按回车,进入
按回车,进入
按回车,进入
将光标移动到 No,按回车,进入
按回车,进入
提示原有系统已经挂载到/mnt/sysimage,按回车进入,目前所处的就是光盘抢救模式(rescue mode),环境是光盘系统,原系统所有文件都在光盘系统的子目录/mnt/sysimage 里。
可以看到原有系统的所有目录结构在/mnt/sysimage 下都是可以看见的。
挂载 U 盘
首先将 U 盘挂载到光盘系统,
>不同环境中 U 盘的标识符不一定是 sdb1,在物理机上可能是 sda1, 可以通过
fdisk –l 命令看各个目录容量大小来判定哪个是 U 盘。
如果挂载 U 盘提示格式错误,U 盘可能是 fat16 格式,执行
mount -t msdos /dev/sdb1 /mnt/usb/ 试试
此时,U 盘里的文件都在/mnt/usb/目录下, 原系统所有文件都在/mnt/sysimage 下。将 usb 目录下的文件拷贝到/mnt/sysimage 下面你能记住的任意目录,本文拷贝到/mnt/sysimage/home 下。
切换到原系统
执行
这个指令使你由当前光盘系统切换到原系统(就是我们要抢救的那个系统),执行 pwd 和 ls 可以看到,你所处的目录就是原系统的根目录,账号是原系统的 root 账号。
一句话,原系统直接进进不去,但是从光盘系统跳,是能跳进去的。
安装 rpm
进入/home,
一个一个安装 U 盘的 rpm 包。装失败的就等把成功的都装完了回头重试,和答卷子题不会一个玩法,都是依赖关系导致失败的。
rpm 最好自己重新命名,改成简短的名字(glibccomm.rpm 这种),一定要去掉“-”。我当时看见显示器上显示的名字包括乱码和问号,靠猜来判断是哪个包,后悔之前没重命名。
替换静态库文件
然后手动 cp 指令替换/lib 和 /usr/lib 的静态库(*.a 文件)。
修改动态库软连接
手动修改动态库的软连接
无论安装 rpm 包时是否自动修改过软连接,都最好手动修改一遍。
到/lib 目录里,先
然后
跳回光盘系统
执行 exit 跳回到光盘系统,
在上图光标处再一次输入 exit,按回车 ,系统会重新启动。
立刻修改 BIOS,设置系统从硬盘启动,原系统可以正常启动了。
完结撒花
抢救成功还挺有成就感的呢!其它操作搞垮服务器,也可以试试,只要那个操作能逆向来一遍,问题都不大。
为什么不重装?上面部署的东西是多年前放的,物是人非,没办法重头再来。
为什么敢升级?亲眼看见过别人把 RHEL6.6 的 glibc 升级了没出事。真不知道会出这么严重的问题。
如果没有版本一致的光盘,接近的也可以。我实际用的光盘是 RHEL4.6,和原系统差了一个小号。
rpm 和.a 文件能拿到就行,不用非按本文方法。
网友提供的替换 so 的方案不靠谱,必须 rpm 安装。
2.3 升级到 2.9 不可以,不代表升级到 2.4 也不可以,版本离的近可能成功。
这个服务器至今还在跑着,那些 jar 包部署到别的服务器上了。
版权声明: 本文为 InfoQ 作者【MySQL从删库到跑路】的原创文章。
原文链接:【http://xie.infoq.cn/article/796d4c214a13c30400926f9e8】。文章转载请联系作者。
评论 (1 条评论)