玩转操作系统之系统封装部署再探!!

简介:
1.4 综述 
本章主要陈述了关于Windows操作系统的基本封装与部署的实现,微软的企业部署工具的效率和自动化程度相当高,封装和部署过程都比较简单。 
但现在有一个很重要的问题,按照微软企业部署工具中Deploy.chm中的简述,企业部署工具对于源计算机和目标计算机需要有相同HAL(硬件抽象层)。 
所谓HAL,是由硬件制造商提供的一种薄层软件,为操作系统高层隐藏或抽象硬件差异。通过 HAL 提供的筛选器,不同类型的硬件看起来与操作系统其余的硬件很相似。这样允许操作系统从一个硬件平台移植到另一个硬件平台。HAL 还提供了允许单个设备驱动器在所有的平台上支持同样设备的例程。 
封装好的系统在部署到硬件配置差异较大的计算机中时,特别是跨平台的计算机(Intel CPU+Intel主板做的映像部署到AMD CPU+nVIDIA主板上时),会由于HAL的差异而造成各种各样的不稳定乃至挡机,这就和要运用封装部署方式来快速安装系统的初衷不一致了。如果不能有良好的兼容性,即使能快速安装系统也完全是徒劳。 
在随后的一章里,将完美解决这个问题,让对硬件平台有依赖的系统封装部署,变为只对硬件配置没有依赖的“万能的”封装部署。
2.Unlimited万能封装与部署的实现
2.1 突破硬件限制的三个问题
2.1.1计算机电源管理模式
不同计算机的电源管理是不一样的,共有Standard、ACPI Uniprocessor、ACPI Multiprocessor、MPS Uniprocessor、MPS Multiprocessor、Compaq SystemPro、ACPI这7种,这7种电源管理模式分别适用于7种类型的计算机。
截止Windows Server 2003的企业部署工具,运用SYSPREP有一个限制,就是仅适用于用于封装的源计算机和进行部署的目标计算机必须具有相同硬件抽象层 (HAL)。
没有相同的HAL,会造成电源管理模式不能正确判断。网络中提出了不用的HAL检测解决方案,如ACPI封包、死性不改的电源模式等等。但是这些都不能做到100%的电源判断正确,而且检测会需要额外的文件,并且可能多次重启计算机,耗费了时间。
问题1,怎么让Sysprep突破不能自动检测电源管理的限制?
2.1.2计算机硬盘
计算机硬盘的发展可谓迅速。容量的提升,个人计算机硬盘容量从97年以前的个位数容量,突破到2007年现在的三位数容量。硬盘接口也一直在改变,从IDE到SATA,再从SATA到SATAII,从前一直在服务器上使用的SCSI磁盘技术和RAID磁盘阵列技术也渐渐的被使用到个人计算机中。(IDE属于并口硬盘,SATA和SCSI都属于串口硬盘,RAID属于硬盘阵列技术)。
在部署过程中,由于磁盘类型不同,需要不同的硬盘驱动(一般都是关于串口磁盘和磁盘阵列的驱动)。如果部署过程中不能正确加载硬盘驱动,则会造成不能进入系统甚至不能启动。
问题2,如何突破S&R&S(SATA & RAID & SCSI)硬盘类型的限制?
2.1.3驱动残留
进行封装的源计算机如果和进行部署的目标计算机硬件差异很大,例如AMD CPU+nVIDIA主板的源计算机做的系统映像部署到Intel CPU+Intel主板的机器上,在源计算机上装载的驱动程序肯定是在目标计算机上用不到了。即使目标计算机和源计算机硬件差异不大,但硬件技术差异很大,例如Intel CPU+Intel主板的源计算机做的系统映像部署到Intel CPU+Intel主板的机器上,源计算机为Intel 865主板,而目标计算机为945主板,源计算机上的驱动也是铁定用不到的。
这些驱动的残留不仅仅是会留下系统垃圾的问题,如果源计算机上的驱动自动强行去识别目标计算机上的硬件,很有可能会造成系统的不稳定乃至蓝屏崩溃。
问题3,如何突破不同硬件驱动冲突的限制?
2.2 突破HAL限制
2.2.1 Longhorn的启示
Windows Server 2003之前,Sysprep受到“必须源计算机与目标计算机有着相同的HAL”的限制,在HAL不相同的时候,不能正确判断计算机电源管理模式。
从2003年Windows Server 2003发布到2006年底Windows Vista的发布中的3年中,微软在研发Vista的时候,发布了以内部研发编号命名的Windows Longhorn测试版。
Windows Longhorn与以往的Windows在启动时有着一定的区别。
第一,NTLDR 有一定区别,提供了“/detecthal” 接口;
第二,BOOT.INI也支持“/detecthal”参数,以实现与NTLDR的结合;
第三,INF文件夹中有了“dtecthal.inf”, 提供各种HAL类型检测的参数说明。
有了这三个文件,可以让计算机在开机启动时即自动检测 HAL,从而可以自动判断电源管理选项。
2.2.2 移植Longhorn的HAL判断
现今大多数人还是以使用Windows 2000/XP为主,所以,即使Longhorn的HAL判断再怎么强悍,不能移植到2000/XP中,也就不能使用。
以下是在2000/XP总移植并使用Longhorn的HAL判断的具体方法:
1>从系统中提取相应的HAL文件包:(WIN2000在SP4.CAB、WINDOWS XP SP2在SP2.CAB中)
halacpi.dll
halapic.dll
halmps.dll
halaacpi.dll
halmacpi.dll
hal.dll
ntkrnlmp.exe
ntkrnlpa.exe
ntkrpamp.exe
ntoskrnl.exe
提取完毕后将hal.dll更名为halstnd.dll,ntoskrnl.exe更名为ntkrnlup.exe;
2>将上述相应的HAL文件包拷贝到准备封装的系统的%Windir%\SYSTEM32\下;
3>将Longhorn的“dtecthal.inf”拷贝到准备封装的系统的%Windir%\INF\下;
4>修改C:\BOOT.INI
在准备封装的系统后面加上 /DETECTHAL参数如:
[boot loader]
timeout=0
default=multi(0)disk(0)rdisk(0)partition(1)\WINDOWS
[operating systems]
multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="Microsoft Windows XP Professional" /fastdetect /detecthal
5>将LONGHORN版本的NTLDR拷贝到从C:\,覆盖原有的NTLDR;
6>删除准备封装的系统的HAL信息,删除注册表中以下键值,如果提示权限不足不能删除,则可用setacl.exe来修改权限再删除。
HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Enum\ACPI_HAL
HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Enum\Root\ACPI_HAL
HKEY_LOCAL_MACHINE\SYSTEM\ControlSet002\Enum\ACPI_HAL
HKEY_LOCAL_MACHINE\SYSTEM\ControlSet002\Enum\Root\ACPI_HAL
HKEY_LOCAL_MACHINE\SYSTEM\ControlSet003\Enum\ACPI_HAL
HKEY_LOCAL_MACHINE\SYSTEM\ControlSet003\Enum\Root\ACPI_HAL
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\ACPI_HAL
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\Root\ACPI_HAL
至此,突破了HAL限制的系统就已经准备完毕。由于这个技术本身就出自微软,所以对电源管理的判断几乎是100%。
突破HAL限制的系统可以部署在任何HAL环境的计算机上,不再有“源计算机和目标计算机需有相同的HAL”的限制。
2.1.1节中提出的问题完美解决
2.3 突破S&R&S 硬盘限制
确定目标计算机上可能用到的所有大量存储控制器,对于可能存在于目标计算机上的每个大量存储控制器,创建其硬件 ID 的列表。
2.3.1对于在 Windows 产品 CD 中提供的大量存储控制器
可以创建具有以下部分的 Sysprep.inf 文件:
[SysprepMassStorage]
hardware_id = path_to_device_inf
其中:
hardware_id
在设备的 .inf 文件中指定的即插即用 ID。
path_to_device_inf
.inf 文件的路径,该文件中包含待安装控制器的即插即用 ID。
例如,要支持 Windows XP 自带的不同 IDE 控制器(PCI 和 Intel),该部分如下所示:
[SysprepMassStorage]
PCI\VEN_8086&DEV_1222 = "%WINDIR%\inf\mshdc.inf"
PCI\VEN_8086&DEV_1230 = "%WINDIR%\inf\mshdc.inf"
PCI\VEN_8086&DEV_7010 = "%WINDIR%\inf\mshdc.inf"
PCI\VEN_8086&DEV_7111 = "%WINDIR%\inf\mshdc.inf"
PCI\VEN_8086&DEV_2411 = "%WINDIR%\inf\mshdc.inf"
PCI\VEN_8086&DEV_2421 = "%WINDIR%\inf\mshdc.inf"
PCI\VEN_8086&DEV_7199 = "%WINDIR%\inf\mshdc.inf"
2.3.2 对于 Windows 产品 CD 上没有提供的大量存储控制器
将目标计算机上的大量存储控制器的驱动程序文件复制到您计算机上的文件夹中 – 例如,复制到主计算机硬盘驱动器上的 %SYSTEMDRIVE%\pnpdrvrs\storage 中。
按以下格式向 [SysprepMassStorage] 部分中添加几行内容:
hardware_id = path_to_device_inf, disk_directory, disk_description, disk_tag
其中:
hardware_id
在设备的 .inf 文件中指定的即插即用 ID。
path_to_device_inf
.inf 文件的路径,该文件中包含待安装控制器的即插即用 ID。
disk_directory
第三方提供的软盘上的文件夹名称,该文件夹中包含大量存储驱动程序的副本。
disk_description
在第三方提供的 Txtsetup.oem 文件中指定的软盘说明。
disk_tag
在第三方提供的 Txtsetup.oem 文件中指定的软盘的磁盘标记。
将驱动程序文件放置到由 Sysprep.inf 中 [SysprepMassStorage] 部分指定的位置。例如,要支持新的 Qlogic 驱动程序,如果将文件复制到 C:\Drivers\Storage 文件夹,则添加如下行:
[SysprepMassStorage]
PCI\VEN_1077&DEV_1080 = "C:\Drivers\Storage\qlogic\qlogic.inf", "C:\Drivers\Storage\qlogic", "Qlogic Software Disk", "C:\Drivers\Storage\qlogic\qlogic"
2.3.3 突破S&R&S实例
1>收集需要的srs驱动,方便期间,直接下载DPS提供的massstorage 驱动:
2>解压驱动到c:\drivers 。
3>编辑sysprep.ini 加入以下内容
InstallFilesPath=C:\sysprep\i386
然后在[SysprepMassStorage]段中添加需要的串口磁盘驱动,根据DPS驱动包的说明书,一般只集成Intel、nVIDIA、Uli、VIA、SiS、AMD的串口磁盘驱动即可,在对应的驱动包中的inf文件中,可以获得硬件的即插即用ID。
例如:
[SysprepMassStorage]
PCI\VEN_1022&DEV_7469=c:\drivers\m\am\AMDEIDE.inf
PCI\VEN_1002&DEV_4349=c:\drivers\m\at\atiide.inf
PCI\VEN_10B9&DEV_5215=c:\drivers\m\au\1\ALIIDE.INF
PCI\VEN_10B9&DEV_5219=c:\drivers\m\au\1\ALIIDE.INF
PCI\VEN_10B9&DEV_5229=c:\drivers\m\au\1\ALIIDE.INF
PCI\VEN_10B9&DEV_5228=c:\drivers\m\au\2\m5228.INF
PCI\VEN_10B9&DEV_5281=c:\drivers\m\au\2\m5281.inf
PCI\VEN_10B9&DEV_5287=c:\drivers\m\au\3\ulisata.inf
PCI\VEN_10B9&DEV_5288=c:\drivers\m\au\4\ULISATA.INF
PCI\VEN_10B9&DEV_5289=c:\drivers\m\au\5\ULISATA.INF
PCI\VEN_8086&DEV_2652&CC_0104=c:\drivers\m\in\1\iastor.inf
PCI\VEN_8086&DEV_27C3&CC_0104=c:\drivers\m\in\1\iastor.inf
PCI\VEN_8086&DEV_2682&CC_0104=c:\drivers\m\in\1\iastor.inf
PCI\VEN_8086&DEV_27C6&CC_0104=c:\drivers\m\in\1\iastor.inf
PCI\VEN_8086&DEV_2822&CC_0104=c:\drivers\m\in\1\iastor.inf
PCI\VEN_8086&DEV_2652&CC_0106=c:\drivers\m\in\1\iaahci.inf
PCI\VEN_8086&DEV_2653&CC_0106=c:\drivers\m\in\1\iaahci.inf
PCI\VEN_8086&DEV_27C1&CC_0106=c:\drivers\m\in\1\iaahci.inf
PCI\VEN_8086&DEV_27C5&CC_0106=c:\drivers\m\in\1\iaahci.inf
PCI\VEN_8086&DEV_2681&CC_0106=c:\drivers\m\in\1\iaahci.inf
PCI\VEN_8086&DEV_2821&CC_0106=c:\drivers\m\in\1\iaahci.inf
PCI\VEN_8086&DEV_24DF&CC_0104=c:\drivers\m\in\1\O\iastor.inf
PCI\VEN_8086&DEV_25B0&CC_0104=c:\drivers\m\in\1\O\iastor.inf
PCI\VEN_10DE&DEV_008E=c:\drivers\m\N\TM\nvatabus.inf
PCI\VEN_10DE&DEV_00D5=c:\drivers\m\N\TM\nvatabus.inf
PCI\VEN_10DE&DEV_00EE=c:\drivers\m\N\TM\nvatabus.inf
PCI\VEN_10DE&DEV_00E3=c:\drivers\m\N\TM\nvatabus.inf
PCI\VEN_10DE&DEV_0036=c:\drivers\m\N\TM\nvatabus.inf
PCI\VEN_10DE&DEV_003E=c:\drivers\m\N\TM\nvatabus.inf
PCI\VEN_10DE&DEV_0054=c:\drivers\m\N\TM\nvatabus.inf
PCI\VEN_10DE&DEV_0055=c:\drivers\m\N\TM\nvatabus.inf
PCI\VEN_10DE&DEV_0266=c:\drivers\m\N\TM\nvatabus.inf
PCI\VEN_10DE&DEV_0267=c:\drivers\m\N\TM\nvatabus.inf
PCI\VEN_10DE&DEV_036F=c:\drivers\m\N\TM\nvatabus.inf
PCI\VEN_10DE&DEV_037E=c:\drivers\m\N\TM\nvatabus.inf
PCI\VEN_10DE&DEV_037F=c:\drivers\m\N\TM\nvatabus.inf
PCI\VEN_10DE&DEV_03F6=c:\drivers\m\N\TM\nvatabus.inf
PCI\VEN_10DE&DEV_03F7=c:\drivers\m\N\TM\nvatabus.inf
PCI\VEN_10DE&DEV_03E7=c:\drivers\m\N\TM\nvatabus.inf
PCI\VEN_1039&DEV_0181=c:\drivers\M\SI\1\SISRaid1.INF
PCI\VEN_1039&DEV_0180=c:\drivers\M\SI\2\SISRaid.INF
PCI\VEN_1039&DEV_0182=c:\drivers\M\SI\3\SISRaid2.INF
PCI\VEN_1106&DEV_3349&CC_0104=c:\drivers\M\V\1\VIAMRAID.INF
PCI\VEN_1106&DEV_6287&CC_0106=c:\drivers\M\V\1\VIAMRAID.INF
PCI\VEN_1106&DEV_0591&CC_0104=c:\drivers\M\V\1\VIAMRAID.INF
PCI\VEN_1106&DEV_3249&CC_0104=c:\drivers\M\V\1\VIAMRAID.INF
PCI\VEN_1106&DEV_3149&CC_0104=c:\drivers\M\V\1\VIAMRAID.INF
PCI\VEN_1106&DEV_3164&CC_0104=c:\drivers\M\V\1\VIAMRAID.INF
PCI\VEN_1106&DEV_0581&CC_0104=c:\drivers\M\V\1\VIAMRAID.INF
PCI\VEN_1106&DEV_7372&CC_0104=c:\drivers\M\V\1\VIAMRAID.INF
PCI\VEN_1106&DEV_4149=c:\drivers\M\V\2\viapide.inf
PCI\VEN_1106&DEV_0571=c:\drivers\M\V\3\vminiide.inf
PCI\VEN_1106&DEV_3149&CC_0101=c:\drivers\M\V\3\vminiide.inf
PCI\VEN_1106&DEV_0591&CC_0101=c:\drivers\M\V\3\vminiide.inf
PCI\VEN_1106&DEV_5337&CC_0101=c:\drivers\M\V\3\vminiide.inf
PCI\VEN_1106&DEV_3349&CC_0101=c:\drivers\M\V\3\vminiide.inf
PCI\VEN_1106&DEV_5287&CC_0101=c:\drivers\M\V\3\vminiide.inf
PCI\VEN_1106&DEV_3164&CC_0101=c:\drivers\M\V\3\vminiide.inf
PCI\VEN_1106&DEV_0581&CC_0101=c:\drivers\M\V\3\vminiide.inf
PCI\VEN_1106&DEV_5324&CC_0101=c:\drivers\M\V\3\vminiide.inf
PCI\VEN_104B&DEV_1040=c:\drivers\M\VM\vmscsi.inf
4>在c:\sysprep 目录下建立 i386\$oem$目录 ,在c:\sysprep\i386\$oem$ 中建立cmdlines.txt 文件,在文件中加入
[Commands]
"c:\sysprep\sysprep -clean"
这样就会在最小化安装的过程中禁用所有因为在目标计算机上不存在而未安装的大量存储控制器。
至此,一个突破了S&R&S限制的系统映像准备完毕。
执行sysprep进行封装,在封装的过程中,系统会自动安装 srs驱动。在最小化安装的时候会删除多余的驱动。
2.1.2节中的问题,这里也就已经解决了。
2.4 多余驱动的卸载
做封装所用的计算机中所使用的驱动程序,在被部署的计算机上大多数不再有用(除非都被部署在相同硬件配置的计算机上)。所以,我们要一一删除源计算机中的这些驱动,以免残留的驱动造成部署的不正常。
卸载驱动,在“设备管理器”(我的电脑,属性,硬件,设备管理器)中列出所有设备,然后一一卸载。
在设备管理器中,可以看到当前正在使用的所有硬件设备。
1>常规驱动的卸载
除“IDE ATA/ATAPI控制器”和“计算机”以外的其他设备,一一展开,然后卸载即可。
2>更改IDE模式
由于不同计算机的IDE控制器差异比较大,如果出现错误的识别,将会出现不能开机的情况,所以,这里预先将IDE控制器设置为“标准双通道”,在部署时,安装程序将自动寻找和起匹配的IDE控制器驱动程序。
3>计算机电源管理
计算机电源管理分为许多种,可以适用于不同类别的计算机。如果电源管理判断不正确,将会造成计算机的不正常。在计算机识别电源管理之前,需要将电源管理设为标准模式以基本适用于所有的计算机,这种标准模式仅仅可以保证计算机正常启动,但是不能保证最高效的运行。
将计算机的电源管理模式设置为Standard PC以后,在部署时,由于我们适用了Longhorn的HAL自动判断,计算机将会在启动时自动修改Standard PC为被部署计算机的电源管理模式。
至此,突破了硬件限制的系统映像也被修改了出来,系统映像可以被部署到不同硬件配置的机器中了。
2.1.3节中的问题被解决。
2.5 综述
在不同硬件配置的机器中适用系统部署受到种种制约,本章分为3块解决了映像系统万能部署的3条限制。
Longhron的自动HAL判断,解决了源计算机与目标计算机在不同HAL模式时不能进行部署的问题。
S&R&S驱动的集成,解决了系统部署在不同硬盘模式的情况下进行部署的问题。
驱动的卸载,解决了系统部署在不同硬件配置的计算机下进行的问题。
这3条限制被突破以后,系统部署时,不必再遵循源计算机和目标计算机必须相同配置的原则,真正可以实现无限制的“万能部署”。
3.Auto 自动封装与部署的实现
3.1 自动封装与部署的意义和理论实现
3.1.1自动封装的意义
1>封装测试需要很多次的重复
封装一个可以部署的系统映象并不难,但是封装一个比较完美的可以满足各项要求的系统映象却是一个特别花费时间和精力的工作,需要很多次的重复制作。仅上一章中所提到的各种限制的突破,如果每次测试都时候都做一次,也会消耗很多的时间。
能不能让这些手工的机械化的操作变成自动的?
2>频繁的手工操作容易造成错误
即使是一个对封装十分了解的人,在多次的执行封装中,也难免会出现遗漏和失误,毕竟封装的步骤一环扣一环,虽然不繁琐也难免会造成错误。
怎么让封装的流程变的自动而无需人手工参与?
3>封装的普及
很多IT工作者并不十分了解封装与部署,却一样想做出自己的系统映象用来部署,由于工作等原因实在没有时间去系统的学习,难道封装只能掌握在少数人手中?
怎么让封装更为普及化,让没有太多封装知识和经验的人也能迅速的进行系统封装?
3.1.2 系统封装和部署的详细流程
1>系统安装、补丁、软件等;
[封装]:
2>在系统光盘上找到Deploy.cab,解压到%system%\Sysprep;
3>运行Setupmgr.exe创建无人职守部署应答文件Sysprep.inf;
4>突破HAL限制,把于HAL相关的文件都放置在%windir%下相应位置,提取Longhorn的ntldr1,修改boot.ini;
5>突破S&R&S限制,把所有串口磁盘和磁盘阵列驱动都放置在%systemdrive%\Drivers下,在Sysprep.inf中的[SysprepMassStorage]段下添加磁盘驱动位置等信息;
6>卸载各种驱动,修改IDE控制器为标准双通道,修改计算机电源管理为Standard PC;
7>运行Sysprep.exe进行系统封装;
8>关闭封装源计算机;
9>DOS模式启动封装源计算机,使用GHOST备份下封装完的系统映象;
[部署]:
10>使用GHOST恢复系统映象到部署目标计算机;
11>部署目标计算机,系统运行%windir%\system32\setup.exe来部署计算机映象。
3.1.3 自动封装的理论实现
纵观流程,封装过程基本上可以分为相关文件的复制、对文件的调整、相关软件的运行、对系统的调整四部分。
相关文件的复制,简单说,就是把应该放在哪儿的文件放在哪儿,这些文件都是特定的,进行封装必然要用到这些文件,所以,可以预先把这些文件提取出来放置在一个另外的文件夹中,然后用WinRAR压缩为自解压文件并设定解压位置,这样到用这些文件的时候直接双击自解压包,这些要用到的文件就会各自解压到自己应该在的位置上。
对文件的调整,主要是替换Longhorn的ntldr,以及修改boot.ini,这个我们可以用命令行修改系统自身的ntldr为ntldr.bak,修改系统自身的boot.ini为boot.ini.bak,然后把 Longhorn的ntldr和修改好的boot.ini复制到原系统ntldr和boot.ini的位置。当系统部署完毕后再把原始的ntldr和boot.ini替换回来,虽然替换回原有的不是必须的,但是个人认为,保持原系统的原始性一定程度上有利于系统的稳定性。
相关软件的运行,这个主要是Sysprep,如果每次要为Sysprep设置相同的执行方式,那么Sysprep提供很多的运行参数,添加参数运行Sysprep,就免去了每次都要去点击封装选项的问题。
对系统的调整,主要是卸载驱动以及调整计算机电源管理和IDE控制器。虽然这个可以使用自动化实现,但是个人认为这个手工还是比较保险。
3.2 实现自动封装与部署
3.2.1 文件的自动复制
建立如下目录,以D:\ES文件夹为例:
D:\ES\ Sysprep\ cvtarea.exe
D:\ES\ Sysprep\ oformat.com
D:\ES\ Sysprep\ Setupcl.exe
D:\ES\ Sysprep\ Sysprep.exe
D:\ES\ Sysprep\ Sysprep.inf
D:\ES\ Sysprep\ SetACL.exe
D:\ES\Sysprep\AutoSysprep.cmd
D:\ES\Sysprep\cmdline.reg
D:\ES\WINDOWS\ inf\ dtecthal.inf
D:\ES\WINDOWS\ system32
D:\ES\WINDOWS\ system32\ halaacpi.dll
D:\ES\WINDOWS\ system32\ halacpi.dll
D:\ES\WINDOWS\ system32\ halapic.dll
D:\ES\WINDOWS\ system32\ halmacpi.dll
D:\ES\WINDOWS\ system32\ halmps.dll
D:\ES\WINDOWS\ system32\ halstnd.dll
D:\ES\WINDOWS\ system32\ mscomctl.ocx
D:\ES\WINDOWS\ system32\ ntkrnlmp.exe
D:\ES\WINDOWS\ system32\ ntkrnlpa.exe
D:\ES\WINDOWS\ system32\ ntkrnlup.exe
D:\ES\WINDOWS\ system32\ ntkrpamp.exe
D:\ES\WINDOWS\ AllUsrRun.cmd
D:\ES\ Drivers
D:\ES\ bootL.ini
D:\ES\ ntldrL
说明:
1>ES文件夹模拟C盘根目录,所有文件排布和此后要复制到C盘中的排布是一样的;
2>Sysprep中的所有文件在第一章中介绍过,Sysprep文件夹将在系统部署最小化安装时自动删除,SetACL.exe是提升权限以修改注册表的工具,AutoSysprep.cmd是自动进行封装所用的批处理,cmdline.reg将在3.2.3中详细说明;
3>inf和system32文件夹中的各文件在第二章中介绍过,用于Longhorn的自动HAL判断;
4>AllUsrRun的用处后面详细介绍;
5>bootL.ini是为HAL自动判断所写好的boot.ini文件,内容为:
[boot loader]
timeout=30
default=multi(0)disk(0)rdisk(0)partition(1)\WINDOWS
[operating systems]
multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="Microsoft Windows XP Professional" /fastdetect /detecthal
6>ntldrL是Longhorn的系统引导文件,同样用于自动HAL判断。
7>Drivers中放置串口磁盘和磁盘阵列驱动
文件打包:
选择最常用的压缩工具WinRAR来进行打包ES文件夹中的所有文件, 设定默认解压缩路径为C:\并且设置解压模式为“隐藏启动对话框”和“覆盖所有文件”,这几个选项的设定可以保证文件不会复制到错误的位置。
3.2.2 自动封装的实现
AutoSysprep.cmd的内容如下(以封装XP系统为例):
rem 自动封装,静默模式、最小化、不重置激活事件、清空事件查看器日志、不重启计算机
start /wait c:\sysprep\sysprep.exe -quiet -mini -activated -reseal -noreboot
rem 导入cmdline.reg键值(3.2.3中介绍)
start /wait regedit.exe /s c:\Sysprep\cmdline.reg
rem 取消XP的ntldr权限,改名为ntldrXP,再恢复其权限
attrib c:\ntldr -h -s -r
ren c:\ntldr ntldrxp
attrib c:\ntldrxp +h +s +r
rem 取消Longhron的ntldrL的权限,改名为ntldr,再恢复其权限
attrib c:\ntldr1 -h -s -r
ren c:\ntldr1 ntldr
attrib c:\ntldr +h +s +r
rem取消XP的boot.ini权限,改名为bootXP.ini,再恢复其权限
attrib c:\boot.ini -h -s -r
ren c:\boot.ini bootxp.ini
attrib c:\bootxp.ini +h +s +r
rem 取消Longhron的bootL.ini的权限,改名为boot.ini,再恢复其权限
attrib c:\boot1.ini -h -s -r
ren c:\boot1.ini boot.ini
attrib c:\boot.ini +h +s +r
rem 进入Sysprep文件夹内
cd\
cd\sysprep
rem 使用SetACL来取消有关源计算机HAL的注册表信息的权限,以便随后的修改
setacl MACHINE\SYSTEM\ControlSet001\Enum\ACPI_HAL /registry /grant everyone /full
setacl MACHINE\SYSTEM\ControlSet001\Enum\Root\ACPI_HAL /registry /grant everyone /full
setacl MACHINE\SYSTEM\ControlSet002\Enum\ACPI_HAL /registry /grant everyone /full
setacl MACHINE\SYSTEM\ControlSet002\Enum\Root\ACPI_HAL /registry /grant everyone /full
setacl MACHINE\SYSTEM\ControlSet003\Enum\ACPI_HAL /registry /grant everyone /full
setacl MACHINE\SYSTEM\ControlSet003\Enum\Root\ACPI_HAL /registry /grant everyone /full
setacl MACHINE\SYSTEM\CurrentControlSet\Enum\ACPI_HAL /registry /grant everyone /full
setacl MACHINE\SYSTEM\CurrentControlSet\Enum\Root\ACPI_HAL /registry /grant everyone /full
rem 删除源计算机的HAL注册表信息
reg delete HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Enum\ACPI_HAL /f
reg delete HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Enum\Root\ACPI_HAL /f
reg delete HKEY_LOCAL_MACHINE\SYSTEM\ControlSet002\Enum\ACPI_HAL /f
reg delete HKEY_LOCAL_MACHINE\SYSTEM\ControlSet002\Enum\Root\ACPI_HAL /f
reg delete HKEY_LOCAL_MACHINE\SYSTEM\ControlSet003\Enum\ACPI_HAL /f
reg delete HKEY_LOCAL_MACHINE\SYSTEM\ControlSet003\Enum\Root\ACPI_HAL /f
reg delete HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\ACPI_HAL /f
reg delete HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\Root\ACPI_HAL /f
rem 以下用于Intel CPU + Intel 主板的源计算机,Intel的这两组键值容易造成部署到非Intel硬件计算机中的蓝屏事故
rem使用SetACL来取消有关当前Intel 主板的注册表信息的权限,以便随后的修改
setacl MACHINE\SYSTEM\ControlSet001\Services\IntelIde /registry /grant everyone /full
setacl MACHINE\SYSTEM\ControlSet002\Services\IntelIde /registry /grant everyone /full
setacl MACHINE\SYSTEM\ControlSet003\Services\IntelIde /registry /grant everyone /full
setacl MACHINE\SYSTEM\CurrentControlSet\Services\IntelIde /registry /grant everyone /full
rem使用SetACL来取消有关当前Intel CPU的注册表信息的权限,以便随后的修改
setacl MACHINE\SYSTEM\ControlSet001\Services\intelppm /registry /grant everyone /full
setacl MACHINE\SYSTEM
rem 使用SetACL来取消有关源计算机HAL的注册表信息的权限,以便随后的修改
setacl MACHINE\SYSTEM\ControlSet001\Enum\ACPI_HAL /registry /grant everyone /full
setacl MACHINE\SYSTEM\ControlSet001\Enum\Root\ACPI_HAL /registry /grant everyone /full
setacl MACHINE\SYSTEM\ControlSet002\Enum\ACPI_HAL /registry /grant everyone /full
setacl MACHINE\SYSTEM\ControlSet002\Enum\Root\ACPI_HAL /registry /grant everyone /full
setacl MACHINE\SYSTEM\ControlSet003\Enum\ACPI_HAL /registry /grant everyone /full
setacl MACHINE\SYSTEM\ControlSet003\Enum\Root\ACPI_HAL /registry /grant everyone /full
setacl MACHINE\SYSTEM\CurrentControlSet\Enum\ACPI_HAL /registry /grant everyone /full
setacl MACHINE\SYSTEM\CurrentControlSet\Enum\Root\ACPI_HAL /registry /grant everyone /full
rem 删除源计算机的HAL注册表信息
reg delete HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Enum\ACPI_HAL /f
reg delete HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Enum\Root\ACPI_HAL /f
reg delete HKEY_LOCAL_MACHINE\SYSTEM\ControlSet002\Enum\ACPI_HAL /f
reg delete HKEY_LOCAL_MACHINE\SYSTEM\ControlSet002\Enum\Root\ACPI_HAL /f
reg delete HKEY_LOCAL_MACHINE\SYSTEM\ControlSet003\Enum\ACPI_HAL /f
reg delete HKEY_LOCAL_MACHINE\SYSTEM\ControlSet003\Enum\Root\ACPI_HAL /f
reg delete HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\ACPI_HAL /f
reg delete HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\Root\ACPI_HAL /f
rem 以下用于Intel CPU + Intel 主板的源计算机,Intel的这两组键值容易造成部署到非Intel硬件计算机中的蓝屏事故
rem使用SetACL来取消有关当前Intel 主板的注册表信息的权限,以便随后的修改
setacl MACHINE\SYSTEM\ControlSet001\Services\IntelIde /registry /grant everyone /full
setacl MACHINE\SYSTEM\ControlSet002\Services\IntelIde /registry /grant everyone /full
setacl MACHINE\SYSTEM\ControlSet003\Services\IntelIde /registry /grant everyone /full
setacl MACHINE\SYSTEM\CurrentControlSet\Services\IntelIde /registry /grant everyone /full
rem使用SetACL来取消有关当前Intel CPU的注册表信息的权限,以便随后的修改
setacl MACHINE\SYSTEM\ControlSet001\Services\intelppm /registry /grant everyone /full
setacl MACHINE\SYSTEM\ControlSet002\Services\intelppm /registry /grant everyone /full
setacl MACHINE\SYSTEM\ControlSet003\Services\intelppm /registry /grant everyone /full
setacl MACHINE\SYSTEM\CurrentControlSet\Services\intelppm /registry /grant everyone /full
  rem 删除有关Intel主板的注册表信息
