2
0
mirror of https://github.com/xcat2/xcat-core.git synced 2024-11-27 19:59:50 +00:00
12 Windows_Multiple_Winpes
ligc edited this page 2015-07-30 04:22:49 -04:00

[Design Warning](Design Warning)

==Overview== WinPE is the installer to initiate a Windows deployment. xCAT supports to use genimage.cmd (base on tool ADK (Microsoft Assessment and Deployment Kit)) and genimage.bat (base on tool AIK (Windows Automated Installation Kit)) to create WinPE.

Refer to following list for the relationship between genimage.x and WinPE versions. *WinPE which created by genimage.bat :WinPE version: 3.0 :Supported target Windows versions: Windows 7 and Windows server 2008/r2. The doc mentions it also support Windows 8 and Windows server 2012, but xCAT recommends to use WinPE 4.0 which is generated by genimage.cmd for Windows server 2012 deployment.

*WinPE which created by genimage.cmd :WinPE version: 4.0 :Supported target Windows versions: Windows 8 and Windows server 2012/r2.

Reference for the matrix of WinPE and supported Windows verions. http://technet.microsoft.com/en-us/library/hh824993

For WinPE to enable the network device and hard driver on a specific node, the drivers of nics and hard disks need be injected to WinPE when creating it. That means it's possible to make multiple WinPEs for different hardware. Plus the restriction that deploying of different Windows versions need different version of WinPE, xCAT has to make a mechanism for node/osimage to choose a proper WinPE for Windows deployment.

==Technical Details== To support multiple WinPEs, a method is needed for compute node to get the location of WinPE during boot. proxydhcp is the method to achieve that. proxydhcp is an additional protocol of dhcp. If no 'next file' is specified in dhcp reply, firmware of compute node will send proxydhcp request to proxydhcp server which running on port 4011 to get the next boot server and boot configuration files. xCAT uses this mechanism to specify the location of WinPE for node.

Not all the compute node support proxydhcp protocol, even for the compute node which supports proxydhcp the booting procedures are different between legacy mode and uefi mode.

===WinPE booting procedures for different scenarios=== BCD - Boot Configuration Data. Which is used to specify the location of WinPE files.

*For firmware of compute node which DOES support proxydhcp

:Legacy Mode: ::dhcp->proxydhcp (specify the location of 'pxeboot.0' and 'BCD') -> load 'pxeboot.0' -> load bootmgr.exe (!!!NOTE: this file must be put in /tftpboot) -> load 'BCD' -> load WinPE_64.wim

::In this scenario, the bootmgr.exe must be put in /tftpboot. That means multiple WinPEs have to share this bootmgr.exe. Currently, the bootmgr.exe can be shared between Winpe 3.0 and Winpe 4.0.

:UEFI Mode: ::dhcp->proxydhcp (specify the location of 'bootmgfw.efi' and 'BCD')->load 'bootmgfw.efi' and 'BCD'-> load WinPE_64.wim

::In this scenario, the multiple WinPE can be supported completely.

