Windows通用克隆系统入门基础知识简介

作者:Climbing(xclimbing@msn.com)
创建日期:2006年8月5日
最后修改日期:2006年9月1日

这里的Windows是指微软的Windows 2000/XP/2003(后文中未经说明的,凡是Windows均指这三种系统);所谓的通用克隆,俗名万能克隆,又名封装系统,就是在一台机器上装好Windows系统,然后经过一系列的技术处理,然后将它使用克隆软件克隆出来,使得这个克隆系统能够在任意的目标PC上恢复。事实上,到目前为止,我还没有遇到过真正的万能克隆,做得再好的通用克隆系统也会遇到失败的情况,而从理论上来说,要实现真正的万能克隆也是不太可能的,在后面的叙述中我们会详细讲一下原因。

最近在很多论坛(龙帝国、无忧启动、sysoft时空、DOS联盟)均看到有人关注有关Windows通用克隆方面的基础知识问题,而很多人对于Windows的通用克隆,只知道S&R&S软件和死性不改,至于S&R&S表示什么意思,死性不改对通用克隆的发展到底作了哪些贡献,均不甚了了。更多的人不了解通用克隆的制做需要解决哪几方面的问题,甚至还有很多人连一些基础概念都不清楚。这种对通用克隆缺乏了解的情况是很普遍的,导致通用克隆这个并不复杂的技术被很多人神秘化,甚至走上了神坛,让广大用户都觉得它是可望而不可及的。实际上,就本人的了解和理解,通用克隆的制做原理并不复杂,但如果抛开S&R&S这一类的制做软件而完全自己手工实现,则在细节上就要麻烦很多,所以,本文只讲原理,不深究技术细节,有兴趣的人可以在本文的基础上进一步穷其本源,而事实上,也只有靠自己的努力探索才能获得其精髓。

1.通用克隆需要解决的技术问题

很多人都知道,一个不经处理的Windows系统直接恢复到另一台机器上,最有可能出现的情况就是蓝屏,或者反复重新启动。那么,造成蓝屏、重启等的原因是什么呢?事实上,这就是通用克隆系统所要解决的最基本的技术问题。

1.1 Windows的硬件抽象层(HAL)问题

我们知道,NT是基于内核的分层设计的操作系统(实际上是类UNIX操作系统),最早的NT系统是支持包括I386(Intel及AMD平台)、Alpha、Sparc等不同硬件平台的操作系统,共实现原理就是将操作系统分层设计,其中最底层的硬件抽象层(即Hardware Abstract Layer,也就是HAL)直接与硬件相关,高层只与其下一层打交道,不再直接接触硬件(这也是Windows NT下不允许软件直接访问硬件的主要原因)。那么,这里的HAL层就相当于现在的JAVA虚拟机、也相当于ISO组织定义的开放互连网络中的OSI七层参考模型中的物理层的作用。就算是在I386平台下,很显然,一台P3的机器跟P4的机器所用的硬件差别也是很大的,也即,它们对于Windows来说要使用不同的内核,也就是不同的HAL。

有了上面这些基础的概念,我们就可以开始介绍通用克隆制做中所谓的电源模式问题了,实际上,电源模式问题就是HAL的问题,又叫计算机类型问题(因为它直接对应设备管理器中的计算机类型项)。在我们日常接触的PC中,最经常用到的计算机类型有这么几项:
Standard PC
Advanced Configuration and Power Interface (ACPI) PC(简称ACPI)
ACPI Uniprocessor PC
ACPI Multiprocessor PC

关于如何理解这些计算机类型之间的区别,请参考龙帝国论坛木鸟朋友的这篇文章:http://nufans.net/dvbbs/dispbbs. … p;ID=823&page=1。另外,也可以参考我曾经写的这篇文章《Windows 2000/XP/2003操作系统所支持的计算机类型(HAL)及相关内核文件的对应关系》来进一步了解不同计算机类型之间的区别及更换计算机类型的原理与方法。

基本上,上面所列出的四种HAL类型,后三种都与Standard PC(标准计算机)兼容,而如果使用了错误的HAL类型启动目标计算机,系统也有可能正常启动,但可能会丢失某些功能,例如一台支持ACPI的计算机如果以Standard PC模式启动,那么就会导致关机时不能自动关闭电源。所以,如何正确的选择目标计算机的HAL类型成为通用克隆系统制做发展历史上的一个重要课题,在前面所提到的木鸟的文章中也有这个历史发展过程的简要介绍(事实上,hyne、chenall、死性不改最早都是从无忧论坛开始讨论这个问题的)。那么解决HAL问题的历史中经过了这么几个阶段:

