當磁盤出現如下狀況:node
io wait 無端增高或居高不下;linux
硬盤聲音忽然由原來的摩檫音變成了怪音;bash
系統沒法正常啓動,出現「IO error」等提示信息;服務器
mkfs時,到某一進度停滯不前,最後報錯,沒法完成;併發
每次系統開機都會運行 fsck 掃描磁盤錯誤;app
對磁盤執行fdisk時,到某必定進度會反覆進進退退。ide
出現如上情況,就須要及時對磁盤進行壞道檢測並及時對磁盤壞道進行檢測測試磁盤的可用性,並當即備份數據。工具
1.發現硬盤壞道測試
當有硬盤壞道時,一般在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.硬盤壞道類型
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
# 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
參數:
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 所有檢查修復。
這個方法對帶有 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 信息。