. : : ClassiClub ForuM : : .

会员中心 论坛帮助 日历事件 标记论坛已读
返回   精品技术论坛 » 技术论坛 » 『软件使用』

『软件使用』: 电脑软件推荐, 电脑软件使用, 经验分享



发表新主题 回复
 
主题工具
ASBai
 
ASBai 的头像
热心会员
 
资 料:
注册日期: May 2005
帖子: 4,721 声望值: 5
精华: 18,解答: 26
#1 旧 2013-04-04, 18:28:11 Icon16 【原创】命令行工具系列-10 跨平台磁盘恢复工具【更新:1.0.5.0426】5月18
ASBai 当前离线  

disk recovery - 转储受损的磁盘和文件

插播 (2013-12-18)
关于 Windows File API 出错自动反复重试导致 msw 版 rdd 表现不好的问题,我前一阵想到两点:
1. 也许可以通过异步 IO + IOCP 的方式绕过?
2. 也许可以通过文件映射的方式绕过?

这两天有点时间,准备试试,鲨鲨那里已经木有坏盘鸟,各位谁有合适的测试盘吗?
另外,如果 Windows 版的实际使用效果最终能够比肩 bsd 甚至 linux 版,那么还想麻烦 ccainiao 兄在给画个 GUI Shell ?


特性
  • FreeBSD recoverdisk 工具的跨平台改进版。
  • 支持手动设置块尺寸和扇区尺寸。对未受损的区域以较大的块尺寸进行高效读取,对包含坏道的块使用 Med 区块及逐扇区恢复。
  • 可指定对于每个坏扇,最多尝试重复读取几次。
  • 可指定遇到无法恢复的坏扇时,使用的填充值。
  • 直接访问源物理设备,禁用了操作系统缓存机制和预读策略:确保更可靠高效的恢复操作,防止由于缓存和预读机制而反复读取一个坏道导致性能和可靠性下降,甚至进一步损伤设备。
  • 源既可以是一个磁盘设备,也可以是普通文件。方便仅需要恢复个别有坏道文件的情形。
  • 目的既可以是一个磁盘设备,也可以是普通文件。将一个磁盘设备转储到镜像文件不需要专门准备一个扇区尺寸一致的专用磁盘,而且可以方便地使用 WinImage、R-Studio 等工具对镜像文件进行扫描和恢复。
  • 可指定冷却间隔,例如:指定 "30/5" 表示每工作 30 分钟后,自动停止 5 分钟。冷却机制防止本已损伤的设备因为过热和疲劳而进一步恶化。
  • 可指定转储的范围,跳过坏块密集或者无需进行恢复的部分。
  • 可指定日志文件和日志级别。
  • 极高的 IO 并发效率:源读取、目标写入以及日志记录均在各自的工作线程中完成。
  • 可指定读线程和写线程间的数据缓存队列尺寸,也可根据当前系统的可用物理内存数量进行自动判断。
  • 可指定进程的运行优先级。例如:较低的进程优先级可以大大降低程序对前台用户体验的影响。
  • 使用清晰的 '-from' 和 '-to' 开关项来指定源和目的以及执行前确认机制,避免由于参数错误带来的灾难性后果。
  • 支持 Win32 和纯 DOS 环境(纯DOS环境中需要 HX DOS Extender 支持且功能受限)。
  • 支持 POSIX 环境,提供 linux x86/x64、FreeBSD、Solaris 等版本下载。

更新历史

2013-04-26, Ver 1.0.5.0426
  • UPD: 改进 Windows 版的物理设备结尾判定算法。
  • UPD: 改进扇区读错误信息的显示方式。

2013-04-23, Ver 1.0.4.0423
  • NEW: 新增耗时显示。

2013-04-16, Ver 1.0.3.0416
  • NEW: 新增恢复范围(-secrange 和 -perrange)选项。

2013-04-08, Ver 1.0.2.0408
  • FIX: 修正了扇区(第三轮迭代)读取失败后,错误提示信息措辞不正确的问题。
  • UPD: 更新自动生成的日志记录格式为 'rdd_YYYYMMDD-hhmm.log'。
  • NEW: 将启动命令行记入日志文件。
  • NEW: 新增扇区尺寸自动判断功能。
  • NEW: 在每秒刷新的状态行中加入剩余尺寸提示。

