關於封裝與部署的深入研究

關於封裝與部署的深入研究

前言

從Windows95到現在的WindowsVista,Windows優秀的圖形界面和可操作性,贏得了目前廣泛的使用人羣。雖然Windows各方面性能,特別是穩定性方面,依然有所不及Unix、Linux這些高穩定性的系統,但是它仍然不可否認的成爲當前使用範圍最廣的操作系統。但是Windows發展了整整10於個年頭,雖然Windows的性能在不斷增強和完善,但是系統安裝的速度依然是十分緩慢且讓人頭疼。雖然2006年底推出的Windows Vista憑藉微軟的新技術ImageX,可以在短短20分鐘內安裝10幾G左右的文件,但是由於Windows Vista對計算機硬件要求較高,軟件兼容性尚不理想,所以未得到最好的普及,目前使用最廣泛的Windows操作系統,依然是Windows XP。Windows XP 的安裝時間在約20~30分鐘左右,這還不算更新Windows安全補丁、系統優化以及軟件安裝的時間,平均來算,要完全安裝一個可用的(包含常用補丁和軟件,以及必要的系統優化)Windows XP操作系統,至少需要1個小時左右的時間。對於做硬件維護的人們來講,系統的這個安裝和調試時間無論如何都是不能被很好接受的事實。即使硬件維護人員可以勉強接受這個安裝時間,很多情況下,要使用計算機來辦公的人員更難接受這個漫長而浪費時間的過程。這的確和高效率的社會結構不符,和高節奏的社會工作生活更不相符。一直在探尋一種方法,在於如何高效的進行系統的維護乃至重新安裝,如何把原來近1小時才能完成的繁雜工作控制在15分鐘以內完成。爲解決系統安裝過於繁雜耗時的問題,我首先考慮到的是利用微軟自己的所謂“封裝部署工具”(Sysprep)。所謂封裝部署,是微軟爲大企業用戶提供的一種結構化的部署操作系統的工具。可以在一臺計算機上把已經做好各種調試的系統進行再封裝,封裝完畢的系統,可以部署到其他計算機中,部署時間相當的短,大概僅僅5~6分鐘,極大的提高對計算機系統的維護效率。但是封裝部署是有條件的,即僅適用於封裝的源計算機和用於部署的目標計算機必須具有相同硬件抽象層 (HAL),即不相同硬件配置的機器不能互相部署對方機器上封裝好的操作系統,這樣就會對當今繁雜的計算機硬件配置中進行封裝和部署造成極大的障礙。通過對微軟的操作系統Longhron各內測版本進行啓動過程的跟蹤,發現微軟在Longhron啓動參數中提供了/detecthal接口,依靠這個接口,我們可以讓計算機在啓動時自動檢測硬件抽象層(HAL),通過了這個檢測,封裝完的系統在部署到不同的計算機中時,就不會出現由於硬件抽象層(HAL)的不同而造成的系統在部署過程中由於對硬件的依賴而造成的種種非正常運行。這個研究成功後,一個被調試好的系統(包括系統補丁追加、系統優化、常用軟件安裝)可以在進行封裝後,高效的部署到任何硬件配置的其他計算機上,極大的縮短進行計算機維護的時間,極大的提高計算機維護的效率。


1.Base 基本封裝與部署的實現

1.1系統的封裝與部署

系統的封裝與部署,這個概念出自Microsoft(微軟)。在Microsoft的Windows系列系統光盤中,包含企業部署工具(Deploy.cab),Deploy中包括了幾個可供管理員和 IT 專業人士用來將 Windows 部署到組織中多臺計算機上的工具。Deploy.cab包括:Setupmgr.exe、Sysprep.exe、Cvtarea.exe、Oformat.com。


Setupmgr.exe,
中文譯爲:安裝管理器,爲預安裝 Microsoft
操作系統和各種應用程序自動創建和修改分佈共享的嚮導。簡單來說,這個工具主要是用來自動創建安裝Windows操作系統的自動應答文件,可以讓系統的安裝做到“無人職守”,即在系統的安裝過程中,無需任何人爲的干預。


Sysprep.exe,中文譯爲:系統準備,準備計算機硬盤,以便進行磁盤復
制、審覈並交付客戶。在分發前必須運行 Sysprep 以重新封裝計算機。Sysprep包含下列組件:Sysprep.exe、Setupcl.exe、Factory.exe、Sysprep.inf 和Winbom.ini。應用程序文件(Sysprep.exe、Setupcl.exe 和Factory.exe)是必需的,而且它們互相依存。簡單來說,這個工具用於重新封裝已經在計算機上安裝好的系統,封裝完畢的映像可以通過介質複製到其他計算機上,當獲取封裝好的映像的計算機啓動時,Sysprep.exe將調用%Windir%\System32\setup.exe在獲取映像的計算機中重新部署系統。這種部署類似於直接安裝系統,但是速度要比正常安裝快許多倍。


Cvtarea.exe,一個用於在 FAT32 或 FAT 文件系統上創建文件並分析那些文件放置情況的靈活工具。使用 Cvtarea 工具,您可以創建連續的文件並將其放在磁盤上的特定位置。


