我已经通过单击“设备->创建分区表...然后应用”使用 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
有可能恢复分区表,但需要满足两个条件:
- 您尚未重新启动机器。
- 更换表时该驱动器正在使用中。
其工作原理是内核将分区布局保留在内存中。如果一个分区正在使用,它需要知道该分区从哪里开始,因此它将拒绝重新加载新表,直到它不再使用。
这个怎么做:
去/sys/block/sda
。在其中您将看到每个分区的目录(sda1
、sda2
等)。其中每个文件内都有一个名为start
and的文件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 重置这些尺寸,但我认为您不走运。