2013-04-04, Ver 1.0.1.0403
  • NEW: 发布。


数据恢复算法说明

1. 首先使用较大的 IO 块尺寸(Big 块,由 '-block' 参数指定)高效地恢复源设备中尚未受损的部分,并将无法读取的 IO 块临时存入 Big 坏块队列中。

2. 当源设备中的所有内容均读取完毕后,将使用一个介于 Big 块和扇区尺寸之间的 IO 块尺寸(Med 块)来逐个读取 Big 坏块队列中记录的那些坏块。此轮迭代主要是为了以 Med 块为步进值跳过那些连续存在的坏扇(坏道)部分,以确保在硬件未被彻底损耗前尽可能多地抢救数据。类似于第一轮的 Big 块遍历,所有无法读取的 Med 块都将被存入一个 Med 坏块队列中。

3. 当源设备上的所有的 Big 坏块上均已执行了 Med 遍历后,将以扇区为单位来逐个读取 Med 坏块队列中记录的那些坏块。此时,每个扇区将最多被尝试读取 "重试次数"(由 '-retry' 选项指定)+1 次。若最终无法读取该扇区中的内容,此扇区将以 '-fill' 选项指定的值来进行填充。

以上算法确保在设备状态相对尚好的初期,尽可能地跳过坏扇/坏道密集区以更多地恢复数据。然后,在大部分完好数据均已被恢复的前提下,再进行更细致的恢复尝试。

此算法在配合设备直接访问和冷却间隔等机制后,可产生更优恢复效能。


参考案例

请参考:https://bbs.et8.net/bbs/showthread.php?t=1038956

本工具是其中 recoverdisk 的跨平台改良版,可以在 msfBSD、Linux rescue 以及 Windows PE 等各种常用恢复环境中运行。

此外,经测试,rdd 可以很好地工作在 AHCI 模式下。配合读写线程分离的设计,在未遇到错误时,基本可以当前系统的磁盘 IO 性能峰值进行数据转储;在遇到坏块时,其直接访问物理设备和禁用预读等措施也可带来相对较优的表现。

UPDATE: 更多的测试表明,在 FreeBSD 下恢复坏块较多的磁盘时,AHCI 还是比 IDC 性能差一些的。其它平台还没测完。
UPDATE: 今天的测试结果显示,linux 下 ahci 模式性能不比 ide 模式差,而且 ahci 模式下貌似还能恢复一些 ide 模式读不出来的坏扇(就是那种有点问题,但努力努力还能读出来的)。
UPDATE: Windows 平台,根据鲨鲨兄的测试结果来说表现不佳。或者在坏块较多时,系统会一直卡在某个坏块无法返回;或者恢复进度很慢,两三天也无法有什么实质性的进展。


感谢

Sharin 兄的大力支持,鲨鲨兄提了很多有用的建议,并且花费了大量时间搭建测试环境并且进行了多次测试。

也感谢鲨鲨兄挑选出来的那些 “坏得恰到好处” 的硬盘,这些硬盘这两天来饱受蹂躏,不过它们的苦难还没结束,还有几个测试再等着他们,哈哈。


帮助屏幕

代码:

#rdd

==============================================================================
  Disk Recovery Tool Ver 1.0.5.0426 by BaiYang / 2013
                           http://baiy.cn
==============================================================================
  Try to dump physically damaged disk or files

[USAGE]: rdd {-from|-fromdisk} {-to|-todisk} [Options]

