确定NTFS引导扇区备份位置

                          《文章转自盆盆的BLOG》
内容提要:本文摘录自微软中文新闻组的技术问答(参与者是笔者和另外一名网友),主要讨论NTFS的Boot Sector备份的保存位置取决于什么因素,知识库文章KB153973似乎表明和NTFS的版本信息有关,而网友的实验结果表明似乎和MFT的存放路径有关……到底哪个是正确的?
鉴证实录

(1楼)网友:NTFS系统中的bootsector会有一份备份保存在partition的中间或者结尾,是根据ntfs的version来判断的。我想请教一下:
(1)怎么去判断ntfs的version,我的意思不是指fsutil fsinfo ntfsinfo c:这种,而是指怎么从硬盘上的数据去判断?
(2)为什么我有个ntfs 3.1的版本,没有bootsector的备份,运行chkdsk之后会把这个备份写到partition的中间那?
这儿是我在microsoft上面找到的资料
http://support.microsoft.com/default.aspx?scid=kb;EN-US;q153973
(2楼)盆盆:第一个问题,在NTFS的元数据文件$Volume中,其$Volume_Information属性保存着NTFS的版本,同时还包括文件系统的Dirty Bit。
在NTFS中有一句著名的话““everything on the disk is a file”,包括引导扇区($boot)、MFT本身($MFT)等都是文件,当然是特殊的文件-元数据文件(Metadata File)。
第二个问题,请问你是采用什么方法进行判断,以方便我们确认是否可以复制这个问题。
(3楼)网友:(2)我用windows的"fsutil fsinfo ntfsinfo 盘符"来判断的。我的疑问是:既然windows xp已经把这个partition判断成为ntfs 3.1的话,它是不是应该在chkdsk修复的时候把bootsector复制到partition的结尾而不是中间?还是说chkdks和fsutil fsinfo nftsinfo两个command所拿的ntfs版本的判断方式是
不一样的?
另外想请教一下,好像那个bootsector的备份不是以cluster的形式来保存的,而是单独的512byte,而且通过$mft里面所有的record­的data run也无法link到该512 byte(或许还是有什么地方我搞错了)!
是不是有什么地方指明了这512 byte保存在什么地方?好像仅仅依靠$volume的volume_information拿不到的吧?
如果通过$mft的record的data run拿不到这个boot sector的备份的话?拿不是和ntfs当初设计的初衷:everything on the disk is a file有违背?

(4楼)网友:以下我的$volume的$volume_information的数据:
70 00 00 00 28 00 00 00    00 00 18 00 00 00 05 00
0C 00 00 00 18 00 00 00    00 00 00 00 00 00 00 00
03 01 00 00 00 00 00 00
去掉attribute header,剩下的就是:
                           00 00 00 00 00 00 00 00
03 01 00 00 00 00 00 00
其中Major version number : 3
      Minor version number : 1
那就是3.1版本的ntfs,但是在运行chkdsk之后,bootsector竟然备份在了partition的中间,感觉非常奇怪,是不是还有什么地方表明了这个bootsector会保存在哪儿?
(5楼)盆盆:测试了一下,无需进行chkdsk /F,在格式化或者创建分区时Windows就在Volume的末尾增加一个Boot Sector Backup。
用Disk Probe工具,即可以在Volume末尾看到boot sector备份,而在Volume的中间位置并不能看到这个备份,请问你是用什么工具进行查看的?
和“everything on the disk is a file”原则相悖?
我是这样理解的:可能是由该备份的位置所决定的。由于该备份只有512 Byte,如果它是一个文件的话,则完全可以作为一个Record容纳到MFT中(MFT的每个Record的大小为1KB)。但是为了能够将该备份保存在Vo­lume的末尾,只能取消其作为文件的权利(否则的话,它必须resident在MFT中)。
这样做的话,并没有什么太大的影响,例如删除一个文件的话,其物理结构照样保存在磁盘上,但是其MFT Record也没有,这个残留的物理结构也不是一个文件。

(6楼)网友:(1)我想请教一下通过什么文件可以索引到bootsector在partition中的备份那?仅仅通过ntfs的$volume的$Volume_Informationversion中的版本来判断好像并不是很准确。
(2)请教一下在format成ntfs分区的时候会把$mft这个文件写到partition的哪个cluster那?这个规则是什么?

