硬盘上有损坏区域,该如何重新分区

本文介绍了一种使用DiskGenius工具检测并隔离硬盘坏道的方法,并通过Python程序辅助计算坏道位置,最终实现对坏硬盘的有效分区利用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


先上干货1(自己编写的工具包)

在网页写个东西是挺麻烦的,还是Evernote写起来比较爽,自己点链接下载吧  点击打开链接


事出偶然
原来的那个单插槽的移动硬盘盒坏了,昨天买了个新的移动硬盘盒,双插槽的,但是看着一个插槽空在那里有点手痒,总想再弄一个硬盘插上去。忽然想起自己还有一块坏掉的硬盘(坏了很多次,最后干脆连核心区域都坏掉了,什么都无法读取,已经彻底放弃治疗了),插上去居然能读出一点,还能拷贝,然后全盘格式化,居然全部能用了。——这天上还真有掉馅饼的事,自己本来还打算再买一个硬盘的。

不过,光能用不够,还要能用得省心才行,那些坏磁道是不能再碰到了(更不指望修复了),必须彻底隔离才好。

隔离方法
理论上,ntfs应该能够自动标记坏区,避免下次再读写到,但是实际情况是,windows每次都去读坏区,一读到就卡死在那里,用windows自带的磁盘检查/修复工具也是读到立即卡死,chkdisk卡死,很多第三方工具都卡死,几个小时都不懂得自己跳过去,估计这些死脑筋工具本着“数据无价”的精神死活都要修复,不修复不罢休吧,或者不读取成功不罢休吧。其实,我已经知道磁道损坏得非常严重了,不指望数据了,所以我不需要修复,我只想有人告诉我哪个磁道坏掉了读取太慢了,要不要屏蔽掉而已。——当然这么高度自动化的工具我没找到,谁找到了可以留个言。

找到态度基本正确的工具——DiskGenius
巧的是,最近见到 DiskGenius 工具里有个 “坏道检测与修复”功能,可以让我放弃修复,放弃长时间尝试读取了——终于可以放弃治疗了。见图:
原始的检测成果弄丢了,拿这个补上吧:


扫描了几个小时,最后给出了检测报告:


根据这个报告,我直接采用柱面数据,因为我也不想去算扇区了,直接放弃整个柱面,反正也亏不了几个MB。

工具在态度上不正确的地方
这个报告给出的是柱面号,而分区工具 DiskGenius 里的分区依据却是 GB(下拉后还有个 MB),没有柱面扇区之类的选项(见下图)。——这也不是 DiskGenius 家的个例,很多磁盘工具都是这样。
看来只好自己进行单位转换了。


写个简单的计算程序
柱面数据不多不少,手工计算太蛋疼,自己写段python程序处理一下,计算结果:

Broken in cylinder number are: [3374, 3757, 8195, 16698, 80608, 80640, 96110, 96110, 116503, 116503, 116503, 116503, 116503, 116503, 116503, 116503, 116503, 119502]
Corresponding, Broken in GB are: [25.85, 28.78, 62.78, 127.91, 617.48, 617.73, 736.23, 736.23, 892.45, 892.45, 892.45, 892.45, 892.45, 892.45, 892.45, 892.45, 892.45, 915.42]
disk valid range info: (+25.85)25.85, (+2.93)28.78, (+34.00)62.78, (+65.13)127.91, (+489.57)617.48, (+0.25)617.73, (+118.50)736.23, (+0.00)736.23, (+156.22)892.45, (+0.00)892.45, (+0.00)892.45, (+0.00)892.45, (+0.00)892.45, (+0.00)892.45, (+0.00)892.45, (+0.00)892.45, (+0.00)892.45, (+22.97)915.42,

还是分行看吧:
//第一行,从文件里提取柱面号数据
Broken in cylinder number are: [3374, 3757, 8195, 16698, 80608, 80640, 96110, 96110, 116503, 116503, 116503, 116503, 116503, 116503, 116503, 116503, 116503, 119502]
//第二行,根据柱面号,算出对应的GB值(以GB表示的位置),如 3374 对应于 25.85GB处有坏道
Corresponding, Broken in GB are: [25.85, 28.78, 62.78, 127.91, 617.48, 617.73, 736.23, 736.23, 892.45, 892.45, 892.45, 892.45, 892.45, 892.45, 892.45, 892.45, 892.45, 915.42]
//第三行,顺便算出每个坏道之间有多少可用的空间,可以看到还有三个100GB以上的空间,预计700GB的可用空间:
disk valid range info: (+25.85)25.85, (+2.93)28.78, (+34.00)62.78, (+65.13)127.91, (+489.57)617.48, (+0.25)617.73, (+118.50)736.23, (+0.00)736.23, (+156.22)892.45, (+0.00)892.45, (+0.00)892.45, (+0.00)892.45, (+0.00)892.45, (+0.00)892.45, (+0.00)892.45, (+0.00)892.45, (+0.00)892.45, (+22.97)915.42,

