linux下MBR分区表修复/恢复

2020-06-10 19:15:09 浏览数 (2)

linux 下 MBR 方式分区后分区表损坏/误删的修复/恢复:

主引导记录(Master Boot Record,MBR),位于一个硬盘的0柱面、0盘面、1扇区,共512字节。具体划分依次为:引导代码区440字节、磁盘签名4字节、空白(Ox0000)2字节、MBR分区表(Disk Partition Table,DPT)64字节、结束标志(Ox55AA)2字节,所以磁盘的前512个字节存储的内容是 MBR主引导记录和分区表

注意:涉及数据的敏感操作一定一定做好备份,然后再尝试做文件系统修复、恢复等操作,出问题可以回滚到操作前的状态,备份精神,备份精神,备份精神

场景一:

磁盘整个空间分为一个分区使用(没有定义特殊的扇区起始位置)
1. 创建分区 > 挂载分区 > 写入数据
代码语言:javascript复制
root@BJ-CentOS7 ~ # fdisk -l /dev/vdb             
磁盘 /dev/vdb:10.7 GB, 10737418240 字节,20971520 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0x3785996d
   设备 Boot      Start         End      Blocks   Id  System
/dev/vdb1            2048    20971519    10484736   83  Linux
root@BJ-CentOS7 ~ # mount /dev/vdb1 /vdb1/
root@BJ-CentOS7 ~ # df -Th /dev/vdb1 
文件系统       类型  容量  已用  可用 已用% 挂载点
/dev/vdb1      ext4  9.8G   44M  9.2G    1% /vdb1
root@BJ-CentOS7 ~ # ll -h /vdb1/
总用量 7.1M
-rw------- 1 root root 1.7K 12月  7 22:48 1.key
-rw-r--r-- 1 root root   45 12月  7 16:24 1.sh
-rw-r--r-- 1 root root    5 12月  7 16:24 1.txt
-rw-r--r-- 1 root root 7.1M 12月 27 21:11 go2tencentcloud_x64
2. 模拟分区表损坏
代码语言:javascript复制
root@BJ-CentOS7 ~ # umount /dev/vdb1; dd if=/dev/zero of=/dev/vdb bs=512 count=1
记录了1 0 的读入
记录了1 0 的写出
512字节(512 B)已复制,0.000377549 秒,1.4 MB/秒
root@BJ-CentOS7 ~ # lsblk /dev/vdb 
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
vdb  253:16   0  10G  0 disk 
root@BJ-CentOS7 ~ # mount /dev/vdb /vdb1
mount: 文件系统类型错误、选项错误、/dev/vdb 上有坏超级块、
       缺少代码页或助手程序,或其他错误
       有些情况下在 syslog 中可以找到一些有用信息- 请尝试
       dmesg | tail  这样的命令看看。
3. 修复分区表
代码语言:javascript复制
root@BJ-CentOS7 ~ # fdisk /dev/vdb 
欢迎使用 fdisk (util-linux 2.23.2)。
更改将停留在内存中,直到您决定将更改写入磁盘。
使用写入命令前请三思。
命令(输入 m 获取帮助):n
Partition type:
   p   primary (0 primary, 0 extended, 4 free)
   e   extended
Select (default p): p
分区号 (1-4,默认 1):1
起始 扇区 (2048-20971519,默认为 2048):
将使用默认值 2048
Last 扇区,  扇区 or  size{K,M,G} (2048-20971519,默认为 20971519):
将使用默认值 20971519
分区 1 已设置为 Linux 类型,大小设为 10 GiB
命令(输入 m 获取帮助):p
磁盘 /dev/vdb:10.7 GB, 10737418240 字节,20971520 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0x41c882ec
   设备 Boot      Start         End      Blocks   Id  System
/dev/vdb1            2048    20971519    10484736   83  Linux
命令(输入 m 获取帮助):w
The partition table has been altered!
Calling ioctl() to re-read partition table.
正在同步磁盘。
4. 挂载验证
代码语言:javascript复制
root@BJ-CentOS7 ~ # mount /dev/vdb1 /vdb1; ll -h /vdb1/
总用量 7.1M
-rw------- 1 root root 1.7K 12月  7 22:48 1.key
-rw-r--r-- 1 root root   45 12月  7 16:24 1.sh
-rw-r--r-- 1 root root    5 12月  7 16:24 1.txt
-rw-r--r-- 1 root root 7.1M 12月 27 21:11 go2tencentcloud_x64

场景二:

磁盘空间分为多个分区使用
1. 创建2个分区 > 挂载分区 > 写入数据
代码语言:javascript复制
root@BJ-CentOS7 ~ # fdisk -l /dev/vdb 
磁盘 /dev/vdb:10.7 GB, 10737418240 字节,20971520 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0x41c882ec
   设备 Boot      Start         End      Blocks   Id  System
/dev/vdb1            2048    12584959     6291456   83  Linux
/dev/vdb2        12584960    20971519     4193280   83  Linux
root@BJ-CentOS7 ~ # lsblk /dev/vdb
NAME   MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
vdb    253:16   0  10G  0 disk 
├─vdb1 253:17   0   6G  0 part /vdb1
└─vdb2 253:18   0   4G  0 part /vdb2
root@BJ-CentOS7 ~ # ll -h /vdb1 /vdb2
/vdb1:
总用量 7.1M
drwx------ 2 root root  16K 12月 30 18:41 lost found
-rw-r--r-- 1 root root 7.1M 1月   1 17:23 o2tencentcloud_x64_1
-rw-r--r-- 1 root root    6 1月   1 17:24 test1
/vdb2:
总用量 7.1M
drwx------ 2 root root  16K 12月 30 18:41 lost found
-rw-r--r-- 1 root root 7.1M 1月   1 17:23 o2tencentcloud_x64_2
-rw-r--r-- 1 root root    6 1月   1 17:24 test2
2. 模拟分区表损坏