1) 以Standard PC方式安装系统,然后手工修改计算机类型。

这种方式是在制做克隆系统前将计算机类型手工修改为Standard PC以求得克隆系统的最好兼容性(同时还会修改IDE控制器为标准双通道,后面详述),然后恢复到目标计算机,但会导致设备管理器的计算机类型中出现两个Standard PC,然后手工将其中一个修改为适合于目标计算机的类型(这要靠人工判断),这种方式的缺点是修改完重新启动后还要再搜索一遍硬件驱动,导致系统中出现大量幽灵硬件。

2) 人工判断,手工选择。

这一阶段以hyne、chenall、死性不改(我所接触到的)为代表,通过使用批处理或者VB程序的方式,在克隆系统启动时出现一个选择菜单让用户选择适合自己计算机的HAL类型,至于如何判断自己计算机所使用的HAL类型,基本上是靠安装人的经验。这种方法避免了二次搜索硬件的过程,至于更多的优点,我已经记不太清楚了。

3) 使用TA.EXE自动判断,手工确认,BOOT菜单二次修改。

这种方法主要来源于死性不改的创举,他发明了使用XP Embeded制做工具中的目标计算机分析程序ta.exe再加上使用CPUZ的结果来判断CPU数量,从而综合判断目标计算机可能的HAL类型。当然,这种判断方式是不完全准确的,有可能会发生错误,所以才会出现手工确认以及BOOT菜单控制法等补充手段,这一阶段的最完美产品我觉得是S&R&S 5.5 Build 1030。

4) 使用WinPE来判断计算机类型。

这种方式在木鸟的文章中有提及,我不甚了了,所以也无法过多介绍。但可以肯定的是,这种方法根本没有流行起来。

5) 使用Longhorn的ntldr自动判断并选择计算机类型。

这种方法我看到的是由网友“微软破解中心”在无忧启动论坛发表的一篇文章中所介绍的,现在这篇文章在网上流传的很广,文章写得也很浅显易懂,我就不详细介绍了,有兴趣的去搜索一下来看看。总之,就是发现longhorn的ntldr有一个新参数,即/detecthal(在boot.ini的启动项中设置),通过这个参数,可以实现自动判断并选择计算机类型,而且这种技术由于源出于微软,所以其结果是百分百准确的。基本上,使用Longhorn技术来判断正确的hal就是目前最完美的解决办法。死改不改的S&R&S 9.x版本基本上都使用这种方式。

1.2 大容量存储设备(MassStorage Device)驱动问题

先解释一下这个MassStorage Device是什么东东。所谓的MassStorage Device,说白了就是硬盘控制器,细分的话包括PATA(传统的硬盘控制器)、SATA、RAID、SCSI等,实际上,死性不改的S&R&S就是SATA&RAID&SCSI的意思。总之,是指Windows可能安装于其上的存储设备的类别,我们一律以MassStorage来统称它们。

说起来通用克隆的MassStorage问题,应该说这个问题最早是由SATA串口硬盘不断推广引起的,在通用克隆发展的早期,SATA硬盘还不是很流行,这个问题还不是很严重,因为所有的PATA(IDE)控制器都兼容于标准双通道IDE控制器,所以人们制做克隆时只需要将源机器的IDE控制器修改为标准双通道即可。但很显然,SATA并不兼容于标准双通道,所以当时制做的克隆系统在SATA硬盘上恢复后重启时会出现蓝屏(错误提示就是Inaccessable_boot_device,即不可访问的启动设备)。其实这个问题的由来已久,在安装Windows NT时在TextMode安装模式下通过按F6加载存储设备驱动软盘上的驱动就是这个问题最早的由来。原因很简单,Windows NT不再依赖于BIOS提供的方式访问硬盘,而是通过底层的驱动程序,如果没有加载对应的驱动程序,那么Windows就会找不到硬盘,找不到硬盘当然就不可能将Windows启动起来。而DOS则是通过BIOS来访问硬盘的,所以这也是为什么DOS能够访问SATA、RAID、SCSI硬盘而Windows却不能访问的主要原因。

