伺服器維運

硬碟修復方法:chkdsk、badblocks、smartctl 命令與工具

硬碟修復先分清修的是什麼:分割槽打不開、提示檔案損壞,多數是檔案系統錯誤,Windows 用 chkdsk /f、Linux 用 fsck 能修好;出現壞道時,任何軟體的“修復”都只是讓硬碟把壞扇區換到備用區,扇區裡的資料和盤面本身都回不來。伺服器上的盤只要壞道還在增長,修復的意義就是把資料遷出來、撐到換盤。

作者 頂聯產品團隊發布於 9 分鐘閱讀

硬碟修復要先分清修的是哪一層。分割槽打不開、提示“檔案或目錄損壞且無法讀取”、開機自檢報檔案系統錯誤,問題出在檔案系統,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)加一,這是“物理壞道”。

由此得出三個結論:

  1. 唯讀掃描修不了壞道。 掃描只會發現更多待對映扇區,必須有一次寫入,重對映才會發生。hdparm 覆蓋單個扇區、badblocks -w、全盤寫零、Victoria 的 Remap 模式、DiskGenius 的壞道修復,本質上都是在對壞扇區製造寫入。chkdsk /r 的思路不同:它把讀不出的簇記進 NTFS 的壞簇表,讓檔案系統以後不再使用這些簇,這是檔案系統層面的繞開,不等於硬碟完成了重對映。
  2. 壞扇區裡原來的資料回不來。 重對映後,這個位址讀出來的是新寫入的內容,通常是全 0。落在這個扇區上的檔案已經損壞,只能從備份恢復。
  3. 備用區有限,重對映是盤面退化的證據。 一塊盤幾周內從 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 寫零效果相同:能讓待對映扇區完成重對映,但已經換到備用區的扇區不會還原,盤面也不會變好。真正意義上的低階格式化在出廠時完成,使用者無法執行。

想看看在你的機房裡怎麼用?

從一次產品示範開始,梳理你的業務鏈路。

查看價格
服務熱線 400-112-2951

讓我們聊聊你的 IDC 業務

掃碼新增企業微信,預約產品示範或申請試用。

Toplink 企業微信二維碼

長按儲存或使用企業微信 / 微信掃描

也可致電
400-112-2951
Telegram
@TopLink88