我在 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 天进行检查,以较早发生者为准。
检查 SMART
正如其他人所说,这只是硬件问题的权宜之计。有时是硬盘坏了,有时是无关的硬件问题(执行内存测试),有时只是 SATA 电缆松动(从两端拔下并重新插入,如果这不能解决问题,请尝试另一根电缆)。
小心最坏的情况,PSU 出现故障并损坏其余硬件(在这种情况下,更换 HDD 只能暂时解决问题,因为随着时间的推移,新的 HDD 将被 PSU 损坏)。检查电压是否在可接受的水平内。
发布智能的输出:
sudo smartctl -a /dev/sda
可以帮助诊断可能发生的情况。
更新
我不知道为什么你不能通过 tune2fs 运行 fsck。
但是我看了你的 SMART。据它显示你的磁盘正在老化,但看起来还很健康。
问题可能出在其他地方,例如 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 表示您的驱动器已损坏,必须尽快更换。
这意味着它已经用完了备用块。但是,有些固件错误会导致此属性被反向报告,值为 1 表示驱动器的健康状况为 99%。
用一个TBW 计算器我输入了您写入的 LBA 数量 + 512 扇区大小,结果显示您的驱动器已写入 77.43TiB。根据谷歌,您的型号应该有 150TBW,因此应该仍然可行。
恐怕最好的解决方案是启动 Windows 系统并运行晶盘信息它可以解释这些固件错误(使用内部数据库)并向您报告非常准确的健康评估。
鉴于您的聪明才智,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 线损坏
- 电源线插松
- 电源线损坏
- 主板总线故障
- PSU 故障
- RAM 故障
但我们现在我们的第二个相互矛盾的信息来源: UDMA_CRC_Error_Count
为 0。
这意味着磁盘从未检测到由电缆损坏/松动或主板总线损坏引起的单个错误。
这不太可能。SMART 表示磁盘没有问题,从操作系统进入磁盘的命令从未因接线错误而损坏;但操作系统读取同一个扇区两次,得到的是不同的字节。
我能想到的唯一可能导致这种情况发生的情况是你的 RAM 有问题。或者极不可能发生电缆问题,所有进入磁盘的数据都不会损坏,但从磁盘传出的数据会损坏。
行动方针
我的直觉告诉我磁盘有问题。但是:
- 将所有数据备份到另一个磁盘。在 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 个月),它们可能会失去存储能力。特别是如果它们很旧的话。
如果您遇到这种情况,只需执行上述步骤:备份数据、安全擦除磁盘、恢复备份。
祝你好运。