讲清楚了这个问题的原因,我们简单讲一下解决办法,其实也很简单:那就是搜集尽可能多的MassStorage设备的驱动程序,然后使用Windows的方式将它们一次性都加载进系统,这样就不会存在找不到硬盘的问题(事实上,Windows自己也是这么做的,大家可以仔细观察一下Windows NT的安装过程,在字符模式(TEXTMODE)安装界面,你会看到它加载了一系列的驱动程序,其中包括很多本机所没有的MassStorage设备驱动,但微软自己也不可能在安装程序中集成所有的MassStorage设备驱动,所以它提供了F6方式通过软盘加载额外的驱动)。什么是Windows的方式呢?基本上就是将驱动文件复制到%windir%system32drivers目录下,然后修改注册表,将相应的驱动程序所对应的服务及硬件ID写入合适的注册表项。这些写入的内容通过分析对应的驱动程序的inf文件就可以获得,为此,rui网友还曾经写过一个inf2reg的程序来自动根据驱动的inf文件生成对应的需要加入注册表的内容,实际上,驱动的inf文件的书写是有严格的规范的,从微软的TeckNet上可以找到很多有关的内容,有兴趣的朋友可以自己搜索并研究一下。

很显然,以我们个人的能力是不可能搜集到所有的MassStorage设备的驱动的,同时存储技术在不断发展,新硬件也层出不穷,这是通用克隆不可能实现万能的原因之一。还有一个原因,就是这些驱动之间有可能存在不兼容问题,驱动的不兼容会导致同时加载时直接死机,例如intelide与viaide的不兼容问题,这是导致克隆不能万能的原因之二,也是最主要的同时也很难解决的问题。目前,死性不改正在探索在DOS下运行的S&R&S软件,目的就是解决这个问题,其实现原理就是根据目标机器的硬件情况在DOS下只加载适合目标机器的对应的驱动,这样就可以有效避免驱动程序的不兼容问题,当然,这个产品还在测试阶段,有兴趣的可以访问龙帝国论坛S&R&S封装专区下载产品进行测试。

Acronis True Image最新版本所具有的Universal Restore功能,实现了在恢复克隆后类似于Windows安装时的F6加载用户自定义驱动功能,这应该是解决通用克隆恢复的一个好方向,当然,这需要更多的有志之士致力于研究它、推广它。

除了MassStorage设备的驱动问题以外,新型的CPU以及USB键盘、鼠标等设备驱动也要使用这种方式解决,例如AMD K8 CPU的驱动问题等。而木鸟所推出的ASR Tools系列封装软件,相对于S&R&S系列软件来说,最大的区别就在于所集成的驱动,由于木鸟对硬件驱动骨灰级的专家水平,所以它的封装软件中集成的驱动要远远优于S&R&S早期的软件,当然,由于木鸟和死性不改私下里是很亲密的战友,新版的S&R&S软件也采用了木鸟所提炼的驱动包,因此,从本质上来说,两个封装软件并没有什么大的区别,当然,细微的区别还是有的。我个人更喜欢用ASR Tools来制做通用克隆系统,但其操作步骤相对繁琐。

由于克隆系统在制做前需要集成大量的驱动程序,而在克隆安装完成后,这些驱动文件及对应的注册表项并不会被系统自动清除,而是随着系统每次都要启动,再加上驱动间的兼容性问题,因此给克隆系统带来了不小的隐患,同时也耗费了不小的系统资源,这也是很多人不提倡对克隆系统进行二次封装的主要原因。因应这种情况,在木鸟的指导下,由我操刀编写了ASRClean程序来配合ASR Tools系列封装软件进行安装完成后的驱动清理工作(同时还要感谢rui朋友提供的检测系统当前使用的MassStorage驱动的方法)。经过ASRClean清理的系统再进行二次封装,原则上应该是没有任何隐患的。

基本上,上面所讲的两个问题就是通用克隆系统所需要解决的两个核心技术问题。其它问题基本上都属于细枝末节问题,并不影响大局。

从我最近的几次装机经验来看,在克隆中集成大量的MassStorage存储设备驱动,在某些机器上真的会导致兼容性问题而导致克隆恢复失败,我遇到的一例失败就是在一个使用SiS芯片组的清华紫光笔记本上,克隆恢复完成后重启时系统不断蓝屏重启,我的解决办法是将失败的system注册表文件提取出来,然后在另一台Windows机器上使用reg load加载注册表文件,再使用ASRClean清理掉除SISIDE外的其它多余的MassStorage设备驱动(ASRClean 1.1支持这种功能,但你要自定义清理列表,详细用法看帮助),再将system文件复制回去,果然恢复成功。我想这个办法可以供大家作为借鉴。

==========================================================================

Windows通用克隆基础知识之二-关于封装系统的步骤及注意事项

