2010年12月17日下午,接到一个老学员小李的求救电话,说是不小心把根目录下的所有东西mv到一个子目录后无法执行任何命令了,有无办法解救。我先是问谁干的,小李说是他的头儿干的。如果是小李干的,我是肯定会狠批他一顿,因为我在培训时一直强调攻击型命令要谨慎操作的。既然不是小李干的,我也就不说什么了,就回答说用光盘启动rescue模式进去后挪回去即可。但是小李说服务器不在本地,而是远程外地的。我赶紧问是否还保持着ssh远程登录会话,回答说是,我就让他不要退出,否则就没法挽救了。然后告诉小李说设置LD_PRELOAD等几个库路径相关的参数然后让mv、cp等命令能恢复工作后再继续下一步,具体的可以先上网查一下。
过了若干时间,小李来个短信问具体怎么做,我回复说无法表达清楚。然后小李就来了个电话,请我帮忙操作恢复。当时正在上课,本来不是很方便,但是转念一想,正好趁这个机会让学员通过VNC看看这种情况下我的实际恢复操作过程,现场直播一下,也是一个很好的学习机会。于是跟学员征求了一下意见,他们一致同意,于是就跟小李说我可以尝试操作进行恢复,然后就请小李加我QQ好友,开始QQ远程协助。
通过QQ连接到小李的桌面后,看到一个SecureCRT的会话界面,命令行执行提示ld-linux.so.2: Bad ELF Interpreter。然后执行ls、mv、cp等命令,大多提示command not found。很明显,由于此前是在/下做了做了类似mv * /var/abc的操作,所以这些命令所在的位置已经从根挪到了/var/abc下了。由于bash内部命令还可以用,可以cd、pwd之类的。此时由于ls无法使用,所以无法列出目录内容。但是cd /var/abc/bin后,先敲入ls空格后再敲两次TAB键,会提示显示目录内容。此时使用./ls、./mv、./cp等,依然会提示有错。甚至/var/abc/lib/ld-linux.so.2 /var/abc/bin/ls的形式仍然提示错误。
命令找到了,但是由于依赖的库已经从/lib挪到了/var/abc/lib,因此会由于动态链接库无法找到而无法正确执行。如果能把库挪回原位,那就不用担心不能执行了;但是为了挪回原位,就要使用mv或者cp甚至是rsync等命令,但是这又依赖/lib下的库。似乎陷入了一个死循环,不可解脱的死扣。
但是执行./ls和执行/var/abc/lib/ld-linux.so.2 /var/abc/bin/ls可以看到提示信息有所不同。而执行/var/abc/lib/ld-linux.so.2时会有帮助提示。由于以前做过开发,想起了一些关于运行库的设置,于是尝试export LD_LIBRARY_PATH="/var/abc/lib:/var/abc/usr/lib"然后再运行./ls命令,就发现可以正常运行了。于是下面就简单了。为了避免二次犯错,先是cd /var/abc; /var/abc/lib/ld-linux.so.2 /var/abc/usr/bin/rsync -av --progress --partial lib usr/lib bin sbin usr/bin usr/sbin etc / -R确保把基本系统复制回原位,然后再/var/abc/lib/ld-linux.so.2 /var/abc/usr/bin/rsync * / -R恢复全部数据;至此可以算是完满恢复了。至于/var/abc这个目录下冗余的数据,就交由小李来做进一步的处理了。为了以防万一,我请小李不用关闭原来的ssh会话,另开辟一个新会话看看能否正常登录,然后确认系统是否正常;回复说已经能够正常登录,于是我的操作完成,直接断开远程协助退出了。
这一次江湖救急之所以能够顺利进行,主要是因为ssh会话还在保持,否则退出后就无法再上去了。除了打飞的到现场用光盘rescue恢复外别无他法。届时要直接启动系统都很困难了:vmlinuz和initrd.img都五脏移位了,还得设置grub参数,对于经验不足者而言这个过程很麻烦。我在恢复期间还把LD_LIBRARY_PATH先误写成了LDLIBRARY_PATH,是因为看了ld-linux.so.2的提示信息才纠正过来的。
小结一下:
#设置动态链接库路径,让命令知道动态链接库所在,这样子就能够保证基本的文件数据操作命令正常执行了。
export LD_LIBRARY_PATH="/var/abc/lib:/var/abc/usr/lib"
#使用已能够正常运行的基本文件操作命令恢复文件系统树
cd /var/abc; /var/abc/lib/ld-linux.so.2 /var/abc/usr/bin/rsync -av --progress --partial * / -R
以前也有一些学员参加工作后忘记了培训期间的警告,非得要弄出大事,刻骨铭心才无法忘记。比如说远程修改iptables的各个链缺省策略为DROP的;有直接setup后修改网卡设置重启出错的;有rm -fr /etc甚至是rm -fr /的。
这期学员(VC20100913)最近看到我的不少实战操作。由于整个桌面都通过VNC共享给他们,所以屏幕上的任何信息他们都能看得一清二楚。相信这次实战操作能够给他们一些信心。后续还会在一些生产系统上演示一些实际操作给他们看。