==============================================================================
Options:
  -from:    - specify the source device or file path.
  -to:      - specify the destination device or file path.
  -sector:  - specify the sector or stripe size for the storage device.
                DEFAULT: auto detect (NOTE: may be faked by driver).
  -block:   - specify the maximum size per io operation should be taked.
                DEFAULT: 1MB.
  -maxbuf:  - specify maximum size of the buffer queue between the reading.
              thread and the writing thread.
                DEFAULT: smaller one of 256 blocks and one-thirdd of the
                current available (free) physical memory.
  -retry:   - maximum number of retries for a sector read error, DEFAULT: 0.
  -fill:    - specify the fill value for bad sectors, DEFAULT: 0x00.
  -secrange:- specify the sector range to dump. format is: [<begin>][-<end>].
              the sector number counted from 0.
                DEFAULT: dump whole source.
  -perrange:- specify the percentage range to dump. format: [<begin>][-<end>].
                DEFAULT: '0.00-100.00' (top to tail).
  -logfile: - write logging to specified logfile.
                DEFAULT: use './rdd_YYYYMMDD-hhmm.log'
  -loglevel - specify the lowest logging level, could be:
                DebugOnly (Most Detail)
                Info (DEFAULT)
                Warning
                Error
                FatalError
                Disabled (Close Logging Output)
  -priority:- specify the process running priority, can be:
                Idle
                BelowNormal
                Normal (DEFAULT)
                AboveNormal
                High
                Realtime
  -cooldown:- specify the duty-cycle for cooling down the device. the format
              is 'MM/mm'. e.g.: '30/10' means 10-minute cooling down break
              every 30 minutes.
                DEFAULT: no cooling down break.
  -h or -?  - this screen.
  --help    - this screen.

==============================================================================
Windows Only Options:
  -fromdisk: - specify the source disk number. '-fromdisk:X' is a shortened
               form of '-from:"\\.\PhysicalDriveX"', wherein X belongs [0..9].
  -todisk:   - specify the source disk number. '-todisk:X' is a shortened form
               of '-to:"\\.\PhysicalDriveX"', wherein X belongs [0..9].

==============================================================================
Recognized size representaion for '-sector', '-block' and '-maxbuf' options:
  Decimal digital with suffix 'm' or 'mb' (case-insensitive):
    recognized as megabytes.
  Decimal digital with suffix 'k' or 'kb' (case-insensitive):
    recognized as kilobytes.
  Decimal digital with no or others suffix: recognized as bytes.

==============================================================================
Recognized value representaion for '-fill' option:
  Hexadecimal, Prefix: 0x, x (case-insensitive)
  Octal,       Prefix: 0
  Binary,      Prefix: 0b, b (case-insensitive)
  Decimal,     Prefix: NONE (1-9)

==============================================================================
Identify the device name:
  On Windows platform, The storage device number could be identified by using
  the Disk Manager (right click 'My Computer' and select 'Management').

  On linux and other unix like platforms, the device can be found in the /dev
  folder.

==============================================================================
Examples:
  rdd -from:/dev/sda -to:~/disk.img -logfile:~/rdd-sda.log
  rdd -fromdisk:1 -todisk:2 -sector:4k
  rdd -fromdisk:1 -to:datapart2.img -sector:4k -perrange:51.45-87.5
  rdd -from:"D:\My Data\file.dat" -to:E:\rec.dat -retry:3 -fill:B10101010
  rdd -fromdisk:1 -to:D:\disk.img -sector:4k -priority:idle
  rdd -from:/dev/sda -to:/data/disk.img -cooldown:20/5
  rdd -from:/dev/sda -to:/data/disk.img -perrange:34.25
  rdd -from:/dev/sda -to:/data/disk.img -secrange:-11785600




中文帮助

代码:

#rdd

==============================================================================
                磁盘恢复工具 Ver 1.0.5.0426, 白杨 / 2013
                           http://baiy.cn
==============================================================================
  尝试转储带有物理损伤的磁盘或文件

[用法]: rdd {-from|-fromdisk} {-to|-todisk} [Options]