reg delete MACHINE\SYSTEM\ControlSet001\Services\IntelIde /f
reg delete MACHINE\SYSTEM\ControlSet002\Services\IntelIde /f
reg delete MACHINE\SYSTEM\ControlSet003\Services\IntelIde /f
reg delete MACHINE\SYSTEM\CurrentControlSet\Services\IntelIde /f
rem 删除有关Intel CPU的注册表信息
reg delete MACHINE\SYSTEM\ControlSet001\Services\intelppm /f
reg delete MACHINE\SYSTEM\ControlSet002\Services\intelppm /f
reg delete MACHINE\SYSTEM\ControlSet003\Services\intelppm /f
reg delete MACHINE\SYSTEM\CurrentControlSet\Services\intelppm /f
3.2.3 部署过程的调整
部署过程,其实就是系统映象恢复到目标计算机上,目标计算机启动,系统会自动运行%windir%\system32\Setup.exe来部署系统。
如果我们想在Setup.exe前或者后运行点什么,该怎么办?例如,我们要在Setup.exe运行后将原来系统的ntldr和boot.ini恢复回来,而不是使用Longhorn的,怎么办?
经过对比封装前和封装后的注册表,发现目标计算机启动后,将要进行部署时并非是一定要运行%windir%\system32\Setup.exe,而是运行系统注册表中“HKEY_LOCAL_MACHINE\SYSTEM\Setup”分支下的“CmdLine”键值所指定的应用程序。在系统封装完成时,“HKEY_LOCAL_MACHINE\SYSTEM\Setup”分支下“CmdLine”键值被修改为“setup.exe”,这就是为什么目标计算机启动后会运行setup.exe来部署系统的原因。
我们自己写一个批处理,批处理的内容包括运行setup.exe和恢复原有ntldr、boot.ini,把这个批处理的名字定名为“AllUsrRun.cmd”,并且把“HKEY_LOCAL_MACHINE\SYSTEM\Setup”分支下“CmdLine”的键值由“setup.exe”修改为“AllUsrRun.cmd”。这样源计算机启动的时候并非运行setup.exe来部署系统,而是运行AllUsrRun.cmd。
AllUsrRun.cmd的内容如下:
rem 把我们修改的CmdLine键值重新置空
reg delete HKEY_LOCAL_MACHINE\SYSTEM\setup /v cmdline /f
rem 部署系统,全新安装、最小化执行
setup.exe -newsetup –mini
rem 修改Longhorn的ntldr权限,并删除
attrib c:\ntldr -h -s -r
del c:\ntldr
rem 修改先前备份的XP的ntldrXP权限,改名回ntldr,恢复权限
attrib c:\ntldrXP -h -s -r
ren c:\ntldrXP ntldr
attrib c:\ntldr +h +s +r
rem 修改Longhorn的boot.ini权限,并删除
attrib c:\boot.ini -h -s -r
del c:\boot.ini
rem 修改先前备份的XP的bootXP.ini权限,改名回boot.ini,恢复权限
attrib c:\bootXP.ini -h -s -r
ren c:\bootXP.ini boot.ini
attrib c:\boot.ini +h +s +r
  rem修改多启动菜单等待时间为5秒
