原双系统硬盘windowsxp 和redhat9.0。用grub从mbr引导。分区信息如下:
Disk /dev/hda: 4865 cylinders, 255 heads, 63 sectors/track
Units = cylinders of 8225280 bytes, blocks of 1024 bytes, counting from 0
Device Boot Start End #cyls #blocks Id System
/dev/hda1 0+ 1019 1020- 8193118+ b Win95 FAT32
/dev/hda2 1020 4864 3845 30884962+ f Win95 Ext'd (LBA)
/dev/hda3 0 - 0 0 0 Empty
/dev/hda4 0 - 0 0 0 Empty
/dev/hda5 1020+ 2305 1286- 10329763+ 83 Linux
/dev/hda6 2306+ 2816 511- 4104576 83 Linux
/dev/hda7 2817+ 2889 73- 586341 82 Linux swap
/dev/hda8 2890+ 3569 680- 5462068+ 83 Linux
/dev/hda9 3570+ 4864 1295- 10402056 b Win95 FAT32
原windows 是别人装的,有C,D,E3个逻辑盘,hda6分区是以前用PQmagic从D盘下分出来的4G,后来发现linux下程序越装越多,/usr空间已经达到了4.6G, 用df查看/下的使用率已经99%了,于是又把整个D盘格掉分给linux做一个单独的/usr分区。Windowsxp是以前用一张不完整的碟强制安装上去的,一直不稳定,反正也就玩CS和格斗游戏时用一下,VC都没装,平时都不用,也就没怎么搭理。前天因为要搭个DSP的实验环境,安装CCE需要在windows下,不得以准备重装windows。弄了一张刻的xp盘,用ntfs把C 盘重格安装完后。重启,发现grub引导错误。这种情况已经习惯了,不就是重装下grub嘛。习惯动作,拿出上方宝剑—linux安装盘,进入rescue模式,让安装盘自动寻找根分区。!!!,居然提示找不到任何linux分区,这就奇怪了,难道分区表出错?进入shell,
#/sfdisk -l /dev/hda
发现原为ext2分区的hda6分区不见了,取而代之的是原hda7的交换分区,后面分区的编号也依次减1,
/dev/hda6 2817+ 2889 73- 586341 82 Linux swap
/dev/hda7 2890+ 3569 680- 5462068+ 83 Linux
/dev/hda8 3570+ 4864 1295- 10402056 b Win95 FAT32
这种情况从没见过,mount一下根分区hda7,发现数据正常。那么就是分区表错误了,还好我以前研究mbr时把每个分区0磁道1扇区的数据进行了记录
dd if=/dev/hdax of=/home/mbr/px bs=512 count=1 x为相应分区号。
不管怎样,先还原引导分区。同样使用dd命令将/hda6 和 /hda7的引导信息还原。重启后用linux安装盘进入rescue模式,找到了根分区然后重装grub,因为/usr做为一个单独的分区没有挂上,所以/sbin/grub命令无效,先mount grub分区。
#mkdir /rescue
#/rescue/sbin/grub
#root (hd0,7)
#setup (hd0)
修改相应的grub.conf文件,和/etc/fstab.重启后,基本恢复正常,但是原来的hda6分区再也看不到了。用带光盘启动的98修复盘运行diskman也没发现错误,只是在2305和2817之间的柱面没有显示在分区表中。也许PQ magic能够发现什么,退出diskman,运行盘上带的PQ magic6.0,马上弹出信息说分区表有错误,问是否需要修复。嗯,能够发现错误,有戏。。顺手就按下了确定,由于一时的疏忽,灾难开始了,出现修复完毕的信息之后,屏幕死机。。
重启之后,硬盘启动找不到启动信息,用98修复盘启动,在选择从cdrom启动后,光标停在屏幕左上方,不停闪烁,闪啊闪啊,就快闪到天荒地老还没反映。换经典的98安装盘选择从光盘启动还是出现上述情况。这下我急了,从没听过不能从光盘启动的情况,启动光盘能够自动加载一个小型的dos系统啊。抱着莫名其妙的心情试着用linux的安装盘启动,耶,行了,I LOVE LINUX!,进入rescue模式,用sfdisk一看,天。出现了160个分区,从hda6开始就是重复的分区,指向分区柱面2305到2890.用fdisk看也有15个分区。没办法,将只能将后面的分区都删掉,现在只剩下一个hda1的fat32分区,一个扩展分区和一个hda5的linux(/usr)分区,根分区都没了。该死的PQ,我的硬盘分区表备份都放在linux根分区里面,
。重启后终于能够用98修复盘引导了,运行diskman,试着重建分区表。结果找回了4个分区,
分区 柱面起始 柱面终止 类型
0 0 1019 fat
1 1020 2305 extend
2 2892 3569 linux
3 3570 4864 fat
4 1020 2305 linux
看来diskman为了找回分区,把前面几个分区都作为主分区了。现在不但那4G空间没有找回来还赔了一个交换分区,唉,革命尚未成功,同志还需努力。再仔细看看,发现第3号分区即linux的主分区起始磁头居然是第91个磁道,理论上来说一个分区的起始引导磁道都在0号磁道,数据都在1号磁头,于是继续查看0柱面,0磁道,1扇区即mbr的分区表,从到数第66个字节读起,发现关于第2号分区的分区描述为
00 5b c1 4c 83 fe 7f f4 09 6f c4 02 69 b0 a6 00
其中的5b即10进制的91,表示起始磁道,将它改为01,重启,用linux启动盘进入rescue模式发现还是无法找到linux根分区,mount 2号分区出现错误。难道分区信息还是有误?猛然想起几天前好象用笔计算过mbr的信息,可能留有什么线索。于是翻箱倒柜,还好主没有抛弃我,终于在一张皱巴巴的草稿纸上找到了一点信息。
16386363+30041550=46427913,46427913+10924200=57352113,这几个数据好象是原始分区的部分分区起始扇区.
#sfdisk -l -uS /dev/hda
有问题,16386363是现在4号分区的起始扇区,而2号分区的起始扇区是46460043,和46427913有点差距,计算一下,一个柱面255个磁道,一个磁道63个扇区
(46427913-46460043)/255/63=2,刚好偏移了2个磁道,于是将2号分区的起始扇区改回来,重启。。rescue模式。万岁,终于找到了根linux分区,
分区表果然是个危险的东西,不能乱玩,还是老老实实重建分区表吧,找到以前的分区信息备份,根据备份信息,重建分区表。一切都回来了把修复过程写下先。。
经过了这次有惊无险的分区修复过程,得出了几点经验,共享一下
1.备份你的分区表,而且最好备份在软盘,U盘,光盘等非硬盘介质上,万一出现问题还可以据此重建分区表,因为分区表不论是mbr还是虚拟mbr大都在0磁道1扇区,不会影响到你的数据区,所以如果分区表出错,还想找回数据的话,千万不要在数据区覆盖信息或格式化。
2.这次分区还算运气好,刚好用不久笔记录了linux根分区的起始磁头,不然真要欲哭无泪了,
这说明了人品好才能运气好:)
3.PQ magic是个不稳定的比较危险的工具,慎用。Linux下有类似的工具parted,不过我还没用过,研究中,不过linux下工具以稳定著称,应该比pq好点,个人观点。
4.如果有 linux和window双系统。经常要重装windows的最好把grub装在非mbr区,并将其设置为活动分区。
Icefox_yic 6th Apr 05