服务器崩了!GPT分区表损坏,我用这8步30分钟救回整个系统

admin 2026-06-30 06:53:56 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

文章总结: 本文详细介绍了欧拉系统硬盘故障的完整恢复流程,重点针对GPT分区表损坏场景提供8步30分钟快速恢复方案。关键内容包括故障诊断方法、TestDisk和gdisk工具使用技巧、文件系统修复步骤以及GRUB引导修复,最后给出预防措施建议。文章提供具体的命令行操作示例,具有较强实战指导价值。 综合评分: 85 文章分类: 应急响应,解决方案,安全工具,数据安全,系统安全


cover_image

服务器崩了!GPT分区表损坏,我用这8步30分钟救回整个系统

原创

刘军军 刘军军

运维星火燎原

2026年6月30日 00:13 山西

在小说阅读器读本章

去阅读

硬核运维实战:欧拉系统硬盘故障完整恢复流程

  1. 故障概述
  2. 硬盘故障类型分类
  3. 故障诊断方法
  4. 分区表损坏恢复流程
  5. 文件系统损坏恢复
  6. GRUB引导修复
  7. 完整恢复案例
  8. 预防措施

1. 故障概述

1.1 典型故障场景

硬盘故障是服务器运维中最常见的硬件问题之一,可能导致:

  • 系统无法启动
  • 数据丢失
  • 服务中断

1.2 故障表现

| 启动阶段 | 典型错误信息 | 故障可能性 | | — | — | — | | BIOS/UEFI | “No bootable device found” | 硬盘未识别/完全损坏 | | GRUB | “error: unknown filesystem” | 分区表/GPT损坏 | | GRUB | “grub rescue>” | GRUB损坏 | | 内核加载 | “VFS: Cannot open root device” | 根分区无法挂载 | | 系统启动 | “dependency failed for /sys” | 文件系统挂载失败 |

1.3 恢复前准备

必备工具:

  • 欧拉/CentOS Live镜像U盘
  • 另一台正常工作的服务器(可选,用于远程协助)
  • 硬盘健康检测工具

操作原则:

  1. 先备份后修复
  2. 优先恢复数据
  3. 保持冷静,按步骤操作

2. 硬盘故障类型分类

2.1 故障类型一览

| 故障类型 | 严重程度 | 数据可恢复性 | 修复难度 | | — | — | — | — | | 硬盘掉线/掉盘 | 高 | 高 | 简单(重新插线) | | 分区表损坏 | 高 | 中高 | 中等 | | 坏道 | 中 | 中 | 中等 | | 超级块损坏 | 中 | 高 | 简单 | | 文件系统损坏 | 中 | 高 | 简单-复杂 | | 硬盘物理损坏 | 极高 | 低-中 | 困难 |

2.2 分区表类型

| 类型 | 最大分区数 | 备份位置 | 恢复难度 | | — | — | — | — | | MBR | 4个主分区 | 仅磁盘开头 | 简单 | | GPT | 128个分区 | 开头+结尾 | 中等(双重备份) |


3. 故障诊断方法

3.1 通过Live CD启动

 # 制作启动U盘
 dd if=openEuler-xx-x86_64-dvd.iso of=/dev/sdX bs=4M status=progress

 # 从U盘启动,选择 "Troubleshooting" -> "Rescue a CentOS system"

3.2 硬盘识别诊断

 # 查看所有硬盘设备
 lsblk

 # 输出示例:
 # NAME            MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
 # sda               8:0    0 500G  0 disk
 # ├─sda1            8:1    0   1G  0 part
 # └─sda2            8:2    0 499G  0 part
 #   ├─centos-root 253:0    0  50G  0 lvm
 #   ├─centos-swap 253:1    0   8G  0 lvm
 #   └─centos-home 253:2    0 441G  0 lvm

 # 查看详细分区信息
 fdisk -l /dev/sda

 # 查看内核日志中的硬盘错误
 dmesg | grep -i "error\|fail\|sda\|disk"