==============================================================================
选项:
  -from:    - 指定源设备或源文件路径。
  -to:      - 指定目标设备或目标文件路径。
  -sector:  - 指定源设备的扇区或区块(RAID)尺寸。
                默认: 自动判断(注意:驱动程序可能报告虚假尺寸)。
  -block:   - 指定每次 IO 操作的最大尺寸。
                默认: 1MB。
  -maxbuf:  - 指定读写线程间缓存队列的最大尺寸。
                默认: 256 个 IO 块或当前系统中可用物理内存的三分之一,取两者间
                的较小值。
  -retry:   - 针对单个坏扇的最大重试读取次数, 默认: 0(不重试读取)。
  -fill:    - 指定坏扇的填充值, 默认: 0x00。
  -secrange:- 指定要转储的扇区范围。格式为: [<起始扇区>][-<结束扇区>]。扇区从 0
              开始计数。
                默认: 转储整个源。
  -perrange:- 以百分比来指定要转储的范围。格式为: [<起始位置>][-<结束位置>].
                默认: '0.00-100.00' (整个源)。
  -logfile: - 指定要写入的日志文件。
                默认: 将日志写入到 './rdd-YYYYMMDD-hhmm.log'。
  -loglevel - 指定日志级别, 可以是:
                DebugOnly (最详细)
                Info (默认)
                Warning
                Error
                FatalError
                Disabled (禁用日志机制)
  -priority:- 指定进程的运行优先级, 可以是:
                Idle
                BelowNormal
                Normal (默认)
                AboveNormal
                High
                Realtime
  -cooldown:- 指定存储设备的冷却周期, 格式为: 'MM/mm'。例如: '30/10' 每工作 30 
              分钟后,冷却 10 分钟。
                默认: 持续工作,无冷却机制。
  -h or -?  - 此说明。
  --help    - 此说明。

==============================================================================
仅针对 Windows 的选项:
  -fromdisk: - 指定源磁盘号。'-fromdisk:X' 是 '-from:"\\.\PhysicalDriveX"' 的简
               写形式, 其中 X 的取值范围为 [0..9]。
  -todisk:   - 指定目标磁盘号。'-todisk:X' 是 '-to:"\\.\PhysicalDriveX"' 的简写
               形式, 其中 X 的取值范围为 [0..9]。

==============================================================================
为 '-sector', '-block' and '-maxbuf' 等选项指定尺寸:
  由 'm' or 'mb' (忽略大小写) 结尾的十进制数字: 识别为兆字节(MB)。
  由 'k' or 'kb' (忽略大小写) 结尾的十进制数字: 识别为千字节(KB)。
  其它: 识别为十进制字节数。

==============================================================================
为 '-fill' 选项指定值:
  0x, x (忽略大小写) 开头: 识别为十六进制值。
  0 开头                 : 识别为八进制值。
  0b, b (忽略大小写) 开头: 识别为二进制值。
  1-9 开头               : 识别为十进制值。

==============================================================================
识别设备名:

  在 Windows 平台上,存储设备号(磁盘号)可以使用磁盘管理器等工具查看。可通过
  以下步骤打开磁盘管理器:右击 "我的电脑" -> 选择 "管理" -> 选择 "磁盘管理"。

  在 linux 和其它类 unix 平台上,可通过 /dev 目录查看当前系统中已识别的存储设
  备。

==============================================================================
使用范例:
  rdd -from:/dev/sda -to:~/disk.img -logfile:~/rdd-sda.log
  rdd -fromdisk:1 -todisk:2 -sector:4k
  rdd -fromdisk:1 -to:datapart2.img -sector:4k -perrange:51.45-87.5
  rdd -from:"D:\My Data\file.dat" -to:E:\rec.dat -retry:3 -fill:B10101010
  rdd -fromdisk:1 -to:D:\disk.img -sector:4k -priority:idle
  rdd -from:/dev/sda -to:/data/disk.img -cooldown:20/5
  rdd -from:/dev/sda -to:/data/disk.img -perrange:34.25
  rdd -from:/dev/sda -to:/data/disk.img -secrange:-11785600



注意事项
  1. 目标文件或目标存储设备中的内容将被覆盖。
  2. 转储包含坏扇的磁盘设备是一个耗时工作,根据损伤程度以及转储区尺寸的不同,本操作可能会持续数小时至数天时间。
  3. 请确认扇区尺寸已被正确设置,因为直接访问底层硬件要求每次 IO 都要以扇区为单位进行,同时提交到 IO 操作的内存基址也必须是扇区尺寸的整数倍,方便将其加入非分页池,直接通过 DMA 提交给磁盘控制器。所以不正确的扇区尺寸将可能导致读取失败。
