作者LIAR (玻璃做的大叔)
站内Storage_Zone
标题[心得] DIY救援分割表错乱
时间Thu Feb 28 18:21:35 2013
第0天:(缘起XD)
话说前几天我想把实验室一台电脑灌98,打算把一颗硬碟分成两区,第二区丢
安装档,第一区就用format/s弄成DOS启动。
我照惯例,先用CentOS的LIVE USB分割过顺便mkfs.msdos弄成FAT32後,就回DOS
执行FORMAT,但reset要用硬碟开机时却开不了,SPFDISK一看,分割表竟然乱掉了?
好吧!反正我有两颗硬碟,前面这颗是IDE的,我猜非南桥原生晶片可能不稳(?),
当下换成另一颗SATA的,问题是这一颗有资料。
sda1:NTFS
sda2:ext
sda5:NTFS
sda6:NTFS
sda7:NTFS
前人交接时已经把资料都留在sda5,其余都没再用,所以我在CentOS下把其他三个分割
打掉,把sda6和sda7合并,然後连同前面的sda1都格式化成FAT32。之後老样子FORMAT/S
,但这时惨剧发生了,分割表又乱掉了,我脸当场绿掉。那些资料好像没其他备份啊!!
第1天:
我想说用FINDDATA或R-STUDIO救援,但时间太久,也有试用版的限制,考虑到RAW data
应该没事,大概只有分割表乱掉,我想用testdisk救援。
问题是我照教学都做到深层扫描了,竟然只看到第一个FAT32,而且容量还是整颗硬碟?
我差点疯掉,印象中这软体对於分割表救援好像评价不错,如果深层扫描都救不了
我不就死了?难道FORMAT真的有动到下一个档案系统的磁区?
我赶紧用SPFDISK去看看实体磁区......如果用微软的软体或SPFDISK分割,我印象中
NTFS的起头会在CHS的(X,1,0),结尾会在(X,254,62)(主分割区不是第0轨的好像比较
前面)而且第一行就有NTFS字样,後头也有像是BOOT还是CTRL +ALT+DEL之类的,想说
土法炼钢从大约C=1000看到C=4000看看,结果眼睛差点破窗,用spfdsik的page down
按好久不说,用眼睛要确认那一小段字真的很蠢。
这时我想到鸟哥的LINUX教学中有提到回圈,但我这辈子从BASIC到现在从来没踏过
回圈啊!我连IF;.then都没碰过多少次耶!但我不想眼睛出事,只好仔细看鸟哥
的文件,结果尝试写下以下的script:
#! /bin/sh
declare -i cylinders=0
while [ "$cylinders" -le "$2" ]
do
dd if=/dev/"$1" bs=512 count=1 skip=$((63+$cylinders*255*63))>>$3
cylinders=$(($cylinders+1))
done
档案存成read.sh,chmod成755,用root执行。
如果这颗要救的硬碟是sda我就执行:
./read.sh sda 4000 file_sda
我推测原本的sda5起点应该会在4000以内,所以只设4000。之後用MadEditd开16进位
读取搜寻之前提到的关键字,像是NTFS或BOOT等等,果然找到一个sector很像。
由於一个磁区大小是512,所以分界的16进位的最後三码一定是n00,且n是偶数。
之後用小算盘推估位置应该是3991,可能有植树问题要加减1,不过反正我会用SPFDISK
再确认,所以就不管确实数字了。
至於结尾嘛....我猜可以直接设定实体硬碟结尾比较省事,印象中档案系统只认
自己知道的大小,大一点应该不会怎样,何况後面的分割表我也没打算救,不过反
正scripte改一下也OK,所以根据我对结尾的(X,254,62)的判断,第五行改成
dd if=/dev/"$1" bs=512 count=1 skip=$(($cylinders*255*63-1))>>$3
第一笔资料会是-1,虽然dd会错误,但後面不会有问题,只是计算磁轨位置
会往前偏,不过就如同前面说的我会用SPFDISK肉眼确认,所以和植树问题一样就不管
了。这次因为要扫比较後面所以数字要设比较大。
./read.sh sda 12000 file_sda
记得前一个档案要删掉,或是另存档名,不然资料是一直累加的。运气很好我也同样只
找到一个磁区符合比对,大概9600多吧!
之後回DOS用SPFDISK看磁区,确实两个磁区和正规的NTFS头尾一样,且3991的上一个
磁轨结尾也有NTFS结束的模式,而9600下一个磁轨的第一个磁柱(H,S=1,0)也有看到
另一个档案系统的起头,容量大小也符合,我想应该错不了。就根据数字回LINUX的
FDISK重建分割区。最後再回SPFDISK确认有没有切对。
但SPFDISK竟然发现切错了,全部往前偏一个磁柱,我才知道linux的计算和SPFDISK
不一样,可能开头是0或1的问题吧!幸好是往前偏,因为在重建延伸分割区时,
也有分割表会确实会写入某个磁区毁掉资掉,而我前面的资料正好不需要。
总之我再重建一次分割表,这次位置就对了,进WIN7也可以直接读到资料,哈雷路亚。
赶紧备份到另一颗硬碟。
基本上这次有几个要注意的地方:
1.由於SPFDISK或微软的切割让头尾位置有规律,所以可以搜寻比较小的范围。如果
直接用LBA位置去切,那dd可能要抓整颗硬碟的资料来搜寻了。
2.我因为偷懒所以从第0轨开始抓,当然可以多加一个参数当起点。不过计算会更复杂。
3.救援软体真的不常用,R-STUDIO或FINDLDATA我这辈子连这次只用过3次,因为平常
都有确实备份资料,这个script也不晓得下次用到是几年後了,所以有错我就懒得改了XD
4.testdisk不晓得为什麽无法读到我的分割表,是因为那台电脑有问题吗?我隔天拿
新的硬碟FORMAT也没有分割表乱掉的情况....
5.定址的时候还是用LBA比较准,像这次就有DOS和LINUX的磁轨编号不一样的状况。
6.人不要铁齿XD。double check是很重要的,不管是切割或救援。
--
起初,他们追杀共产主义者,我没有说话,因为我不是共产主义者;
接着,他们追杀犹太人,我没有说话,因为我不是犹太人;
後来,他们追杀工会成员,我没有说话,因为我不是工会成员;
此後,他们追杀天主教徒,我没有说话,因为我是新教教徒;
最後,他们奔我而来,却再也没有人站起来为我说话了。
《First They Came(他们首次来时)》,Martin Niemoller牧师(1892-1984)
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 180.176.45.179
1F:推 gaiaesque :好难.. 02/28 18:47
※ 编辑: LIAR 来自: 180.176.45.179 (02/28 18:47)
2F:推 givigan :鸟哥 无所不在 上过他的RHCE 赞 02/28 18:50
3F:→ givigan :我也有过类似情况 不过我发现很麻烦就 整个砍掉重练 02/28 18:51
4F:→ givigan :後来我直接买NAS来用2T*8 RAID 5 02/28 18:51
5F:→ givigan :PS:我丢失的是精挑细选过的动作片 伤心三天 02/28 18:52
6F:推 givigan :之前有次GHOST 98的硬碟 结果GHOST完 两边都开不起来 02/28 18:54
7F:→ givigan :也是用FINDDATA去找 但是只找到C槽 D槽找不到 02/28 18:55
8F:推 asadfish :没想到这边也看的到鸟哥XD 02/28 19:01
9F:→ anedo :相关也可以去"酷学园"问问看.. 03/01 00:51
10F:推 piligo :DiskGenius可以试试看 03/02 23:07