注:先备份一份分区表内容,损坏分区表后磁盘没有分区了,无法正常挂载使用

代码语言:javascript复制
root@BJ-CentOS7 ~ # dd if=/dev/vdb of=./vdbmbr.bak bs=512 count=1
记录了1 0 的读入
记录了1 0 的写出
512字节(512 B)已复制,0.000157049 秒,3.3 MB/秒
root@BJ-CentOS7 ~ # umount /dev/vdb1 /dev/vdb2; dd if=/dev/zero of=/dev/vdb bs=512 count=1
记录了1 0 的读入
记录了1 0 的写出
512字节(512 B)已复制,0.000431802 秒,1.2 MB/秒
root@BJ-CentOS7 ~ # lsblk /dev/vdb 
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
vdb  253:16   0  10G  0 disk 
3. 修复分区表

方法1: 使用之前备份的分区表还原恢复受损/不小心删除的分区表

代码语言:javascript复制
root@BJ-CentOS7 ~ # dd if=./vdbmbr.bak of=/dev/vdb bs=512 count=1
记录了1 0 的读入
记录了1 0 的写出
512字节(512 B)已复制,0.000423296 秒,1.2 MB/秒
root@BJ-CentOS7 ~ # lsblk /dev/vdb
NAME   MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
vdb    253:16   0  10G  0 disk 
├─vdb1 253:17   0   6G  0 part 
└─vdb2 253:18   0   4G  0 part 
root@BJ-CentOS7 ~ # mount /dev/vdb1 /vdb1; mount /dev/vdb2 /vdb2
root@BJ-CentOS7 ~ # df -hT | grep vdb
/dev/vdb1      ext4      5.8G   32M  5.5G    1% /vdb1
/dev/vdb2      ext4      3.9G   24M  3.7G    1% /vdb2
root@BJ-CentOS7 ~ # ll -h /vdb1 /vdb2
/vdb1:
总用量 7.1M
drwx------ 2 root root  16K 12月 30 18:41 lost found
-rw-r--r-- 1 root root 7.1M 1月   1 17:23 o2tencentcloud_x64_1
-rw-r--r-- 1 root root    6 1月   1 17:24 test1
/vdb2:
总用量 7.1M
drwx------ 2 root root  16K 12月 30 18:41 lost found
-rw-r--r-- 1 root root 7.1M 1月   1 17:23 o2tencentcloud_x64_2
-rw-r--r-- 1 root root    6 1月   1 17:24 test2

方法2: 重建分区表 ,前提是知道之前分区的扇区起始位置,可以重新分区时手动指定扇区起始位置,重建完分区验证挂载没问题,分区表损坏前存入的数据也存在 注意: 创建分区1、分区2时扇区起始位置需要指定为和原来分区一致

代码语言:javascript复制
root@BJ-CentOS7 ~ # fdisk /dev/vdb 
欢迎使用 fdisk (util-linux 2.23.2)。
更改将停留在内存中,直到您决定将更改写入磁盘。
使用写入命令前请三思。
命令(输入 m 获取帮助):n
Partition type:
   p   primary (0 primary, 0 extended, 4 free)
   e   extended
Select (default p): p
分区号 (1-4,默认 1):1
起始 扇区 (2048-20971519,默认为 2048):
将使用默认值 2048
Last 扇区,  扇区 or  size{K,M,G} (2048-20971519,默认为 20971519):12584959
分区 1 已设置为 Linux 类型,大小设为 6 GiB
命令(输入 m 获取帮助):n
Partition type:
   p   primary (1 primary, 0 extended, 3 free)
   e   extended
Select (default p): p
分区号 (2-4,默认 2):2
起始 扇区 (12584960-20971519,默认为 12584960):
将使用默认值 12584960
Last 扇区,  扇区 or  size{K,M,G} (12584960-20971519,默认为 20971519):20971519
分区 2 已设置为 Linux 类型,大小设为 4 GiB
命令(输入 m 获取帮助):p
磁盘 /dev/vdb:10.7 GB, 10737418240 字节,20971520 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0x16e5f126
   设备 Boot      Start         End      Blocks   Id  System
/dev/vdb1            2048    12584959     6291456   83  Linux
/dev/vdb2        12584960    20971519     4193280   83  Linux
命令(输入 m 获取帮助):w
The partition table has been altered!
Calling ioctl() to re-read partition table.
正在同步磁盘。
root@BJ-CentOS7 ~ # mount /dev/vdb1 /vdb1; mount /dev/vdb2 /vdb2
root@BJ-CentOS7 ~ # df -hT | grep vdb
/dev/vdb1      ext4      5.8G   32M  5.5G    1% /vdb1
/dev/vdb2      ext4      3.9G   24M  3.7G    1% /vdb2
root@BJ-CentOS7 ~ # ll -h /vdb1 /vdb2
/vdb1:
总用量 7.1M
drwx------ 2 root root  16K 12月 30 18:41 lost found
-rw-r--r-- 1 root root 7.1M 1月   1 17:23 o2tencentcloud_x64_1
-rw-r--r-- 1 root root    6 1月   1 17:24 test1
/vdb2:
总用量 7.1M
drwx------ 2 root root  16K 12月 30 18:41 lost found
-rw-r--r-- 1 root root 7.1M 1月   1 17:23 o2tencentcloud_x64_2
-rw-r--r-- 1 root root    6 1月   1 17:24 test2

0 人点赞