# Using the Diskimage-Builder PowerShell script This page thoroughly documents the use of [this](https://github.com/slokesh184/windows-diskimage-builder/blob/master/windows-diskimage-builder/diskimagebuilder.ps1) PowerShell script to obtain valid _vdh/vhdx/qcow2_ Windows disks from an installation _.iso_ image. ## Prerequisites: #### Start a PowerShell session from _cmd_: ``` > start powershell ``` ### Downloading and installing dependencies: #### Download and install _git_: ``` PS> (New-Object System.Net.WebClient).DownloadFile("https://msysgit.googlecode.com/files/Git-1.9.0-preview20140217.exe", "$HOME\Git-1.9.0-preview20140217.exe") PS> cmd.exe /C call $HOME\Git-1.9.0-preview20140217.exe /SILENT ``` #### For _qcow2 conversion support_, download and install the latest _qemu_ tools(as of the making of this article, build date 08.01.2014): ``` PS> (New-Object System.Net.WebClient).DownloadFile("http://qemu.weilnetz.de/w64/qemu-w64-setup-20140801.exe", "$HOME\qemu-w64-setup-20140801.exe") PS> cmd.exe /C call $HOME\qemu-w64-setup-20140801.exe /SILENT ``` #### Add all dependencies to path, both to the environment variable and for the current session: ``` PS> $newPath = "$env:Path;${env:ProgramFiles(x86)}\Git\cmd;${env:ProgramFiles}\qemu" PS> $env:Path = $newPath PS> setx PATH $newPath ``` ## Getting the script: ``` PS> cd $HOME PS> git clone https://github.com/slokesh184/windows-diskimage-builder ``` ## Running the script: ####**THIS SCRIPT CAN ONLY BE RUN AS _ADMINISTRATOR_** #### Start a new PowerShell session as administrator: ``` PS> Start-Process PowerShell -Verb RunAs ``` #### **INPUT: this script requires a _.wim_ file as input** ### Getting at the _.wim_ file of an _.iso_: ``` PS> $mountpoint = Mount-DiskImage -ImagePath C:\Absolute\Path\To\Your\Iso\Image.iso -PassThru PS> $wimfilePath = ($mountpoint | Get-Volume).DriveLetter + ":\sources\install.wim" # AFTER succesfully using the .wim in the script, don't forget to dismount the .iso: PS> Dismount-DiskImage -ImagePath C:\Absolute\Path\To\Your\Iso\Image.iso ``` ### Creating a _.vhd_ or _.vhdx_: * **Note**: For _.vhdx_ output, simply provide a VHDFile name with the _.vhdx_ extension. ``` PS> cd $HOME\windows-diskimage-builder\windows-diskimage-builder # previous steps for obtaining the $wimfilePath are assumed to have been done PS> .\diskimagebuilder.ps1 -SourceFile $wimfilePath -VHDFile $HOME\resultingDiskImage.vhd -VHDSize 16 ``` * *Notes:* * The script tries to use tools from the HyperV module by default. * If for some reason HyperV is unavailable for import, the script will revert to using _DiskPart_ which is present on all Windows systems. * Should the above occur, the script will initially spew out a couple of errors **but** will continue to run properly after the fallback to DiskPart. ### Creating a _.qcow2_: ``` PS> .\diskimagebuilder.ps1 -SourceFile $wimfilePath -VHDFile $HOME\resultingDiskImage.vhd -VHDSize 16 -OutputFormat qcow2 -VirtIOPath C:\Absolute\Path\To\VirtIO.iso ``` * **Notes:** * If operating on _qcow2_'s; applyiong the drivers from the VirtIO _.iso_ is **absolutely necessary** * Even when creating a _.qcow2_, the name of the resulting file **must have the .vhd extension**, lest _DiskPart_ will fail at processing it. * After the execution of the script, the result will indeed be a _.qcow2_ as the script puts the proper extension towards the end of its execution. ##### FAILURE NOTICE: * If for some reason after attempting to create a _.qcow2_ diskimage you see that no output file was produced, it is because of a failure to call qemu and the script deleting the output by default. To try and debug such a problem, type "_qemu-img.exe_" in the PowerShell prompt and see what happens: * if PowerShell says it cannot find it, recheck to make sure the qemu tools are installed/set to path (review initial instructions). * if there is no output whatsoever, it means that there was a problem with the qemu-img binary; in which case you should either try reinstalling the above or another one from [their downloads page](http://qemu.weilnetz.de/w64/) (choose any one of the "qemu-w64-setup-release_date.exe"'s). ## Script parameters and options: * **-SourceFile** C:\Path\To\Wim\File.wim * absolute path to the .wim file which will be used as input. * **-VHDFile** C:\Path\To\Output\File.vhd * absolute path to the script's output file; * must have the .vhd extension initially, even when creating a _qcow2_. * if _qcow2_ is selected, output's extention is changed to ".qcow2" automatically. * represents the **exact** path to the output file, **which must NOT exist beforehand**. * **-VHDSize** 16 * maximum size in GB of the resulting vhd/qcow2 image * for most Windows installations, I reccommend at the very least 12, prefferably 16. * all output disks are resizeable, so initial size of output may be a lot less than this value. * **-CloudbaseInitMsiUrl** http://someplace.net/someothercloudbaseinit.msi * link to the CloudBaseInit.msi that is to be added to the image. * default is http://www.cloudbase.it/downloads/CloudbaseInitSetup_Beta.msi * the .msi together with a .cmd to execute it are put in the resulting disk under Disk:\Windows\Setup\Scripts * **-UnattendedPath** C:\Absolute\Path\To\Unattended.xml * path to the .xml file which is to be used in unattended mode. * default is the Unattended.mxl that can be found right beside the script. * the .xml file is placed directly in the root directory of the created image. * **-DriversPath** C:\Absolute\Path\To\Drivers\Folder * path to a folder containing drivers that are to be added to the disk. * default is none, in which case no additional drivers will be added to the disk image. * **-VirtIOPath** C:\Absolute\Path\To\VirtIO.iso * path to a VirtIO _.iso_ from which VirtIO drivers mean to be installed. * default is none, in which case no additional drivers will be installed to the disk image. * **-Feature feature** * feature to be enabled in the final disk image (ex: TFTP, IIS-WebServer, etc...) * this script only specifically enables one feature per image, the default being none. * the feature are enabled in the image by _DISM.exe_, for a full list of features, please review [this webpage](http://blogs.technet.com/b/joscon/archive/2010/08/26/adding-features-with-dism.aspx). * **-DiskLayout** UEFI * the layout of the resulting disk, used if booting the disk in UEFI mode is desired. * default value is BIOS. * **-Index** 3 * index of the _.wim_ supplied as input, if applicable. * default value is 1 and it will work in the vast majority of cases. * **-SerialBaudRate** 8400 * baudrate of the serial port that is to be added to the disk. * default is 9600 and will work fine in the vast majority of cases.