2008-02-24

再次遭遇reiserfs文件系统错误

为了重现上次文件系统的问题,也为了找到上次出问题的原因,我又一次捣鼓了休眠的功能。

这次是用菜单休眠的,按理说应该没什么问题,但是由于重启是用我自己编译的内核启动的,而且参数似乎没设对,因此没能自动唤醒,而是正常启动。中间似乎有个关于swap的服务,显示fail,不过当时我没注意。另外值得注意的是,这次启动过程中fsck.reiserfs有些replay的动作。

后来进行了很多操作,按了一些软件包,其中还创建的新的用户和组。没任何异常。但是重启时,我又想起来了那个resume参数,加上以后,也没什么异常,直接关机了。

但是再次重启后,问题重现了。首先是一堆reiserfs的错误,应该是上次开机后进行了大量文件操作的缘故。之后自然shell也进不去了。

***

这一次,问题的原因很明显了,应该就是休眠时文件系统没有同步,然后正常启动后把那些操作都replay了,之后进行的新的操作,然后我又恢复了休眠时的状态,这样造成了文件系统的错乱。

本想着用上次的办法骗来一个shell,但是这次告诉我PAM failure之类的错误,我心想坏了,估计/etc/passwd之类的文件挂了,因为上次开机后中间新建了用户和组。

***

有了上次的经验,我估计不用安装盘没戏了,花了一天下了个Ubuntu 7.10 alternate的CD,然后从ubuntu网站xxx上下了硬盘安装所需要的hd-media文件,vmlinuz和initrd.gz.准备用它恢复。

由于我本身有grub,而且能够正常运行,因此不需要下而外的grub4dos,我把vmlinuz, initrd.gz和CD映像放在移动硬盘里,开机前插上。启动进入grub后,进入shell,输入

kernel (hd1,0)/vmlinuz root=/dev/ram0 ramdisk_size=170000 devfs=mount,dall
initrd (hd1,0)/initrd.gz
boot

于是从移动硬盘启动了,看到选择语言界面后,按Alt+F2换个控制台,按回车就出来个busybox。


不过遗憾的是它虽然支持reiserfs,但是没有reiserfsck,几分钟后我想到了可以把那块磁盘只读挂载,这样也许就不用检查了,果然如此。

之后就可以用那个盘上的reiserfsck来修复了,这次不需要中间super block(应该是上次已经重建过的缘故),只需要--rebuild-tree 和 --check就可以了。另外我用了chroot,但是似乎不用也可以运行reiserfsck。

这次也没花很长时间,但是报的错误比上次多很多,而且有很多关键的文件。我心里一时没了底,但是心里明白,都是安装软件惹得祸,特别是还创建了用户和组,弄不好就。。。

***

本以为一些就像上次一样顺利,但是重启后虽然没有reiserfs的错误,却出来一堆modprobe的错误,之后shell也进不去,仍然是PAM failure。

我再次用hd-media启动,挂载磁盘一看,/lib/modules/ 竟然都没了!不过是意料之外,情理之中。另外我查看了一下/etc/passwd,/etc/group,/etc/shadow等文件,都是莫名其妙的xml文件(后来知道是/etc里的另一个文件,应该是指针交叉了),幸好还有/etcpasswd-,/etc/group-,/etc/shadow-,于是简单恢复了一下,以为没事了。

用另一个内核启动后,虽然没有modprobe的问题,但是仍然有PAM failure,我估计文件系统乱得够呛了,决定重装。

***

首先要备份的当然是~,之后是/usr/local,还有一些/etc/下的配置文件(我后来挑拣出来一些我修改过的备份出来)

另一个要备份的就是已安装的软件,我查到可以用dpkg --get-selections得到列表,于是用hd-media启动,然后chroot,但是运行时告我/var/lib/dpkg/status错误,我一看,压根儿没这个文件,一下没招儿了,肯定是当时装软件时弄的。不过又一想,重装是对的,系统估计也很难恢复了,而且我正好也想重分一下区,换换文件系统。

最后一个备份的就是/var/cache/apt/archieves,这是apt存档留下的deb文件,虽然不全,但是可能能省点带宽,所以也备份了。

***

重装前我还想调整一下分区,有个不常用的FAT分区,我想腾出点空间给linux,于是下了个Partition Magic,另外要注意的调整后是否还能启动,因为现在硬盘上有grub,是在Linux分区上,因此用PM只是把那个FAT分区分割,而没有跟Linux分区合并,否则就不能启动了。

***

参考了wiki.ubuntu.org上关于硬盘安装ubuntu的文章,知道可以把iso放FAT硬盘上,hd-media可以自动识别(伟大!),于是为了快一些就把移动硬盘上的iso挪到了一个FAT硬盘上,重启。

重装时对分区动了些脑筋,有31G的空间,最后的结果如下

12G XFS linux系统
15G XFS /home
1.5G swap
0.5G reiserfs /boot
2G reiserfs 一个最小系统,以及hd-media和ubuntu映像,用于紧急情况

其他就没什么了,等着便是

***

不一会儿装好了,剩下就是把那些文件拷回去,再补上却的软件了。不过考虑到我家网费,还是决定回学校再装软件,所以现在只是把文件拷回去了。但是现在软件,库之类的版本不一,仍然不大敢用,就等着更新软件了。

***

尾声&总结

1.找到了上次问题的原因,以后要慎用休眠,以及自己编译的内核,毕竟ubuntu的内核多了很多东西,或者挂个initrd是否会好些?另外就是正常启动时要让休眠镜像失效
2.分区分区!
3.备份备份!
4.查了查资料,这次换成了XFS,不知会如何
5.ubuntu重装,总的来说,还是很容易的,最好是联着网装,这样直接装最新的,省去了不少时间
6.不要太相信文件系统如何如何安全,我倒不是针对reiserfs,其实它确实挺好的
发表评论