近段时间,越来越觉得花在archlinux上折腾的时间太长了,遂有意换个发行版,恰好我的 /usr 在前天更新的时候,被我装的五花八门的各种软件给占满了,于是,昨天早上下定决心重装系统,这次用有奔头(ubuntu),以节省更多时间在其他方面,而不是系统。但我手真贱,安装装出了问题:分区表损坏

我原来的系统,分区是这样的:

/boot 64m
/ 3G ext4
/swap 3G
/tmp 2G ext4
/var 3G ext4
/usr 15G ext4
/home 剩余 ext4

因为先前出现了 /usr 用光的情况,为了防止以后类似情况发生,于是,想把前面分区都集中在一起,变成:

/boot 64m
/ 21G ext4
/swap 3G
/home 剩余 ext4

分区结束后,安装失败,重新进入livecd,发现分区结果变成了图里这样:

分区损坏

郁闷了,原来的那个 /home现在被掰成了两个,分区类型无法识别。初步感觉,应该是主分区和扩展分区问题。因为原来/tmp /var /usr /home都是在扩展分区里面的,现在我把他们拉出来,和原来在主分区的并在一起,原来的第四个主分区因为这个改变,而失去作用,于是,系统默认又在 /home位置建了一个主分区,然后主分区里包含/home这个分区,结果就成了这样。

挂载是挂不上了,又不敢格式化(里面积累了好多年的心血),不知道如何处理。于是跑到相关社区,开始求助。

  1. 我的最高目标:数据不损坏,分区简单方式找回
  2. 最低目标:数据不损坏

为了达到此目的,需要:

  1. 尽可能从丢失分区中找回数据。
  2. 使用工具恢复分区表

恰好有朋友推荐,使用testdisk。于是我搜之。为了方便其他人,我把过程详细写下:

一、在有奔头中安装testdisk:

#sudo apt-get install testdisk

二、使用testdisk(需要使用根权限)

#sudo testdisk

三、详细步骤(下面复制粘帖自网上,其中有些修改):

1.选择Create来进行分析,此处创建日志,以方便以后使用

Use arrow keys to select, then press Enter key:
[ Create ]  Create a new log file
[ Append ]  Append information to log file
[ No Log ]  Don’t record anything

2.然后选择testdisk中要修复的硬盘:

Select a media (use Arrow keys, then press Enter):
Disk /dev/sda – 160 GB / 149 GiB – ATA HITACHI HTS54251
Disk /dev/sdb – 3272 MB / 3121 MiB – SM324BC USB DISK

3.选择testdisk修复的平台,我是Intel的,所以选择它

Please select the partition table type, press Enter when done.
[Intel  ]  Intel/PC partition
[EFI GPT]  EFI GPT partition map (Mac i386, some x86_64…)
[Mac    ]  Apple partition map
[None   ]  Non partitioned media
[Sun    ]  Sun Solaris partition
[XBox   ]  XBox partition
[Return ]  Return to disk selection

4.使用testdisk分析,现在选择Analyse进行分析

[ Analyse  ]  Analyse current partition structure and search for lost partitions
[ Advanced ]  Filesystem Utils
[ Geometry ]  Change disk geometry
[ Options  ]  Modify options
[ MBR Code ]  Write TestDisk MBR code to first sector
[ Delete   ]  Delete all data in the partition table
[ Quit     ]  Return to disk selection

5.见到了没,基本所有的分区都出来了,直接回车就好了,默认直接回车是快速扫描.

*=Primary bootable  P=Primary  L=Logical  E=Extended  D=Deleted
[Quick Search]  [ Backup ]

然后因为没用vista,所以选择n。

Should TestDisk search for partition created under Vista ? [Y/N] (answer Yes if
unsure)
N

6.进入,见到你的表区表了吧,注意下面的说明,此处可以对每个分区进行设定,比如最后一个分区,原先是D,也就是删除了的意思,此时我们如果确定该区就是我要找的分区,那么我可以选中该分区,然后将其换成L或者P(逻辑分区或者主分区),然后就可以回车进入下一步

Disk /dev/sda – 160 GB / 149 GiB – CHS 19457 255 63
     Partition               Start        End    Size in sectors
* HPFS – NTFS              0   1  1  1567 254 63   25189857
L FAT32 LBA             1568   2  1  5097 254 63   56709324 [NO NAME]
L Linux Swap            5098   1  1  5221 254 63    1991997
L Linux                 5222   1  1  7298 254 63   33366942
D Linux                 7299   1  1 19456 254 63  195318207

Structure: Ok.  Use Up/Down Arrow keys to select partition.
Use Left/Right Arrow keys to CHANGE partition characteristics:
*=Primary bootable  P=Primary  L=Logical  E=Extended  D=Deleted
Keys A: add partition, L: load backup, T: change type, P: list files,
     Enter: to continue
NTFS, 12 GB / 12 GiB

如果你不确定该分区是否是你所要的分区,可以按p,查看该区详细的文件。在查看详细的文件时,可以选择复制文件,安全起见,最好使用此功能备份。

7、最后一步,就是写入了。先前由于不了解testdisk,以为找到的是现有的分区,后来仔细深入分区内部的搜索,才发现找到的是丢失的/home,找到了就好办了,将其D(delete,就是被删除了)的标志换成L(逻辑分区),然后进一步就是write(写入),之后退出testdisk,重启系统,搞定。

经验教训:

1、尽可能使用已经成熟的分区格式,比如ext3,我一开始用slax来急救,结果这家伙默认不识别ext4,浪费了点时间才搞定。如果我用btrfs呢?恐怕会更糟。

2、有备无患:没有分区格式化前,先备份好,同时留有恢复工具

3、数据瞬间丢失,是很伤人心的事情,会让人瞬间有死的感觉,所以,需要提高承受能力,同时,丢失数据也是锻炼承受能力的好办法,呵呵。