我在 Ubuntu 18.04 上遇到了硬碟問題,由於錯誤,系統隨機將我的根分割區 (/dev/sda4) 重新掛載為唯讀。
dmesg|grep 'I/O error'
揭示了 sda4 的明顯問題。我現在沒有確切的輸出,因為盒子已成功重新啟動,目前沒有問題。
我的計劃是對檔案系統運行檔案系統檢查。我跟著這個答案也本教程小心。在後一個教程中,我使用了標題為“的部分”使用 systemd 時如何在 Linux 上系統重新啟動後強制 fsck 檢查檔案系統」
但是,重新引導後,不會檢查檔案系統,如下列命令的輸出所示:
tune2fs -l /dev/sda4 | grep checked
Last checked: Sat Nov 21 15:36:56 2020
我嘗試過 GRUB CMDLINE 的這些變體,但都沒有成功:
GRUB_CMDLINE_LINUX_DEFAULT="maybe-ubiquity fsck.mode=force"
和
GRUB_CMDLINE_LINUX_DEFAULT="maybe-ubiquity fsck.mode=force fsck.repair=yes"
是的,我確實跑了update-grub
。我缺什麼?
輸出smartctl -a /dev/sda
:
Device Model: Samsung SSD 860 EVO 250GB
Serial Number: S59WNG0MA22770K
LU WWN Device Id: 5 002538 e70265a2a
Firmware Version: RVT03B6Q
User Capacity: 250,059,350,016 bytes [250 GB]
Sector Size: 512 bytes logical/physical
Rotation Rate: Solid State Device
Form Factor: 2.5 inches
Device is: Not in smartctl database [for details use: -P showall]
ATA Version is: Unknown(0x09fc), ACS-4 T13/BSR INCITS 529 revision 5
SATA Version is: SATA 3.2, 6.0 Gb/s (current: 6.0 Gb/s)
Local Time is: Wed May 3 11:35:14 2023 MST
SMART support is: Available - device has SMART capability.
SMART support is: Enabled
=== START OF READ SMART DATA SECTION ===
SMART overall-health self-assessment test result: PASSED
General SMART Values:
Offline data collection status: (0x00) Offline data collection activity
was never started.
Auto Offline Data Collection: Disabled.
Self-test execution status: ( 0) The previous self-test routine completed
without error or no self-test has ever
been run.
Total time to complete Offline
data collection: ( 0) seconds.
Offline data collection
capabilities: (0x53) SMART execute Offline immediate.
Auto Offline data collection on/off support.
Suspend Offline collection upon new
command.
No Offline surface scan supported.
Self-test supported.
No Conveyance Self-test supported.
Selective Self-test supported.
SMART capabilities: (0x0003) Saves SMART data before entering
power-saving mode.
Supports SMART auto save timer.
Error logging capability: (0x01) Error logging supported.
General Purpose Logging supported.
Short self-test routine
recommended polling time: ( 2) minutes.
Extended self-test routine
recommended polling time: ( 85) minutes.
SCT capabilities: (0x003d) SCT Status supported.
SCT Error Recovery Control supported.
SCT Feature Control supported.
SCT Data Table supported.
SMART Attributes Data Structure revision number: 1
Vendor Specific SMART Attributes with Thresholds:
ID# ATTRIBUTE_NAME FLAG VALUE WORST THRESH TYPE UPDATED WHEN_FAILED RAW_VALUE
5 Reallocated_Sector_Ct 0x0033 038 038 010 Pre-fail Always - 311
9 Power_On_Hours 0x0032 095 095 000 Old_age Always - 21420
12 Power_Cycle_Count 0x0032 099 099 000 Old_age Always - 14
177 Wear_Leveling_Count 0x0013 001 001 000 Pre-fail Always - 2041
179 Used_Rsvd_Blk_Cnt_Tot 0x0013 100 100 010 Pre-fail Always - 0
181 Program_Fail_Cnt_Total 0x0032 100 100 010 Old_age Always - 0
182 Erase_Fail_Count_Total 0x0032 100 100 010 Old_age Always - 0
183 Runtime_Bad_Block 0x0013 038 038 010 Pre-fail Always - 311
187 Reported_Uncorrect 0x0032 100 100 000 Old_age Always - 0
190 Airflow_Temperature_Cel 0x0032 067 065 000 Old_age Always - 33
195 Hardware_ECC_Recovered 0x001a 200 200 000 Old_age Always - 0
199 UDMA_CRC_Error_Count 0x003e 100 100 000 Old_age Always - 0
235 Unknown_Attribute 0x0012 099 099 000 Old_age Always - 10
241 Total_LBAs_Written 0x0032 099 099 000 Old_age Always - 166281511800
SMART Error Log Version: 1
No Errors Logged
SMART Self-test log structure revision number 1
No self-tests have been logged. [To run self-tests, use: smartctl -t]
SMART Selective self-test log data structure revision number 1
SPAN MIN_LBA MAX_LBA CURRENT_TEST_STATUS
1 0 0 Not_testing
2 0 0 Not_testing
3 0 0 Not_testing
4 0 0 Not_testing
5 0 0 Not_testing
256 0 65535 Read_scanning was never started
Selective self-test flags (0x0):
After scanning selected spans, do NOT read-scan remainder of disk.
If Selective self-test is pending on power-up, resume after 0 minute delay.
更新:
今天早上伺服器再次崩潰(它仍然正常運行,但/
以唯讀方式安裝),這是我在 dmesg 中看到的內容:
dmesg |grep sda
[70547.166349] sd 0:0:0:0: [sda] tag#13 FAILED Result: hostbyte=DID_BAD_TARGET driverbyte=DRIVER_OK
[70547.166354] sd 0:0:0:0: [sda] tag#13 CDB: ATA command pass through(16) 85 06 2c 00 00 00 00 00 00 00 00 00 00 00 e5 00
[70948.441912] sd 0:0:0:0: [sda] tag#15 FAILED Result: hostbyte=DID_BAD_TARGET driverbyte=DRIVER_OK
[70948.441918] sd 0:0:0:0: [sda] tag#15 CDB: Read(10) 28 00 1a cb 1c 00 00 00 08 00
[70948.441922] print_req_error: I/O error, dev sda, sector 449518592
[70948.442312] sd 0:0:0:0: [sda] tag#16 FAILED Result: hostbyte=DID_BAD_TARGET driverbyte=DRIVER_OK
[70948.442315] sd 0:0:0:0: [sda] tag#16 CDB: Read(10) 28 00 1a cb 1c 00 00 00 08 00
[70948.442316] print_req_error: I/O error, dev sda, sector 449518592
[70948.442955] sd 0:0:0:0: [sda] tag#17 FAILED Result: hostbyte=DID_BAD_TARGET driverbyte=DRIVER_OK
[70948.442960] sd 0:0:0:0: [sda] tag#17 CDB: Read(10) 28 00 0e 0b 03 08 00 00 20 00
[70948.442962] print_req_error: I/O error, dev sda, sector 235602696
[70948.443389] sd 0:0:0:0: [sda] tag#18 FAILED Result: hostbyte=DID_BAD_TARGET driverbyte=DRIVER_OK
[70948.443393] sd 0:0:0:0: [sda] tag#18 CDB: Read(10) 28 00 0e 0b 03 08 00 00 08 00
[70948.443396] print_req_error: I/O error, dev sda, sector 235602696
[72347.211525] sd 0:0:0:0: [sda] tag#19 FAILED Result: hostbyte=DID_BAD_TARGET driverbyte=DRIVER_OK
[72347.211531] sd 0:0:0:0: [sda] tag#19 CDB: ATA command pass through(16) 85 06 2c 00 00 00 00 00 00 00 00 00 00 00 e5 00
[74147.255746] sd 0:0:0:0: [sda] tag#21 FAILED Result: hostbyte=DID_BAD_TARGET driverbyte=DRIVER_OK
[74147.255752] sd 0:0:0:0: [sda] tag#21 CDB: ATA command pass through(16) 85 06 2c 00 00 00 00 00 00 00 00 00 00 00 e5 00
[75947.299631] sd 0:0:0:0: [sda] tag#23 FAILED Result: hostbyte=DID_BAD_TARGET driverbyte=DRIVER_OK
[75947.299637] sd 0:0:0:0: [sda] tag#23 CDB: ATA command pass through(16) 85 06 2c 00 00 00 00 00 00 00 00 00 00 00 e5 00
[77747.345291] sd 0:0:0:0: [sda] tag#25 FAILED Result: hostbyte=DID_BAD_TARGET driverbyte=DRIVER_OK
[77747.345297] sd 0:0:0:0: [sda] tag#25 CDB: ATA command pass through(16) 85 06 2c 00 00 00 00 00 00 00 00 00 00 00 e5 00
[79547.389376] sd 0:0:0:0: [sda] tag#27 FAILED Result: hostbyte=DID_BAD_TARGET driverbyte=DRIVER_OK
[79547.389382] sd 0:0:0:0: [sda] tag#27 CDB: ATA command pass through(16) 85 06 2c 00 00 00 00 00 00 00 00 00 00 00 e5 00
[81347.432593] sd 0:0:0:0: [sda] tag#29 FAILED Result: hostbyte=DID_BAD_TARGET driverbyte=DRIVER_OK
[81347.432598] sd 0:0:0:0: [sda] tag#29 CDB: ATA command pass through(16) 85 06 2c 00 00 00 00 00 00 00 00 00 00 00 e5 00
我確實意識到需要更換驅動器,但我的目標只是fsck
在根分區上運行。
答案1
我不知道如何使用您正在嘗試的解決方案強制進行 fsck,但我可以建議一個替代解決方案:
使用tune2fs
該值並將其限制為非常低的重新安裝次數和非常低的時間戳
# To see current settings
sudo tune2fs -l /dev/sda4
# To alter it
sudo tune2fs -c 1 -i 1d /dev/sda4
這將強制每 1 次重新安裝或自上次檢查後每 1 天進行一次檢查,無論發生的時間是否早。
檢查智能
正如其他人所說,這只是解決硬體問題的創可貼。有時硬碟壞了,有時是無關的硬體問題(執行記憶體測試),有時只是 SATA 電纜鬆動(從兩端拔下並重新插入,如果不能解決問題,請嘗試另一條電纜) 。
請注意最壞的情況,即 PSU 發生故障並損壞硬體的其餘部分(在這種情況下,更換 HDD 只能暫時解決問題,因為隨著時間的推移,新的 HDD 將被 PSU 損壞)。檢查電壓是否在可接受的水平內。
發布智慧的輸出:
sudo smartctl -a /dev/sda
可以幫助診斷可能發生的情況。
更新
我不知道為什麼你也不能透過tune2fs運行fsck。
但我看到了你的聰明。根據它,您的磁碟正在老化,但看起來很健康。
問題可能出在其他地方,例如 SATA 電纜。
如果您無法使 fsck 工作,那麼我所能建議的就是從 liveUsb 啟動並手動執行命令。
更新2
好的,您發布了 dmseg 訊息。我們有來自 SMART 和 OS 的相互矛盾的訊息,所以我會詳細寫一下。
壞塊
SMART 表示您的磁碟機有壞塊。對任何 SSD 來說,這都是正常現象,因為它們會老化,磁碟機會將資料重新分配到備用區塊。一旦耗盡備用驅動器,就需要更換驅動器。
SMART 表示壞塊數量在「正常」範圍內:這裡最重要的屬性是Reallocated_Sector_Ct
和Runtime_Bad_Block
。
它說它檢測到 311 個壞塊,並將 311 個重新分配到備用區塊中。這很好。如果有 311 個壞區塊,但只有 310 次重新分配,則表示其中一個區塊中的資料遺失。
重要的是“標準化”值(038)。這就是製造商告訴您他們認為正常的情況的方式。
一個值,其中 100 表示完美,0 表示非常糟糕。現在是 38,這意味著「情況越來越糟」;但製造商說只要該值高於 010(閾值)就可以。
這裡我們得到了第一個互相矛盾的訊息:Used_Rsvd_Blk_Cnt_Tot
說保護區根本沒有被觸及,儘管有壞塊。它不相加。
但如果韌體儘管報告了該值但沒有追蹤該值,我也不會感到驚訝,因此我們暫時忽略它。
磨損均衡
這是閱讀時最有問題的屬性。Wear_Leveling_Count
說它是 001。
這意味著它已經用完了備用塊。但存在韌體錯誤,該屬性會向後報告,值為 1 表示驅動器處於 99% 的運作狀況。
用一個總重量計算器我插入了您寫入的 LBA 數量 + 512 磁區大小,並發現您的磁碟機已寫入 77.43TiB。根據谷歌,你的模型應該有 150TBW 所以它應該仍然可以生存。
恐怕最好的解決方案是啟動 Windows 盒子並運行水晶磁碟資訊它解釋了這些韌體錯誤(使用內部資料庫),並將向您報告非常準確的健康評估。
鑑於你的 smart 說SMART overall-health self-assessment test result: PASSED
我傾向於相信它想說的是 99%,而不是 1%。
但如果我錯了,我們可以到此為止,必須更換磁碟。
電纜問題/主機板問題
Linux dmesg 中的錯誤基本上表明它嘗試讀取扇區並獲取了錯誤資料。
核心甚至說它嘗試讀取扇區 235602696 兩次並得到不同的資料:
- 28 00 0e 0b 03 08 00 002000
- 28 00 0e 0b 03 08 00 000800.
如果磁碟顯示沒有錯誤,但作業系統顯示有錯誤;然後資料在傳輸過程中被損壞。通常這表示:
- SATA 電纜鬆動
- SATA 線損壞
- 電源線插頭鬆動
- 電源線損壞
- 主機板總線故障
- 電源故障
- 記憶體故障
但這就是我們所擁有的我們的第二個相互矛盾的資訊來源: UDMA_CRC_Error_Count
是 0。
這意味著磁碟從未偵測到由電纜損壞/鬆動或主機板匯流排損壞所引起的單一錯誤。
這是非常不可能的。 SMART 表示磁碟狀況良好,從作業系統到達磁碟的命令絕不會因接線不良而損壞;然而作業系統讀取同一扇區兩次並得到不同的位元組。
我能想到的唯一能讓這成為可能的事情是如果你的內存不好。或者是一種極不可能的電纜問題,其中進入磁碟的所有資料都不會損壞,但從磁碟中取出的資料確實會損壞。
行動方針
我的直覺告訴我磁碟壞了。但:
- 將所有資料備份到另一個磁碟。在 LiveUSB 運行中(以及足夠大的外部 USB 驅動器):
sudo apt install zstd
# To backup
sudo zstd -16v < /dev/sda > /media/external_disk/backup_file.zst
# To restore (don't do that on step 1, see step 5)
sudo zstdcat -v /media/external_disk/backup_file.zst > /dev/sda
- 再次備份數據,但這次僅使用常規副本文件(如果磁碟損壞,從簡單備份中恢復比嘗試循環掛載磁碟的壓縮 zstd 映像並從中讀取文件要容易得多)
- 重新啟動並執行記憶體測試以丟棄 RAM 錯誤
- 關機,打開機箱,然後重新拔除並插入 SATA 和電源(驅動器)電纜。檢查它們沒有損壞。可能會替換它們。
- 再次啟動 LiveUSB 磁碟機並執行磁碟安全性擦除。如果您的驅動器出現問題,也許這會將其重置回工作狀態(或者如果磁碟無法挽救,可能會導致它運行最後一個命令)。這應該需要幾分鐘:
sudo blkdiscard -s /dev/sda
- 如果到目前為止一切順利,請使用
sudo zstdcat
步驟 1 中的命令還原備份。
如果磁碟仍然有問題且 memtest 成功,那麼我個人會將磁碟判定為壞磁碟。
我們不能忽視 038 的價值意味著Reallocated_Sector_Ct
情況正在變得糟糕,儘管製造商表示還沒有「那麼」糟糕。
啊!重要提示:如果在某個時候您將磁碟關閉超過 3 個月;這種情況很有可能發生。儘管人們普遍認為,NAND 單元如果長時間未通電(「太長時間」可能是 7 天到 7 年;但最常見的情況是 3 個月),可能會失去儲存能力。特別是如果他們老了。
如果您遇到這種情況,則只需執行上述步驟:備份資料、安全性清除磁碟、復原備份。
祝你好運。