3TB HDD是混沌的奴隸 ~ 修复死去的3TB HDD的壞扇區並使其復活 ~
大家好,我是無能。
雖然我在上一篇文章中沉浸在絕望之中,但我不是一個輕易放棄的人。
夏天還沒結束。直到作業完成為止______
事情的經過
昨天,SSH 連線突然中斷,GNU/Linux 似乎卡住了,重啟後我檢查了 syslog。
Aug 27 04:03:55 localhost kernel: [2768521.366336] EXT4-fs (sdc1): error count since last fsck: 52
Aug 27 21:19:27 haturatu kernel: [ 28.915465] EXT4-fs (sdc1): warning: mounting fs with errors, running e2fsck is recommended
Aug 27 21:24:30 haturatu kernel: [ 332.803482] EXT4-fs (sdc1): error count since last fsck: 53
Aug 27 22:28:45 haturatu kernel: [ 5.694598] EXT4-fs (sdc1): warning: mounting fs with errors, running e2fsck is recommended
Aug 27 22:33:55 haturatu kernel: [ 316.412146] EXT4-fs (sdc1): error count since last fsck: 53
Aug 28 08:19:17 haturatu kernel: [ 5.710007] EXT4-fs (sdc1): warning: mounting fs with errors, running e2fsck is recommended
Aug 28 08:24:39 haturatu kernel: [ 316.427213] EXT4-fs (sdc1): error count since last fsck: 53
咦
啊
嗯?
HDD,一去不復返
嘗試 fsck
總之,用 USB-HDD 連接。
$ sudo fsck -f -y /dev/sdb
用lsblk確認磁碟後,先執行。
727810) +(77856769--77859749) +(77987841--77990269) +(78118913--78121629) +(78249985--78252434) +(78381057--78383008) +(78512129--78515588) +(78643201--78644782) +(78774273--78776000) +(78905345--78907598) +(79036417--79038955) +(79167489--79169769) +(79298561--79300360) +(79429633--79431425) +(79560705--79562857) +(79691777--79695179) +(79822849--79857556) +(79953921--79960927) +(80084993--80113787) +140247041
Fix? yes
Padding at end of inode bitmap is not set. Fix? yes
Error reading block 32768 (輸入/輸出錯誤). Ignore error? yes
Force rewrite? yes
Error writing block 32768 (輸入/輸出錯誤). Ignore error? yes
Error reading block 98304 (輸入/輸出錯誤). Ignore error? yes
果然是這樣啊!!!!!
是的,這是我過去見過的那種絕望的 I/O 錯誤。
用 dmesg 查看
雖然會省略一些,但會用 grep 確認相關磁碟的項目。
$ sudo dmesg | grep ' I/O error,' | grep "sdb"
[227123.296980] I/O error, dev sdb, sector 62916608 op 0x0:(READ) flags 0x83700 phys_seg 1 prio class 0
[227175.622027] I/O error, dev sdb, sector 78880 op 0x0:(READ) flags 0x80700 phys_seg 1 prio class 0
[227175.622087] I/O error, dev sdb, sector 62916624 op 0x0:(READ) flags 0x83700 phys_seg 14 prio class 0
[227459.286465] I/O error, dev sdb, sector 373295104 op 0x0:(READ) flags 0x80700 phys_seg 5 prio class 0
[227490.240900] I/O error, dev sdb, sector 377489408 op 0x0:(READ) flags 0x80700 phys_seg 4 prio class 0
啊啊啊
我的心快碎了,帕特拉修。
Google 搜尋
借鑒過去工程師們的智慧。
(Linux 硬碟出現壞扇區,嘗試修復)[https://web.archive.org/web/20240828125146/https://neocat.hatenablog.com/entry/2019/10/21/061645]
大概讀了一下,理解了其機制。
這種時候,如果對這個扇區進行寫入操作,HDD 的韌體應該會將其替換為備用扇區。
據說如此。總之,我一邊焦急,一邊不斷輸入 dmesg 輸出中顯示的扇區。
$ cat secter.sh
#!/bin/bash
sudo dd if=/dev/zero of=/dev/sdc bs=4k seek=$((62916608 / 8)) count=1
sudo dd if=/dev/zero of=/dev/sdc bs=4k seek=$((62916624 / 8)) count=1
sudo dd if=/dev/zero of=/dev/sdc bs=4k seek=$((373295104 / 8)) count=1
sudo dd if=/dev/zero of=/dev/sdc bs=4k seek=$((406849536 / 8)) count=1
sudo dd if=/dev/zero of=/dev/sdc bs=4k seek=$((411043840 / 8)) count=1
sudo dd if=/dev/zero of=/dev/sdc bs=4k seek=$((415238144 / 8)) count=1
sudo dd if=/dev/zero of=/dev/sdc bs=4k seek=$((419432448 / 8)) count=1
sudo dd if=/dev/zero of=/dev/sdc bs=4k seek=$((423626752 / 8)) count=1
這裡也省略了,但由於我每次嘗試 fsck 都會因為 I/O 錯誤而拔插,所以磁碟名稱從 sdb 變成了 sdc 再變成了 sdd,請見諒。
總之,我對 dmesg 輸出中顯示的扇區一次性執行了腳本化的指令。
雖然可以做得更簡潔,但在這種時候根本顧不上效率。如果因為粗糙的戰鬥方式而搞砸,導致整個磁碟資料毀滅,那我寧願喝泥水也要繼續。
然後,進行 fsck...
在同一個扇區上執行了幾次之後,
Bad sectors playing hide and seek on my hard drive
這裡提到 smartctl 也能檢查壞扇區,所以我一開始就嘗試了,但沒有成功。
然而,在進行了幾次上述那種粗糙的戰鬥後,它開始成功了,所以我執行了 sudo smartctl -a /dev/sda, sudo smartctl -t short /dev/sda 並成功了,然後又重複了粗糙的過程...
$ sudo fsck -f -y /dev/sdd1
fsck from util-linux 2.40.2
e2fsck 1.47.1 (20-May-2024)
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
Block bitmap differences: +(7864320--7872543) +(7929856--7946227) +(7946240--7962599) +(46661632--46669855) +(50855936--50864159) +(51380224--51388447) +(51388796--51404769) +(51404800--51412989) +(51904512--51928992) +(51929026--51929058) +(51929088--51937274) +(52428800--52453339) +(52453376--52461542) +(52953088--52962248) +(52964143--52977649) +(52977664--52985847)
Fix? yes
嗚啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊!!!!!
復活!!!!

雖然還沒完全確認哪些檔案損壞了,但 1TB 的大部分資料都回來了。
這一天,我深刻體會到前人的智慧是多麼偉大。
早上發現硬碟壞了,沒想到當天就能恢復,真是出乎意料的一天。
那麼。
下次再見了。