3.3 SMART健康检测

 # 安装 smartmontools
 yum install smartmontools

 # 检查硬盘SMART状态
 smartctl -a /dev/sda

 # 关键指标:
 # - Reallocated_Sector_Ct (>0 表示有坏道)
 # - Current_Pending_Sector (>0 表示有未修复扇区)
 # - Offline_Uncorrectable (>0 表示有无法纠正的错误)

 # 快速健康检查
 smartctl -H /dev/sda
 # 输出 PASSED 表示健康,FAILED 表示即将损坏

3.4 硬盘读写测试

 # 读取测试(不破坏数据)
 badblocks -sv /dev/sda

 # 写入测试(会破坏数据,仅在确认无重要数据时使用)
 badblocks -wsv /dev/sda

4. 分区表损坏恢复流程

4.1 GPT分区表结构

GPT分区表特点:

  • 主GPT头:位于LBA 1(512字节)
  • 分区表:位于LBA 2-33
  • 备份GPT头:位于磁盘最后一个扇区
  • 备份分区表:位于备份GPT头之前
 +------------------+
 | Protective MBR   |  LBA 0
 +------------------+
 | Primary GPT Header | LBA 1
 +------------------+
 | Partition Table    | LBA 2-33
 +------------------+
 |                    |
 |    Data Area       |
 |                    |
 +------------------+
 | Backup Partition   | LBA -33 to -2
 | Table              |
 +------------------+
 | Backup GPT Header  | Last LBA
 +------------------+

4.2 使用 TestDisk 恢复(推荐)

TestDisk 支持 MBR、GPT、EFI 等多种分区表类型,是恢复分区表的首选工具。

4.2.1 安装 TestDisk

 # 在Live环境中安装
 yum install testdisk      # CentOS/RHEL/欧拉
 apt install testdisk      # Debian/Ubuntu

4.2.2 TestDisk 恢复步骤

 # 启动 testdisk
 testdisk

 # 交互式操作流程:

 # Step 1: 选择硬盘
 Select a media (use Arrow keys)
 >[Proceed ] /dev/sda
 [Proceed ] /dev/sdb

 # Step 2: 选择分区表类型
  Select partition table type:
>[Intel  ] MBR (MSDos, Windows)
 [EFI GPT] EFI GPT partition
[None   ] Empty
# 选择 [EFI GPT](欧拉系统使用GPT)

 # Step 3: 选择操作

 [Analyse ] Analyse current
 partition structure
[Advanced] Filesystem utils
[Geometry ] Change disk geometry
[Options  ] Modify options
 [MBR Code ] Write TestDisk MBR
 to first sector
[Delete   ] Delete all data
 # Step 4: 分析当前分区
 # 按 [Proceed] 开始分析

 # Step 5: 搜索丢失的分区

 [Search ] Search!
[Stop  ] Stop

 # 选择 [Search] 深度搜索

 # Step 6: 找到分区后确认

HPFS - NTFS        0  0  2  4096
Linux swap         0  0  3 16384
 Linux LVM          0  0  4  XXX

 # 按 [Enter] 确认每个分区

 # Step 7: 写入恢复

[Write ] Write recovered data
 to partition table
  # 选择 [Write] 保存

4.3 使用 gdisk 手动恢复

当 TestDisk 无法自动恢复时,使用 gdisk 手动重建。

4.3.1 gdisk 基本命令

 # 查看GPT分区表
 gdisk -l /dev/sda

 # 进入交互式编辑
 gdisk /dev/sda

 # 常用子命令:
 # ?    - 显示帮助
 # p    - 显示当前分区表
 # o    - 创建新的空GPT分区表
 # d    - 删除分区
 # n    - 创建新分区
 # t    - 更改分区类型
 # w    - 保存并退出
 # q    - 不保存退出
 # i    - 显示分区详情
 # b    - 备份GPT数据到文件
 # c    - 更改分区名称

4.3.2 常见欧拉系统分区布局

