工程師思路系列・事出必有因

工程師手記:一顆瑕疵硬碟的「好區分割」實錄

用 AI 協助開發一套把壞區封印、好區留下的工具鏈


作者:Mr. τ / 風雲網通系統有限公司(PCPiLOT)

有時候,工程師會做一些很「客家」的事情。

不是因為買不起新的,而是看著一顆還能讀、還能轉、還能跑的老硬碟,心裡總會冒出一個問題:

「它真的已經完全沒有利用價值了嗎?」

這次的專案,就是從這個問題開始的。

一、問題從哪裡來

一般遇到硬碟出現壞軌,最標準的建議其實很簡單:備份資料、更換硬碟、淘汰。

這個答案沒有錯。尤其是企業伺服器、資料庫、NAS 等重要設備,硬碟一旦出現大量重新配置磁區、Pending Sector 或 Uncorrectable Sector,根本不應該拿來賭。

但是,如果今天手上的硬碟只是在某些區域出現瑕疵呢?

例如:

  • 前面一大段可以正常讀取
  • 中間有一段連續的問題區域
  • 後面又有很長一段可以正常讀取

這顆硬碟不是「全部壞掉」,而是只有一部分不能用了。

於是我開始思考:如果可以把壞掉的區域隔離起來,只把確認可以正常使用的區域建立成 partition,是不是就能讓這顆硬碟繼續承擔一些低風險用途?

二、現有工具為什麼不夠用

一開始我也認為「這應該早就有人做了吧?」

畢竟 Linux 有 badblocks、有 SMART 工具、有 ddrescue、有各種 HDD surface scanner,也有非常成熟的 partition 工具。把它們組合起來,應該就完成了。

但仔細研究之後,才發現事情沒有那麼簡單。

現有工具大多各自解決一個問題:

  • badblocks:找出有問題的 block
  • smartmontools:分析硬碟健康狀態
  • ddrescue:在硬碟快壞掉時,盡可能把資料救出來
  • diskpart、fdisk、parted:建立與管理 partition

但我要做的事情其實不太一樣。

我不是要「修復硬碟」,也不是要「搶救資料」。

而是想做:找出還可以使用的區域,然後把不能使用的區域隔離。
不是把壞硬碟修好,而是重新定義這顆硬碟「哪些地方可以用」。

三、觀念轉變:從找壞軌,變成找好區域

這是開發過程中一個很重要的觀念轉變。

最初很容易把問題想成「我要找 Bad Sector」,但真正要解決的問題其實是「我要找 Good Region」。

假設一顆硬碟的 LBA 空間如下:

GOOD GOOD GOOD GOOD GOOD
GOOD GOOD GOOD GOOD GOOD
BAD  BAD  BAD  BAD
BAD  BAD  BAD
GOOD GOOD GOOD GOOD GOOD
GOOD GOOD GOOD GOOD GOOD

傳統的壞軌工具會告訴你哪些 LBA 有問題,但我的工具真正需要的資訊是:

GOOD REGION #1
LBA 0 ~ X

BAD REGION
LBA X ~ Y

GOOD REGION #2
LBA Y ~ END

接下來才有可能進一步產生:

Partition 1  →  GOOD REGION #1
BAD REGION   →  UNALLOCATED
Partition 2  →  GOOD REGION #2

四、AI 助理真正幫上忙的地方

這次專案另一個有趣的地方,是我不是一個人從頭寫,而是讓 AI 助理參與整個開發過程。

包括:

  • 程式架構
  • PowerShell script
  • DiskPart 操作
  • Partition 計算
  • 實際 partition table 驗證
  • 錯誤處理與安全機制
  • 一次又一次的 code review

但這次的經驗也讓我更加確定:

AI 很適合當工程師的第二雙眼睛,但不能把實體硬碟的風險交給 AI 自己決定。

普通應用程式寫錯,大不了程式 crash;Partition 工具寫錯,資料可能直接消失。