Oformat.com,創建 FAT32 卷,該卷中的簇以某種優化方法取整,以便在以後將其轉換爲 NTFS 文件系統格式。


總體而言,隨着技術的發展,可以替代Cvtarea.exe和Oformat.com的工具出現了許多,Setupmgr.exe用於生成無人職守安裝應答文件,Sysprep.exe是用於系統封裝的主要工具。

1.2 Setupmgr

獲得封裝好的系統映像的計算機,第一次啓動時,將會自行進行系統部署,系統部署過程中,會提問用戶有關產品密鑰、時區、計算機名稱、管理員密碼等等,這個和普通的系統安裝的步驟一樣(當然,比普通安裝快速的多),每次都去輸入這些,無非會降低工作效率。利用Setupmgr.exe,可以爲系統部署創建一份自動應答文件,當系統部署時碰到各種需要用戶來確認的信息時,直接去這份自動應答文件中尋找預先規定好的答案,而無需提示用戶輸入。Setupmgr.ex的使用方法十分簡單,安裝提示一步步寫下去即可。寫完後,即可單擊“完成”,這樣就可以完成所有有關無人職守安裝模式的設定了。設定完成後,系統會自動生成Sysprep.inf文件,這個文件中記錄了所有有關自動應答的答案。部署時,sysprep.inf置於%systemdrive%\Sysprep文件夾中,即可執行無人職守的部署安裝。

1.3 Sysprep

1.3.1系統封裝部署基本流程
一般流程爲:
1>常規安裝Windows到被設置爲啓動的硬盤的第一分區(一般爲C盤);
2>對系統做應有的系統補丁添加、驅動安裝、系統優化調整、常用軟件安裝等;
3>在C盤根目錄下創建Sysprep文件夾,放入企業部署工具(Deploy.cab)中的相應各文件;
4>使用Setupmgr.exe創建自動應答文件;
5>運行Sysprep.exe來封裝當前系統爲系統映像;
6>關閉計算機,利用第三方軟件複製下這個系統映像(C盤全部),一般使用GHOST;
7>利用網絡或其他介質(光盤)複製該映像到其他計算機進行部署。

1.3.2 系統封裝
做完上節中步驟的前4步,就可以進行對系統的封裝了,運行C盤根目錄下創建Sysprep文件夾中的Sysprep.exe,進入一下界面:

這是一個很簡潔的界面,背後卻包含着很高的技術含量。
“不重置激活的寬限期”,將以當前系統的激活剩餘時間爲主,做封裝的系統是如果是免激活的Windows,這一項應選中。
“使用最小化安裝”,在XP以後的版本中,系統可以以“歡迎使用”方式安裝,也可以使用經典的2000模式即“最小化安裝”模式進行安裝,一般選中“使用最小化安裝”。
“不重新產生安全標識符”,即不重新產生SID,以當前系統的SID爲準,這會一定程度的加快封裝部署速度,但是會令部署後的系統產生不穩定,不建議選中。
“檢測非即插即用硬件”,這會令系統強行檢測非即插即用硬件,不建議選中。
“關機模式”,用來設定執行完封裝以後要執行什麼,有“關機”、“重新啓動”和“退出”三種模式。選擇完畢後,單擊“重新封裝”,Sysprep將當前系統自動封裝爲系統映像。
系統映像封裝完畢後,無論是自動還是手動,重啓計算機後,直接用帶GHOST工具的光盤由光盤直接啓動計算機,使用GHOST備份當前C盤系統磁盤映像。
備份完畢後,我們就得到了可以用來部署在其他計算機上的系統映像了。使用光盤或者網絡等介質,將這個磁盤映像再次使用GHOST恢復在其他計算機的C盤上,被恢復的計算機啓動時會自動開始部署系統。

1.4 綜述
本章主要陳述了關於Windows操作系統的基本封裝與部署的實現,微軟的企業部署工具的效率和自動化程度相當高,封裝和部署過程都比較簡單。但現在有一個很重要的問題,按照微軟企業部署工具中Deploy.chm中的簡述,企業部署工具對於源計算機和目標計算機需要有相同HAL(硬件抽象層)。
所謂HAL,是由硬件製造商提供的一種薄層軟件,爲操作系統高層隱藏或抽象硬件差異。通過 HAL
提供的篩選器,不同類型的硬件看起來與操作系統其餘的硬件很相似。這樣允許操作系統從一個硬件平臺[非法內容]到另一個硬件平臺。HAL還提供了允許單個設備驅動器在所有的平臺上支持同樣設備的例程。封裝好的系統在部署到硬件配置差異較大的計算機中時,特別是跨平臺的計算機
(Intel CPU+Intel主板做的映像部署到AMDCPU+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 驅動:
[url]http://www.driverpacks.net/DriverPacks/download.php?pag=m[/url]
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\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章的研究工作,封裝部署已經變的擁有更大的適用性並擁有更簡單的可用性,系統封裝部署這種可以有效的提高計算機維護人員工作效率的方法,必將得到最廣泛的認可與應用!


[url]http://wenda.tianya.cn/wenda/thread?tid=138e1d7ebeb1450c[/url]
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章