重新启动后 LVM 没有出现,找不到带有 uuid 的设备

Smu*_*dge 5 lvm data-recovery hard-disk

有一个虚拟机,直到最近都没有问题,但在一些配置更改后需要重新启动。但是,重新启动后,VM 没有恢复,说它找不到根设备(它是 /dev/mapper 下的 LVM 卷)。

启动到恢复模式,我看到 /dev/mapper 和 /dev/dm-* 下的文件系统确实不存在。

文件系统应该用

  • /dev/sda1 作为引导分区
  • /dev/sda2 扩展分区包含
  • /dev/sda5/dev/sda6作为 LVM 分区
  • /dev/sda{5,6} 是单个 VG 中的两个 PV
  • 有 2 个 LV 用于根 FS 和交换

做一个lvm pvshow给我:

  Couldn't find device with uuid '8x38hf-mzd7-xTes-y6IV-xRMr-qrNP-0dNnLi'.
  Couldn't find device with uuid '8x38hf-mzd7-xTes-y6IV-xRMr-qrNP-0dNnLi'.
  Couldn't find device with uuid '8x38hf-mzd7-xTes-y6IV-xRMr-qrNP-0dNnLi'.
  --- Physical volume ---
  PV Name               unknown device
  VG Name               of1-server-lucid
  PV Size               19.76 GiB / not usable 2.00 MiB
  Allocatable           yes (but full)
  PE Size               4.00 MiB
  Total PE              5058
  Free PE               0
  Allocated PE          5058
  PV UUID               8x38hf-mzd7-xTes-y6IV-xRMr-qrNP-0dNnLi

  --- Physical volume ---
  PV Name               /dev/sda6
  VG Name               of1-server-lucid
  PV Size               100.00 GiB / not usable 2.66 MiB
  Allocatable           yes (but full)
  PE Size               4.00 MiB
  Total PE              25599
  Free PE               0
  Allocated PE          25599
  PV UUID               cuhP6R-QbiO-U7ye-WvXN-ZNq5-cqUs-VVZpux
Run Code Online (Sandbox Code Playgroud)

所以看起来好像/dev/sda5没有被列为 PV 并导致错误。

fdisk -l

Disk /dev/sda: 128.8 GB, 128849018880 bytes
255 heads, 63 sectors/track, 15665 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: 0x00044a6c

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *           1          32      248832   83  Linux
Partition 1 does not end on cylinder boundary.
/dev/sda2              32       15665   125579256+   5  Extended
/dev/sda5              32        2611    20722970   8e  Linux LVM
/dev/sda6            2612       15665   104856223+  8e  Linux LVM
Run Code Online (Sandbox Code Playgroud)

所以我可以看到/dev/sda5设备存在,但blkid没有报告任何内容:

~ # blkid
/dev/sda1: UUID="d997d281-2909-41d3-a835-dba400e7ceec" TYPE="ext2" 
/dev/sda6: UUID="cuhP6R-QbiO-U7ye-WvXN-ZNq5-cqUs-VVZpux" TYPE="LVM2_member" 
Run Code Online (Sandbox Code Playgroud)

拍摄磁盘快照后,我尝试从存档配置中恢复 PV:

~ # pvremove -ff /dev/sda5
Labels on physical volume "/dev/sda5" successfully wiped
~ # pvcreate --uuid=8x38hf-mzd7-xTes-y6IV-xRMr-qrNP-0dNnLi /dev/sda5 --restorefile=/etc/lvm/archive/of1-dev-server_00000.vg
Couldn't find device with uuid '8x38hf-mzd7-xTes-y6IV-xRMr-qrNP-0dNnLi'.
  Physical volume "/dev/sda5" successfully created
~ # vgchange -a y
2 logical volume(s) in volume group "of1-dev-server" now active"
Run Code Online (Sandbox Code Playgroud)

所以至少现在设备有一个blkid

/dev/sda1: UUID="d997d281-2909-41d3-a835-dba400e7ceec" TYPE="ext2" 
/dev/sda6: UUID="cuhP6R-QbiO-U7ye-WvXN-ZNq5-cqUs-VVZpux" TYPE="LVM2_member" 
/dev/sda5: UUID="8x38hf-mzd7-xTes-y6IV-xRMr-qrNP-0dNnLi" TYPE="LVM2_member" 
Run Code Online (Sandbox Code Playgroud)

做一个pvdisplaynow 也会显示正确的设备:

  --- Physical volume ---
  PV Name               /dev/sda5
  VG Name               of1-dev-danr-lucid
  PV Size               19.76 GiB / not usable 2.00 MiB
  Allocatable           yes (but full)
  PE Size               4.00 MiB
  Total PE              5058
  Free PE               0
  Allocated PE          5058
  PV UUID               8x38hf-mzd7-xTes-y6IV-xRMr-qrNP-0dNnLi

  --- Physical volume ---
  PV Name               /dev/sda6
  VG Name               of1-dev-danr-lucid
  PV Size               100.00 GiB / not usable 2.66 MiB
  Allocatable           yes (but full)
  PE Size               4.00 MiB
  Total PE              25599
  Free PE               0
  Allocated PE          25599
  PV UUID               cuhP6R-QbiO-U7ye-WvXN-ZNq5-cqUs-VVZpux
