![避免 ext4 中的块损坏](https://linux22.com/image/188546/%E9%81%BF%E5%85%8D%20ext4%20%E4%B8%AD%E7%9A%84%E5%9D%97%E6%8D%9F%E5%9D%8F.png)
我在跑步
$ 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.ext2
,fsck.ext3
和fsck.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 年历史的磁盘,如果在其设计的细分市场的“典型”方式附近使用,那么它肯定会很好地进入上升边缘。浴缸曲线:它的设计寿命已经超过并且已经磨损。