标准分区布局(Legacy):

 /dev/sda1  1GB      ext4/xfs    /boot
 /dev/sda2  剩余     LVM
   ├─centos-root   50G   /
   ├─centos-swap   8G    swap
   └─centos-home   剩余  /home

UEFI分区布局(推荐):

 /dev/sda1  512MB     vfat        /boot/efi    (EFI System Partition, EF00)
 /dev/sda2  剩余      LVM
   ├─centos-root   50G   /
   ├─centos-swap   8G    swap
   └─centos-home   剩余  /home

4.3.3 手动重建GPT分区

 # 启动 gdisk
 gdisk /dev/sda

 # 按 o 创建新的空GPT分区表(谨慎!这会清空现有分区)
 Command (? for help): o

 # 按 n 创建第一个分区(EFI分区)
 Command (? for help): n
 Partition number (1-128, default 1): 1
 First sector (34-XXXXXXXX, default = XXXXXXXX) or {+-}size{KMGTP}: [Enter]
 Last sector, {+-}size{KMGTP} (34-XXXXXXXX, default = XXXXXXXX): +512M
 Current type is 'Linux filesystem'
 Hex code or GUID (L to show codes, Enter =8300): EF00
 Changed system type of partition to 'EFI System'

 # 按 n 创建第二个分区(LVM分区)
 Command (? for help): n
 Partition number (2-128, default 2): 2
 First sector (XXXX-XXXXXXXX, default = XXXXXXXX) or {+-}size{KMGTP}: [Enter]
 Last sector, {+-}size{KMGTP} (XXXX-XXXXXXXX, default = XXXXXXXX): [Enter]
 Current type is 'Linux filesystem'
 Hex code or GUID (L to show codes, Enter =8300): 8E00
 Changed system type of partition to 'Linux LVM'

 # 按 w 保存
 Command (? for help): w

 Final checks complete. About to write GPT data.
 THIS WILL OVERWRITE EXISTING
 PARTITIONS AND THEIR SIGNATURES!
 Are you sure? (Y/N): Y
 OK; writing new GUID partition table (GPT) to /dev/sda.
 The operation has completed successfully.

4.4 备份和恢复GPT分区表

 # 备份GPT分区表(重要!恢复时用)
 sgdisk --backup=/tmp/gpt_backup.bin /dev/sda

 # 备份为可读文本格式
 sgdisk --print=/tmp/gpt_partitions.txt /dev/sda

 # 从备份恢复
 sgdisk --load-backup=/tmp/gpt_backup.bin /dev/sda

 # 复制分区表到另一块硬盘
 sgdisk --replicate=/dev/sdb /dev/sda

5. 文件系统损坏恢复

5.1 检查文件系统

 # 检查 ext4 文件系统
 fsck.ext4 -n /dev/sda1   # -n 表示只读检查,不修复
 fsck.ext4 -n /dev/sda2

 # 检查 xfs 文件系统
 xfs_check /dev/sda1
 xfs_repair -n /dev/sda1   # -n 表示只检查不修复

 # 检查 LVM 中的文件系统
 lvscan
 fsck.ext4 -n /dev/mapper/centos-root

5.2 修复文件系统

警告:修复前最好先备份数据!

 # 卸载要修复的分区
 umount /dev/sda1

 # 修复 ext4
 fsck.ext4 -p /dev/sda1   # 自动修复
 fsck.ext4 -y /dev/sda1   # 对所有问题自动回答 yes

 # 修复 xfs(xfs_repair 不能在挂载状态下运行)
 xfs_repair /dev/sda1

 # 修复有严重问题的文件系统
 fsck.ext4 -f-y /dev/sda1