上传的附件
文件类型: rar rdd_msw_x86.rar (217.0 KB, 165 次查看)
文件类型: zip rdd_linux_x86.zip (1.05 MB, 105 次查看)
文件类型: zip rdd_linux_x64.zip (1.05 MB, 87 次查看)
文件类型: zip rdd_freebsd_x64.zip (1.21 MB, 90 次查看)
文件类型: zip rdd_solaris_x86.zip (1.23 MB, 61 次查看)

此帖于 2013-12-19 00:45:49 被 ASBai 编辑. . 原因: 版本更新


baiy.cn
俺的原创免费作品站
回复时引用此帖
clear
 
clear 的头像
热心会员
 
资 料:
注册日期: Feb 2002
帖子: 1,072 声望值: 4
精华: 0,解答: 2
#2 旧 2013-04-04, 18:45:06 默认
clear 当前离线  

cool,规划的非常合理


But there are also unknown unknowns, the ones we don't know we don't know.
回复时引用此帖
xjc
 
xjc 的头像
热心会员
 
资 料:
注册日期: Jan 2002
帖子: 1,496 声望值: 4
精华: 0
#3 旧 2013-04-04, 20:29:49 默认
xjc 当前离线  

真厉害,高手啊!


走,走两步
回复时引用此帖
gmaroman10
 
gmaroman10 的头像
热心会员
 
资 料:
注册日期: May 2002
帖子: 2,925 声望值: 5
精华: 0,解答: 7
#4 旧 2013-04-04, 20:41:15 默认
gmaroman10 当前离线  

“必须在BIOS中将AHCI切换为IDE兼容模式” 这个软件需要吗?
回复时引用此帖
nicol
 
nicol 的头像
热心会员
 
资 料:
注册日期: Jun 2001
帖子: 11,683 声望值: 6
精华: 0,解答: 11
#5 旧 2013-04-04, 21:00:41 默认
nicol 当前离线  

这么快就出来了啊,
回复时引用此帖
ASBai
 
ASBai 的头像
热心会员
 
资 料:
注册日期: May 2005
帖子: 4,721 声望值: 5
精华: 18,解答: 26
#6 旧 2013-04-04, 21:29:11 默认
ASBai 当前离线  

UPDATE: 从今天的测试来看,AHCI 对 rdd 没影响,而且开了 AHCI 性能更好。
UPDATE: 更多的测试表明,在 FreeBSD 下的恢复坏块较多的磁盘时,AHCI 还是比 IDC 性能差一些的。其它平台还没测完。

引用:
作者: gmaroman10 查看帖子
“必须在BIOS中将AHCI切换为IDE兼容模式” 这个软件需要吗?
鲨鲨童鞋认为很有必要,具体还要等他上班以后做一个 A/B 比较测试才清楚。但是我觉得必要性肯定没有 recoverdisk 那么大,因为:

1. recoverdisk 只是用了最普通的文件读方法来恢复数据,而 rdd 是绕过了系统缓存和预读机制,直接访问磁盘设备的。
2. 不幸的是在 FreeBSD 上,绕过了系统缓存和预读机制的指令是建议性而不是强制性的,但在 Linux、Windows 等平台上,这些指令就靠谱的多。

因此,我觉得非 FreeBSD 版本的 rdd 应该不太会受 ahci 模式的影响。即使 FreeBSD 版本的 rdd 应该也比 recoverdisk 受到的影响小一些。

具体还是要等鲨鲨兄的测试结果啦。

引用:
作者: nicol 查看帖子
这么快就出来了啊,
本来就是个小工具

此帖于 2013-04-16 19:55:20 被 ASBai 编辑. .
回复时引用此帖
时间潜艇
 
时间潜艇 的头像
热心会员
 
资 料:
注册日期: May 2011
帖子: 3,220 声望值: 4
精华: 0,解答: 15
#7 旧 2013-04-04, 21:42:39 默认
时间潜艇 当前离线  