bootcfg /timeout 5
这样部署过程就被我们调整的如我们所愿了。
3.3 综述
经过3.2节中的几步,自动封装和部署基本被我们实现。
3.1.2中[封装]段的步骤被简化为:
1>运行自动解压缩,把文件解压到相应位置;
2>卸载驱动,手动修改IDE控制器和计算机电源管理;
3>运行%systemdrive%\Sysprep文件夹中的AutoSysprep.cmd封装系统;
4>重启计算机,使用GHOST备份系统映象。
3.1.2中[部署]段的步骤变为:
1>恢复系统映象到目标计算机;
2>目标计算机启动,自动运行AllUsrRun.cmd部署系统并还原系统原始的ntldr和boot.ini。
如此以来,系统封装将变的十分简单,不仅给多次测试封装系统带来很大的方便,还能让没有太多封装经验的人迅速封装系统。
系统自动化封装和部署完美实现。
结论
全文分3章讲述了封装部署方法快速安装和部署操作系统的方法。
从第一章的基本实现到第二章的万能实现,再到第三章自动实现,一步步实现了从最基本封装部署到全自动封装部署。
从覆盖面上讲,从最原始的微软所规定的“源计算机与目标计算机必须有相同的HAL”到最终的任意HAL源计算机部署到任意HAL目标计算机,覆盖面被有效的提高。理论上讲,部署方法,可以适用于任何计算机。
从易用性上讲,从最早的手工复制文件、手工修改注册表、手工修改各种配置文件,到最终的“Easy Sysprep”只需在图形界面设置好然后单击一下“开始封装”即可封装系统,不可说不是个比较大的进步和跨越。
经过本文中3章的研究工作,封装部署已经变的拥有更大的适用性并拥有更简单的可用性,系统封装部署这种可以有效的提高计算机维护人员工作效率的方法,必将得到最广泛的认可与应用!
现在大家对系统封装,因该有了一定的认识,资料的收集和整理不容易,希望大家有所收获!
TKS!
本文转自许珈毓的技术思考博客51CTO博客,原文链接http://blog.51cto.com/jiayu/65923如需转载请自行联系原作者

