记得刚接触UNIX那会儿,学会了rm命令,紧接着就学会了rm -rf *——这大概是很多人的必经之路。UNIX设计哲学里,删除操作默认不做任何提示(除非你用alias把rm绑成rm -i)。对新手来说,这个坑特别容易踩,而且后果可能很严重。以前在AIX上不小心把/目录删掉大半,等按Ctrl+C时已经晚了。还好那台机器没什么重要数据,最后只能重装系统。从那以后,印象中这类事故基本上只有重装这一条路。
但最近又碰上了类似的事,这次可没那么简单——机器是双机热备的主机,挂着磁阵,上面跑着SC、Veritas,还有数据库。不过这次尝试了重装以外的办法,花了两个小时(包括查资料的时间)搞定了。场景是这样的:一位高手在电脑前以无影手的速度敲键盘,突然停下来,伴着一声惨叫:“啊,怎么当前目录在根目录下!”他刚输入的就是UNIX杀手锏——rm -rf *。看了一眼,好像只是bin目录没了——那个bin其实是个符号链接,指向/usr/bin。重新建一个链接不就行了?以为天下太平了。下午修改配置后重启机器,平时几分钟就起来,这次等了半天也连不上。用串口线连上去一看,系统已经进入OK状态。把auto-reboot参数改成true,再输入go,几分钟没反应。重启了几次都没用——问题严重了。以前用Windows时,中病毒或系统变慢就重装,现在家里电脑早就换成Linux了,没那种烦恼了。废话少说:把Solaris安装盘放进光驱,在OK状态输入boot cdrom -sw,用光盘引导启动进入操作系统。
思路很直接:把原来的根分区挂载上来,找到丢失的文件,再补回去。具体操作如下:
用format命令找到原来根分区所用的磁盘。注意到format里显示的磁盘顺序和正常启动时不一样,只能逐个选中磁盘后用p查询分区和挂载情况。比如发现c1t0d0s1是原来的根分区,退出format。
在/tmp/root/下新建目录:mkdir /tmp/root/mytmproot,然后挂载:mount /dev/dsk/c1t0d0s1 /tmp/root/mytmproot。为什么挂到/tmp下?因为光盘引导时根分区是只读的,不能直接挂到/。
挂载成功后,到/tmp/root/mytmproot检查是不是原来根目录的内容。接下来要找少了哪些文件。用了个土办法:找另一台同样配置的机器,用du或du -s对比每个目录下的文件个数和大小。最终发现/dev/dsk目录没了,/devices下面也少了一些文件。大家都知道这些目录是干什么的——/dev/dsk下都是指向/devices的符号链接。手工重建符号链接?每台机器可能有差异,直接照搬有风险。想起可以用devfsadm -C -r /tmp/root/mytmproot,-r选项指定根目录路径。执行完后,/dev/dsk下面的文件都回来了。心想应该差不多了——对比发现就这个目录下的文件被删了。重启后出现一些网卡相关的错误,不管它,直接重启(从硬盘引导)。进去后发现以前配置的网卡都不在了,用ifconfig ce0 plumb提示没有这样的设备。一比较发现/devices下面丢失了一些网卡设备文件。进入OK状态,输入probe-scsi-all,再输入watch-net-all,然后power-off,重新启动后硬件重新检测,之前丢失的设备文件都回来了。至此所有问题解决。
这个问题比较特殊——因为删除的文件刚好是设备文件。希望能起个抛砖引玉的作用吧。