所以開發過程中,我反而一直在要求 AI:

  • 這裡如果判斷錯怎麼辦?
  • 這個 DiskNumber 有沒有可能指錯?
  • 如果實際 partition table 和預期不一樣呢?
  • DiskPart 執行成功,但結果和我們想的不一樣呢?
  • 如果 script 中途失敗呢?

五、最後加入的重要觀念:Verify

這也是後期開發中,我認為非常重要的一個設計。

不要相信自己剛剛執行的命令,去讀實際結果。

例如 partition 建立流程完成之後,不是看到「DiskPart successfully created the partition.」就算結束,而是再透過 PowerShell 的 Get-Partition 重新讀取實際 partition table,然後拿「實際結果」和「預期結果」比較。

因此整個流程變成:

Scan → Analyze → Plan → Partition → Read Back → Verify

對一般軟體來說,這可能只是比較嚴謹;但對磁碟工具來說,這是完全不同的思維。因為 DiskPart 回報成功,不代表你的整體設計真的成功。

六、刻意讓「壞區」變成空白

這個設計看起來很簡單,實際上卻很重要。

工具不是把所有空間都拿來建立 partition,而是:

可用區域   →  建立 Partition
瑕疵區域   →  刻意留下 Unallocated

也就是讓作業系統根本看不到那一段。這可以稱為 Bad Region Isolation,或者更直白一點:壞區封印。

我們沒有修復壞軌、沒有改變 HDD firmware、沒有進行低階重新配置,只是利用 partition table,把「不值得信任的區域」隔離在作業系統使用範圍之外。

七、它不是「讓壞硬碟復活」

這一點一定要講清楚。這個工具不是魔法。

如果硬碟 SMART 已經嚴重失敗:

  • 大量 Reallocated Sector
  • 大量 Pending Sector
  • 大量 Uncorrectable
  • 持續出現新的讀取錯誤
  • 甚至硬碟本身已經出現異常聲音或機械故障

那麼最好的處理方式仍然是:換掉它。

這套工具比較適合的是「有局部瑕疵,但是仍然存在大量穩定可讀取區域的硬碟」,而且用途也應該限制在測試機、暫存資料、非關鍵用途、實驗環境、備用設備。

而不是企業資料庫、唯一備份、重要 NAS 儲存池、生產環境。

八、搜尋 GitHub 之後的發現

完成一個可以工作的版本之後,我回頭去搜尋 GitHub。

結果很有趣:相關工具其實很多,壞軌掃描器很多、SMART 工具很多、資料救援工具很多、Partition 工具也很多。

但是把「瑕疵掃描 → LBA Map → Good Region 分析 → Partition Planning → 自動分割 → 實際結果驗證」完整串在一起的專案,反而沒有想像中普遍。

這也讓我重新理解這個專案。它不是要取代 badblocks、不是要取代 ddrescue、更不是要取代專業硬碟檢測工具。它比較像是把這些不同領域的能力,重新組合成另一種工作流程。

九、結語

整個專案做完之後,我覺得最有價值的部分,其實不是最後產生了一個什麼工具,而是重新思考了一個老問題:

「一個已經不完美的硬體,還剩下多少價值?」

過去我們習慣用二元方式看待硬碟:好、壞、能用、不能用。但實際上,硬體的狀態經常不是二元的。

一顆硬碟可能 90% 很好、5% 有問題、5% 非常不穩定。如果我們可以把這些狀態量化、定位、隔離,那麼「硬碟壞了」這件事情,就可以被重新描述成「這顆硬碟還剩下哪些可靠的空間?」

這次專案也再次驗證一個我很喜歡的開發原則:

讓 AI 幫忙寫程式,但不要讓 AI 幫你承擔硬體風險。

真正的「客家」精神,不是什麼都捨不得丟,而是:該省的省,該換的換。

工程師思路・結語
對工程師而言,這正是日常工作中最有成就感的部分之一——用最簡單的方法,把被忽略的價值重新找回來。

#工程師思路系列
#硬碟修復
#Partition
#AI協作開發
#客家工程師

作者:Mr. τ / PCPiLOT 風雲網通系統有限公司

Last modified: 2026-08-12

Author

Comments

Write a Reply or Comment

Your email address will not be published.