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