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

Mus*_*afa 7 data-recovery ntfs 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
Run Code Online (Sandbox Code Playgroud)

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

phe*_*mer 7

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

  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
/dev/sdc2 on /mnt/tmp type xfs (rw)
#猫/mnt/tmp/world
你好

擦除分区表

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

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


命令(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 device@ events_poll_msecs power/ ro slaves/
bdi@discard_alignment ext_range 队列/sdc1/stat
能力事件持有者/范围 sdc2/子系统@
dev events_async 飞行中可移动大小 uevent

# cat sdc1/start
2048

# cat sdc1/大小
2097152

# cat sdc2/start
2099200

# 猫 sdc2/大小
13539328

恢复分区表

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

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


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

命令(m 寻求帮助):n
分区类型:
   p 主要(1 个主要,0 个扩展,3 个免费)
   e 扩展
选择(默认 p):p
分区编号(1-4,默认 2):2
第一扇区(2099200-15638527,默认2099200):2099200
最后一个扇区,+扇区或 +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/

# partprobe /dev/sdc

# 挂载 /dev/sdc2 /mnt/tmp

#猫/mnt/tmp/world 
你好


小智 4

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