Retire stackforge/windows-diskimage-builder
This commit is contained in:
parent
f0df1fff50
commit
cabff92bd9
34
README.md
34
README.md
@ -1,34 +0,0 @@
|
|||||||
A windows Disk image builder tool to the Disk Image Builder project. This Windows tool runs on any Windows machine
|
|
||||||
and generate VHD/QCOW2 image directly from an ISO without needing to standup a VM on Hypervisor. This tool
|
|
||||||
uses windows native commands like ImageX, DISM, and Diskpart to generate disk images which can work for both VMs and
|
|
||||||
Baremetal Servers. This is made possible by injecting user provided drivers using DISM while building the image.
|
|
||||||
|
|
||||||
Creates a Image file, Includes cloudbase-init package by default.
|
|
||||||
User can create image by adding custom drivers, VirIO Drivers by providing suitable ISO or inf files. Enable Roles like Hyperv , TFTP etc., Use below formats to run script.
|
|
||||||
|
|
||||||
Runs on Windows 7,8, 8.1 and 2012 R2 ( To run this tool on Windows 7 it needs WAIK to be installed inorder to use dism /apply-image )
|
|
||||||
|
|
||||||
Requires Powershell 3.0 or above and wim file from ISO Source folder. ISO is not required. Only Wim file is enough to generate and apply wim to vhd.
|
|
||||||
|
|
||||||
Please download and install qemu binary for getting qcow2 format of image from the link --> http://qemu.weilnetz.de/w64/ Also set it to system path.
|
|
||||||
|
|
||||||
Basic Usage
|
|
||||||
.\diskimagebuilder.ps1 -SourceFile <path>\install.wim -VHDFile <path>\VHDFilename -VHDSize <size of vhd>
|
|
||||||
|
|
||||||
Enabling Feature like TFTP
|
|
||||||
.\diskimagebuilder.ps1 -SourceFile <path>\install.wim -VHDFile <path>\VHDFilename -VHDSize <size of vhd> -feature TFTP
|
|
||||||
|
|
||||||
Add Drivers to images. It auto adds all drivers present in the drivers folder
|
|
||||||
.\diskimagebuilder.ps1 -SourceFile <path>\install.wim -VHDFile <path>\VHDFilename -VHDSize <size of vhd> -DriversPath <path to drivers folder>
|
|
||||||
|
|
||||||
Add Unattend answer file
|
|
||||||
.\diskimagebuilder.ps1 -SourceFile <path>\install.wim -VHDFile <path>\VHDFilename -VHDSize <size of vhd> -UnattendPath <path>\unattend.xml
|
|
||||||
|
|
||||||
Add VirtIO Drivers
|
|
||||||
.\diskimagebuilder.ps1 -SourceFile <path>\install.wim -VHDFile <path>\VHDFilename -VHDSize <size of vhd> -VirtIOPath <path>\virtio.iso
|
|
||||||
|
|
||||||
Add UEFI Disk format support
|
|
||||||
.\diskimagebuilder.ps1 -SourceFile <path>\install.wim -VHDFile <path>\VHDFilename -VHDSize <size of vhd> -disklayout UEFI (if not specified Default will be bios)
|
|
||||||
|
|
||||||
All Commands Usage
|
|
||||||
.\diskimagebuilder.ps1 -SourceFile <path>\install.wim -VHDFile <path>\VHDFilename -VHDSize <size of vhd> -feature <featuretoenable> -UnattendPath <path>\unattend.xml -DriversPath <path to drivers folder> -CloudbaseInitMsiUrl < your cloudbaseinit msi url> -baudrate <value> -OutputFormat vhd/qcow2 (if not specified Default will be vhd) -disklayout UEFI (if not specified Default will be bios)
|
|
7
README.rst
Normal file
7
README.rst
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
This project is no longer maintained.
|
||||||
|
|
||||||
|
The contents of this repository are still available in the Git source code
|
||||||
|
management system. To see the contents of this repository before it reached
|
||||||
|
its end of life, please check out the previous commit with
|
||||||
|
"git checkout HEAD^1".
|
||||||
|
|
@ -1,2 +0,0 @@
|
|||||||
msiexec /i "%systemroot%\Setup\Scripts\CloudbaseInitSetup_Beta_x64.msi" /q /l "%systemroot%\Setup\Scripts\cloudbaseinstalllog.txt"
|
|
||||||
del "%systemroot%\Setup\Scripts\CloudbaseInitSetup_Beta_x64.msi"
|
|
@ -1,105 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<unattend xmlns="urn:schemas-microsoft-com:unattend">
|
|
||||||
<settings pass="generalize">
|
|
||||||
<component name="Microsoft-Windows-PnpSysprep" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS" xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
|
|
||||||
<PersistAllDeviceInstalls>true</PersistAllDeviceInstalls>
|
|
||||||
</component>
|
|
||||||
<component name="Microsoft-Windows-PnpSysprep" processorArchitecture="x86" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS" xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
|
|
||||||
<PersistAllDeviceInstalls>true</PersistAllDeviceInstalls>
|
|
||||||
</component>
|
|
||||||
|
|
||||||
<component name="Microsoft-Windows-Security-Licensing-SLC" processorArchitecture="x86" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS" xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
|
|
||||||
<SkipRearm>1</SkipRearm>
|
|
||||||
</component>
|
|
||||||
|
|
||||||
</settings>
|
|
||||||
<settings pass="oobeSystem">
|
|
||||||
<component name="Microsoft-Windows-Shell-Setup" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS" xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State">
|
|
||||||
<OOBE>
|
|
||||||
<HideEULAPage>true</HideEULAPage>
|
|
||||||
<NetworkLocation>Work</NetworkLocation>
|
|
||||||
<ProtectYourPC>1</ProtectYourPC>
|
|
||||||
<SkipMachineOOBE>true</SkipMachineOOBE>
|
|
||||||
<SkipUserOOBE>true</SkipUserOOBE>
|
|
||||||
</OOBE>
|
|
||||||
<AutoLogon>
|
|
||||||
<Password>
|
|
||||||
<Value>Passw0rd</Value>
|
|
||||||
<PlainText>true</PlainText>
|
|
||||||
</Password>
|
|
||||||
<Enabled>true</Enabled>
|
|
||||||
<LogonCount>5</LogonCount>
|
|
||||||
<Username>Administrator</Username>
|
|
||||||
</AutoLogon>
|
|
||||||
<UserAccounts>
|
|
||||||
<AdministratorPassword>
|
|
||||||
<Value>Passw0rd</Value>
|
|
||||||
<PlainText>true</PlainText>
|
|
||||||
</AdministratorPassword>
|
|
||||||
</UserAccounts>
|
|
||||||
<FirstLogonCommands>
|
|
||||||
<SynchronousCommand wcm:action="add">
|
|
||||||
<Order>1</Order>
|
|
||||||
<CommandLine>cmd.exe /c powershell.exe set-executionpolicy -ExecutionPolicy RemoteSigned -Force</CommandLine>
|
|
||||||
<Description>Enable powershell script execution</Description>
|
|
||||||
</SynchronousCommand>
|
|
||||||
|
|
||||||
<SynchronousCommand wcm:action="add">
|
|
||||||
<Order>2</Order>
|
|
||||||
<CommandLine>cmd.exe /c powershell.exe set-ItemProperty -Path 'HKLM:\System\CurrentControlSet\Control\Terminal Server' -name "fdenyTSConnections" -Value 0</CommandLine>
|
|
||||||
<Description>Disable monitor timeout to allow iLO CM - set node power off shutdown</Description>
|
|
||||||
<RequiresUserInput>false</RequiresUserInput>
|
|
||||||
</SynchronousCommand>
|
|
||||||
<SynchronousCommand wcm:action="add">
|
|
||||||
<Order>3</Order>
|
|
||||||
<CommandLine>cmd.exe /c powercfg.exe -setacvalueindex scheme_max sub_video videoidle 0</CommandLine>
|
|
||||||
<Description>Disable monitor timeout to allow iLO CM - set node power off shutdown</Description>
|
|
||||||
<RequiresUserInput>false</RequiresUserInput>
|
|
||||||
</SynchronousCommand>
|
|
||||||
<SynchronousCommand wcm:action="add">
|
|
||||||
<Order>4</Order>
|
|
||||||
<CommandLine>cmd.exe /c powercfg.exe -setacvalueindex scheme_balanced sub_video videoidle 0</CommandLine>
|
|
||||||
<Description>Disable monitor timeout to allow iLO CM - set node power off shutdown</Description>
|
|
||||||
<RequiresUserInput>false</RequiresUserInput>
|
|
||||||
</SynchronousCommand>
|
|
||||||
<SynchronousCommand wcm:action="add">
|
|
||||||
<Order>5</Order>
|
|
||||||
<CommandLine>cmd.exe /c powercfg.exe -setactive scheme_min</CommandLine>
|
|
||||||
<Description>Enable High Performance power plan</Description>
|
|
||||||
<RequiresUserInput>false</RequiresUserInput>
|
|
||||||
</SynchronousCommand>
|
|
||||||
</FirstLogonCommands>
|
|
||||||
</component>
|
|
||||||
</settings>
|
|
||||||
<settings pass="specialize">
|
|
||||||
<component name="Networking-MPSSVC-Svc" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS" xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
|
|
||||||
<FirewallGroups>
|
|
||||||
<FirewallGroup wcm:action="add" wcm:keyValue="FileAndPrinterSharing">
|
|
||||||
<Active>true</Active>
|
|
||||||
<Group>File and Printer Sharing</Group>
|
|
||||||
<Profile>all</Profile>
|
|
||||||
</FirewallGroup>
|
|
||||||
<FirewallGroup wcm:action="add" wcm:keyValue="WMI">
|
|
||||||
<Active>true</Active>
|
|
||||||
<Group>Windows Management Instrumentation (WMI)</Group>
|
|
||||||
<Profile>all</Profile>
|
|
||||||
</FirewallGroup>
|
|
||||||
<FirewallGroup wcm:action="add" wcm:keyValue="RemoteDesktop">
|
|
||||||
<Active>true</Active>
|
|
||||||
<Group>Remote Desktop</Group>
|
|
||||||
<Profile>all</Profile>
|
|
||||||
</FirewallGroup>
|
|
||||||
</FirewallGroups>
|
|
||||||
</component>
|
|
||||||
<component name="Microsoft-Windows-Deployment" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS" xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
|
|
||||||
<RunSynchronous>
|
|
||||||
<!-- WinRM configuration -->
|
|
||||||
<RunSynchronousCommand wcm:action="add">
|
|
||||||
<Order>1</Order>
|
|
||||||
<Path>cmd.exe /c %WINDIR%\Setup\Scripts\SetupComplete.cmd</Path>
|
|
||||||
<Description>Download Specialize script</Description>
|
|
||||||
</RunSynchronousCommand>
|
|
||||||
</RunSynchronous>
|
|
||||||
</component>
|
|
||||||
</settings>
|
|
||||||
</unattend>
|
|
@ -1,410 +0,0 @@
|
|||||||
# Copyright 2012 Hewlett-Packard Development Company, L.P.
|
|
||||||
#
|
|
||||||
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
|
||||||
# not use this file except in compliance with the License. You may obtain
|
|
||||||
# a copy of the License at
|
|
||||||
#
|
|
||||||
# http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
#
|
|
||||||
# Unless required by applicable law or agreed to in writing, software
|
|
||||||
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
|
||||||
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
|
||||||
# License for the specific language governing permissions and limitations
|
|
||||||
# under the License.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# Creates a Image file, Includes cloudbase-init package by default.
|
|
||||||
# User can create image by adding custom drivers, VirIO Drivers by providing suitable ISO or inf files. Enable Roles like Hyperv , TFTP etc., Use below formats to run script.
|
|
||||||
|
|
||||||
# Runs on Windows 7, 8, 8.1 and 2012 R2
|
|
||||||
|
|
||||||
# Requires Powershell 3.0 or above and wim file from ISO Source folder. ISO is not required. Only Wim file is enough to generate and apply wim to vhd.
|
|
||||||
|
|
||||||
# Basic Usage
|
|
||||||
#.\diskimagebuilder.ps1 -SourceFile <path>\install.wim -VHDFile <path>\VHDFilename -VHDSize <size of vhd>
|
|
||||||
|
|
||||||
# Enabling Feature like TFTP
|
|
||||||
#.\diskimagebuilder.ps1 -SourceFile <path>\install.wim -VHDFile <path>\VHDFilename -VHDSize <size of vhd> -feature TFTP
|
|
||||||
|
|
||||||
# Add Drivers to images. It auto adds all drivers present in the drivers folder
|
|
||||||
#.\diskimagebuilder.ps1 -SourceFile <path>\install.wim -VHDFile <path>\VHDFilename -VHDSize <size of vhd> -DriversPath <path to drivers folder>
|
|
||||||
|
|
||||||
#Add Unattend answer file
|
|
||||||
#.\diskimagebuilder.ps1 -SourceFile <path>\install.wim -VHDFile <path>\VHDFilename -VHDSize <size of vhd> -UnattendPath <path>\unattend.xml
|
|
||||||
|
|
||||||
#Add VirtIO Drivers
|
|
||||||
#.\diskimagebuilder.ps1 -SourceFile <path>\install.wim -VHDFile <path>\VHDFilename -VHDSize <size of vhd> -VirtIOPath <path>\virtio.iso
|
|
||||||
|
|
||||||
# All Commands Usage
|
|
||||||
#.\diskimagebuilder.ps1 -SourceFile <path>\install.wim -VHDFile <path>\VHDFilename -VHDSize <size of vhd> -feature <featuretoenable> -UnattendPath <path>\unattend.xml -DriversPath <path to drivers folder>
|
|
||||||
|
|
||||||
# Please download and install qemu binary for getting qcow2 format of image from the link --> http://qemu.weilnetz.de/w64/
|
|
||||||
|
|
||||||
Param(
|
|
||||||
[Parameter(mandatory=$True,HelpMessage="Name and path of Sourcefile (WIM).")]
|
|
||||||
[ValidateNotNullOrEmpty()]
|
|
||||||
[ValidateScript({ Test-Path $(Resolve-Path $_) })]
|
|
||||||
[String]$SourceFile,
|
|
||||||
|
|
||||||
[parameter(mandatory=$True,HelpMessage="Name and path of VHD or VHDx file.")]
|
|
||||||
[ValidateNotNullOrEmpty()]
|
|
||||||
[String]$VHDFile,
|
|
||||||
|
|
||||||
[parameter(mandatory=$True,HelpMessage="Size of VHD or VHDx file.")]
|
|
||||||
[ValidateNotNullOrEmpty()]
|
|
||||||
[String]$VHDSize,
|
|
||||||
|
|
||||||
[parameter(HelpMessage="feature to enable.")]
|
|
||||||
[ValidateNotNullOrEmpty()]
|
|
||||||
[String]$feature,
|
|
||||||
|
|
||||||
[parameter(HelpMessage="Index of the wim.")]
|
|
||||||
[ValidateNotNullOrEmpty()]
|
|
||||||
[String]$Index,
|
|
||||||
|
|
||||||
[parameter(HelpMessage="Unattended xml file path")]
|
|
||||||
[ValidateNotNullOrEmpty()]
|
|
||||||
[String]$UnattendPath,
|
|
||||||
|
|
||||||
[parameter(HelpMessage="cloudbaseinit msi url")]
|
|
||||||
[ValidateNotNullOrEmpty()]
|
|
||||||
[String]$CloudbaseInitMsiUrl,
|
|
||||||
|
|
||||||
[parameter(HelpMessage="Serial port baudrate")]
|
|
||||||
[ValidateNotNullOrEmpty()]
|
|
||||||
[String]$serialbaudrate,
|
|
||||||
|
|
||||||
[parameter(HelpMessage="Add Drivers Folder Path.")]
|
|
||||||
[ValidateNotNullOrEmpty()]
|
|
||||||
[String]$DriversPath,
|
|
||||||
|
|
||||||
[parameter(HelpMessage="Output format vhd\qcow2.")]
|
|
||||||
[ValidateNotNullOrEmpty()]
|
|
||||||
[String]$OutputFormat,
|
|
||||||
|
|
||||||
[parameter(HelpMessage="UEFI Disk layout")]
|
|
||||||
[ValidateNotNullOrEmpty()]
|
|
||||||
[String]$disklayout,
|
|
||||||
|
|
||||||
[parameter(HelpMessage="Add Drivers From Virtio ISO.")]
|
|
||||||
[ValidateNotNullOrEmpty()]
|
|
||||||
[String]$VirtIOPath
|
|
||||||
|
|
||||||
)
|
|
||||||
|
|
||||||
$name = "createimage"
|
|
||||||
$currdate = get-date -f yyyy-MM-dd
|
|
||||||
|
|
||||||
|
|
||||||
write-host $args
|
|
||||||
|
|
||||||
|
|
||||||
if(!$UnattendPath){
|
|
||||||
|
|
||||||
$UnattendPath = "unattend.xml"
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
if(!$CloudbaseInitMsiUrl){
|
|
||||||
|
|
||||||
$CloudbaseInitMsiUrl = "http://www.cloudbase.it/downloads/CloudbaseInitSetup_Beta.msi"
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
if(!$serialbaudrate){
|
|
||||||
|
|
||||||
$serialbaudrate = "9600"
|
|
||||||
|
|
||||||
}
|
|
||||||
if($OutputFormat){
|
|
||||||
$arrFormats = @("vhd", "qcow2")
|
|
||||||
$Found = 0
|
|
||||||
for ($i=0; $i -lt $arrFormats.length; $i++) {
|
|
||||||
if($arrFormats[$i] -eq $OutputFormat){
|
|
||||||
$Found = 1
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if(!$Found){
|
|
||||||
Write-W2VInfo "Not a valid output format"
|
|
||||||
exit
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
$VHDVolume = 'v'
|
|
||||||
$Error = 0
|
|
||||||
if(!$Index){
|
|
||||||
$Index = 1
|
|
||||||
}
|
|
||||||
|
|
||||||
$VHDloc = Split-Path $VHDFile -Parent
|
|
||||||
$testpaths = @($SourceFile, $VirtIOPath, $DriversPath, $UnattendPath, $VHDloc)
|
|
||||||
|
|
||||||
function
|
|
||||||
Write-W2VError {
|
|
||||||
# Function to make the Write-Host (NOT Write-Error) output prettier in the case of an error.
|
|
||||||
[CmdletBinding()]
|
|
||||||
param(
|
|
||||||
[Parameter(Mandatory = $true, ValueFromPipeline = $true)]
|
|
||||||
[string]
|
|
||||||
[ValidateNotNullOrEmpty()]
|
|
||||||
$text
|
|
||||||
)
|
|
||||||
Write-Host "ERROR : $($text)" -ForegroundColor green
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
function Write-W2VInfo {
|
|
||||||
# Function to make the Write-Host output a bit prettier.
|
|
||||||
[CmdletBinding()]
|
|
||||||
param(
|
|
||||||
[Parameter(Mandatory = $true, ValueFromPipeline = $true)]
|
|
||||||
[string]
|
|
||||||
[ValidateNotNullOrEmpty()]
|
|
||||||
$text
|
|
||||||
)
|
|
||||||
Write-Host "INFO : $($text)" -ForegroundColor Green
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Function Createvhd{
|
|
||||||
Import-Module ..\Hyperv\HyperV.psd1
|
|
||||||
$GB = [System.UInt64] $VHDSize*1024*1024*1024
|
|
||||||
$ImageMgtService = get-wmiobject -class "Msvm_ImageManagementService" -namespace "root\virtualization" -computername "." 2
|
|
||||||
# Create the Dynamic VHD
|
|
||||||
$result = $ImageMgtService.CreateDynamicVirtualHardDisk($VHDFile,$GB)
|
|
||||||
if($result.ReturnValue -eq 4096){
|
|
||||||
# A Job was started, and can be tracked using its Msvm_Job instance
|
|
||||||
$job = [wmi]$result.Job
|
|
||||||
# Wait for job to finish
|
|
||||||
while($job.jobstate -lt 7){$job.get()}
|
|
||||||
# Return the Job's error code
|
|
||||||
return $job.ErrorCode
|
|
||||||
}
|
|
||||||
# Otherwise, the method completed
|
|
||||||
return $result.ReturnValue
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
Function PscreatePartition(){
|
|
||||||
|
|
||||||
#Mount-DiskImage
|
|
||||||
Mount-DiskImage -ImagePath $VHDFile -Verbose
|
|
||||||
Write-W2VInfo "image mounted"
|
|
||||||
|
|
||||||
$VHDDisk = Get-DiskImage -ImagePath $VHDFile | Get-Disk -Verbose
|
|
||||||
$VHDDiskNumber = [string]$VHDDisk.Number
|
|
||||||
|
|
||||||
#Initialize-Disk
|
|
||||||
Initialize-Disk -Number $VHDDiskNumber -PartitionStyle MBR -Verbose
|
|
||||||
|
|
||||||
#Format vhdfile
|
|
||||||
$VHDDrive = New-Partition -DiskNumber $VHDDiskNumber -UseMaximumSize -IsActive -Verbose
|
|
||||||
$VHDDrive | Format-Volume -FileSystem NTFS -NewFileSystemLabel OSDisk -Confirm:$false -Verbose
|
|
||||||
Add-PartitionAccessPath -DiskNumber $VHDDiskNumber -PartitionNumber $VHDDrive.PartitionNumber -AssignDriveLetter
|
|
||||||
$VHDDrive = Get-Partition -DiskNumber $VHDDiskNumber -PartitionNumber $VHDDrive.PartitionNumber
|
|
||||||
$VHDVolume = [string]$VHDDrive.DriveLetter+":"
|
|
||||||
. Logit "Driveletter is now = $VHDVolume"
|
|
||||||
dism.exe /apply-Image /ImageFile:$SourceFile /index:$Index /ApplyDir:$VHDVolume\
|
|
||||||
Write-W2VInfo "$VHDVolume\Windows"
|
|
||||||
Write-W2VInfo $VHDDrive.Offset
|
|
||||||
Write-W2VInfo $VHDDisk.Signature
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
function remove-vhd($vhdfile) {
|
|
||||||
$path = resolve-path $vhdfile
|
|
||||||
$script = "SELECT VDISK FILE=`"$path`"`r`nDETACH VDISK"
|
|
||||||
$script | diskpart
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
function CreateThrwDiskpart(){
|
|
||||||
$GB = [System.UInt64] $VHDSize*1024
|
|
||||||
$path = $vhdFile
|
|
||||||
$script = "create VDISK FILE=`"$path`" maximum=`"$GB`" type=expandable `r`nselect VDISK FILE=`"$path`"`r`nattach VDISK`r`ncreate partition primary`r`nassign letter=`"$VHDVolume`"`r`nformat fs=ntfs quick label=vhd`r`nactive`r`nexit"
|
|
||||||
$gptscript = "create VDISK FILE=`"$path`" maximum=`"$GB`" type=expandable `r`nselect VDISK FILE=`"$path`"`r`nattach VDISK`r`convert gpt`r`ncreate partition primary`r`nassign letter=`"$VHDVolume`"`r`nformat fs=ntfs quick label=vhd`r`nexit"
|
|
||||||
if($disklayout){
|
|
||||||
$gptscript | DISKPART
|
|
||||||
}else{
|
|
||||||
$script | DISKPART
|
|
||||||
}
|
|
||||||
$VHDVolume = [string]$VHDVolume + ":"
|
|
||||||
Write-W2VInfo " $VHDVolume is the drive letter"
|
|
||||||
dism.exe /apply-Image /ImageFile:$SourceFile /index:$Index /ApplyDir:$VHDVolume\
|
|
||||||
}
|
|
||||||
|
|
||||||
function MountDisk() {
|
|
||||||
$path = resolve-path $vhdFile
|
|
||||||
$script = "SELECT VDISK FILE=`"$path`"`r`attach VDISK"
|
|
||||||
$script | diskpart | Out-Null
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
function CreateBootfiles(){
|
|
||||||
|
|
||||||
$VHDVolume = [string]$VHDVolume + ":"
|
|
||||||
Write-W2VInfo $VHDVolume
|
|
||||||
cmd /c "$VHDVolume\Windows\System32\bcdboot.exe $VHDVolume\windows /s $VHDVolume"
|
|
||||||
bcdedit /store $VHDVolume\boot\BCD
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
function ApplyVirtIODrivers(){
|
|
||||||
|
|
||||||
$VHDVolume = $VHDVolume + ":"
|
|
||||||
$VirtIOMountPath = ''
|
|
||||||
if($VirtIOPath){
|
|
||||||
Write-W2VInfo "Mounting virio iso file."
|
|
||||||
$MountedISO = Mount-DiskImage $VirtIOPath -PassThru
|
|
||||||
$driveletter = ($MountedISO | Get-Volume).DriveLetter
|
|
||||||
$winstring = Get-WindowsImage -Imagepath $SourceFile | findstr "Name"
|
|
||||||
if($winstring -match "windows 7"){
|
|
||||||
|
|
||||||
$VirtIOMountPath = "$driveletter"+":\WIN7\AMD64"
|
|
||||||
|
|
||||||
}else{
|
|
||||||
|
|
||||||
$VirtIOMountPath = "$driveletter"+":\WIN8\AMD64"
|
|
||||||
}
|
|
||||||
|
|
||||||
Write-W2VInfo "Applying virtio drivers......"
|
|
||||||
Dism /image:$VHDVolume\ /Add-Driver /driver:$VirtIOMountPath /ForceUnsigned /recurse
|
|
||||||
Dismount-DiskImage $VirtIOPath
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
function ApplyDrivers(){
|
|
||||||
|
|
||||||
$VHDVolume = $VHDVolume + ":"
|
|
||||||
Write-W2VInfo "Applying Drivers...."
|
|
||||||
Dism /image:$VHDVolume\ /Add-Driver /driver:$DriversPath /ForceUnsigned /recurse
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
function ApplyUnattendxml(){
|
|
||||||
$VHDVolume = $VHDVolume + ":"
|
|
||||||
Write-W2VInfo "Copying Unattend xml file"
|
|
||||||
copy $UnattendPath $VHDVolume\Unattend.xml
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
function AddCloudbaseinit(){
|
|
||||||
|
|
||||||
$VHDVolume = $VHDVolume + ":"
|
|
||||||
#$CloudbaseInitMsiUrl = "http://www.cloudbase.it/downloads/CloudbaseInitSetup_Beta.msi"
|
|
||||||
$CloudbaseInitMsi = "$ENV:Temp\CloudbaseInitSetup_Beta.msi"
|
|
||||||
Write-W2VInfo "Downloading Cloudbase init msi ........."
|
|
||||||
(new-object System.Net.WebClient).DownloadFile($CloudbaseInitMsiUrl, $CloudbaseInitMsi)
|
|
||||||
New-Item -ItemType directory -Path $VHDVolume\Windows\Setup\Scripts
|
|
||||||
Copy-Item $pwd\SetupComplete.cmd $VHDVolume\Windows\Setup\Scripts
|
|
||||||
Copy-Item $CloudbaseInitMsi $VHDVolume\Windows\Setup\Scripts
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
function SerialPort(){
|
|
||||||
$VHDVolume = $VHDVolume + ":"
|
|
||||||
Write-W2VInfo "Adding Serial Port"
|
|
||||||
bcdedit /store $VHDVolume\boot\BCD /dbgsettings serial debugport:1 baudrate:$serialbaudrate
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
function convertoutputtoqcow2(){
|
|
||||||
try{
|
|
||||||
Write-W2VInfo "Converting to qcow2"
|
|
||||||
qemu-img.exe convert -f vpc -O qcow2 $VHDFile $VHDFile.Replace("vhd","qcow2")
|
|
||||||
Remove-Item $VHDFile
|
|
||||||
}catch{
|
|
||||||
Write-W2VInfo "qemu is not installed or its path is not set to system path. So ouput will be in vhd format"
|
|
||||||
exit
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
foreach($p in $testpaths){
|
|
||||||
if($p){
|
|
||||||
$valid = Test-Path -path $p
|
|
||||||
if(!$valid){
|
|
||||||
Write-W2VError "Not a valid Path please check the path specified --- $p"
|
|
||||||
exit
|
|
||||||
break
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
try {
|
|
||||||
if($disklayout){
|
|
||||||
$Errorvalue = 1
|
|
||||||
}else{
|
|
||||||
Createvhd
|
|
||||||
PscreatePartition
|
|
||||||
}
|
|
||||||
|
|
||||||
} catch{
|
|
||||||
Write-W2VInfo "Could not run through hyperv module will use diskpart..."
|
|
||||||
$Errorvalue = 1
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
if($Errorvalue){
|
|
||||||
CreateThrwDiskpart
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
CreateBootfiles
|
|
||||||
Addcloudbaseinit
|
|
||||||
|
|
||||||
Write-W2VInfo "---------------------Enabling features.-----------------------------------------------------"
|
|
||||||
if($feature){
|
|
||||||
Write-W2VInfo "----- Enabling Role -----"
|
|
||||||
Dism /online /enable-feature /featurename:$feature
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
if($UnattendPath){
|
|
||||||
ApplyUnattendxml
|
|
||||||
}
|
|
||||||
|
|
||||||
if($DriversPath){
|
|
||||||
|
|
||||||
ApplyDrivers
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
if($VirtIOPath){
|
|
||||||
|
|
||||||
ApplyVirtIODrivers
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
#serial port
|
|
||||||
SerialPort
|
|
||||||
|
|
||||||
#select and detach the vdisk created by the disk.
|
|
||||||
remove-vhd($VHDFile)
|
|
||||||
|
|
||||||
if($OutputFormat){
|
|
||||||
if($OutputFormat -eq "qcow2"){
|
|
||||||
convertoutputtoqcow2
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
Write-W2VInfo "================= Please check logs directory for Image creation log files. ===================="
|
|
||||||
Write-W2VInfo "================= Completed Image Creation and ready. ======================="
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user