5.3 超级块损坏修复

 # 查看超级块位置
 dumpe2fs /dev/sda1 | grep -i superblock

 # 输出示例:
 # Primary superblock at 0, Group descriptors at 1-3
 # Backup superblock at 32768, Group descriptors at 32769-32771
 # Backup superblock at 98304, Group descriptors at 98305-98307
 # Backup superblock at 163840, Group descriptors at 163841-163843
 # ...

 # 使用备份超级块修复
 umount /dev/sda1
 fsck.ext4 -b 32768 /dev/sda1

 # 或者自动查找并使用备份超级块
 fsck.ext4 -n -S /dev/sda1

6. GRUB引导修复

6.1 挂载原系统

 # 挂载根分区
 mount /dev/mapper/centos-root /mnt/sysimage

 # 挂载 boot 分区
 mount /dev/sda1 /mnt/sysimage/boot

 # 挂载 EFI 分区(UEFI启动)
 mount /dev/sda1 /mnt/sysimage/boot/efi

 # 挂载必要目录
 mount --bind /proc /mnt/sysimage/proc
 mount --bind /sys /mnt/sysimage/sys
 mount --bind /dev /mnt/sysimage/dev

 # chroot 进入原系统
 chroot /mnt/sysimage

6.2 修复GRUB for BIOS

 # 安装 GRUB2 到 MBR
 grub2 -install /dev/sda

 # 生成 GRUB 配置文件
 grub2 -mkconfig -o /boot/grub2/grub.cfg

 # 验证配置文件
 cat /boot/grub2/grub.cfg | grep menuentry

6.3 修复GRUB for UEFI

 # 安装 GRUB2 for UEFI
 grub2 -install --target=x86_64-efi --efi-directory=/boot/efi --bootloader-id=centos

 # 如果上述命令失败,尝试:
 grub2 -install --target=x86_64-efi --efi-directory=/boot/efi --bootloader-id=centos --recheck

 # 生成配置文件
 grub2 -mkconfig -o /boot/grub2/grub.cfg

 # 验证 EFI 启动目录
 ls -la /boot/efi/EFI/centos/
 # 应该看到 grubx64.efi 和 shimx64.efi

6.4 重建 initramfs

 # 查看当前内核版本
 uname -r

 # 重建 initramfs(如果initramfs损坏)
 dracut -f /boot/initramfs-$(uname -r).img $(uname -r)

 # 或指定版本
 dracut -f /boot/initramfs-3.10.0-1160.el7.x86_64.img 3.10.0-1160.el7.x86_64

6.5 退出并重启

 # 退出 chroot
 exit

 # 卸载挂载
 umount -R /mnt/sysimage

 # 重启
 reboot

7. 完整恢复案例

7.1 场景描述

故障现象:

  • 服务器突然断电后重启
  • 启动时显示 “error: unknown filesystem”
  • 进入 GRUB Rescue 模式

诊断结果:

  • 硬盘能被识别
  • GPT分区表损坏
  • 但文件系统完好

7.2 恢复步骤

 # Step 1: 从Live CD启动

 # Step 2: 安装必要工具
 yum install testdisk gdisk lvm2

 # Step 3: 使用 TestDisk 恢复分区表
 testdisk /dev/sda
 # 选择 /dev/sda
 # 选择 EFI GPT 分区表类型
 # 选择 Analyse
 # 选择 Search 搜索
 # 找到分区后选择 Write

 # Step 4: 重新激活 LVM
 vgchange -ay

 # Step 5: 检查文件系统
 fsck.ext4 -n /dev/sda1
 fsck.ext4 -n /dev/mapper/centos-root

 # Step 6: 挂载系统
 mount /dev/mapper/centos-root /mnt/sysimage
 mount /dev/sda1 /mnt/sysimage/boot
 mount /dev/sda1 /mnt/sysimage/boot/efi

 # Step 7: 挂载必要目录并 chroot
 mount --bind /proc /mnt/sysimage/proc
 mount --bind /sys /mnt/sysimage/sys
 mount --bind /dev /mnt/sysimage/dev
 chroot /mnt/sysimage

 # Step 8: 修复 GRUB
 grub2 -install --target=x86_64-efi --efi-directory=/boot/efi --bootloader-id=centos
 grub2 -mkconfig -o /boot/grub2/grub.cfg

 # Step 9: 退出并重启
 exit
 umount -R /mnt/sysimage
 reboot

7.3 恢复后验证

 # 重启后检查启动日志
 journalctl -b

 # 检查硬盘状态
 smartctl -a /dev/sda | grep-E"SMART|PASSED|FAILED"

 # 检查文件系统挂载
 df -h

 # 检查 LVM 状态
 lvs
 pvs
 vgs

8. 预防措施

8.1 定期备份

 # 备份分区表(定期执行)
 #!/bin/bash
 BACKUP_DIR="/backup"
 DATE=$(date +%Y%m%d)
 HOSTNAME=$(hostname)

 # 备份 GPT 分区表
 sgdisk --backup=$BACKUP_DIR/gpt_${HOSTNAME}_${DATE}.bin /dev/sda

 # 备份 MBR(如果有)
 dd if=/dev/sda of=$BACKUP_DIR/mbr_${HOSTNAME}_${DATE}.bin bs=512count=1

 # 备份 LVM 配置
 vgs --reportformat json > $BACKUP_DIR/lvm_vgs_${HOSTNAME}_${DATE}.json
 lvs --reportformat json > $BACKUP_DIR/lvm_lvs_${HOSTNAME}_${DATE}.json
 pvs --reportformat json > $BACKUP_DIR/lvm_pvs_${HOSTNAME}_${DATE}.json

 # 保留最近30天备份
 find$BACKUP_DIR-name"*.bin"-mtime+30-delete
 find$BACKUP_DIR-name"*.json"-mtime+30-delete

8.2 硬盘健康监控

 # 配置 smartd 开机自启
 systemctl enable smartd

 # 编辑配置文件
&nbsp;cat&nbsp;> /etc/smartd.conf << EOF
&nbsp;/dev/sda&nbsp;-a-I190-I194-W4,45,55&nbsp;-R5-s&nbsp;(S/../.././02|L/../../6/03)&nbsp;-m&nbsp;[email protected]
&nbsp;EOF

&nbsp;# 重启服务
&nbsp;systemctl&nbsp;restart&nbsp;smartd

&nbsp;# 手动检查
&nbsp;smartctl&nbsp;-H&nbsp;/dev/sda

8.3 UPS保护

确保服务器连接 UPS,防止意外断电导致:

  • 分区表损坏
  • 文件系统损坏
  • 数据丢失

8.4 定期巡检

&nbsp;# 每周检查命令
&nbsp;#!/bin/bash
&nbsp;echo&nbsp;"=== 硬盘 SMART 状态 ==="
&nbsp;smartctl&nbsp;-H&nbsp;/dev/sda

&nbsp;echo&nbsp;"=== 硬盘分区 ==="
&nbsp;lsblk

&nbsp;echo&nbsp;"=== LVM 状态 ==="
&nbsp;vgs
&nbsp;lvs

&nbsp;echo&nbsp;"=== 文件系统挂载 ==="
&nbsp;df&nbsp;-h

&nbsp;echo&nbsp;"=== 最近系统日志 ==="
&nbsp;journalctl&nbsp;-p&nbsp;err&nbsp;--since&nbsp;" 1 week ago"

附录

A. 常用命令速查

| 操作 | 命令 | | — | — | | 查看分区 | lsblkfdisk -lgdisk -l | | 检查SMART | smartctl -a /dev/sda | | 恢复分区表 | testdisk /dev/sda | | 备份GPT | sgdisk --backup=file /dev/sda | | 修复GRUB | grub2-install /dev/sda | | 检查文件系统 | fsck.ext4 -n /dev/sda1 | | 激活LVM | vgchange -ay | | 重建initramfs | dracut -f |

#


免责声明:

本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。

任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。

本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我

本文转载自:运维星火燎原 刘军军 刘军军《服务器崩了!GPT分区表损坏,我用这8步30分钟救回整个系统》

评论:0   参与:  0