工程師思路系列・事出必有因
工程師手記:一顆瑕疵硬碟的「好區分割」實錄
用 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 風雲網通系統有限公司
Comments