避免 ext4 中的块损坏

避免 ext4 中的块损坏

我在跑步

$ uname -a
Linux myhostname 4.14.15-041415-generic #201801231530 SMP Tue Jan 23 20:33:21 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux
$ lsb_release -a
No LSB modules are available.
Distributor ID: Nitrux
Description:    Nitrux 1.1.4
Release:        1.1.4
Codename:       nxos

ext4它有一个带有系统分区和交换分区的硬盘。硬盘既不能完成Smartshort测试,也不能完成Smart测试long

SMART Self-test log structure revision number 1
Num  Test_Description    Status                  Remaining  LifeTime(hours)  LBA_of_first_error
# 1  Short offline       Completed: read failure       90%     32232         11202419
# 2  Extended offline    Completed: read failure       90%     32229         11202419

也许应该更换磁盘。

同时,是否可以简单地指示文件系统避免对应的块LBA?这样就不会从那里产生进一步的读/写错误。事实上,这似乎是一个孤立的错误,硬盘(当然,该区域除外)仍然可以工作。


SMART参数很奇怪,因为有待重新分配的扇区,但也有0重新分配的扇区。请注意,该硬盘已有大约 10 年的历史。

ID# ATTRIBUTE_NAME          FLAG     VALUE WORST THRESH TYPE      UPDATED  WHEN_FAILED RAW_VALUE
  1 Raw_Read_Error_Rate     0x002f   200   200   051    Pre-fail  Always       -       19
  3 Spin_Up_Time            0x0027   140   139   021    Pre-fail  Always       -       3966
  4 Start_Stop_Count        0x0032   098   098   000    Old_age   Always       -       2058
  5 Reallocated_Sector_Ct   0x0033   200   200   140    Pre-fail  Always       -       0
  7 Seek_Error_Rate         0x002e   100   253   000    Old_age   Always       -       0
  9 Power_On_Hours          0x0032   056   056   000    Old_age   Always       -       32232
 10 Spin_Retry_Count        0x0032   100   100   000    Old_age   Always       -       0
 11 Calibration_Retry_Count 0x0032   100   100   000    Old_age   Always       -       0
 12 Power_Cycle_Count       0x0032   098   098   000    Old_age   Always       -       2001
192 Power-Off_Retract_Count 0x0032   200   200   000    Old_age   Always       -       206
193 Load_Cycle_Count        0x0032   200   200   000    Old_age   Always       -       1851
194 Temperature_Celsius     0x0022   103   086   000    Old_age   Always       -       40
196 Reallocated_Event_Count 0x0032   200   200   000    Old_age   Always       -       0
197 Current_Pending_Sector  0x0032   200   200   000    Old_age   Always       -       78
198 Offline_Uncorrectable   0x0030   200   200   000    Old_age   Offline      -       70
199 UDMA_CRC_Error_Count    0x0032   200   200   000    Old_age   Always       -       0
200 Multi_Zone_Error_Rate   0x0008   200   200   000    Old_age   Offline      -       89

在里面链接页面没有选择的答案。我必须保持系统正常运行,并且我想避免dd(并且没有关于如何在这种情况下使用它的明确示例)。我可以fsck.ext2 -c在已安装的文件系统上运行吗?

答案1

e2fsck手册页(e2fsck也链接到名称fsck.ext2fsck.ext3fsck.ext4):

请注意,通常在已安装的文件系统上运行 e2fsck 并不安全。唯一的例外是如果-n指定了该选项,并且-c-l-L选项是不是指定的。但是,即使这样做是安全的,e2fsck如果安装了文件系统,打印的结果也无效。如果e2fsck询问是否应该检查已安装的文件系统,唯一正确的答案是“否”。只有真正了解自己在做什么的专家才应该考虑以其他方式回答这个问题。

所以答案是“不,您不能fsck以任何会对文件系统进行任何更改的模式在已安装的 ext2/3/4 文件系统上运行”。

启动时,当根文件系统以只读模式挂载或系统仍在 initramfs 上运行时,可能会检查根文件系统。但在这种情况下,如果系统fsck指示必须进行任何更改,则应立即重新启动系统。


如果磁盘块完全失败,即使重复重试也不会导致磁盘确信数据已被正确读取,则磁盘无法自动重新分配该块,直到其内容被操作系统覆盖 - 因为重新分配不需要拥有正确的数据相当于默默地破坏数据(通过用零替换数据块)。那是更差与仅产生读取错误的文件相比,因为损坏的数据可能会用于进一步处理,并默默地导致其他结果被损坏,直到最终被注意到。

产生读取错误的文件通常很容易从备份中恢复,除非它是关键的系统文件并且如果该文件丢失则系统崩溃或无法运行恢复工具。

SMART 指示有待重新分配的扇区但没有实际重新分配的事实可能仅意味着失败的扇区被通常只读取而实际上从未写入的系统文件占用。如果您可以找出这些文件属于哪个包,则可以指示包管理系统重新安装该包; Nitrux 似乎使用.deb包,因此apt-get reinstall <package name>运行的命令也是如此。这将导致文件被重写,从而使磁盘完成重新分配。

不幸的是,一些磁盘制造商创建的磁盘具有不完整的 SMART 实现,因此只有在 SMART 带来坏消息时您才能真正信任它;如果它说一切正常,但操作系统报告读/写错误,那么无论 SMART 怎么说,都有问题 - 由于 HDD 是磨损件,因此在大多数情况下是磁盘出现故障。


20 多年来,我一直在服务器管理领域担任各种职务。一直以来,我们的团队看到仍在使用的 10 多年旧磁盘时的反应是——现在仍然是:

“天哪!如果该磁盘因任何原因停止旋转,实际上根本无法保证它会再次重新启动。我们甚至可以以任何合理的价格和响应时间获得这样的旧硬件的备件吗?至少,我们需要就该做什么制定一个非常现实的计划什么时候(不是如果)那个东西失败了,最好现在就尽快更换或虚拟化那个旧东西。”

诚然,我们处理的服务器在其整个生命周期中几乎每年每天 24 小时都在运行 - 而您的系统可能并非如此。

但是,一个已有 10 年历史的磁盘,如果在其设计的细分市场的“典型”方式附近使用,那么它肯定会很好地进入上升边缘。浴缸曲线:它的设计寿命已经超过并且已经磨损。

相关内容