1、关于克隆母系统所用机型。个人感觉对制作克隆系统的机器应该没有什么特别的要求,在我想来,VMWare、Virtual PC、PIII、P4的机器均可,当然,我们一般选用比较新比较快的机器进行母系统的安装与设置。不过,有一点儿特别需要注意的问题就是intelide和intelppm的不兼容问题。在封装完成后,应该删除intelide和intelppm服务及相关的注册表项。这个操作可以使用ASRClean完成。

命令1:
ASRClean /Delete:DelList.txt /NoRegBackup /Quiet

DelList.txt内容:
INTELIDE
INTELPPM

将ASRClean.exe和DelList.txt放到同一目录下,然后执行命令1即可清除intelide和intelppm服务相关注册表项。

当然,我的克隆系统都是在Intel平台下完成的,nForce、VIA及SiS平台是否需要清除相关的服务我不敢肯定,有心人可以测试一下。

2、关于克隆系统安装杀毒软件。在我的实践中,我仅测试过安装NAV企业版和瑞星网络版的客户端,对克隆系统都是没有影响的。至于卡巴斯基,论坛里曾经有人反映过它会造成克隆系统恢复失败,有人也给出了解决方案。但对于杀毒软件,我不是十分看重,毕竟,我们恢复完系统都要给系统再做克隆,系统坏了,大不了恢复克隆即可。所以,我个人虽然并不推荐不安装杀毒软件,但对过分强调杀毒软件的作用也持保留态度。有时候,用户良好的计算机操作和上网习惯是比安装杀毒软件更重要的一个因素,例如:经常给系统打补丁、不随意运行不明软件、浏览时不随意点Yes或者确定,这些都很重要。所以,对于杀毒软件,我只推荐象NAV企业版客户端或者McAfee这一类兼容性较好,占用系统资源较少的软件,虽然有时候它们的杀毒效果并不明显,但毕竟聊胜于无。

3、关于IDE控制器和计算机类型(电源类型)。虽然ASRTools宣称在使用它的卸载驱动功能后,不再需要将IDE控制器修改为标准双通道,但我个人认为,将IDE控制器修改为标准双通道还是稳定性更好的一种做法。因此我建议在使用ASRTools时,不要使用它的卸载驱动功能。在使用msprep.exe对系统进行封装前或者后,请手工确认一下是否将IDE控制器修改成了标准双通道,将计算机类型修改为Standard PC。

4、关于卸载普通硬件驱动和减少幽灵硬件。个人感觉完全不用担心幽灵硬件会对系统造成什么严重的影响,因此,如果你不是追求完美型的,完全可以不必理会幽灵硬件问题,因为FXZM所制作的最经典的克隆系统都没有理会幽灵硬件问题。

如果你想减少幽灵硬件,有两种比较简单有效的办法:
(1)使用下面的批处理:

@echo off
:: CPU
devcon remove ACPIProcessor

::GAME Port
devcon remove PCICC_09*

::网卡
devcon remove PCICC_02*

::声卡
devcon remove PCICC_04*

:: USB HOST and SMBus
devcon remove PCICC_0C*

:: 监视器
devcon remove DISPLAY*

:: 显卡
devcon remove PCICC_03*

:: 芯片组
devcon remove PCICC_0604*

:: 磁盘卷
devcon remove @STORAGE*

:: USB存储卷
devcon remove @USBSTOR*

:: USB设备
devcon remove @USB*

:: 人机接口设备
devcon remove @HID*

:: IDE设备
devcon remove @ide*

:: IDE Channel
devcon remove @PCIIDE*

这个批处理我是在ASRTools的removed.cmd的基础上完善出来的,例如,我不再卸载IDE控制器。因此,这个批处理请在安装完ASRTools后运行。

(2)使用我写的另一个批处理在恢复克隆后的封装安装过程中进行,具体说,是使用msprep.ini的ext=命令运行。

这个批处理我在ASRClean的讨论专帖中曾经发布过,帖子链接如下:
http://bbs.mscode.cc/viewthread.php?tid=19179

批处理名为xyfprep.cmd。

另外,可以同时采用上面两种方式,即在封装前使用removed.cmd卸载硬件,在恢复后封装安装过程中使用xyfprep.cmd再次卸载硬件。我自己的克隆系统就是同时使用这两种方式,基本上在恢复完成后可以保证没有什么幽灵硬件。

至于有人所说的在BIOS中关闭大部分硬件应该也是有效的,只要系统不安装对应的硬件驱动,就不会存在幽灵硬件。

5、关于对母系统进行封装的步骤。这个步骤其实不是死的,如果你了解整个过程,甚至在封装完成后都可以对克隆进行必要的改动。但我一般采用的步骤如下:

(1)母系统的准备。主要是系统的安装、安装常用软件,对系统进行优化和设置,这是一个完全个性化的过程,没有必要统一。如果你想将克隆放到光盘上,就尽量少安装软件。至于优化和减肥,自然更是见仁见智的事情。总之,你在对母系统进行封装前,一定要保证它是稳定的没有问题的。

(2)先给母系统制作一个克隆。一个好用的通用克隆系统的制作是一个大量实际测试和不断完善的过程,因此,对母系统保留一个原始的克隆是一种很好的节省克隆制作时间的方法,这样可以保证我们的每次封装安装都是在一个稳定的基础上开始的。而我们所要做的只是不断完善封装过程,改正上一次封装中所发现的错误。

(3)安装ASRTools或者S&R&S软件。安装过程中会有一些选项,一般就是选择你要集成到系统中哪些驱动(我一般是选择集成全部驱动的)。关于ASRTools的卸载驱动功能,建议你采用我上面所推荐的方式进行。

(4)将对应母系统的sysprep.exe和setupcl.exe复制到c:sysprep目录(没有必要将deploy.cab中的所有文件解压过去,只需要这两个文件)。运行msprep.exe对系统进行封装,至于msprep的选项,我一般将修改IDE控制器和计算机类型为Standard PC操作手工进行,因此,不会选择msprep中的对应选项。至于sysprep.exe的选项,好像最新版的msprep.exe已经剥夺了用户选择对应选项的权利,就用它默认的即可。至于sysprep.inf,我觉得根本没有必要每次封装都使用setupmgr.exe生成一个,直接将别人所做的克隆中的sysprep.inf文件复制出来然后稍加修改即可。例如,你可以用下面的:

;SetupMgrTag
[Unattended]
    OemSkipEula=Yes
    OemPreinstall=Yes
    DriverSigningPolicy=Ignore
    OemPnPDriversPath=”windowssystem32bird;driversCamera;driversChipsets;driversDisplayATI63B_31321;driversDisplayATI63;driversDisplayNV5216;driversDisplayNV8421;driversDisplay;driversEthernet;driversIntegratedinteli8x5;driversIntegratedinteli9x5;driversIntegratedintel;driversIntegrateds3;driversIntegratedsis;driversIntegratedvia;driversIntegrated;driversSoundad3890;driversSoundad4050;driversSoundad5430;driversSoundaddell;driversSoundadihd;driversSoundcmedia;driversSoundews88;driversSoundHdaudio;driversSoundrealtek;driversSoundSigmaTel;driversSoundsndchip;driversSoundviaenvy;driversSoundviahd;driversSound”

[GuiUnattended]
     AdminPassword=*
     EncryptedAdminPassword=NO
     OEMSkipRegional=1
     OEMDuplicatorstring=”Climbing”
     TimeZone=210
     OemSkipWelcome=1
     AutoLogon=Yes
     AutoLogonCount=1

[UserData]
     ProductKey=QC986-27D34-6M3TY-JJXP9-TBGMD
     FullName=”Climbing”
     OrgName=”www.mscode.cc”
     ComputerName=Climbing-clone-xp

[TapiLocation]
     CountryCode=86
     Dialing=Tone
     AreaCode=0312

[RegionalSettings]
     LanguageGroup=10
     Language=00000804

[Identification]
     JoinWorkgroup=WORKGROUP

[Networking]
     InstallDefaultComponents=Yes

[sysprepcleanup]

[GuiRunOnce]
command0=”C:WindowsGuiRunOnce.BAT”

封装完成后,不要忘了在设备管理器中检查IDE控制器是否为标准双通道和计算机类型是否为Standard PC,如果不是,请手工改之。还有,这时不要忘了清除象intelide和intelppm这样不兼容的驱动。

(5)修改c:msprep.ini,对里面的参数进行适当的设置。例如我的部分设置:

[Sysprep]
Cuser=Administrator
timeout=5
Setip=4
ext=windowsautohalx.cmd
IP=
Wcome=

然后将对应的批处理文件放到适当的位置。例如将GuiRunOnce.BAT和autohalx.cmd放到windows目录下,这些都是我自己编写的批处理。

(6)关于DllCacheManager的使用。你可以在这一步进行,也可以在第(2)步前进行,都没有关系,因为它的主要目的就是给克隆减肥,缩小克隆文件的体积。至于DllCache的恢复,本论坛(mscode.cc)的S&R&S专区曾经有人专门总结过(据说榕榕的教程中也有 …

发表评论

电子邮件地址不会被公开。 必填项已用*标注