*For firmware of compute node which does NOT support proxydhcp (like kvm virtual machine) :Only the Legacy mode is supported. ::dhcp->load xnba->load pxeboot.0->load 'bootmgr.exe' and 'BCD'-> load WinPE_64.wim (The location of bootmgr.exe and BCD must be put in fixed directory (/tftpboot)

::In this scenario, the BCD must be put in /tftpboot/Boot. That means it's impossible to support multiple WinPE concurrently. To work around this, when running nodeset the BCD for specific WinPE will be copied to /tftpboot/Boot. If there are nodes which are using different WinPE in one invoke of nodeset, an error message will be displayed.

==Interface== ===Create WinPE=== Choose ADK or AIK base on the target deployment Windows version. Copy the specify drivers for the WinPE to c:\drivers and run genimage.cmd or genimage.bat base on the selected ADK or AIK to generate WinPE.

A WinPE name needs be specified to identify the WinPE when running genimage.x e.g. genimage.cmd amd64 The winpe will be created in winboot/, customer just needs to copy all files in whole directory '''winboot''' to /tftpboot/ on xCAT MN.

===Specify WinPE for osimage=== The WinPE is bound to osimage. Set the path of WinPE to the target osimage. chdef -t osimage win2k8r2-x86_64-install-enterprise winpepath=/tftpboot/winboot/

===Enable the Proxydhcp Service on xCAT MN/SN=== If you want to use proxydhcp in your cluster for Windows deployment, enable it by setupproxydhcp attribute (this attribute belongs to xCAT management node or service node).

Add the xCAT management node to xCAT database xcatconfig -m Enable the proxydhcp service in xCAT management node chdef <xcat MN/SN> setupproxydhcp=1 (or 'yes')

===Disable the Proxydhcp Support for Specific Node=== By default, xCAT considers all nodes are proxydhcp protocol supported. If you have node which does not support proxydhcp protocol, disable the proxydhcp operation for this node. chdef supportproxydhcp=0 (or 'no')

==Implementation==

===How to create multiple Winpe?=== In current code of genimage.bat and genimage.cmd, the target WinPE path is hard coded to pxe/ or media/. To support multiple WinPEs in /tftpboot, a flag will be added to genimage.bat/genimage.cmd to change the path for created WinPE.

e.g. genimage.cmd amd64 The winpe will be created in winboot/

I was considering to use hivex to generate the BCD for each winpe, but looks like it needs some efforts to compile hivex and need to consider the shipping of hivex. So in this design I planed to use genimage.cmd/genimage.bat to generate BCD for the specific WinPE.

===Where to store the path of winpe?=== Add a column winpepath in winimage table for osimage object to specify the path of winpe. chdef -t osimage win2k8r2-x86_64-install-enterprise winpepath=winboot/ Note: the tftp root directory '''/tftpboot/''' should be removed from the winpe path when set to 'winpepath' attribute.

===How to make proxydhcp to know the correct location of winpe for a specific node?=== Make a configuration file /var/lib/xcat/proxydhcp.cfg to pass data to proxydhcp-xcat daemon. When running nodeset against a node for Windows deployment, the path of BCD will be written to /var/lib/xcat/proxydhcp.cfg and send a signal to proxydhcp-xcat daemon for it to reload configuration file.

The format of configuration file will looks like following: (each node has a fixed size block to specify the path) node1{pad to 50}winboot/newwinpe{pad to 150} Note: to improve the configuration loading performance, the configuration for each node uses 200 bytes (50bytes for node name, 150bytes for winpe path)

===proxydhcp daemon=== Implement a perl program proxydhcp-xcat which starts a daemon to handle the proxydhcp request on 4011 port.

proxydhcp-xcat loads winpe path from configuration file /var/lib/xcat/proxydhcp.cfg. When receives a proxydhcp request, use the client IP to get the node name for the client. And then uses the node name to get the winpe path and generate the proxydhcp reply with correct Windows bootloader and BCD, then send to client.

===How to generate the dhcp configuration file=== If node.supportproxydhcp equals no/0 or daemon proxydhcp-xcat is not running (mn/sn.setupproxydhcp=0) makedhcp is running as usual else remove the 'next file' in dhcpd.leases file, so that compute node will get the location of 'next file' from proxydhcp daemon endif

===How to start proxydhcp daemon=== The proxydhcp-xcat is started or stopped when starting xcatd base on the setting in mn/sn.setupproxydhcp.

===How to ship proxydhcp binary=== The proxydhcp-xcat is shipped with GPL lisence in xcat-service rpm.

== Other Design Considerations ==

  • '''Required reviewers''':
  • '''Required approvers''': Bruce Potter, William, Jarrod
  • '''Database schema changes''': N/A
  • '''Affect on other components''': N/A
  • '''External interface changes, documentation, and usability issues''': N/A
  • '''Packaging, installation, dependencies''': N/A
  • '''Portability and platforms (HW/SW) supported''': N/A
  • '''Performance and scaling considerations''': N/A
  • '''Migration and coexistence''': N/A
  • '''Serviceability''': N/A
  • '''Security''': N/A
  • '''NLS and accessibility''': N/A
  • '''Invention protection''': N/A