Skip to main content

遭遇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.不要轻易尝试危险的东西,如那个休眠的命令。有时,分辨一个东西是否危险的能力更加重要


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

Comments

Popular posts from this blog

[转] UTF-8 and Unicode FAQ for Unix/Linux

这几天,这个东西把我搞得很头疼 而且这篇文章好像太大了,blogger自己的发布系统不能发 只好用mail了 //原文 http://www.cl.cam.ac.uk/~mgk25/unicode.html UTF-8 and Unicode FAQ for Unix/Linux by Markus Kuhn This text is a very comprehensive one-stop information resource on how you can use Unicode/UTF-8 on POSIX systems (Linux, Unix). You will find here both introductory information for every user, as well as detailed references for the experienced developer. Unicode has started to replace ASCII, ISO 8859 and EUC at all levels. It enables users to handle not only practically any script and language used on this planet, it also supports a comprehensive set of mathematical and technical symbols to simplify scientific information exchange. With the UTF-8 encoding, Unicode can be used in a convenient and backwards compatible way in environments that were designed entirely around ASCII, like Unix. UTF-8 is the way in which Unicode is used under Unix, Linux, and similar systems. It is now time to make sure that you are well familiar

Determine Perspective Lines With Off-page Vanishing Point

In perspective drawing, a vanishing point represents a group of parallel lines, in other words, a direction. For any point on the paper, if we want a line towards the same direction (in the 3d space), we simply draw a line through it and the vanishing point. But sometimes the vanishing point is too far away, such that it is outside the paper/canvas. In this example, we have a point P and two perspective lines L1 and L2. The vanishing point VP is naturally the intersection of L1 and L2. The task is to draw a line through P and VP, without having VP on the paper. I am aware of a few traditional solutions: 1. Use extra pieces of paper such that we can extend L1 and L2 until we see VP. 2. Draw everything in a smaller scale, such that we can see both P and VP on the paper. Draw the line and scale everything back. 3. Draw a perspective grid using the Brewer Method. #1 and #2 might be quite practical. #3 may not guarantee a solution, unless we can measure distances/p

Moving Items Along Bezier Curves with CSS Animation (Part 2: Time Warp)

This is a follow-up of my earlier article.  I realized that there is another way of achieving the same effect. This article has lots of nice examples and explanations, the basic idea is to make very simple @keyframe rules, usually just a linear movement, then use timing function to distort the time, such that the motion path becomes the desired curve. I'd like to call it the "time warp" hack. Demo See the Pen Interactive cubic Bezier curve + CSS animation by Lu Wang ( @coolwanglu ) on CodePen . How does it work? Recall that a cubic Bezier curve is defined by this formula : \[B(t) = (1-t)^3P_0+3(1-t)^2tP_1+3(1-t)t^2P_2+t^3P_3,\ 0 \le t \le 1.\] In the 2D case, \(B(t)\) has two coordinates, \(x(t)\) and \(y(t)\). Define \(x_i\) to the be x coordinate of \(P_i\), then we have: \[x(t) = (1-t)^3x_0+3(1-t)^2tx_1+3(1-t)t^2x_2+t^3x_3,\ 0 \le t \le 1.\] So, for our animated element, we want to make sure that the x coordiante (i.e. the "left" CSS property) is \(