我已经使用 gparted 擦除了分区表,有办法恢复我的分区吗?

我已经使用 gparted 擦除了分区表,有办法恢复我的分区吗?

我已经通过单击“设备->创建分区表...然后应用”使用 gparted 擦除了我的 NTFS (windows) 分区表,有没有办法恢复我的 NTFS 分区?

我尝试使用此命令gpart /dev/sda 得到以下输出:

Begin scan...
End scan.

Checking partitions...
Ok.

Guessed primary partition table:
Primary partition(1)
type: 000(0x00)(unused)
size: 0mb #s(0) s(0-0)
chs:  (0/0/0)-(0/0/0)d (0/0/0)-(0/0/0)r

Primary partition(2)
type: 000(0x00)(unused)
size: 0mb #s(0) s(0-0)
chs:  (0/0/0)-(0/0/0)d (0/0/0)-(0/0/0)r

Primary partition(3)
type: 000(0x00)(unused)
size: 0mb #s(0) s(0-0)
chs:  (0/0/0)-(0/0/0)d (0/0/0)-(0/0/0)r

Primary partition(4)
type: 000(0x00)(unused)
size: 0mb #s(0) s(0-0)
chs:  (0/0/0)-(0/0/0)d (0/0/0)-(0/0/0)r

这个输出是什么意思?我有办法恢复吗?

答案1

有可能恢复分区表,但需要满足两个条件:

  1. 您尚未重新启动机器。
  2. 更换表时该驱动器正在使用中。

其工作原理是内核将分区布局保留在内存中。如果一个分区正在使用,它需要知道该分区从哪里开始,因此它将拒绝重新加载新表,直到它不再使用。

这个怎么做:

/sys/block/sda。在其中您将看到每个分区的目录(sda1sda2等)。其中每个文件内都有一个名为startand的文件size(so /sys/block/sda/sda1/start)。如果您使用这些完全相同的起始位置和大小重新创建分区表,那就没问题了。

请注意,它不保留分区类型。 Linux 不关心这些信息。因此,重新创建后,您必须记住分区类型设置为什么(NTFS 或其他)。


例子

原盘:

# fdisk -l /dev/sdc

磁盘 /dev/sdc:8006 MB,8006926336 字节,15638528 个扇区
单位 = 1 * 512 = 512 字节的扇区
扇区大小(逻辑/物理):512 字节/512 字节
I/O 大小(最小/最佳):512 字节/512 字节
磁盘标识符:0x000ce29c

   设备引导开始结束块 ID 系统
/dev/sdc1 2048 2099199 1048576 83 Linux
/dev/sdc2 2099200 15638527 6769664 83 Linux
# 挂载 | grep sdc
/mnt/tmp 上的 /dev/sdc2 类型 xfs (rw)
# 猫 /mnt/tmp/world
你好

擦除分区表

# fdisk /dev/sdc
欢迎使用 fdisk (util-linux 2.22.2)。

更改将仅保留在内存中,直到您决定写入它们。
使用写入命令之前请务必小心。


命令(m 寻求帮助):d
分区数量(1-4):1
分区 1 已删除

命令(m 寻求帮助):d
选定分区 2
分区2被删除

命令(m 寻求帮助):p

磁盘 /dev/sdc:8006 MB,8006926336 字节,15638528 个扇区
单位 = 1 * 512 = 512 字节的扇区
扇区大小(逻辑/物理):512 字节/512 字节
I/O 大小(最小/最佳):512 字节/512 字节
磁盘标识符:0x000ce29c

   设备引导开始结束块 ID 系统

命令(m 寻求帮助):w
分区表已被更改!

调用ioctl()重新读取分区表。

警告:重新读取分区表失败,错误为 16:设备或资源繁忙。
内核仍然使用旧表。新表将用于
下次重新启动或运行partprobe(8) 或kpartx(8) 后
同步磁盘。

请注意,它仍然已安装并且可以访问:

# 猫 /mnt/tmp/world
你好

获取偏移量

# cd /sys/class/block/sdc

# ls
alignment_offset 设备@ events_poll_msecs 功率/ ro 从机/
bdi@discard_alignment ext_range 队列/ sdc1/ stat
能力事件持有者/范围 sdc2/subsystem@
dev events_async inflight 可移动大小 uevent

# 猫 sdc1/启动
2048

# 猫 sdc1/尺寸
2097152

# 猫 sdc2/启动
2099200

# 猫 sdc2/尺寸
13539328

恢复分区表

# fdisk /dev/sdc
欢迎使用 fdisk (util-linux 2.22.2)。

更改将仅保留在内存中,直到您决定写入它们。
使用写入命令之前请务必小心。


命令(m 寻求帮助):n
分区类型:
   p 主要(0 个主要、0 个扩展、4 个空闲)
   扩展
选择(默认p):p
分区数量(1-4,默认1):1
第一扇区(2048-15638527,默认2048):2048
最后一个扇区,+sectors 或 +size{K,M,G}(2048-15638527,默认 15638527):+2097151
设置 Linux 类型且大小为 1 GiB 的分区 1

命令(m 寻求帮助):n
分区类型:
   p 主要(1 个主要、0 个扩展、3 个免费)
   扩展
选择(默认p):p
分区数量(1-4,默认2):2
第一扇区(2099200-15638527,默认2099200):2099200
最后一个扇区,+sectors 或 +size{K,M,G}(2099200-15638527,默认 15638527):+13539327
设置 Linux 类型且大小为 6.5 GiB 的分区 2

命令(m 寻求帮助):p

磁盘 /dev/sdc:8006 MB,8006926336 字节,15638528 个扇区
单位 = 1 * 512 = 512 字节的扇区
扇区大小(逻辑/物理):512 字节/512 字节
I/O 大小(最小/最佳):512 字节/512 字节
磁盘标识符:0x000ce29c

   设备引导开始结束块 ID 系统
/dev/sdc1 2048 2099199 1048576 83 Linux
/dev/sdc2 2099200 15638527 6769664 83 Linux

命令(m 寻求帮助):w
分区表已被更改!

调用ioctl()重新读取分区表。

警告:重新读取分区表失败,错误为 16:设备或资源繁忙。
内核仍然使用旧表。新表将用于
下次重新启动或运行partprobe(8) 或kpartx(8) 后
同步磁盘。

!!请注意,在指定最后一个扇区时,我们使用大小 - 1。!!

确认

让我们卸载驱动器,运行partprobe告诉内核获取新表,然后重新安装并验证我们仍然可以访问我们的文件。

#卸载/mnt/tmp/

# 部分探针/dev/sdc

# 挂载 /dev/sdc2 /mnt/tmp

# 猫 /mnt/tmp/world
你好

答案2

您可以尝试使用测试盘来恢复分区表。 Testdisk 将读取磁盘表面并尝试确定分区的开始和结束位置。

答案3

parted有一个救援命令,如果您知道文件系统的大致位置,则可以嗅探文件系统的开始位置和长度。

答案4

如果您碰巧知道 NTFS 磁盘的尺寸,您“可能”能够使用 fdisk 或 parted 重置这些尺寸,但我认为您不走运。

相关内容