linux系統下檢測硬盤上的壞道和壞塊

磁盤壞道檢測

當磁盤出現如下狀況:node

  •  io wait 無端增高或居高不下;linux

  •  硬盤聲音忽然由原來的摩檫音變成了怪音;bash

  •  系統沒法正常啓動,出現「IO error」等提示信息;服務器

  •  mkfs時,到某一進度停滯不前,最後報錯,沒法完成;併發

  •  每次系統開機都會運行 fsck 掃描磁盤錯誤;app

  •   對磁盤執行fdisk時,到某必定進度會反覆進進退退。ide

        出現如上情況,就須要及時對磁盤進行壞道檢測並及時對磁盤壞道進行檢測測試磁盤的可用性,並當即備份數據。工具

1.發現硬盤壞道測試

dmesg

當有硬盤壞道時,一般在dmesg輸出的信息中會有 Buffer I/O Error,因此常常檢查dmesg的輸出能夠及時發現是否存在硬盤問題。spa

2.檢測壞道

2.1 經過fdisk 查看顯示全部磁盤或閃存的信息

# fdisk -l /dev/sd*

2.2 使用 badlocks檢查 linux 硬盤上的壞道/壞塊。也能夠修復壞道,但僅限於邏輯壞道,物理壞道只能更換硬盤

# badblocks -s -v /dev/sdg  > badsectors.txt
Checking blocks 0 to 20970495
Checking for bad blocks (read-only test): 
done                                                 
Pass completed, 0 bad blocks found. (0/0/0 errors)

備註: -v 選項讓它顯示操做詳情

           -s 在檢查時顯示進度

           -o<輸出文件> 將檢查的結果寫入指定的輸出文件

           -w 在檢查時,執行寫入測試。

       也能夠針對單獨分區進行檢查。

3.硬盤壞道類型

    硬盤壞道分爲物理壞道和邏輯壞道。

    物理壞道:就是硬盤實體有壞的地方,物理壞道推薦換硬盤,固然也有辦法從新分區來隔離壞道,不過可能也用不久,因此不推薦。

   邏輯壞道:是磁盤磁道上面的校驗信息(ECC)跟磁道的數據對不上號所致。出現這一故障的緣由,一般都是由於一些程序的錯誤操做或是該處扇區的磁介質開始出現不穩定的先兆。物理壞道也是邏輯壞道產生的一種緣由。

4.修復磁盤壞道

    首先,當檢測出壞道以後首先要看下服務器磁盤的燈有沒有報警,通常的服務器都有硬盤報警燈,燈顯示紅色說明磁盤不工做了,這個明顯是物理性故障問題,須要更換磁盤。

    其次,若硬盤燈沒有報警,或已經換了硬盤,但檢查仍然有壞道,此時多是邏輯壞道,須要嘗試修復,若能修復說明確實是邏輯壞道,若修復不了說明是物理壞道。

4.1 邏輯壞道修復方式

查看上述分區檢查出來的壞道信息:

# tail -f badsectors.txt
205971590
205971591
205971592
205971593
205971594
205971595

4.1.1 先備份數據

若修復的硬盤或分區的重要數據已備份,此部分能夠省略

# dd if=/dev/sdg skip=205971590 of=/tmp/205971590-205971595.dat count=5

4.1.2 修復磁盤

硬盤在使用時不能修復,不然可能存在寫併發的問題,因此修復前須要umount對應分區(若爲系統所在分區就沒辦法在線修復了,由於沒法umount)。

# umount /data02

    但umount可能出現"Device busy"的錯誤,是由於有程序在使用這個分區,須要將這些進程都關閉。使用fuser(命令以下),其中/data02是分區對應的掛載目錄。

# fuser -m /data02

# fuser -m -v -i -k /data02

    第一條fuser命令列出使用/data02的進程ID,第二條列出PID並kill掉進程(帶有提示確認),建議先使用第一條命令列出PID,而後針對查看是哪些類型的進程,不要盲目殺死進程。

umount 分區成功後,修復命令以下,其中-s表示給出進度,-w表示寫入修復的,後面是結束(END)和開始(START)塊號,注意END在前,START在後。


