记得几年以前刚接解UNIX操作系统的时候,学会了rm命令,还学会了rm -rf *,我想很多人都经常这样使用,在UNIX下如果不用alias rm rm -i的话,删除根本不做任何提示,这也是UNIX设计的哲学,但是对于新手有时候会容易犯错误的.有时候后果是很严重 .以前在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/下新建目录mytmproot,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,重启重新检测硬件进入操作系统,以前丢失的东西都回来了,至此所有问题都解决了.
可能我这个问题比较特殊,因为删除的文件特殊,希望能够起到一个抛砖引玉的作用吧!