写这段程序费时很少,想要的数据基本有了,接下来进行手工计算(过程不解释,看下图),得到一个 480+110+150=740GB 的空间及分区位点:


根据手工计算结果进行分区,见下图,再次核对了柱面数据,确实都避开了坏道:
Broken in cylinder number are: [3374, 3757, 8195, 16698, 80608, 80640, 96110, 96110, 116503, 116503, 116503, 116503, 116503, 116503, 116503, 116503, 116503, 119502]


按理说,问题也算解决了,可以结束了,反正自己短时间内再碰到磁盘损坏的概率也不高。
不过作为程序员,好像还差点什么,尤其是后半段的手工计算,其实还是有点繁琐易错,于是有了下文。

完整解决方案
干脆写完这段程序,直接算出坏盘重新分区的方案,最终代码给出的分配方案如下:

//跟上边一样,略过
Broken in cylinder number are: [3374, 3757, 8195, 16698, 80608, 80640, 96110, 96110, 116503, 116503, 116503, 116503, 116503, 116503, 116503, 116503, 116503, 119502]
Corresponding, Broken in GB are: [25.85, 28.78, 62.78, 127.91, 617.48, 617.73, 736.23, 736.23, 892.45, 892.45, 892.45, 892.45, 892.45, 892.45, 892.45, 892.45, 892.45, 915.42]
disk valid range info: (+25.85)25.85, (+2.93)28.78, (+34.00)62.78, (+65.13)127.91, (+489.57)617.48, (+0.25)617.73, (+118.50)736.23, (+0.00)736.23, (+156.22)892.45, (+0.00)892.45, (+0.00)892.45, (+0.00)892.45, (+0.00)892.45, (+0.00)892.45, (+0.00)892.45, (+0.00)892.45, (+0.00)892.45, (+22.97)915.42,

//搜索算法跟手工计算不一样,不过结果一样:
searching can use range:
begin in 130 GB, end in 610 GB, range: 480 GB
begin in 620 GB, end in 730 GB, range: 110 GB
begin in 740 GB, end in 890 GB, range: 150 GB

//根据上边结果,再形成完整分配方案
making a complete disk partition recommendation:
broken range: (0, 130)GB,     range: 130 GB, with some broken in [25.85, 28.78, 62.78, 127.91]
-good range: *(130, 610)GB,     range: 480 GB
broken range: (610, 620)GB,     range: 10 GB, with some broken in [617.48, 617.73]
-good range: *(620, 730)GB,     range: 110 GB
broken range: (730, 740)GB,     range: 10 GB, with some broken in [736.23, 736.23]
-good range: *(740, 890)GB,     range: 150 GB
broken range: (890, 931)GB,     range: 41 GB, with some broken in [892.45, 892.45, 892.45, 892.45, 892.45, 892.45, 892.45, 892.45, 892.45, 915.42]

(全文完)
ps:独乐乐不如众乐乐,估计自己短时间内不会再碰到磁盘损坏,这些工具自己老藏着有点浪费了,也许能帮上你的忙。
ps:这段一段python 2.7的程序。
ps:干货2,写完程序后,听说 linux 下边有个 ntfsfix 命令,看了一下文档,貌似能够隔离坏道,暂时不想去试了,试过的也可以留个言。
ubuntu:~$ ntfsfix -h
ntfsfix v2013.1.13AR.1 (libntfs-3g)

Usage: ntfsfix [options] device
    Attempt to fix an NTFS partition.

    -b, --clear-bad-sectors Clear the bad sector list
    -d, --clear-dirty       Clear the volume dirty flag
    -h, --help              Display this help
    -n, --no-action         Do not write anything
    -V, --version           Display version information

For example: ntfsfix /dev/hda6

Developers' email address: ntfs-3g-devel@lists.sf.net
News, support and information:  http://tuxera.com
ubuntu:~$













评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值