修复 ext4 整个设备文件系统和损坏的 GPT 分区表

修复 ext4 整个设备文件系统和损坏的 GPT 分区表

我有一个与这里的问题非常相似的问题:

https://askubuntu.com/questions/1370421/restore-ext4-hd-after-creating-gpt-partition-table

我的问题似乎是我有一个 ext4 文件系统,它直接位于块设备上,并且将 Windows 安装到完全不同的驱动器决定弄乱该设备的分区表(或者,看起来,它是缺少分区表)。

当我启动时,该驱动器有一个 GPT 分区表,如下所示:

λ  sudo fdisk -l /dev/nvme1n1
Disk /dev/nvme1n1: 931.51 GiB, 1000204886016 bytes, 1953525168 sectors
Disk model: Samsung SSD 970 EVO 1TB
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: 73405727-65E8-485F-99F8-C2D65E99D767

Device         Start        End    Sectors   Size Type
/dev/nvme1n1p1  2048 1953525127 1953523080 931.5G Linux filesystem

但该分区无法安装,并且文件系统似乎无效。然而,我可以通过运行来取回所有数据fsck.ext4 /dev/nvme1n1- 但似乎因为这是整个设备而不是分区,这样做会炸毁 GPT 表:

λ  sudo fdisk -l /dev/nvme1n1
The primary GPT table is corrupt, but the backup appears OK, so that will be used.
...

我可以用 重写该表gdisk,但随后我又回到了损坏的文件系统。我可以像这样来回切换,但我不知道如何做我真正想要的事情:创建一个有效的 GPT 分区表并将我现有的文件系统恢复到它上面。

我尝试过传递显式超级块,但没有好的结果:

λ  sudo fsck.ext4 -p -b 32765 -B 4096 /dev/nvme1n1p1
fsck.ext4: Bad magic number in super-block while trying to open /dev/nvme1n1p1

答案1

这是不可能的(那样)。

您不能在同一个块设备上拥有分区表和文件系统。

当您在 /dev/nvme1n1 上创建分区时,它会为您提供一个新的块设备 /dev/nvme1n1p1 — 您必须为文件系统使用新的块设备。

这意味着将所有数据移动分区偏移量。将文件系统数据保留在旧的偏移量是行不通的。 fsck 不会为你解决这个问题。所以它无法完成(按照你试图做的方式)。

所以你的选择是:

  • 继续按原样使用裸驱动器并完全删除 msdos/gpt 分区表头(wipefs仅用于删除 msdos/gpt 分区头)

  • 将文件系统缩小 2MiB,然后将其移动 1MiB(或任何分区偏移量)。为了在驱动器的开始和结束处为 GPT 标头腾出空间,需要缩小。

  • 备份所有文件,使用新分区和文件系统从头开始正确设置,然后将文件恢复到其中

我推荐最后一个选项。虽然转移数据偏移量在理论上是可以完成的(并且像 gparted 这样的工具可能会帮助您),但这样做实际上风险很大,当出现任何问题时,您的设备将无法使用,并且没有简单的修复方法。

直接使用裸驱动器在理论上是可能的,但在实践中,您会遇到这种情况,即其他东西“帮助”为您创建分区表,从而在此过程中损坏您的数据。

因此,拥有分区表不是可选的;这是强制性的。

相关内容