恢复 lvm 的分区表

恢复 lvm 的分区表

我设法在错误的磁盘上运行了 fdisk。但是我能够保存终端会话的日志。

磁盘管理意外:

~$ sudo fdisk -l /dev/sda

Disk /dev/sda: 320.1 GB, 320072933376 bytes
255 heads, 63 sectors/track, 38913 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x72fc82e8

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *           1       36473   292969341   8e  Linux LVM
/dev/sda2           36474       38913    19599300    b  W95 FAT32

后来我在日志中发现:

$ sudo fdisk -u /dev/sda

WARNING: DOS-compatible mode is deprecated. It's strongly recommended to
         switch off the mode (command 'c').

Command (m for help): p

Disk /dev/sda: 320.1 GB, 320072933376 bytes
255 heads, 63 sectors/track, 38913 cylinders, total 625142448 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x72fc82e8

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1              64   550000000   274999968+  83  Linux
/dev/sda2       550000001   625142447    37571223+  83  Linux

Command (m for help): t
Partition number (1-4): 1
Hex code (type L to list codes): 8e
Changed system type of partition 1 to 8e (Linux LVM)

Command (m for help): p

Disk /dev/sda: 320.1 GB, 320072933376 bytes
255 heads, 63 sectors/track, 38913 cylinders, total 625142448 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x72fc82e8

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1              64   550000000   274999968+  8e  Linux LVM
/dev/sda2       550000001   625142447    37571223+  83  Linux

Command (m for help): w
The partition table has been altered!

Calling ioctl() to re-read partition table.

WARNING: Re-reading the partition table failed with error 16: Das Gerät oder die Ressource ist belegt.
The kernel still uses the old table. The new table will be used at
the next reboot or after you run partprobe(8) or kpartx(8)
Syncing disks.

系统继续正常运行。我按照自己的意愿正确分区了 /dev/sdb,最后在 /dev/sdb 上运行了 kpartx。我想这就是为什么 sda 上的卷在重新启动之前表现正常的原因。

我注意到了错误并尝试恢复 /dev/sda 上的分区表

但是我没能恢复原始分区表。/dev/sda1 显示的块数始终为 292969348,因此比原始值多 7 个。我记得在对 sdb 进行分区之前升级了 fdisk,可能是因为版本较新?

尽管如此,我认为系统是安全的,因为我不介意未使用的 fat32 分区。重新启动后,lvm 找到物理卷,但没有找到卷组。我定义了一个仅由 sda1 和该组上的一些逻辑卷组成的卷组。

当前系统状态:

~# fdisk -c -l /dev/sda

Disk /dev/sda: 320.1 GB, 320072933376 bytes
255 heads, 63 sectors/track, 38913 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x72fc82e8

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *           1       36473   292968348+  8e  Linux LVM
/dev/sda2           36474       38913    19599300    b  W95 FAT32

~# pvdisplay 
  "/dev/sda1" is a new physical volume of "279,40 GiB"
  --- NEW Physical volume ---
  PV Name               /dev/sda1
  VG Name               
  PV Size               279,40 GiB
  Allocatable           NO
  PE Size               0   
  Total PE              0
  Free PE               0
  Allocated PE          0
  PV UUID               ur3J4Y-cwvC-lji2-RPk0-39xb-ltzW-ogN4Sd

~# vgscan 
  Reading all physical volumes.  This may take a while...
  No volume groups found

~# pvck -v /dev/sda1
    Scanning /dev/sda1
  Found label on /dev/sda1, sector 1, type=LVM2 001
  Found text metadata area: offset=4096, size=192512
    Found LVM2 metadata record at offset=168448, size=28160, offset2=0 size2=0
    Found LVM2 metadata record at offset=67584, size=100864, offset2=0 size2=0

为什么我无法恢复具有精确块数的原始分区表?为什么 lvm 找不到任何卷组?我现在有什么选择?多个 lvm 元数据可以解决问题吗?我该如何使用它们?

答案1

您应该取出分区表的备份并将dd其恢复到原位。或者运行分区恢复工具(在 Google 上搜索“恢复 Linux 分区”的第一个结果看起来很有趣)。但我还是会坚持使用分区表备份。

答案2

我无法保证您的所有数据都会恢复,但您可以尝试重建 LVM 元数据。无论如何,在 HPUX 上,这根本不会触及数据区域,但您需要了解有关 LVM 创建方式的信息。

  1. 我首先要删除旧的 VG 信息(vgexport oldvg)。
  2. 在 /dev/sda1 上运行 pvcreate
  3. vg使用 /dev/sda1 创建一个新的 vg,使用与最初相同的参数
  4. 使用与最初完全相同的参数运行 lvcreate
  5. 对 /dev/newvg/newlv(不是真实名称)执行 fsck,看看它是否识别您的数据。

再次,我在 HP/UX LVM 系统上成功使用了这种类型的流程,它也可能适用于您的情况。

如果这是启动/引导盘,您可能还需要重新启动磁盘。

但是如果您不想丢失任何数据,请务必在尝试我的建议之前备份磁盘。

答案3

从输出中恢复分区表是成功的关键。请注意上述终端转储中原始分区表和恢复后的分区表之间的细微差别:尽管柱面值匹配,但实际扇区数不匹配。

额外的帮助来自测试磁盘最终正确检测并恢复了分区信息。在恢复过程中,我注意到备份中有以下白点:

  • 分区表的备份,例如使用 fdisk -u -l /dev/disk/by-id/example 并了解不同的单位如柱面和扇区。
  • /etc/lvm 中 lvm 配置的备份。(我实际上已经备份了,但没有意识到这一点)

相关内容