8. 恢复已删除的分区表

以下是关于手动恢复已删除分区表的说明。有一些实用程序,例如 gpartTestDisk,可以使这项任务变得相当容易。但是,如果您正在阅读本文是因为您已经运气不佳,那么这就是您必须要做的事情

  1. 创建一个至少与您的第一个分区一样大的分区。您可以使其比原始分区大任意量。如果您低估了大小,将会非常痛苦。

    Command (m for help): n
    Command action
       e   extended
       p   primary partition (1-4)
    p
    Partition number (1-4): 1
    First cylinder (1-23361, default 1): <RETURN>
    Using default value 1
    Last cylinder or +size or +sizeM or +sizeK (1-22800, default 22800): 13032
    
    Command (m for help): w
    

  2. 在第一个分区上运行 dumpe2fs,并 grep 输出块计数。

    示例

               % dumpe2fs /dev/sda1 | grep "Block count:"
               Block count:              41270953
          
    如果您不确定此值,请使用更大的分区大小重复步骤 1。如果块计数发生变化,则说明您低估了原始分区的大小。重复步骤 1,直到获得稳定的块计数。

  3. 删除您刚刚创建的分区

             Command (m for help): d
             Partition number (1-4): 1
          

  4. 创建一个大小与您从块计数中获得的精确大小的新分区。由于您无法在 fdisk 中输入块大小,因此您需要计算出需要请求多少柱面。以下是公式

      (number of needed cylinders) = (number of blocks) / (block size)
    
      (block size) = (unit size) / 1024
    
      (unit size) = (number of heads) * (number of sectors/cylinder) * (number of bytes/sector)
    

    考虑以下示例,其中硬盘已划分为四个主分区,分别为 1、2、4 和 8 个柱面。

    disk /dev/sda: 16 heads, 63 sectors, 23361 cylinders
    Units = cylinders of 1008 * 512 bytes
    
       Device Boot    Start       End    Blocks   Id  System
    /dev/sda1             1         2       976+  83  Linux
    /dev/sda2             3         5      1512   83  Linux
    /dev/sda3             6        10      2520   83  Linux
    /dev/sda4            11        19      4536   83  Linux
    
    fdisk 在输出的头部提供了我需要的配置信息。单位大小是516096 ( 16磁头数 *63扇区/柱面 *512字节/扇区)。块大小是504 ( 516096 / 1024)。第二个分区所需的柱面数因此为3 ( 1512块数/ 504)。分区表显示情况确实如此:第一个柱面是3,第二个4,最后一个是5,总共三个柱面。第三个分区所需的柱面数计算方式类似2520块数/ 504 = 5,对应于块数6,7,8,9,10。请注意,此计算不适用于第一个分区,因为块计数是错误的(976而不是1008)。加号表示并非所有块都包含在 fdisk 值中。当您尝试计算(976 / 504)时,您得到1.937。知道柱面数必须是整数,您可以简单地向上取整。

  5. 在其上运行 e2fsck 以验证您可以读取新分区。

  6. 对剩余分区重复步骤 1-5。

重新挂载您的分区。令人惊讶的是,您的所有数据都将在那里。

感谢:Mike Vevea,jedi sys admin,提供基本策略。