更新

更新

我在 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_CtRuntime_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 有问题。或者极不可能发生电缆问题,所有进入磁盘的数据都不会损坏,但从磁盘传出的数据会损坏。

行动方针

我的直觉告诉我磁盘有问题。但是:

  1. 将所有数据备份到另一个磁盘。在 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
  1. 再次备份数据,但这次只使用常规复制文件(如果磁盘坏了,从简单的备份中恢复要比尝试循环安装磁盘的压缩 zstd 映像并从中读取文件容易得多)
  2. 重新启动并运行内存测试以消除 RAM 错误
  3. 关机,打开机箱,拔下并重新插入 SATA 和电源(驱动器)电缆。检查它们是否损坏。可能需要更换它们。
  4. 再次启动 LiveUSB 驱动器并执行磁盘安全擦除。如果您的驱动器出现问题,这也许会将其重置为工作状态(或者,如果磁盘无法挽救,这也许会导致它运行的最后一个命令)。这应该需要几分钟:
sudo blkdiscard -s /dev/sda
  1. 如果到目前为止一切顺利,请使用sudo zstdcat步骤 1 中的命令恢复备份。

如果磁盘仍然有问题并且 memtest 成功,那么我个人会判定该磁盘为坏的。

我们不能忽视,038 的数值意味着Reallocated_Sector_Ct情况正在变得糟糕,尽管制造商表示情况还没有“那么”糟糕。

啊!重要提示:如果在某个时候你让磁盘关闭超过 3 个月,这种情况很有可能发生。尽管人们普遍认为,如果 NAND 单元长时间断电(“长时间”可以是 7 天到 7 年,但最常见的情况是 3 个月),它们可能会失去存储能力。特别是如果它们很旧的话。

如果您遇到这种情况,只需执行上述步骤:备份数据、安全擦除磁盘、恢复备份。

祝你好运。

相关内容