Run Code Online (Sandbox Code Playgroud)

并且存在映射器设备:

crw-rw----    1 root     root      10,  59 Jul 10 10:47 control
brw-rw----    1 root     root     252,   0 Jul 10 11:21 of1--dev--server-root
brw-rw----    1 root     root     252,   1 Jul 10 11:21 of1--dev--server-swap_1
Run Code Online (Sandbox Code Playgroud)

此外,LVM 似乎已正确列出:

~ # lvdisplay
  --- Logical volume ---
  LV Name                /dev/of1-dev-danr-lucid/root
  VG Name                of1-dev-danr-lucid
  LV UUID                pioKjE-iJEp-Uf9S-0MxQ-UR0H-cG9m-5mLJm7
  LV Write Access        read/write
  LV Status              available
  # open                 0
  LV Size                118.89 GiB
  Current LE             30435
  Segments               2
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     256
  Block device           252:0

  --- Logical volume ---
  LV Name                /dev/of1-dev-danr-lucid/swap_1
  VG Name                of1-dev-danr-lucid
  LV UUID                mIq22L-RHi4-tudV-G6nP-T1e6-UQcS-B9hYUF
  LV Write Access        read/write
  LV Status              available
  # open                 0
  LV Size                888.00 MiB
  Current LE             222
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     256
  Block device           252:1
Run Code Online (Sandbox Code Playgroud)

但是尝试挂载根设备给了我一个错误:

~ # mount /dev/mapper/of1--dev--server-root /mnt2
mount: mounting /dev/mapper/of1--dev--server-root on /mnt2 failed: Invalid argument
Run Code Online (Sandbox Code Playgroud)

所以我尝试了磁盘一致性检查:

~ # fsck.ext4 -f /dev/mapper/of1--dev--server-root
e2fsck: Superblock invalid, trying backup blocks...
e2fsck: Bad magic number in super-block while trying to open /dev/mapper/of1--dev--server-root
[...]
Run Code Online (Sandbox Code Playgroud)

所以我尝试了另一个超级块:

~ # mke2fs -n /dev/mapper/of1--dev--server-root
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
7798784 inodes, 31165440 blocks
1558272 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=4294967296
952 block groups
32768 blocks per group, 32768 fragments per group
8192 inodes per group
Superblock backups stored on blocks: 
        32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208, 
        4096000, 7962624, 11239424, 20480000, 23887872
~ # fsck.ext4 -y -b 23887872 /dev/mapper/of1--dev--server-root
Run Code Online (Sandbox Code Playgroud)

我收到了大量可笑的错误,我看到的主要错误是:

  • Superblock 有一个无效的日志
  • 一个或多个块组描述符校验和无效。
  • 截断孤立的 inode ()
  • 已清除块 #0 () 在孤立的 inode 中找到
  • /dev/mapper/of1--dev--server-root 包含有错误的文件系统,强制检查
  • 调整 inode 大小无效。重新创建
  • 根 inode 不是目录。
  • 保留的 inode 3() 有无效模式
  • HTREE 目录 inode 具有无效的根节点
  • inode , i_blocks 是,应该是 0。
  • 未连接的目录 inode

很多消息后,它说它完成了。如上所述挂载目录工作正常,但该目录是空的,lost+found目录中充满了文件,大多数只是数字,有些文件名与曾经存在的文件模糊相关。

那么,如何让虚拟机恢复正常?

每当我看到磁盘错误时,我的第一反应就是进行快照,这样事情就不会变得更糟,所以当我第一次看到错误时,我会在重新启动后获得快照。

我知道数据在某处,因为虚拟机在我重新启动之前没有问题地工作。用户不记得最近更改了文件系统上的任何内容,但是当我重新启动它时,它有将近一年的正常运行时间,因此从那时起可能会发生各种情况。

不幸的是,我们也没有备份,因为 Puppet 在这个节点上被禁用了。

最初的操作系统是 Ubuntu Lucid,在 VMWare 上运行。

Val*_*das 1

如果我理解正确,您已经修复了卷,即使您的lost+found目录可能包含也可能不包含关键文件。

现在发生了什么阻止虚拟机启动?还是找不到启动设备?

你的fdisk -l输出对我来说似乎有点不对劲。有没有考虑过只有分区表损坏的可能性?在这种情况下,您的快照可能会有所帮助,并且在最好的情况下您甚至不需要(另一个)fsck。但我们需要一些东西来尝试找到分区偏移量 - 我已经多次成功使用testdisk 。

在最坏的情况下,如果您需要从卷中删除任何内容,PhotoRecAutopsy/The Sleuth Kit等取证工具可能会很有用。

如果这些都不起作用,请lsblk -o NAME,RM,SIZE,RO,TYPE,MAJ:MIN -fat也给我们一个(这些标志只是为了显示尽可能多的信息)以及相关dmesg输出(如果有)。