AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 104417
Accepted
Nelson
Nelson
Asked: 2010-01-20 17:10:15 +0800 CST2010-01-20 17:10:15 +0800 CST 2010-01-20 17:10:15 +0800 CST

如何轻松修复 Linux 磁盘上的单个不可读块?

  • 772

我的 Linux 系统开始在 syslog 中抛出 SMART 错误。我对其进行了追踪,并认为问题出在磁盘上的单个块上。如何轻松地让磁盘重新分配那个块?我想知道在这个过程中什么文件被破坏了。(我知道,如果磁盘上的一个块发生故障,其他块可能会跟随;我有一个很好的持续备份,只是想尝试保持该磁盘正常工作。)

在网络上搜索会导致Bad block HOWTO,它描述了在卸载磁盘上的手动过程。这似乎很复杂且容易出错。是否有工具可以在 Linux 中自动执行此过程?我唯一的其他选择是制造商的诊断工具,但我认为这会破坏坏块,而不会报告损坏的内容。最坏的情况,它可能是文件系统元数据。

有问题的磁盘是主系统分区。使用 ext3fs 和 LVM。这是来自 syslog 的错误日志和来自 smartctl 的相关位。

smartd[5226]: Device: /dev/hda, 1 Currently unreadable (pending) sectors

Error 1 occurred at disk power-on lifetime: 17449 hours (727 days + 1 hours)
... Error: UNC at LBA = 0x00d39eee = 13868782

pastebin上有一个完整的 smartctl 转储。

hard-drive linux lvm smart smartctl
  • 6 6 个回答
  • 27401 Views

