There is, but you don't see it in the Edit Settings form.
Also note that it is a very limited controller, you can for example only add 2 devices.
So if you have 2 CD/DVD defined as IDE you will not be able to add an IDE disk on the same controller.
The following script will add an IDE harddisk.
$vmName = "MyVM"
$hdSize = 8 * 1GB $vm = Get-VM -Name $vmName $spec = New-Object VMware.Vim.VirtualMachineConfigSpec # Check if there is an IDE COntroller present
$ideCtrl = $vm.ExtensionData.Config.Hardware.Device | where {$_.GetType().Name -eq "VirtualIDEController"} | select -First 1
if(!$ideCtrl){ $ctrl = New-Object VMware.Vim.VirtualDeviceConfigSpec
$ctrl.Operation = "add"
$ctrl.Device = New-Object VMware.Vim.VirtualIDEController
$ideKey = -1
$ctrl.Device.ControllerKey = $ideKey
$spec.deviceChange += $ctrl
} else{ $ideKey = $ideCtrl.Key } # Get next harddisk number
$hdNr = 0
$vm.ExtensionData.Config.Hardware.Device | where {$_.GetType().Name -eq "VirtualDisk"} | %{ $nr = [int]$_.DeviceInfo.Label.Split(' ')[2] if($hdNr -lt $nr){ $hdNr = $nr } } if($hdNr -eq 0){$hdNrStr = ""} else{$hdNrStr = "_" + $hdNr} # Get datastore
$dsName = $vm.ExtensionData.Config.Files.VmPathName.Split(']')[0].TrimStart('[') # Add IDE harddisk
$dev = New-Object VMware.Vim.VirtualDeviceConfigSpec
$dev.FileOperation = "create"
$dev.Operation = "add"
$dev.Device = New-Object VMware.Vim.VirtualDisk
$dev.Device.backing = New-Object VMware.Vim.VirtualDiskFlatVer2BackingInfo
$dev.Device.backing.Datastore = (Get-Datastore -Name $dsName).Extensiondata.MoRef $dev.Device.backing.DiskMode = "persistent"
$dev.Device.Backing.FileName = "[" + $dsName + "] " + $vmName + "/" + $vmName + $hdNrStr + ".vmdk"
$dev.Device.backing.ThinProvisioned = $true
$dev.Device.CapacityInKb = $hdSize / 1KB $dev.Device.ControllerKey = $ideKey
$dev.Device.UnitNumber = -1
$spec.deviceChange += $dev
$vm.ExtensionData.ReconfigVM($spec)
Blog: lucd.info Twitter: @LucD22 Co-author PowerCLI Reference
Afaik, the cmdlets in the current PowerCLI build don't allow this.
To add an IDE disk you will first need to create an IDE controller.
See the New-VM -> how to define ControllerType thread.
That thread has pointers to some functions that can accomplish what you want to do.
Blog: lucd.info Twitter: @LucD22 Co-author PowerCLI Reference
Hi Luc,
Is there such a thing as an "IDE controller"?
If you edit settings of a VM with IDE hard disk(s) there is no IDE controller listed.
Is there a way of changing the hard disk itself from a SCSI to an IDE?
Even if you add a hard disk via New-HardDisk to a VM with existing IDE drives, it still gets added as SCSI.
Regards
marc0
There is, but you don't see it in the Edit Settings form.
Also note that it is a very limited controller, you can for example only add 2 devices.
So if you have 2 CD/DVD defined as IDE you will not be able to add an IDE disk on the same controller.
The following script will add an IDE harddisk.
$vmName = "MyVM"
$hdSize = 8 * 1GB $vm = Get-VM -Name $vmName $spec = New-Object VMware.Vim.VirtualMachineConfigSpec # Check if there is an IDE COntroller present
$ideCtrl = $vm.ExtensionData.Config.Hardware.Device | where {$_.GetType().Name -eq "VirtualIDEController"} | select -First 1
if(!$ideCtrl){ $ctrl = New-Object VMware.Vim.VirtualDeviceConfigSpec
$ctrl.Operation = "add"
$ctrl.Device = New-Object VMware.Vim.VirtualIDEController
$ideKey = -1
$ctrl.Device.ControllerKey = $ideKey
$spec.deviceChange += $ctrl
} else{ $ideKey = $ideCtrl.Key } # Get next harddisk number
$hdNr = 0
$vm.ExtensionData.Config.Hardware.Device | where {$_.GetType().Name -eq "VirtualDisk"} | %{ $nr = [int]$_.DeviceInfo.Label.Split(' ')[2] if($hdNr -lt $nr){ $hdNr = $nr } } if($hdNr -eq 0){$hdNrStr = ""} else{$hdNrStr = "_" + $hdNr} # Get datastore
$dsName = $vm.ExtensionData.Config.Files.VmPathName.Split(']')[0].TrimStart('[') # Add IDE harddisk
$dev = New-Object VMware.Vim.VirtualDeviceConfigSpec
$dev.FileOperation = "create"
$dev.Operation = "add"
$dev.Device = New-Object VMware.Vim.VirtualDisk
$dev.Device.backing = New-Object VMware.Vim.VirtualDiskFlatVer2BackingInfo
$dev.Device.backing.Datastore = (Get-Datastore -Name $dsName).Extensiondata.MoRef $dev.Device.backing.DiskMode = "persistent"
$dev.Device.Backing.FileName = "[" + $dsName + "] " + $vmName + "/" + $vmName + $hdNrStr + ".vmdk"
$dev.Device.backing.ThinProvisioned = $true
$dev.Device.CapacityInKb = $hdSize / 1KB $dev.Device.ControllerKey = $ideKey
$dev.Device.UnitNumber = -1
$spec.deviceChange += $dev
$vm.ExtensionData.ReconfigVM($spec)
Blog: lucd.info Twitter: @LucD22 Co-author PowerCLI Reference
Thanks Luc, great stuff.
Out of curiousity, is there a reason you are trying to create an unsupported configuration using IDE disks instead of SCSI disks?
Thanks for the script Luc! Works like a champ; just needed to add a linebreak after the "0" on line 21:
$hdNr = 0
$vm.ExtensionData.Config.Hardware.Device | where {$_.GetType().Name -eq "VirtualDisk"} | %{It's worth mentioning that the VM needs to be powered off with this approach. One alternative is to edit VMX and VMDK stub file(s) by hand, and just vMotion to re-read the config without downtime, but your mileage may vary there. IDE HDDs are already an unsupported configuration, so expect surprises if you don't test it first.
I'm not sure why the OP had a requirement for IDE HDDs, but in my case it's due to an emergency P2V of an old SCO box. Testing SCSI drives with dd consistently produced a bunch of non-recoverable errors that we didn't experience with IDE. Again, this is a totally unsupported configuration, but it was the fastest way to ressurect a legacy system sitting on rickety old hardware.
Thanks, I updated the post.
Blog: lucd.info Twitter: @LucD22 Co-author PowerCLI Reference
Would you happen to have an example of the code for attaching an existing IDE disk to the VM rather than creating a new one?
Thanks!
In that case, you could use the New-Harddisk cmdlet with the DiskPath parameter.
Blog: lucd.info Twitter: @LucD22 Co-author PowerCLI Reference
Doesn't New-HardDisk still try and attach it with a SCSI controller? I tried that method initially but always receive the "Incompatible device backing specified for device '1'" error. Here's what I'm using:
$VM_Name = "Windows 10"
$Location = (Get-Folder "MySubFolder" | where {$_.Parent -like "MyFolder"})
$Datastore_Name = "Datastore01"
$New_VM_Name = Get-VM -Name $VM_Name -Location $Location -Datastore $Datastore_Name
New-HardDisk -VM $New_VM_Name -DiskPath "[$Datastore_Name] $VM_Name/$VM_Name.vmdk"
The VMDX is a converted Hyper-V VHDX that is configured to use an IDE controller, and works fine if importing manually as an existing disk with IDE.
You will have to fetch the Controller first with Get-ScsiController, and then pass that via the Controller parameter on the New-Harddisk cmdlet
Blog: lucd.info Twitter: @LucD22 Co-author PowerCLI Reference
LucD - Thanks for the help. I just want to be certain we're on the same page, you're saying that the Get-ScsiController cmdlet should work when I'm trying to add a disk to the IDE controller?
Running that command against my VM returns a NULL object, which is what I would expect since there is no SCSI Controller present. I'm attempting to add an existing IDE disk to the IDE controller of a newly created VM. Am I missing something?
Thanks!
Come to think of it, you could use the script.
You would just need to point the
$dev.Device.Backing.FileName
property to the existing VMDK file.
Did you try that?
Blog: lucd.info Twitter: @LucD22 Co-author PowerCLI Reference
Yes, but no luck with that so far. If I use the script as is (just pointed to the existing disk) it still tries to create a new disk and the dies because there's already a disk with that name. I've tried tweaking the various parameters to prevent it from creating a new disk, but haven't found a combination that works.
Ok, I didn't realise you wanted to use an existing Harddisk and attach an existing VMDK to it.
I'll have a look.
Blog: lucd.info Twitter: @LucD22 Co-author PowerCLI Reference
Just to clarify, this is a newly created VM, and I'm attaching an existing (but unused) VMDK to it as the only disk.
I'm taking a virtual disk exported from Hyper-V, converting to VMDK, then use scripting to build a new VM and attempting to make that existing disk the master/only disk on the new VM. Just migrating everything over to VMware.
My comment in our previous discussion about "existing disk" should have said "existing VMDK".
Instead of me producing a new script, you could also remove the existing disk (on the VM), and then use the script to add a new harddisk pointing to the existing VMDK.
Blog: lucd.info Twitter: @LucD22 Co-author PowerCLI Reference
That's what I'm attempting to do, but have not found a programmatic way to add the new disk.
My steps thus far are:
Convert VHDX to VMDK
Use Cmdlet to create new VM
Delete existing disk from new VM
Use Cmdlet to upload newly converted VMDK to Datastore
Add converted VMDK to New VM as the only disk
Everything works except the last step. The virtual hardware in the converted disk expects an IDE controller, so it needs to be added to VMware as IDE. It works great through the GUI, but I have not been able to add the disk to the IDE bus via CLI.
Does that help clarify?