我需要测试一些嵌入式硬件的一些读/写代码的弹性。我怎么可能牺牲一些 SD 卡并破坏几个已知扇区来进行对照研究?
我唯一能想到的就是将单个扇区覆盖几百万次。我想知道是否可以创建一个 Linux badblocks 脚本来在单个扇区上重复运行几个小时的破坏性测试。
我在 1TB 驱动器上运行坏块(或者更确切地说是“e2fsck -c”),如果进度指示器有任何指示(没有双关语),它几乎需要永远才能完成。
现在它说0.01% done, 30:20 elapsed这意味着这件事需要 17 周左右才能完成,这在我的书中似乎有些过分。
这是进行此类检查的正常时间,还是仅仅因为我的怀疑是正确的,因为驱动器出现故障,从而导致检查时间仅略短于永恒?
我在这里找到了这个问题,但这与完成的传球数量有关。
我想使用坏块来检查我的硬盘,并希望对其操作进行澄清。
有人可以解释与-b和一起使用的最佳选择-c吗?我已经在手册页中包含了它们的定义,但我不确定更大的尺寸是否对具有 64MB RAM 和 4k 扇区的现代磁盘有益。
-b block-size Specify the size of blocks in bytes. The default is 1024.
-c number of blocks the number of blocks which are tested at a time. The default is 64
Run Code Online (Sandbox Code Playgroud)
其次我想知道写模式测试是否比非破坏性读写模式更彻底?
最后,有多少 SMART 扇区重新分配是可以接受的/是否应该立即更换具有非零重新分配计数的驱动器?
我在两盘软件 RAID-1 中有一个磁盘,最近在 SMART 状态下出现了“离线不可纠正扇区”。
198 Offline_Uncorrectable 0x0030 200 200 000 Old_age Offline - 1
Run Code Online (Sandbox Code Playgroud)
如果它越来越频繁地发生,这显然只是磁盘即将发生故障的迹象(并且由于驱动器是镜像的,因此实际数据丢失的风险也不大)。当时,自检在某些时候也失败了,并向smartd我发送了一封电子邮件以通知我这当然应该这样做。
但是,写入损坏的扇区通常会导致磁盘使用其备用扇区之一,而这显然是因为自从我检查dd了磁盘后,所有自检都运行得很好。而且badblocks还发现没有理由抱怨。
Num Test_Description Status Remaining LifeTime(hours) LBA_of_first_error
[...]
# 5 Extended offline Completed without error 00% 5559 -
# 6 Short offline Completed without error 00% 5540 -
# 7 Short offline Completed: read failure 90% 5524 63273368
Run Code Online (Sandbox Code Playgroud)
故障扇区的数量并没有减少,但实际上不应该减少,因为损坏的扇区仍然存在,尽管未使用。然而,smartd每天晚上继续给我发电子邮件:
The following warning/error was logged by the smartd daemon:
Device: /dev/sda [SAT], 1 Offline uncorrectable sectors
Run Code Online (Sandbox Code Playgroud)
这显然非常烦人,并且麻木了我对 …
我正在执行全新的 Linux 安装,在我开始安装之前,我认为现在是验证 HDD 健康状况的好时机,因为如果需要,我可以安全地覆盖 HDD 上的任何数据。
首先,我尝试使用 smartmontools 检查...我的 Seagate HDD 报告一个当前待处理的扇区和一个无法更正的离线扇区(大概是同一个)。重新分配的扇区数为零。
5 Reallocated_Sector_Ct 0x0033 100 100 036 Pre-fail Always - 0
...
197 Current_Pending_Sector 0x0012 100 100 000 Old_age Always - 1
198 Offline_Uncorrectable 0x0010 100 100 000 Old_age Offline - 1
Run Code Online (Sandbox Code Playgroud)
然而,SMART 自测(短、长、离线、传输)没有发现错误。
SMART Self-test log structure revision number 1
Num Test_Description Status Remaining LifeTime(hours) LBA_of_first_error
# 1 Extended offline Completed without error 00% 6631 -
# 2 Conveyance offline Completed without error 00% 6630 -
# …Run Code Online (Sandbox Code Playgroud) 我从 eBay 购买了 64 GB SD 卡。当我将 Arch Linux ARM 映像刻录到它并使用它来启动我的 Raspberry Pi 时,它工作正常。
但是,当我尝试在其上创建单个 ext4 分区以使用卡的所有容量时,会发生错误。mkfs.ext4总是幸福地结束;但是,分区不能被mount编辑,总是抛出错误并dmesg显示内核消息包括Cannot find journal. 事实证明,至少在两个平台上都是这种情况:Arch Linux ARM 和 Ubuntu 13.04。
另一方面,我可以无误地创建和挂载 FAT32 分区(尚未完成全容量检查)。
我听说有些坏人可以更改 SD 卡接口以向操作系统报告错误的容量(即该卡实际上只有 2 GB,但它报告自己为 64 GB),以便以更好的价格出售该卡。
我知道有类似的工具badblocks可供我检查 SD 卡是否存在坏块。能badblocks检测出这样的问题吗?如果没有,还有什么其他解决方案可供我测试卡?
理想情况下,我想知道我是否被骗了;如果结果显示我刚收到一件坏物品,我只能退回给卖家,而不是向 eBay 报告有人试图欺骗我。
更新
操作和消息:
~$ sudo mkfs.ext4 /dev/sde1
mke2fs 1.42.5 (29-Jul-2012)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
4096000 inodes, …Run Code Online (Sandbox Code Playgroud) “坏块”的完整读/写表面扫描与内置的SMART Extended 自检有何不同?
看起来它们都是全表面扫描,那么为什么badblocks -vws测试 1TB 驱动器需要3 天,而 SMART 只需 2 1/2 小时(至少这是 smartmon 给我的估计时间)?
fsck不久前,我在有问题的(未安装的)分区上运行了-c。该过程无人值守,结果未存储在任何地方(坏块 inode 除外)。
现在我想获取坏块信息,以了解硬盘驱动器是否有任何问题。不幸的是,分区是在生产系统中使用的,无法卸载。
我看到了两种获得我想要的东西的方法:
运行badblocks在只读模式。这可能会花费大量时间,并对系统造成不必要的负担。
以某种方式从文件系统本身提取有关坏块的信息。
如何查看已挂载的文件系统中注册的已知坏块?
使用传统的旋转磁盘诊断相当容易。如果您怀疑驱动器有故障,您可以检查 SMART 值,运行 SMART 扩展测试和badblocks -wsv测试。如果所有三个测试都没有显示错误,则驱动器可能/通常没问题。
对于 SSD 或现代 NVMe 驱动器,我们应该怎么做?
显然,SMART 仍然是一个好主意,但如果它没有错误地完成呢?badblocks -wsv在基于闪存的存储设备上运行是个好主意吗?
还有其他选择吗?
另外,如果使用badblocks什么选项是合适的?应该使用SSD的“擦除块大小”吗?
这个问题类似于我能证明固态硬盘坏了吗?但答案是从 2013 年开始的。从那时起,我们已经看到了几代闪存技术。- 另外,虽然他们建议badblocks,但我错过了关于天气的讨论,这是一个好主意。最后,有些闪存不喜欢将其写入 100%。另外,之后我们如何告诉 SSD 哪些扇区是空闲的(再次)?
如何修复SSD上的坏块也不令人满意。
在 SSD 上运行 CHKDSK 有多安全?只讨论影响chkdsk
我找不到处理这个问题的其他资源。
我在互联网上的某个地方读到gddrescue优于dd 至少在能够区分在有问题的扇区上执行的磁盘读取量方面。真的是这样吗?
时间 dd if=/dev/sda skip=900343967 of=a.bin count=4 iflag=direct conv=noerror,sync
dd: 读取`/dev/sda': 输入/输出错误
2+0 记录中的
2+0 记录
复制了1024 字节 (1.0 kB),18.6057 秒,0.1 KB/s 4+0 记录中的
3+1
记录输出
2048复制的字节 (2.0 kB),18.6707 s,0.1 kB/s真实 0m18.672s
用户 0m0.000s
系统 0m0.004s
顺便说一句,直接标志真的很有帮助,没有它我只能读取 4 个扇区中的 1 个(与 3/4 相比)。然而,这明显降低了传输速度——对我来说至少慢了大约 5 倍:5MB/s vs 25MB/s没有这个标志。无论如何,现在对于gddrescue (ddrescue) 部分..
时间 ddrescue -b512 -c1 -s4b -dnvD -i900343967b -o0b /dev/sda b.bin
即将从 /dev/sda 复制 2048 字节到 b.bin
起始位置:infile = …
bad-blocks ×10
hard-drive ×5
linux ×5
smart ×3
bad-sectors ×2
sd-card ×2
dd ×1
ext2 ×1
ext3 ×1
ext4 ×1
ssd ×1