起因和舞台

学校机房采用一台IBM小型机作为OJ服务器,现在浙江大学的马宏菩学长给它装了CentOS 6.4,做了精密的配置,目标是它能正常工作十年以上。事实也证明他的工作何其卓越:从配置好到现在一年多时间从来没有遇到过任何系统问题,性能一直稳定得像放射性同位素的半衰期一样,作为一台OJ简直棒极了。他毕业后由我负责维护。

而我其实也即将毕业,自然需要未来的学生学习维护。然而新的信息组学生并没有在初中用过Linux操作系统的,就算高中开始用,也都只是玩玩Ubuntu的图形界面,至少没有一个会用Vim/Emacs的,就知道水平如何了。

前几天,他们将一组数据送上OJ,因为cp命令参数弄反,然后sudo rm * -r,不知道怎么回事就把/lib给删掉了……不久rm就崩溃了,停止运行。然后系统就废掉了,开机不久Kernel就因为动态库调用失败panic。

准备工作

向马宏菩学长请教后我准备了两套方案:
1.用CentOS 6.4 LiveCD进入系统,把LiveCD的/lib复制给系统,先让系统基本的功能能够运行,然后再安装失去的功能
2.重装

显然我是不想重装的,一是这台机器数据很多,二是这样一台机器相当难装机,尽管马宏菩学长已经做到了RAID5磁盘阵列区块对齐(请点击这里看他如何实现对齐的文章),解决了最难的问题,但重装还是让人觉得可怕的。而且还要考虑恢复MySQL数据库什么的。所以我还是希望方案1可用。

因此我刻录了CentOS6.4的LiveDVD和安装DVD,然后开进去。开进去干的第一件事就是备份数据。最初我让学弟们给我格式化一块空置的原本是NTFS的1TB移动硬盘为ext4,结果他格式化成了exFAT……而我只是开启了复制就去上晚自习了,下课回来一看才发现不妙,还是自己去格式化,然后扔在那里备份了一个晚上,到第二天中午下课,过去看已经备份完了。

诊断

我最担心的是他们不仅仅删了/lib,结果仔细一看,除了lib找不到,其他都在,还把用于存放数据的目录移动到了根底下。进去一看,居然有个目录叫lib,大喜,赶紧将其复制出来,重启,然后依然Kernel panic,依然是动态库调用错误。

这下比较郁闷了。仔细看了看复制出来的/lib目录,发现里面有一些失效的链接,都是库的特定版本命名。看来他们可能确实删掉了一些库。

治疗

这时强大的Shell工具就派上用场了。先用ls生成系统的/lib目录内容以及LiveDVD的/lib目录内容,然后用diff比对一下,就知道/lib缺少了哪些文件了。将它们逐个复制过去,大功告成,成功开机。

然而问题又来了:虽然Kernel不会panic了,但恢复得并不完整。由于这台服务器经常有小白来管理,因此它装了图形界面,gdm+gnome2。刚开始进入系统时,gdm正常,但一log out出来,gdm就无法加载用户列表了。CentOS的诊断系统报告只是缺少gvfs,不太可能造成这样的问题。

再问马宏菩学长,他提示我考虑看看日志。翻开日志,里面全是pluseaudio的报错……好吧你作为一台服务器有图形界面已经够bug了,居然还有pluseaudio……无视它,翻了越200行,终于看到一行特别的:dbus加载错误。问题找到,重装dbus,一切恢复正常。

原本计划这次维修用时在3天~5天,但仅仅用了一个中午就结束了。

启示

这是我第一次遇到一台弄到无法开机的Linux,给了我许多启示。
1.会尽可能避免重装,是一个系统管理员和街边修电脑的人遇到故障时最大的差别。重装是以破坏用户数据和使用习惯为代价的,能避免一定要避免。而避免的方法就是认真分析发生的故障或问题。
2.遇到问题请看日志,日志能给你最重要的提示。
3.系统交给小白之前一定要对他们进行认真的培训。


Michael_Lin
338 声望17 粉丝

OIer/ACMer,C/C++/Java/Js/Php/python业余开发者