BabyXc
相关文章
|
17天前
|
监控 Unix Linux
Linux操作系统调优相关工具(四)查看Network运行状态 和系统整体运行状态
Linux操作系统调优相关工具(四)查看Network运行状态 和系统整体运行状态
31 0
|
19天前
|
算法 程序员
深入理解操作系统内存管理:分页系统的优势与挑战
【4月更文挑战第7天】 在现代操作系统中,内存管理是一项至关重要的任务,它确保了计算机能够高效、安全地运行各种程序。分页系统作为内存管理的一种技术,通过将物理内存分割成固定大小的单元——页面,为每个运行的程序提供了一种独立且连续的内存地址空间。该技术不仅简化了内存分配,还允许更高效的内存使用和保护。本文探讨了分页系统的核心原理,优势以及面临的挑战,旨在为读者揭示其在操作系统设计中的重要性。
|
4天前
|
存储 Linux API
软件体系结构 - 嵌入式系统(2)- 嵌入式操作系统
软件体系结构 - 嵌入式系统(2)- 嵌入式操作系统
10 0
|
3天前
|
前端开发 Android开发 开发者
移动应用与系统:探索开发实践与操作系统融合
【4月更文挑战第23天】 在数字化时代的浪潮中,移动应用与系统的发展已成为技术创新和商业竞争的前沿阵地。本文将深入探讨移动应用的开发实践、移动操作系统的最新趋势以及二者之间的紧密融合。通过分析跨平台工具的效能、原生开发的优化策略以及操作系统的定制化功能,旨在为开发者提供一个全面而深入的视角,以适应不断变化的市场需求和技术挑战。
|
15天前
|
监控 测试技术 Android开发
移动应用与系统:开发与操作系统的深度解析
【4月更文挑战第11天】在这篇文章中,我们将深入探讨移动应用的开发过程,以及移动操作系统如何影响这些应用的性能和功能。我们将详细分析移动应用开发的关键步骤,包括需求分析、设计、编码、测试和维护。同时,我们也将探讨移动操作系统,如Android和iOS,如何为应用开发提供支持,并影响其性能。
|
18天前
|
Java 物联网 Android开发
移动应用与系统:探索开发与操作系统的融合
【4月更文挑战第8天】 在数字化时代的浪潮中,移动应用与系统的发展已成为技术创新的前沿阵地。本文将深入探讨移动应用开发的关键技术、移动操作系统的架构演变以及两者之间的相互作用。通过对当前流行的开发工具、编程语言和操作系统特性的分析,我们旨在为开发者提供一套全面的指导,以优化移动应用的性能和用户体验。同时,文章还将展望移动技术的未来趋势,特别是在人工智能和物联网领域的潜在应用。
|
28天前
|
机器学习/深度学习 搜索推荐 vr&ar
移动应用与系统的未来:从开发到操作系统的全面解析
本文将探讨移动应用和系统的未来,包括移动应用开发的趋势,移动操作系统的进展,以及这两者如何相互影响。我们将深入探讨如何通过理解这些变化,来优化移动应用的性能和用户体验。
10 2
|
1月前
|
存储 Shell Linux
【Shell 命令集合 网络通讯 】⭐Linux 显示当前系统的主机名和操作系统类型 uuname命令 使用教程
【Shell 命令集合 网络通讯 】⭐Linux 显示当前系统的主机名和操作系统类型 uuname命令 使用教程
29 0
|
1月前
|
缓存 算法 安全
深入理解操作系统内存管理:分页系统的优势与挑战
【2月更文挑战第30天】 在现代操作系统中,内存管理是核心功能之一,它负责将有限的物理内存资源分配给多个并发运行的进程。分页系统作为内存管理的一种流行技术,其通过虚拟到物理地址的映射提供了程序的逻辑地址空间,并允许更高效的内存分配和保护。本文旨在探讨分页系统的关键优势,包括其如何提升内存利用率、实现内存保护以及支持多任务处理。同时,我们也将分析分页机制带来的挑战,诸如页面置换算法的效率问题、页表管理和TLB(Translation Lookaside Buffer)的维护等。
|
1月前
|
存储 算法
深入理解操作系统内存管理:分页系统的优势与挑战
【2月更文挑战第29天】 在现代操作系统中,内存管理是核心功能之一,它负责有效地分配、跟踪和回收内存资源。分页系统作为一种内存管理技术,已经成为大多数操作系统的标准配置。本文将探讨分页系统的原理、优势以及面临的挑战。通过对分页机制的深入分析,我们旨在提供一个全面的视角,以帮助读者更好地理解这一关键技术如何影响操作系统的性能和稳定性。