硬碟修復方法:chkdsk、badblocks、smartctl 命令與工具
硬碟修復先分清修的是什麼:分割槽打不開、提示檔案損壞,多數是檔案系統錯誤,Windows 用 chkdsk /f、Linux 用 fsck 能修好;出現壞道時,任何軟體的“修復”都只是讓硬碟把壞扇區換到備用區,扇區裡的資料和盤面本身都回不來。伺服器上的盤只要壞道還在增長,修復的意義就是把資料遷出來、撐到換盤。
硬碟修復要先分清修的是哪一層。分割槽打不開、提示“檔案或目錄損壞且無法讀取”、開機自檢報檔案系統錯誤,問題出在檔案系統,Windows 用 chkdsk /f、Linux 用 fsck(ext4 是 e2fsck,XFS 是 xfs_repair)多數能修好,盤本身沒壞。複製檔案報“資料錯誤(迴圈冗餘檢查)”、SMART 裡待對映扇區不為 0,問題出在盤面,這時任何工具的“壞道修復”做的都是同一件事:讓硬碟重新寫入讀不出的扇區,寫不進去就換到出廠預留的備用區。壞扇區裡原來的資料已經丟失,盤面也不會因此變好,所以伺服器上的盤只要壞道還在增長,修復只是為遷移資料和換盤爭取時間。
先判斷:修檔案系統還是修壞道
| 現象 | 問題在哪一層 | 能不能修好 | 先做什麼 |
|---|---|---|---|
開機出現“正在掃描和修復驅動器”,或 fsutil dirty query 顯示卷為髒 |
檔案系統,多為非正常關機 | 能 | 讓檢查跑完,或執行 chkdsk /f |
開啟目錄提示“檔案或目錄損壞且無法讀取”;Linux 報 Structure needs cleaning |
檔案系統後設資料損壞 | 多數能 | chkdsk /f;e2fsck、xfs_repair |
| 分割槽變成 RAW,提示需要格式化 | 檔案系統或分割槽表損壞 | 視情況 | 有重要資料先做整盤映象,不要格式化 |
| 複製某個檔案卡住,報“資料錯誤(迴圈冗餘檢查)”或“裝置未就緒” | 壞扇區 | 扇區上的資料通常讀不回來,盤可以重對映後再用一段時間 | 先拷出能讀的資料 |
dmesg 出現 Medium Error,SMART 的 197、198 不為 0 |
盤面介質 | 同上 | 陣列成員交給陣列卡處理,單盤按後文 Linux 一節處理 |
| 不識別、容量異常、通電有咔噠聲 | 磁頭、電機、韌體或主控 | 軟體修不了 | 斷電,按資料恢復流程處理 |
| 固態硬碟突然唯讀或掉盤 | 壽命耗盡或主控故障 | 修不了 | 趁還能讀先拷資料,然後換盤 |
判斷屬於哪一類,先看兩條命令的結果:
# Linux:壞道相關的三個計數,5 是已重對映,197 是待對映,198 是離線無法糾正
smartctl -A /dev/sdb | grep -E '^ *(5|197|198) '
# Windows(PowerShell):系統識別的介質型別與健康狀態
Get-PhysicalDisk | Select-Object FriendlyName, MediaType, HealthStatus, OperationalStatus
三個計數都是 0、系統日誌裡沒有磁碟錯誤,就按檔案系統問題處理;有任何一項不為 0,先把重要資料拷走,再談修復。
壞道“修復”到底做了什麼
機械硬碟出廠時,在碟片上預留了一批備用扇區。某個扇區讀取失敗時,硬碟不會馬上替換它,因為也可能只是那一次寫入的訊號品質不好,於是先記為“待對映”(SMART 197)。之後這個扇區被重新寫入時,硬碟寫入並校驗:寫得進、讀得回,就從待對映列表裡移除,這就是常說的“邏輯壞道”;寫不進去,硬碟就把這個位址指向一個備用扇區,已重對映計數(SMART 5)加一,這是“物理壞道”。
由此得出三個結論:
- 唯讀掃描修不了壞道。 掃描只會發現更多待對映扇區,必須有一次寫入,重對映才會發生。hdparm 覆蓋單個扇區、badblocks -w、全盤寫零、Victoria 的 Remap 模式、DiskGenius 的壞道修復,本質上都是在對壞扇區製造寫入。chkdsk /r 的思路不同:它把讀不出的簇記進 NTFS 的壞簇表,讓檔案系統以後不再使用這些簇,這是檔案系統層面的繞開,不等於硬碟完成了重對映。
- 壞扇區裡原來的資料回不來。 重對映後,這個位址讀出來的是新寫入的內容,通常是全 0。落在這個扇區上的檔案已經損壞,只能從備份恢復。
- 備用區有限,重對映是盤面退化的證據。 一塊盤幾周內從 0 漲到幾十個重對映扇區,下個月往往會更多。修復讓盤暫時能用,不代表它恢復了可靠性。
Windows 硬碟修復命令:chkdsk 與 diskpart
chkdsk 引數怎麼選
以管理員身份開啟命令提示符(cmd),格式是 chkdsk 磁碟機代號: 引數:
| 命令 | 做什麼 | 耗時與影響 |
|---|---|---|
chkdsk D: |
只檢查、不修復,報告是否有錯誤 | 幾分鐘,可線上執行 |
chkdsk D: /scan |
NTFS 線上掃描,能線上修的就地修,其餘排隊等待離線修復 | 不需要解除安裝卷 |
chkdsk D: /spotfix |
只修復 /scan 排隊的問題 | 卷離線的時間很短 |
chkdsk D: /f |
修復檔案系統錯誤,需要獨佔鎖定卷 | 系統盤要在重啟時執行 |
chkdsk D: /r |
包含 /f,並逐簇讀取全盤,可讀的資料遷走,讀不出的簇記入壞簇表 | 大容量機械盤可能要數小時到十幾小時 |
chkdsk D: /x |
必要時先強制解除安裝卷,再按 /f 修復 | 捲上已開啟的檔案控制代碼全部失效 |
chkdsk D: /b |
包含 /r,清空 NTFS 的壞簇表後重新掃描所有簇 | 用在把卷克隆到新盤之後 |
推薦的順序是 chkdsk D: → chkdsk D: /scan → 必要時 /f,確認是壞道問題、資料已經拷走之後才用 /r。原因是 /r 要讀每一個簇,讀到壞扇區時硬碟會反覆重試,正在退化的盤多讀一遍就多一分風險。
幾種常見情況:
- 對系統盤 C: 執行 /f 或 /r,會提示卷正在使用、是否在下次重啟時檢查,輸入 Y 後重啟執行。開機檢查的結果不會停留在螢幕上,要到事件檢視器的“Windows 日誌 → 應用程式”裡,找來源為 Wininit、事件 ID 為 1001 的記錄。
- 伺服器上的資料卷,先停掉往這個卷寫資料的服務(資料庫、檔案共享),再用
/x解除安裝修復,否則鎖不住卷。 - 寫進指令碼時可以用 PowerShell 的等價命令:
Repair-Volume -DriveLetter D -Scan,以及-SpotFix、-OfflineScanAndFix。
fsutil dirty query D:
chkdsk D: /scan
echo %errorlevel%
fsutil dirty query 顯示卷是否被標記為“髒”,被標記的卷下次開機會自動檢查。chkdsk 的退出碼:0 表示沒有發現錯誤,1 表示發現錯誤並已修復,2 表示做了磁碟清理或因為沒加 /f 而未做清理,3 表示無法檢查、無法修復,或因為沒加 /f 而未修復。
diskpart 能修什麼
diskpart 不修壞道,也不修檔案系統,它處理的是磁碟和分割槽層面的狀態:
diskpart
list disk
select disk 1
detail disk
online disk
attributes disk clear readonly
- 磁碟顯示“離線”:常見於新掛載的資料盤,或 SAN 策略設為離線的伺服器,
online disk讓它聯機。 - 磁碟或卷被標為唯讀:
attributes disk clear readonly清除磁碟唯讀屬性;卷級唯讀先select volume N,再attributes volume clear readonly。如果是固態硬碟壽命耗盡後被主控鎖成唯讀,清屬性不起作用。 - 徹底清空一塊有壞道的盤:
clean all會把每個扇區寫一遍 0,這次全盤寫入會讓所有待對映扇區完成重對映,作用相當於 Linux 上的全盤寫零。它清除盤上全部資料,選錯盤無法挽回,執行前用detail disk再核對一遍型號和容量。不帶 all 的clean只刪除分割槽資訊,不會觸發重對映。
Linux 硬碟修復命令:定位、覆蓋、整盤處理
第一步:找到壞扇區在哪裡
讓硬碟跑一次長自檢,結果裡會給出第一個讀失敗的扇區位址(LBA):
smartctl -t long /dev/sdb # 後台執行,預計時間見 smartctl -c 的輸出
smartctl -l selftest /dev/sdb # 看 Status 列和最後一列 LBA_of_first_error
結果為 Completed: read failure 時,最後一列就是壞扇區的 LBA,例如 1953519231。接著查這個扇區屬於哪個檔案,決定能不能直接覆蓋它。以 ext4 為例(塊大小 4096 位元組、扇區 512 位元組):
cat /sys/block/sdb/sdb1/start # 分割槽起始扇區,例如 2048
echo $(( (1953519231 - 2048) * 512 / 4096 )) # 換算成檔案系統塊號,得到 244189647
debugfs -R "icheck 244189647" /dev/sdb1 # 塊號 → inode 號;顯示 <block not found> 說明是空閒塊
debugfs -R "ncheck 12345678" /dev/sdb1 # inode 號(這裡是範例)→ 檔案路徑
其他檔案系統的反查方法不同,查不出來時,就按“這個扇區上的資料已經損壞”處理。
第二步:覆蓋單個壞扇區,觸發重對映
確認這個扇區是空閒塊,或者對應的檔案已經有備份,可以只覆蓋這一個扇區:
hdparm --read-sector 1953519231 /dev/sdb # 先確認確實讀不出,應報 I/O error
hdparm --yes-i-know-what-i-am-doing --write-sector 1953519231 /dev/sdb # 寫入全 0
hdparm --read-sector 1953519231 /dev/sdb # 能讀出全 0,說明寫入成功
smartctl -A /dev/sdb | grep -E '^ *(5|197) ' # 197 減少;5 增加說明換到了備用區
hdparm 直接向 SATA 盤發命令,盤在硬體 RAID 卡後面時用不了。寫入 0 以後,對應檔案的內容就損壞了,要從備份恢復該檔案;壞扇區落在檔案系統後設資料上時,覆蓋後再對解除安裝狀態的分割槽跑一次 fsck。
第三步:壞扇區多時整盤處理
壞扇區多,或者盤已經退出生產、要決定去留,就整盤處理一遍:
| 命令 | 讀寫方式 | 對資料的影響 | 用途 |
|---|---|---|---|
badblocks -sv -b 4096 /dev/sdb |
唯讀 | 不改資料 | 列出讀不出的塊 |
badblocks -nsv -b 4096 /dev/sdb |
讀出原內容、寫測試圖案、校驗、寫回 | 正常跑完不破壞資料,但分割槽必須未掛載 | 有資料、能停機的盤做讀寫檢測 |
badblocks -wsv -b 4096 /dev/sdb |
寫滿測試圖案再讀回校驗,預設 4 種圖案 | 清空整盤 | 新盤驗收、壞盤複檢 |
dd if=/dev/zero of=/dev/sdb bs=1M oflag=direct status=progress |
順序寫一遍 0 | 清空整盤 | 讓所有待對映扇區完成重對映 |
時間要提前算好。以 8 TB 機械盤、平均 200 MB/s 估算,全盤寫一遍約 11 小時;badblocks -w 預設 4 種圖案各寫一遍、讀一遍,共 8 遍,接近 4 天,加 -t 0 只測一種圖案,可以縮短到一天左右。badblocks 的塊號上限是 32 位,-b 4096 時最多覆蓋約 16 TiB,更大的盤要把 -b 調大,例如 8192。
處理完再跑一次長自檢。197 歸零、自檢透過、之後幾周 5 號不再增長,這塊盤可以降級去做不重要的用途;自檢仍然失敗,或者 5 號還在漲,就報廢或返修。
e2fsck -c 會呼叫 badblocks,把壞塊記進 ext4 的壞塊表,讓檔案系統繞開它們。這是硬碟還不會自動重對映的年代留下的做法,現在的盤在寫入時會自己處理;到了需要檔案系統來躲壞塊的地步,說明備用區已經不夠用,該換盤了。fsck 本身只修檔案系統結構,和壞道無關。
伺服器上的壞道:交給陣列修,修完決定換不換
陣列的巡讀和一致性檢查
伺服器的盤大多在 RAID 裡,修壞道用不著上面這些單盤工具,陣列自己就會做,而且不丟資料:陣列讀到某塊成員盤的壞扇區時,用映象或校驗算出正確內容,再寫回這個扇區,硬碟就在這次寫入時完成重對映。問題是平時沒被讀到的扇區不會觸發這個過程,潛伏的壞道會一直留到某塊盤故障、陣列重建時才暴露,導致重建失敗。所以要定期全盤巡檢:
| 陣列 | 巡檢方式 | 命令 |
|---|---|---|
| Broadcom/LSI MegaRAID、Dell PERC | 巡讀(Patrol Read),週期性掃描全部成員盤 | 檢視 storcli64 /c0 show patrolread;開啟 storcli64 /c0 set patrolread=on mode=auto |
| 同上 | 一致性檢查(CC),核對資料與校驗是否一致 | storcli64 /c0/v0 start cc;進度 storcli64 /c0/v0 show cc |
| Linux 軟 RAID(mdadm) | check 讀遍所有成員,遇到讀錯誤用冗餘資料重寫 | echo check > /sys/block/md0/md/sync_action;cat /proc/mdstat 看進度 |
| ZFS | scrub 校驗全部資料塊,用冗餘副本修復 | zpool scrub tank;zpool status tank |
Dell 伺服器上的 perccli 與 storcli 命令格式基本相同。巡讀和一致性檢查都會佔用磁碟 IO,陣列卡一般會自動限速,仍然建議排在業務低峰。單盤伺服器或 RAID 0 沒有冗餘資料可以回寫,只能按上一節的方法處理,並認定壞扇區上的資料已經丟失。
修完還能不能用:按盤的位置決定
| 盤的位置 | 出現壞道後怎麼處理 | 理由 |
|---|---|---|
| RAID 1、5、6、10 的成員盤 | 不在原位修,讓陣列回寫壞扇區,同時安排更換;198 不為 0 或自檢讀失敗就換 | 單冗餘陣列重建時要讀遍其他盤,帶著潛伏壞道的盤最容易在這時出事 |
| 單盤系統盤 | 先備份或遷移,再用 hdparm 或寫零處理;修完繼續用只作短期過渡 | 沒有冗餘,下一個壞扇區可能就落在系統檔案上 |
| 熱備盤、庫存備件 | 不修,直接返修或報廢 | 熱備盤要在別的盤壞時頂上,本身不能有問題 |
| 測試機、臨時儲存 | 全盤寫零、自檢透過後可以繼續用,持續盯住 5 號計數 | 資料不重要,能用多久算多久 |
| 新到貨的盤 | 驗收時 badblocks -w 或全盤寫一遍,出現重對映就退換 | 新盤出現壞道屬於早期失效 |
| 固態硬碟 | 不修,看備用塊和介質錯誤計數決定是否更換 | 壞塊由主控處理,外部工具幫不上 |
出現下面任何一條,就不再修,直接換:SMART 總體健康為 FAILED;同一塊盤的 5 號計數一個月內持續上漲;修復後的長自檢仍報 read failure;陣列卡標記為 Predictive Failure;通電後有異響。
硬碟修復工具哪個好:按用途選
| 工具 | 平台 | 擅長做什麼 | 注意 |
|---|---|---|---|
| chkdsk、Repair-Volume | Windows 自帶 | 修復 NTFS 檔案系統,/r 順帶掃壞簇 | 看不到壞道分佈和回應時間 |
| DiskGenius | Windows | 分割槽管理與恢復、檔案恢復、壞道檢測與修復、磁碟克隆 | 壞道修復會改寫壞道所在區域,先恢復檔案再修 |
| Victoria | Windows | 表面掃描,按每個塊的回應時間分檔著色;檢視 SMART | 掃描模式中除 Ignore 外,Remap、Erase、Refresh 都會寫盤 |
| CrystalDiskInfo | Windows | 讀取 SMART,給出 Good、Caution、Bad 三檔判斷 | 只看不修 |
| smartctl(smartmontools) | Linux、Windows | 讀 SMART、跑自檢、穿透 RAID 卡讀取成員盤 | 只診斷不修復 |
| badblocks、hdparm、dd | Linux | 掃壞塊、覆蓋指定扇區、全盤寫零 | -w、–write-sector、dd 都會改寫資料 |
| e2fsck、xfs_repair | Linux | 修復檔案系統結構 | 分割槽必須先解除安裝 |
| ddrescue | Linux | 從有壞道的盤上儘量把資料複製出來 | 任何修復之前,先用它做映象 |
| 廠商診斷工具(如希捷 SeaTools) | 視廠商而定 | 按廠商標準測試 | 報修時是否需要測試結果,以廠商說明為準 |
| storcli、perccli、ssacli | 隨陣列卡提供 | 巡讀(HPE 陣列卡稱為表面掃描)、一致性檢查、成員盤錯誤計數 | 伺服器 RAID 優先用它們 |
“哪個好”取決於要做什麼:救資料,用 ddrescue 做映象、DiskGenius 恢復檔案;判斷盤還能不能用,看 smartctl 或 CrystalDiskInfo 的計數,再用 Victoria 看回應時間分佈,回應明顯偏慢的塊往往是壞道的前兆;讓壞扇區完成重對映,用 hdparm 覆蓋單個扇區,或用 Victoria 的 Remap、badblocks -w、全盤寫零;檔案系統打不開,用 chkdsk 或 fsck。沒有哪款軟體能修好物理損壞的盤面,上限就是觸發重對映。
在管理系統裡怎麼落地
修盤之後真正麻煩的是追蹤:哪台伺服器的哪塊盤修過、修完計數有沒有再漲、換下來的盤送修回來沒有。Toplink DCIM 的機櫃與資產把硬碟等可更換部件按批次入庫,壞盤登記返修後,首頁能看到處於返修流程中的部件數量;向伺服器下發硬體採集指令碼後,硬碟資訊自動入庫並保留每次採集的歷史,換盤前後的記錄一對就知道動過哪塊盤。Windows 伺服器重啟後停在開機磁碟檢查、Linux 停在要求手動 fsck 的提示符時,可以在 IPMI 遠端管理裡開啟 VNC 控制檯檢視進度、輸入命令,不必為了按一個鍵專門跑一趟機房。
常見問題
chkdsk /r 卡在某個百分比很久不動怎麼辦?
讀到壞扇區時,硬碟自身會反覆重試,每個壞扇區可能耗時數秒到數十秒,進度看起來就像卡住。盤裡有重要資料時不要硬等,寧可中斷檢查,先用 ddrescue 或 DiskGenius 把資料拷出來。開機前的磁碟檢查反覆出現時,可以進系統後執行 chkntfs /x C: 跳過預定檢查,但盤的問題並沒有解決。
固態硬碟能用 Victoria 之類的工具修壞道嗎?
不能。SSD 的邏輯位址和快閃記憶體物理塊之間隔著主控的對映表,壞塊由主控用備用塊替換,外部工具掃描看到的只是邏輯位址,反覆全盤讀寫只會消耗寫入壽命。SSD 出現讀錯誤時,看 SMART 裡的可用備用塊和介質錯誤計數,接近閾值就換盤。
chkdsk 和 sfc /scannow、DISM 有什麼區別?
chkdsk 修的是磁碟上的檔案系統結構;sfc /scannow 檢查並替換損壞的 Windows 系統檔案;DISM /Online /Cleanup-Image /RestoreHealth 修復 sfc 所依賴的元件儲存。系統檔案報錯先跑 DISM 再跑 sfc,分割槽打不開、目錄損壞才用 chkdsk。
低階格式化能修復壞道嗎?
現在所說的“低階格式化”工具,實際做的是全盤寫零,和 diskpart 的 clean all、dd 寫零效果相同:能讓待對映扇區完成重對映,但已經換到備用區的扇區不會還原,盤面也不會變好。真正意義上的低階格式化在出廠時完成,使用者無法執行。