Move OCI Windows Instances between regions and tenants

Most instances (VMs and Bare Metal) can be exported, so that they can be copied/transferred to other regions or other Cloud Accounts. One type of instance does not support this, these are the instances created based on Oracle provided Windows. This has to do with the licensing deal between Oracle and VMware.

So is it really not possible to move you your Windows VMs??? Of course you can 🙂

Here is a method on how to move / copy / duplicate your Windows instances between regions / tenants.

Prepare the destination:

Create on the destination, where you want to move your Windows VM to, a new Windows Instance.

After it is provisioned, stop the instance and wait for the instance to be stopped.

Go to the Boot Volume and Detach the boot disk from the Instance

Create a (temporary) Linux VM on the destination side, I tested this with Ubuntu 18.04. Make sure the Linux VM is in the same Availability Domain as the Destination Windows VM.

Goto attached block volumes on the Destination Linux VM and add the Destination Windows Boot disk, as paravirtualized and with read/write permissions.

Prepare the source:

Stop the Original Windows VM you wan to move. When it is stopped, also detach it’s boot volume.

Create also on the source side a Linux VM and attach the Original Windows boot volume to this VM as paravirtualized, but you can give it just READ ONLY permission (to be on the safe side).

Block level copying:

Open a SSH / Putty session to both source and destination Linux VMs. The default username is: ubuntu

We are going to use the linux dd command to copy over the source disk, block by block (very low level) and overwrite the destination disk. This is done over the network, so this can be done to anywhere you like.

While the dd command is very powerful, it’s “interface” is pretty shitty as there is no displayed output. I do like to know what is going on, so we need to install a small utility called pv. Run the following commands in both your Linux VMs:

Below the example of using Netcat. You can use any port number for the traffic, just make sure you modify your security list for the destination target, that is allows that port as incoming traffic. In my example, I will use port 1900. Important: also disable the firewall inside the Destination Linux VM by running the command:

sudo iptables -F

Now we start NetCat listening on the Destination Linux VM:

nc -l 1900 | pv | sudo dd of=/dev/sdb bs=100M

Then we start the copying process on the Source Linux VM:

sudo dd if=/dev/sdb bs=100M | pv | nc 130.61.125.192 1900

Depending on the size of the Boot disk and the speed of the public internet, this can take “some time”.

Extra option:

If you are worried about your ssh session disconnecting during the transfer, you can first run the command screen in both sessions.

The Netcat session will stay for ever, so you need to stop is manually by control-C when you see that the transfer is done.

All you need to do, to complete this operation:

Stop the linux VMs and detach the Attached boot volumes

Re-attach the Windows Boot disks to the Windows instances.

The new Windows instance will now be an exact copy of the orginal Windows instance.

This method leaves you with a “new” official OCI Windows VM, that has the contents of your source VM. It runs in the same native mode and you will still be paying for a Windows VM.

Why not use the volume groups and volume group backups? You can put this into object storage, issue a PAR for the bucket in question, and load the back-up into the new environment’s vm.compute image running windows w/o causing any issue, data is moved, new image is now instantiated, and you can continue operating your snowflake compute effectively…