6 个回答

  • Voted
  1. tenner
    2012-09-23T17:24:09+08:002012-09-23T17:24:09+08:00

    我曾经为WD写磁盘固件,我曾经写过重新分配坏块的固件。

    首先,大多数坏块是在读取时检测到的,而不是在写入时检测到的。写入是盲目进行的,这意味着数据在未经检查的情况下写入。因此,如果介质损坏,则在写入时,在主机读取该扇区之前您不会知道它。有一小部分扇区(扇区头)在写入时被读取以定位正确的扇区,因此如果读取扇区头时出现错误,驱动器将重新分配扇区并将接收到的数据写入从写命令。但是绝大多数坏块都是在读取时检测到的,仅仅因为一个扇区的写入成功并不意味着介质是好的或该扇区已被重新分配。

    现在关于坏块重新分配(也称为重新分配)。是的,通常情况下,如果错误严重(即 ECC 故障已经严重),驱动器将尝试重新分配扇区,但在 ECC 更正后,驱动器仍然可以恢复数据。通常这是自动完成的。唯一的例外是主机之前可以告诉驱动器不要进行自动重新分配,但很少这样做。

    那么如果驱动器进行读取并且无法恢复数据会发生什么?没有什么。错误会报告给主机,但不会重新分配。问题是驱动器可以重新分配扇区,但它根本不知道要在新重新分配的扇区中写入什么数据。例如,如果它只是写了一堆零,然后再次读取该扇区,它将返回所有零,而没有任何迹象表明数据无效。这与数据损坏本质上是一样的。由于各种原因,驱动器不能指望主机跟踪错误(例如,如果驱动器被移动到新主机怎么办?),所以最好的做法是当数据可以时什么都不做不能恢复。

    但是,现代驱动器会在无法重新分配坏扇区时保存坏扇区的位置。可以在 SMART 数据中找到等待重新分配的坏扇区的数量。发生的情况是,如果对等待重新分配的坏扇区之一进行了写入,则重新分配已完成,因为驱动器现在在重新分配后具有要写入的有效数据。因此,当人们说写入坏扇区会重新分配它时,这实际上只是故事的一半。必须先读取驱动器,以便驱动器可以发现所有无法自动重新分配的坏扇区。因此您可以写入整个驱动器,SMART 数据会说没有坏扇区等待重新分配,但您不一定清除所有坏扇区的驱动器。因此,如果您真的想清除所有坏扇区的驱动器,

    还有其他处理无法重新分配的坏块的方法。如果驱动器是冗余 RAID 配置的一部分(即除 RAID 0 之外的任何配置),RAID 软件应自动从其他驱动器恢复坏扇区的数据并将其写入重新分配的扇区。SCSI 磁盘有一个明确的重新分配块命令,即使没有有效数据写入块,主机也可以使用该命令强制重新分配,但它的使用非常低级。

    • 36
  2. Best Answer
    James
    2010-01-26T09:44:50+08:002010-01-26T09:44:50+08:00

    你可以试试hdparm --write-sector <LBA> /dev/ice。

    我不知道这样做的任何其他方式 - 您需要手动将 LBA 转换为文件系统块(正如您已经找到的那样)

    • 13
  3. Matthew Flaschen
    2010-01-20T17:20:59+08:002010-01-20T17:20:59+08:00

    我想你所要做的就是:

    e2fsck -c /dev/hda1
    

    假设 /dev/hda1 是(未挂载的)分区。或者:

    e2fsck -c -c /dev/hda1
    

    做一个(较慢的)非破坏性读写测试。它仍然必须卸载。不过,我认为这不会为您提供任何丢失数据的详细信息。

    • 3
  4. 3dinfluence
    2010-01-20T18:10:21+08:002010-01-20T18:10:21+08:00

    迈克尔说得对,在大多数情况下,我会说只是更换便宜的驱动器。但是,如果您没有备份并且无法从驱动器中获取重要数据,或者只是想尝试修复驱动器,那么您可能需要尝试在最高级别上使用spinrite 。

    几年前,我有一个笔记本电脑驱动器开始发出一些噪音。坏块显示驱动器有 118 个左右的坏块对最终用户可见。由于我已经拥有 SpinRite 的副本,因此我决定在购买新驱动器之前尝试一下。在驱动器坏块上运行 spinrite 后,显示 0 个坏块并且噪音停止。从那时起,该驱动器已经工作了两年多。

    • 2
  5. Jahith
    2016-03-10T03:48:16+08:002016-03-10T03:48:16+08:00

    如果您有备份并且您知道这是一个逻辑错误而不是物理错误,那么解决此问题的最佳方法是将磁盘归零。

    我会使用 MHDD,它相当容易使用,只要您记得在 Bios 中将 HDD 设置为 IDE 仿真,然后在您的工作完成后返回 AHCI,您就无需担心。

    启动到 MHDD 后,在 ERASE 命令中选择您的驱动器类型并确认您的选择。

    给自己买咖啡,这可能需要一段时间。

    驱动器归零后,运行扫描(f4)并将重映射设置为打开(默认为关闭)。如果驱动器仍然存在问题(这意味着盘片上存在物理损坏并且驱动器处于稳定向下的斜坡上),此选项将通过将损坏区域映射到驱动器的健康部分来“修复”它们。

    如果没有 UNC 错误,那么恭喜您和您的硬盘在未来几年仍然可以成为朋友。

    • 1
  6. Michael Graff
    2010-01-20T17:58:15+08:002010-01-20T17:58:15+08:00

    如果磁盘坏了,请更换它。不值得冒它会更加崩溃的风险。

    • -1

相关问题

  • 你最喜欢的 Linux 发行版是什么?[关闭]

  • 更改 PHP 的默认配置设置?

  • 保护新的 Ubuntu 服务器 [关闭]

  • 为什么添加新驱动器后我的磁盘驱动器访问速度如此之慢?

  • (软)Ubuntu 7.10 上的 RAID 6,我应该迁移到 8.10 吗?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    从 IP 地址解析主机名

    • 8 个回答
  • Marko Smith

    如何按大小对 du -h 输出进行排序

    • 30 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    MikeN 在 Nginx 中,如何在维护子域的同时将所有 http 请求重写为 https? 2009-09-22 06:04:43 +0800 CST
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    0x89 bash中的双方括号和单方括号有什么区别? 2009-08-10 13:11:51 +0800 CST
  • Martin Hope
    Kyle Brandt IPv4 子网如何工作? 2009-08-05 06:05:31 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve