转发了向小田的微博:魔都三神器中秋佳节结界庇护我大中华。(发表于9月28日 12:55,来自Robbie Mosaic的微博评论(1) 转发(1)

08年的老Thinkpad安装4K扇区硬盘历险记

我上上周买了这个西数1TB硬盘WD10JPVT。速度很快,品质一流,声音很轻,很好用。但是发现一些软件上面需要注意的兼容性问题。大概的情况是,我把老的120GB硬盘(512字节扇区)的Windows Vista系统分区克隆到新硬盘上,出现下列症状:Windows Search无法工作,Windows Update无法工作,所有Windows自带的应用程序(比如mmc.exe)以管理员方式运行时,UAC弹出的对话框显示该程序来自“未知的发行商”。

我的笔记本电脑是联想2008年的Thinkpad T61。主板芯片组和CPU都是英特尔的。里面的硬盘控制器(IDE/SATA控制器)是英特尔ICH8M/ICH8M-E。Lenovo Thinkpad System Update(Thinkpad系统更新软件)给我自动安装的驱动版本是8.9.*。

后来我重装了系统,发现问题依旧存在。我想,如果只是分区拷贝之后发生问题,重装之后被修复,那倒好了。可现在却是重装之后还有问题。而且,用了微软的Windows Update Fix It修复工具之后依然毫无起色。我当时头皮发麻,差一点就想放弃,把老硬盘装回去了。为了避免自己冲动之下做出不理智的决定,我去外面走了一大圈,连文庙都走到了,就差给孔老夫子烧香了。不过,回来路上隐隐觉得,问题有可能就是和硬盘上的差别有关。

花了一下午四晚上研究如何解决这个问题,最终成功解决。结论如下:对于Windows Vista系统,必须安装KB2470478和KB2553708(Windows 7系统则至少保证SP1即可,不需要单独装补丁)。对于采用ICH8M控制器的T61,还必须安装英特尔Rapid Storage Technology驱动9.6及以上版本。

由于出现了和重装前同样的症状,在网上用必应搜了一些相关的英文帖子,里面有人提到了catroot2,以及重置Windows Update的支持网页中所描述的手动方法(http://support.microsoft.com/kb/971058)。我也尝试了手动方法,仍然不解决问题。不过在此过程中,发现catroot2目录里除了两个空文件夹和一个dberr.txt之外,其他一无所有。打开dberr.txt一看,发现其中有一些日志记录,显示JetInit错误-583。这才开始了漫长的解决问题之路。

分区是由Windows Vista创建的,所以已经是4KB对齐的。用msinfo32.exe(系统信息)工具查看分区的起始偏移量,发现C:位于物理硬盘的1MB处开始(而不是Windows XP通常分区所在的63扇区位置)。

KB2470478更新了ESENT数据库引擎的兼容性,该数据库引擎被多个关键的Windows组件所依赖,包括Windows Update、Windows Search(搜索)、Cryptographic Services(密码学服务)、IIS等等。前面我说的症状的根本原因就是ESENT报错-583(扇区大小不支持),导致这些服务都没法正常运行。在这些症状发生时,打开C:\Windows\System32\catroot2\dberr.txt,可以发现密码学服务的JetInit报错信息,此信息即来自ESENT(代号Jet Blue)。

KB2553708更新了fsutil.exe和storport.sys。更新后的fsutil.exe除了原有的显示逻辑扇区大小的功能之外,还会显示物理扇区的大小。可以使用fsutil.exe查看C盘的扇区大小:以管理员权限运行cmd.exe,并输入以下命令:

fsutil fsinfo ntfsinfo C:
NTFS Volume Serial Number :       ...
Version :                         3.1
...
Bytes Per Sector  :               512
Bytes Per Physical Sector :       4096
Bytes Per Cluster :               4096
Bytes Per FileRecord Segment    : 1024
...

其中Bytes Per Sector就是逻辑扇区大小,在Vista和Win7系统上都是512,只有Windows 8才支持4096(参见http://support.microsoft.com/kb/2510009)。Bytes Per Physical Sector显示了物理扇区的大小。如果显示4096则表示是4K扇区的硬盘(即如WD10JPVT这样的硬盘)。显示512则表示512字节扇区的硬盘。显示<Not supported>(不支持)则表示SATA控制器驱动程序(或控制器本身)不支持4K扇区的硬盘。

英特尔Rapid Storage Technology(RST)驱动程序9.6或以上版本,就是用来解决控制器正确支持4K扇区硬盘这个问题的。

在我的例子里,因为Windows Update已经瘫痪,单个的KB2470478和KB2553708补丁包也无法成功安装,所以我在另一台电脑上装了一台Vista虚拟机,并打上SP2和这两个补丁包,然后把它们安装上的文件(KB2470478的esent.dll和KB2553708的fsutil.exe及storport.sys)提取出来,再通过WinPE拷贝到要修复的机器的硬盘上相应的位置,以取代老版本的这些文件。这些都拷完以后,fsutil.exe能显示物理扇区这一项,但是显示的扇区大小是<Not supported>(不支持),所以判断可能是控制器程序不支持。

查找了网上的一些讨论贴,发现有人明确指出9.6版本或以上的RST驱动程序有用。鉴于我的电脑的控制器的确是英特尔的,并通过下载RST驱动程序,阅读其中包含的readme.txt,发现ICH8M是受支持的,Vista也是受支持的,所以就放心地安装了。注意太高的版本(11.x)可能不支持Vista系统(只支持Win7),而英特尔网站上也只提供最高版本的下载,所以可以去驱动之家(mydrivers.com)下载一个老版本的RST驱动。我下载的是9.6.3.1001。

安装完RST驱动之后,fsutil.exe终于能成功显示出物理扇区大小为4096了,而且ESENT也不再报错。除了Windows Update之前因为我运行了修复工具而导致更新历史丢失之外,也没有别的问题。Windows Search和密码学服务都能正常运行,自带的应用程序以管理员方式运行时也显示出来自“Windows”而不是来自“未知的发行商”了。终于,可以放下悬着的心,长长地舒一口气,我这台2008年的老Thinkpad,也用上4K扇区的高级格式硬盘了。。。