# badblocks -s -w /dev/sdg 205971590 205971595

或者修復後再次檢查


# badblocks -s -v /dev/sdg 205971590 205971595

4.1.3 再次檢查恢復

恢復數據

# dd if=/tmp/205971590-205971595.dat of=/dev/sdg

從新分區檢查

# badblocks -s -v  /dev/mapper/VolGroup-lv_home > badsectors.txt

若沒有壞道說明修復已完成,如有壞道能夠嘗試重複以上方法。

5.屏蔽壞道部分

執行e2fsck(針對 ext2/ext3/ext4 文件系統)或fsck命令,命令中還須要用到badsectors.txt文件和設備文件。

備註:-l    選項告訴命令將在指定的文件 badsectors.txt 中列出的扇區號碼加入壞塊列表。

------------ 針對 for ext2/ext3/ext4 文件系統 ------------
# e2fsck -l badsectors.txt /dev/sdb1 
e2fsck 1.42.9 (28-Dec-2013)
/dev/sdb1: Updating bad block inode.
Pass 1: Checking inodes, blocks, and sizes
Pass 2: Checking directory structure
Pass 3: Checking directory connectivity
Pass 4: Checking reference counts
Pass 5: Checking group summary information

/dev/sdb1: ***** FILE SYSTEM WAS MODIFIED *****
/dev/sdb1: 12/1310720 files (8.3% non-contiguous), 128782/5242624 blocks

 

------------ 針對其它文件系統 ------------
$ sudo fsck -l badsectors.txt /dev/sda10


6. fsck工具

參數:

filesys : 磁盤設備名稱(eg./dev/sda1),掛載(mount)點 (eg. / 或 /usr)

-t : 給定檔案系統的型式,若在 /etc/fstab 中已有定義或 kernel 自己已支援的則不需加上此參數

-s : 依序一個一個地執行 fsck 的指令來檢查

-A : 對/etc/fstab 中全部列出來的 分區(partition)作檢查

-C : 顯示完整的檢查進度

-d : 打印出 e2fsck 的 debug 結果

-p : 同時有 -A 條件時,同時有多個 fsck 的檢查一塊兒執行

-R : 同時有 -A 條件時,省略 / 不檢查

-V : 詳細顯示模式

-a : 若是檢查有錯則自動修復

-r : 若是檢查有錯則由使用者回答是否修復

-y : 選項指定檢測每一個文件是自動輸入yes,在不肯定那些是不正常的時候,能夠執行 # fsck -y 所有檢查修復

 

 

在 Linux 上使用 Smartmontools 工具掃描壞道


這個方法對帶有 S.M.A.R.T(自我監控分析報告技術Self-Monitoring, Analysis and Reporting Technology)系統的現代磁盤(ATA/SATA 和 SCSI/SAS 硬盤以及固態硬盤)更加的可靠和高效。S.M.A.R.T 系統可以幫助檢測,報告,以及可能記錄它們的健康情況,這樣你就能夠找出任何可能出現的硬件失效。
你可使用如下命令安裝smartmontools:

------------ 在基於 Debian/Ubuntu 的系統上 ------------

$ sudo apt-get install smartmontools


------------ 在基於 RHEL/CentOS 的系統上 ------------

$ sudo yum install smartmontools


安裝完成以後,使用 smartctl 控制磁盤集成的 S.M.A.R.T 系統。你能夠這樣查看它的手冊或幫助:

$ man smartctl
$ smartctl -h


而後執行 smartctrl 命令並在命令中指定你的設備做爲參數,如下命令包含了參數 -H 或 --health 以顯示 SMART 總體健康自我評估測試結果。

$ sudo smartctl -H /dev/sda10


檢查 Linux 硬盤健康
上面的結果指出你的硬盤很健康,近期內不大可能發生硬件失效。

要獲取磁盤信息總覽,使用 -a 或 --all 選項來顯示關於磁盤全部的 SMART 信息, -x 或 --xall 來顯示全部關於磁盤的 SMART 信息以及非 SMART 信息。

相關文章
相關標籤/搜索