【问题标题】:Recovery from optical media ignoring read errors从忽略读取错误的光学介质中恢复
【发布时间】:2010-09-14 00:39:37
【问题描述】:

我有存档在光学媒体(CD 和 DVD)中的文件的备份。这些都有 par2 恢复文件,存储在单独的媒体上。即使在没有 par2 文件的情况下,在一个光驱上读取时的小错误也可以在另一个光驱上正常读取。

问题是,当读取有故障的媒体时,读取时间非常非常长,因为设备往往会重试多次。

问题是:如何控制重试次数(即设置为不重试或只试一次)?一些系统调用?可以下载的库吗?我必须在 SCSI 层上工作吗?

这个问题主要是关于 Linux 的,但也欢迎任何 Win32 指针。

【问题讨论】:

    标签: windows linux recovery system-calls optical-drive


    【解决方案1】:

    dd(1) 是你的朋友。

    dd if=/dev/cdrom of=image bs=2352 conv=noerror,notrunc

    驱动器可能仍会重试一下,但我认为如果不修改固件,您不会变得更好。

    【讨论】:

    • 我认为这不会减少光驱的重试次数。 noerror 只是意味着 dd 在读取块失败后将继续,而不是中止。我认为只有在光驱尝试了所有可能的方法后,读取块的失败才会传播到 dd。
    • 除了 Alexander 的评论之外,您对 bs=2352 的建议意味着您认为读取“原始”设备允许您读取所有 ECC 数据,而不管扇区是否为模式 1(典型用于 CD-ROM光盘)
    • Alexander,问题是大多数应用程序在 read() 失败时要么中止,要么更可能重试(可能是因为它认为媒体稍后可用)。因此,虽然您没有减少每次尝试的读取次数,但您正在减少尝试次数。
    • 好点,@Daniel。我想知道标准工具,比如 cp 是否会在应用程序级别重试。实际上,如果可以使用 dd 来读取 Mode-1 光盘,就好像它是 Mode-2 光盘一样,它就可以工作。但我怀疑硬件可以解决这个问题。
    【解决方案2】:

    在检查hdparm 是否可以修改重试次数(似乎不是)时,我认为,根据错误的类型,降低 CD-ROM 速度可能会减少读取错误的数量,这实际上可以提高平均读取速度。但是,如果某些扇区完全无法读取,那么即使降低 CD-ROM 速度也无济于事。

    【讨论】:

      【解决方案3】:

      由于 dd 被建议,我应该注意我知道存在并且使用了 sg_dd,但我的问题不是关于命令 (1) 或 (1m),而是关于系统调用 (2) 或库 (3)。

      编辑

      另一个有用的 linux 命令行实用程序是 sdparm。以下标志似乎禁用了硬件重试:

      sudo sdparm --set=RRC=0 /dev/sr0
      

      /dev/sr0 是我的光驱设备。

      【讨论】:

      • 我不知道 sg_dd。感谢您提及!
      • 这个包,至少在Gentoo上,叫做sg3_utils。
      • 如果问题的目的是“不是关于命令 (1) 或 (1m)”,您应该在问题中这样说
      • 这是一个面向程序员的网站,所以这是一道编程题。我给出了我想要的指针的示例:系统调用、我可以下载的库或 SCSI 层。
      【解决方案4】:

      既然您询问的是驱动程序级别的访问,您应该查看 SCSI 命令,或者可能是类似 ASPI 的 API。在 windows VSO 软件(下面的盲读/盲写的开发者)开发了一个更好的 API,Patin-Couffin,它提供锁定的低级访问:

      http://en.wikipedia.org/wiki/Patin-Couffin

      这可能会让你开始。然而,归根结底,驱动器与 SCSI 命令接口,即使它实际上是 USB、SATA、ATA、IDE 或其他。您还可以查找与 ATAPI 相关的术语,这是该 CD-ROM SCSI 层接口的首批规范之一。

      如果您找不到合适的 linux 库或使用上述搜索术语和概念处理较低级别命令的示例,我会感到惊讶。


      旧答案:

      Blindread/blindwrite 是在 cd-rom 保护方案的鼎盛时期开发的,通常使用故意坏扇区或错误信息来验证原始 CD。

      它将允许您设置一系列参数,包括重试。请记住,CD-ROM 驱动器本身决定了重试的次数,我不确定这是否可以通过软件为许多(大多数?)CD-ROM 驱动器设置。

      您可以将磁盘复制为 ISO 格式,忽略错误,然后使用 ISO 实用程序读取数据。

      -亚当

      【讨论】:

        【解决方案5】:

        man readom,cdrecord自带的程序:

           -noerror
                  Do not abort if the high level error checking in readom found an
                  uncorrectable error in the data stream.
        
           -nocorr
                  Switch  the  drive  into  a mode where it ignores read errors in
                  data sectors that are a result of uncorrectable  ECC/EDC  errors
                  before reading.  If readom completes, the error recovery mode of
                  the drive is switched back to the remembered old mode.
           ...
        
           retries=#
                  Set the retry count for high level retries in readom to #.   The
                  default  is  to do 128 retries which may be too much if you like
                  to read a CD with many unreadable sectors.
        

        【讨论】:

        • 是的,readom 源代码似乎与我所寻求的最接近。在授予赏金之前,我会再等一会儿。谢谢。
        【解决方案6】:

        看看ASPI 接口。在 windows 和 linux 上都可用。

        【讨论】:

          【解决方案7】:

          可用的最佳工具是 dd_rhelp。只是

          dd_rhelp /dev/cdrecorder /home/myself/DVD.img
          

          ,喝杯茶,看看漂亮的图形。

          dd_rhelp rpm 包信息:

          dd_rhelp 在整个光盘上使用 ddrescue,并尝试收集最大 在尝试对坏扇区进行多年之前的有效数据。如果您离开 dd_rhelp 工作 对于无限时间,它具有与简单的 dd_rescue 类似的效果。但是因为 你可能没有这个无限的时间,dd_rhelp 跳过坏扇区并救援 有效数据。从长远来看,它会使用 dd_rescue 解析您的所有设备。

          您可以随时按Ctrl-C,然后随意重新运行,dd_rhelp 恢复 作业,因为它取决于 dd_rescue 创建的日志文件。此外,进展 显示在您被救出的设备的 ASCII 图片中。

          我自己用过很多次,非常非常实用。

          您可以将它从 DAG 安装到类似 Red Hat 的发行版中。

          【讨论】:

            猜你喜欢
            • 2013-11-15
            • 1970-01-01
            • 2018-03-18
            • 2012-09-16
            • 2020-09-29
            • 2018-12-06
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多