2008-02-17

遭遇reiserfs文件系统错误

第3天,我的ubuntu终于回来了。

在讲故事之前,先交代一下我的系统:

我的电脑双系统,windows xp和ubuntu 7.10
硬盘分了5个区,一个ntfs放windows,两个fat32放windows程序和双系统公共数据,一个reiserfs放ubuntu,最后一个swap
ubuntu有两个内核可以启动,一个是自己编译的2.6.24.2 另一个是ubuntu自己的2.6.22-14-generic

***

事情还要从编译内核说起,那天编译内核是发现有个hibernate的支持,说明里是说可以用echo 'disk' > /sys/power/state来休眠,于是编译好内核并用它启动后便试了试这个功能。

运行这个命令后系统很快就掉电了,没什么异样。

重启后和没休眠没什么两样,这让我有些疑惑,后来想起好像需要在启动是加上resume=<休眠swap分区>的参数,于是修改了/boot/grub/menu.lst,再用那个命令休眠。

但是,谁能想到,从那时起,到我那linux再次正常启动,竟花了3天时间

当时已是深夜,母亲催我入睡。 料我昏昏欲睡之时也不大可能搞好--不把电脑弄的更糟那就是万幸--睡吧,明天再说。

***

第二天白天都串亲戚去了,晚上才开始动手。

再次启动时,突然发现grub选择操作系统的菜单消失了,迎接我的只有一堆提示信息和一个grub>的shell提示符,愣了几秒后我反过神来,凭印象输入引导命令,但是总报错,按help得到了命令列表,其中有个cat,于是cat /boot/grub/menu.lst,但是提示inconsistnet filesystem,于是我大概明白了发生了什么--似乎时休眠时文件系统没有同步好。

按tab命令不全时发现了原来还有/boot/grub/menu.lst~这个自动备份,于是cat看看,记下了命令,先进linux看看吧:

root (hd0,5)
kernel /boot/vmlinux-2.6.24.2 root=/dev/sda6 ro
boot

但是不一会fsck报出一堆错误,还说必须用--rebuild-tree修复,都说reiserfs很稳定,我一直也这么觉得,遇上这么严重的问题,我还是大姑娘上花轿--头一回。

这次仍用上面的命令,只是加上了 resume=/dev/sda7,神奇的是竟然成功唤醒了休眠时的状态。由于grub的问题,我查看了/boot/grub/menu.lst,权限各栏都是问号,用root也不能进行操作(编辑,删除)。我当时只是觉得文件系统出了问题,也没多想,就关机了。后来想想,可能这时候多拷贝出些文件,或者再次休眠才是好注意。

以后启动就一直是失败,resume参数也不灵了。 我意识到问题严重了,开始想办法修复

***

首先想到的当然是用fsck修复,但是既然硬盘不行了,就只能用U盘启动了,我以前只做过dos启动盘,linux启动盘还是没有接触过。只好上网查查了,首先要进去windows,在grub shell里输入

root (hd0,0)
chainloader +1
boot

还好还好,windows完好无损。

几经查找,几番折腾(重启了若干次),我用syslinux和ttylinux做好了一个启动盘,成功进入的一个linux2.6.14,似乎成功在望了,而其实,还差的远。

不知是不是为了省空间,ttylinux不支持reiserfs,mount不认识,fsck.reiserfs也没有。唉,毕竟是个不到6M的系统,人家也不容易。

后来下了个50M的Damn Small Linux,我那32M的U盘已经放不下了,于是用老爸的移动硬盘(杀鸡时如果只有牛刀可以用,也得用啊)又搞了一下,启动后到不错,还有个简易的图形界面,而且竟然还有游戏--虽然linux只是2.4,虽然仍然不认reiserfs。 唉,又白搭。

这时想到了ubuntu的iso(手边没有盘,要是有盘我早弄好了。。。),开始下,但是可怜我们家的网速,要一个半小时才能下完。想到我家这月上网时间所剩不多,放弃了。

现在的问题是没有fsck.reiserfs,也就是reiserfsck,而我现在只有linux分区上才有这个文件。这就是个鸡生蛋蛋生鸡的问题。 突然想到何不从别的地方搞一个?网上搜了半天没有结果,于是让同学给传了一个。 欣喜地(用u盘)重启后发现还要个libuuid库,这哪有? 不想再找同学传了(谁知道还有几个依赖的库?当然。。。也许就这一个),而且又到了深夜,不弄了。

***

第三天,一起床就开始搞。

想了很多办法,试图用U盘上的内核挂上硬盘上linux分区,都失败了。

这时不知怎的有想起linux的recovery模式了,就是加上个single的内核参数。启动后虽说fsck也失败了,但是还是要管理员密码,看来有点门儿!

不过,输入了密码后没有见到root shell,却被告知sulogin terminated,也不知怎么回事。

一定要搞个shell来,我这样想着,想着,突然心生一计,记得以前刚学会sysrq魔术键时在启动时乱按,弄出个busybox的shell来,似乎还是initrd阶段的(后来知道应该是init被中断自动重启),何不试试看呢。

仍用single模式重启,我试着按alt+sysrq+k,但是只是看到进程被杀,就卡在那里了,没有反应,多次重启并在不同地方尝试,仍未成功,直到再次看到give root password for maintainance or type Control-D to continue。我已经知道输了密码后会说sulogin被中止,而此时按alt+sysrq+k也类似。只好按control-d了,这是系统开始关机,依次结束各个服务和进程,之后系统就断电了。

再次重启,我再最后一个地方试alt+sysrq+k,也就是按control-d后的那个阶段,这一次,只见init terminated, repawn之类的提示,啊,终于看到login了,我用普通用户登陆,然后sudo bash,试了一下,/是只读挂载的,太好了!

按照http://www.chinaitpower.com/2005September/2005-09-13/200571.html上的方法,我开始修复:

方法如下

1,dmesg |grep reiserfs |grep partition
查看你的 reiserfs 文件系统是那个版本的(在后面要用到)

2.fsck.reiserfs --check /dev/partition
如果报错不能修复,转3,否则结束。

3.fsck.reiserfs --rebuild-sb /dev/partition
重建 super block

重建时会让你选择文件系统版本,根据刚才得到的版本号选择

4.fsck.reiserfs --rebuild-tree /dev/partition
尝试重建文件系统树

5.fsck.reiserfs --check /dev/partition

我实际操作时,第4步一开始说剩余时间8000多秒,2个多小时啊,吓我一跳(我那个分区用了18G),但是过了几分钟后剩余时间突然变成260秒。整个过程不到10分钟就结束了,而且感觉出问题的地方并不多。万幸万幸。

另外第3步时并没有问我版本号。另外我一开始没看到第5步,第4步成功后就高兴地重启了,但一般启动总报错,是ata模块报的,好像是某某状态错误。最后用single模式进入,中间有fsck的提示,进行了一些操作,大概做了些标记,之后sulogin仍然失败。但是感觉上文件系统已经没问题了,于是再次重启。

这一次,没有任何异样,一堆系统消息后,屏幕一闪,啊,终于看到了熟悉的登陆界面。啊!终于弄好了!

***

现在分析一下问题的起因,应该就是我休眠和恢复没有弄好,导致文件系统没有同步好。至于具体的原理,其实现在也还是不大清楚。只是现在不敢用那条命令进行休眠了。

另外就是再休眠的那个会话里我还在一个FAT分区下了些文件,结果到windows发现那个地方也不正常了,后来全盘扫描了一遍才恢复。

***

总结
1.备份很重要,自动备份的/boot/grub/menu.lst~还是很有用的
2.分区很重要,我很后悔当时没有把/boot, /home等单独分一个区,现在想分也很麻烦
3.最好准备一个应急启动盘,而且至少要支持自己硬盘的文件系统
4.文件系统再稳定也没用,还是应该平时注意保护和保养
5.应该熟记grub命令和kernel参数,关键时刻还是挺有用的
6.那个syssq魔术键我自以为用得还是不错,至少骗来个shell,在最后时刻发挥了决定性的作用。我最好再看看其他魔术键的功能
7.不要轻易尝试危险的东西,如那个休眠的命令。有时,分辨一个东西是否危险的能力更加重要


就写这些了。可能系统还有些后遗症,但是已经无大碍了。能恢复成这样已经万幸了。

No comments: