萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 電腦故障排除 >  >> 硬碟故障

一次誤操作引發分區表災難:RHEL5 物理機上誤執行 RAID 建立,fdisk 重建分區表完美救回 114GB 數據

在物理機而非虛擬機上誤執行 fdisk 刪除關鍵分區 /dev/sda6(151GB、存 114GB 數據)並重建為 30GB RAID 分區,導致分區表錯亂、數據「消失」。冷靜分析未格式化 /dev/md0、數據實際未覆寫,利用 fdisk 精確重建原始分區起止扇區 + partprobe 刷新 + 重啟,成功喚醒完整數據。血淚級運維實錄,教你分區表災難自救。

事故回顧:誤操作時間線

  1. 環境:RHEL5 物理機(SSH 多終端混淆),本意在 VM 操作。
  2. fdisk /dev/sda → p 看分區 → 刪除 /dev/sda6 (151GB, 數據分區) → 新建 /dev/sda6 30GB、類型改 RAID (fd)。
  3. w 寫入分區表 → partprobe 刷新失效 → mdadm 建 RAID 失敗。
  4. init 6 重啟 → 物理機重啟(驚覺錯誤)。
  5. 重啟後:掛載點目錄存在但無法進入,df -h 顯示 /dev/sda6 大小未變(仍為 151GB),但數據不可讀。

關鍵洞察:數據其實還在

  • 未對 /dev/md0 執行 mkfs 格式化,文件系統超級塊、inode 表、數據區塊完整保留。
  • df -h 仍顯示原大小,證明分區表元數據中起始/結束扇區尚未被覆寫(或僅部分覆寫)。
  • 核心策略:精確重建與原分區完全一致的分區表項目,讓文件系統驅動重新掛載現有結構。

自救操作手冊(標準化流程)

  1. 立即停止寫入:任何掛載/掃描/修復/複製操作皆可能覆寫關鍵元數據。
  2. 記錄關鍵參數(事前備份最佳):
    • 原分區起始扇區、結束扇區、類型代碼 (83=Linux)、ID。
    • 無備份時:fdisk -l /dev/sda 查看當前錯誤表,結合記憶/歷史截圖/備份文件推算原始值。
  3. 重建分區表:
    fdisk /dev/sda
    d   # 刪除錯誤的 sda6
    n   # 新建分區
    p   # 主分區
    6   # 分區號
    [原始起始扇區]   # 關鍵:必須與原分區完全一致
    [原始結束扇區]   # 關鍵:必須與原分區完全一致
    t   # 修改類型
    6   # 分區號
    83  # Linux 標準類型
    w   # 寫入分區表
    
  4. 刷新內核分區表: partprobe 或 kpartx -a /dev/sda。
  5. 嘗試掛載: mount /dev/sda6 /mnt。若報錯「wrong fs type / bad superblock」,不要 執行 fsck 或 mkfs,進入下一步。
  6. 終極鑰匙 — 重啟: reboot。內核重新讀取分區表、文件系統驅動重新掛載,往往能解決內核緩存的元數據不一致問題。
  7. 驗證數據完整性: ls -la /mnt、md5sum 關鍵文件、tar -tzf 壓縮包測試。

為什麼重啟能解決?

內核在記憶體中緩存了舊的分區表結構與文件系統超級塊資訊。partprobe 僅通知內核重讀分區表,但文件系統驅動可能仍持有舊的超級塊緩存(特別是掛載點目錄項已建立但不可讀的情況)。完全重啟強制內核拋棄所有緩存,基於新分區表從頭掃描超級塊、重建 inode 緩存,從而正確識別原有文件系統結構。

預防與最佳實踐

  • 物理機/生產環境嚴禁直接操作分區:務必在虛擬機/測試機驗證腳本。
  • SSH 多終端必設明顯提示符: PS1='\[\e[31m\]\h:\w# \[\e[0m\]' 紅色標識物理機。
  • 關鍵操作前強制快照/備份: sfdisk -d /dev/sda > sda.partition.backup 導出分區表備份。
  • 使用 wipefs -a 而非 fdisk 清除簽名:更安全、可逆。
  • 建立操作清單與回滾預案:每步驟預設「失敗怎麼回滾」。

結語:分區表災難看似毀滅性,實則多為元數據錯位而非數據實質銷毀。冷靜、不寫入、精確重建、重啟內核 是核心生存法則。這次 114GB 數據完美歸位,是對「備份分區表」與「不輕易 fsck」鐵律的最佳驗證。願每位運維者永遠用不上這份指南,但必須熟記於心。

copyright © 萬盛學電腦網 all rights reserved