我有一个与这里的问题非常相似的问题:
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 这样的工具可能会帮助您),但这样做实际上风险很大,当出现任何问题时,您的设备将无法使用,并且没有简单的修复方法。
直接使用裸驱动器在理论上是可能的,但在实践中,您会遇到这种情况,即其他东西“帮助”为您创建分区表,从而在此过程中损坏您的数据。
因此,拥有分区表不是可选的;这是强制性的。