干货呀,和硬件区鲨鲨的帖子一并收藏了.
回复时引用此帖
zhy_2000
 
zhy_2000 的头像
热心会员
 
资 料:
注册日期: Nov 2001
帖子: 6,511 声望值: 4
精华: 0,解答: 3
#8 旧 2013-04-05, 23:15:52 默认
zhy_2000 当前离线  

这个牛X!可惜我的坏盘好象已经被提前搞残了
回复时引用此帖
mouze
 
mouze 的头像
热心会员
 
资 料:
注册日期: Apr 2002
帖子: 8,071 声望值: 13
精华: 5,解答: 64
#9 旧 2013-04-06, 20:09:12 默认
mouze 当前离线  

好工具!支持是必须的!谢谢!


Ignorance is bliss. 无知是福。
回复时引用此帖
77880099
 
77880099 的头像
终极会员
 
资 料:
注册日期: Jan 2008
帖子: 28,445 声望值: 5
精华: 0,解答: 56
#10 旧 2013-04-06, 20:26:44 默认
77880099 当前离线  

支持 楼主是开发牛人 这次看到的是存储分支了 不知道下次会是cs的什么分支


 假如明天来临InGodWeTrust & cCF C‘est la vie老温的墙外方舟 bbs.fangzhou10.net
回复时引用此帖
sim
 
sim 的头像
待认证激活
 
资 料:
注册日期: Mar 2002
帖子: 6,976 声望值: 2
精华: 0,解答: 21
#11 旧 2013-04-06, 20:56:10 默认
sim 当前离线  

好样的,收藏!

论坛真应该考虑鼓励机制维护开发者的热情。


It's bad to be good when it's good to be bad...
回复时引用此帖
ASBai
 
ASBai 的头像
热心会员
 
资 料:
注册日期: May 2005
帖子: 4,721 声望值: 5
精华: 18,解答: 26
#12 旧 2013-04-07, 01:12:09 默认
ASBai 当前离线  

多谢支持!其实兄弟们觉得有用就是最好的鼓励了

引用:
作者: 77880099 查看帖子
支持 楼主是开发牛人 这次看到的是存储分支了 不知道下次会是cs的什么分支
cs是虾米?
回复时引用此帖
ooo000
 
ooo000 的头像
超级会员
 
资 料:
注册日期: Oct 2002
帖子: 1,948 声望值: 3
精华: 0,解答: 1
#13 旧 2013-04-07, 04:47:53 默认
ooo000 当前离线  

win 8 64 位操作系统支持吗 ?
回复时引用此帖
hnlyzhd
 
hnlyzhd 的头像
热心会员
 
资 料:
注册日期: Dec 2006
帖子: 5,478 声望值: 4
精华: 5,解答: 81
#14 旧 2013-04-07, 14:19:35 默认
hnlyzhd 当前离线  

引用:
作者: ASBai 查看帖子
多谢支持!其实兄弟们觉得有用就是最好的鼓励了


cs是虾米?
必须支持一下,超棒的程序,超棒的程序员。

我理解cs是computer science。总不会是反恐吧?
回复时引用此帖
海阔天空
 
海阔天空 的头像
高级会员
 
资 料:
注册日期: Mar 2013
帖子: 742 声望值: 4
精华: 0
#15 旧 2013-04-07, 14:57:58 默认
海阔天空 当前离线  

人才啊~
不是很看的懂,边查边学~~
谢楼主分享
回复时引用此帖
发表新主题 回复

主题工具

论坛规则  发帖规则
不可以发表主题
不可以回复帖子
不可以上传附件
不可以编辑自己的帖子
论坛启用 vB 代码
版面启用 表情符号
版面启用 [IMG] 代码
版面禁用 HTML 代码


所有时间均为北京时间, 现在的时间是 23:58:36.

本论坛带宽由迅通网络提供
SSL证书由TrustAsia提供

Copyright © 2000 - 2019 ClassiClub Forum All Rights Reserved.
粤ICP备09123456号