(7楼)盆盆:以下是我对你的两个问题的理解。
1. 这个问题可以参考我的前个回复。大意是:也许应该避免将boot sector的备份看成是文件,因为它的存放位置决定了如果是文件的话,其必须是non-resident;而其大小(512B)又决定了它必须是reside­nt……所以干脆不要将其看成是文件。
可以利用DiskProbe等工具来定位boot sector的备份,因为它不是一个文件,无法在MFT里索引。
2. 这个问题不能一概而论,下面权举三种情况:
(1) WIN2K和以前版本:在卷的开头部分放置MFT
(2) WINXP和WIN2K3以后:
对于大容量的卷,在卷的3GB以后放置MFT(当cluster factor=4KB,MFT的起始簇=786432=3×1024×1024÷4)。
对于小容量的卷(例如小于3GB),不太清楚其放置规则。
(3) 对于FAT转化过来的卷,则要看具体情况,例如是否使用/cvtarea参数。
Windows通过读取boot sector(offset:0x30,8 Bytes),来获知MFT的具体位置。  
(8楼)网友:我做了下试验,好像Windows XP在写boot sector备份的位置是根据$MFT的位置来决定的,而不是$Volume中的信息来决定。
试验1: 把$MFT写在卷开头,没有boot sector备份,Windows XP的chkdsk会认为ntfs的版本是老版本,然后把boot sector备份写到partition的中间。
试验2: 把$MFT写在卷中间某个位置(参考了ghost写$MFT的位置),没有boot sector备份,Windows XP的chkdsk会把boot sector的备份写到partition的结尾。
试验1和试验2中唯一的不同就是$MFT在partition中的位置。 KB153973说boot sector的备份是根据ntfs的version来判断,但是仅仅根据$volume中的version信息来判断ntfs version来写boot sector备份的位置又不是很准确,比如说$MFT文件的位置并没有根据NTFS版本规则来写,例如volume中表明是3.1版本的ntfs还是把$mft写在了卷开头。
因为没有具体的document只能猜测结论是: $MFT在partition中的位置由ntfs的volumne中的$volume_information中的version来决定,boot
sector的备份由$MFT在partition中的位置来决定。
现在想知道的就是$MFT在ntfs中写的规则:
其中你提到:
 (2) WINXP和WIN2K3以后:
 对于大容量的卷,在卷的3GB以后放置MFT(当cluster factor=4KB,MFT的起始簇=786432=3×1024×1024÷4)。
 对于小容量的卷(例如小于3GB),不太清楚其放置规则。
是不是对于>3G的volume,$MFT的位置= 3×1024×1024 / (cluster per sector * 2)?

(9楼)盆盆:能否提供二个试验的详细步骤,我们应该谨慎设计实验进行充分验证。
光凭一、二个实验,难以判定Boot Sector备份的位置取决于$MFT位置的结论。至少还应该得出以下的几种可能性:
(1)chkdsk可能采用另外的机制,不同于Windows本身的机制(格式化时,Windows默认会创建Boot Sector备份)。
(2)如果实验过程中涉及到第三方工具软件,那么实验结果就是不充分的。
所以必须设计严格的、可靠的Hand-on Lab,这样才能得到可信的结果。
微软的公开官方文档,没有提到有关$MFT位置的决定因素,但是以下的一篇文档,提到Windows XP的格式化程序默认将3GB以后的位置作为$MFT的存储:
http://www.microsoft.com/whdc/system/winpreinst/ntfs-preinstall.mspx
原文如下:
In Windows 2000 and earlier versions of Windows NT, the MFT was typically placed at the start of the disk space available to the file system. In Windows XP, the NTFS format utilities place the MFT 3 GB further into the disk space.
(10楼)网友:试验步骤是这样的:
(1)找两个分区,分别都为500MB,然后用00来填充,这个可以用winhex来实现。
(2)用NTFS来格式化一个分区A(在windows xp的环境下),然后把里面所有的数据都copy出来(不包括boot sector的备份), 这个可以自己写个小程序或者用winhex对每个文件进行检索,然后把相关的数据copy出来,反正文件也不是很多。
(3)然后把2)中copy来的数据,全部写到分区B(这个仅仅只能称作copy,还没有达到写的程度),
   同时对于数据在partition上的位置做了重新排序,相当于defragment,
   试验1:把$MFT写在了partition的中间左右的位置(参考了ghost的还原的位置,采取了和ghost还原相同的位置)
   试验2:把$MFT写在了partition的开头,比如说0x4000的位置
   其他文件,比如说$MFTMirr,$LogFile全部按照在$MFT中的顺序依次写在$MFT的后面。
试验1和试验2都没有boot sector备份,然后运行chkdsk来检查写回去的NTFS分区是否正确,结果是:
试验1:chkdsk没有发现错误,但是boot sector被写到了partition的结尾(没有boot
sector备份chkdsk不会报错)
试验2:chkdsk没有发现错误,boot sector被写到了partition的中间(当然如果有文件占据了正中间那个cluster,chkdsk就会报错;
       并且把boot sector备份写到中间,把占据正中间cluster的那个文件作修改,把那个文件的cluster移到别的位置)
试验1和试验2唯一的区别是从$MFT开始所有文件的位置不同,其他都相同。
这个是我做得简单的实验步骤
由于没有microsoft的public的文档,所有只能猜测一些结论出来,并不能肯定。
试验1和试验2写$MFT的位置都不是很规范,由于没有相关public的文档,只能猜测的去找位置写入partition.
因此想找一些比较确定的资料,或者比较确定的结论来保证对ntfs分区进行copy的时候不会出现错误(至少chkdsk不会出现错误)
……
嗯,先写到这里吧,在本文的后续部分里,笔者会提供相应的原理解析和合适的实验设计,以尽可能逼近问题的真正答案。还请读者诸公百忙中拨冗关注一下本文的更新情况,我只要有空,就会尽快写好贴出来。如果您对此问题有自己的见解,欢迎您和我邮件联系(请原谅我无法一一回复)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值