3 min read

Cloning VMware machines loses network connection

I have been setting up a whole swag of virtual machines to do my bidding. Ideally I would use ESXi but it doesn’t support my choice of server – my old laptop (Toshiba Tecra M5).

So I am back to using VMware Server. Since I last used it, VMware Server 2.0 has been released. It features a web-based management interface, which is quite good, though it uses a self-signed certificate that causes browsers to complain. I will eventually figure out how to replace it with a real certificate (or rather, one that my personal trusted certification authority has issued) and post the instructions here.

But that’s not what this post is about. My operating system of choice at the moment is Ubuntu Server 8.04 LTS. Yes, 8.10 is out, but I don’t want to download another CD image. I am in New Zealand, the land of data caps, after all. I have created a base install of Ubuntu, and want to clone it and use it as a base for other virtual machines.

Installation is simple.

Copying the virtual machine is simple:

cp -r [source_directory] [destination_name]

Then it’s a matter of renaming the virtual disk (for consistency’s sake – it’s not mandatory):

vmware-vdiskmanager -n [source_file.vmdk] [destination_file.vmdk]

Following that, I edit the .vmx file, and change references to the .vmdk file and the virtual machine name that is displayed in the management interface. Otherwise you’ll end up with multiple machines with the same name, and that gets confusing.

Once you add the machine to the inventory, VMware Server will realise that it’s a clone of an existing machine, and will ask you to confirm that. If you say it is a copy, it will regenerate some IDs, like the NIC’s MAC address. And this is where we run into trouble.

With a new MAC address, the system thinks there’s a new device in there. Which is virtually true. It leaves the existing configuration (from the base image) as eth0, and sets up the “new” NIC as eth1. Which is fine. But eth0 will never work, and it’s better (I think) for the first NIC to be eth0.

I found a solution here:

Re: Eth0 disapears in VMware and Ubuntu Server

I think that the best thing is delete the eth0 line from /etc/udev/rules.d/70-persistent-net.rules and change eth1 to eth0 in the eth1′s lineI mean, my file was

This file was automatically generated by the /lib/udev/write_net_rules

program, probably run by the persistent-net-generator.rules rules file.

You can modify it, as long as you keep each rule on a single line.

PCI device 0×1022:0×2000 (pcnet32)

SUBSYSTEM==”net”, DRIVERS==”?*”, ATTRS{address}==”00:0c:29:b0:1a:59″, NAME=”eth0″

PCI device 0×1022:0×2000 (pcnet32)SUBSYSTEM==”net”, DRIVERS==”?*”, ATTRS{address}==”00:0c:29:38:15:ba”, NAME=”eth1″

but now is

This file was automatically generated by the /lib/udev/write_net_rules

program, probably run by the persistent-net-generator.rules rules file.

You can modify it, as long as you keep each rule on a single line.

PCI device 0×1022:0×2000 (pcnet32)SUBSYSTEM==”net”, DRIVERS==”?*”, ATTRS{address}==”00:0c:29:38:15:ba”, NAME=”eth0″

Salute

Frank Abel

Thanks Frank – that fixed it.

Some other things to think of:

You will want to change the host name of your new virtual machine, probably. You do that by editing the /etc/hostname file. But if you do that, and the new host name isn’t resolvable by DNS, you may run into troubles, especially using sudo on a default installation of Ubuntu (and probably other distros as well). So, before you change the hostname, it’s advisable to add an entry in /etc/hosts for the new host name.

I have run into trouble by changing /etc/hostname and then being unable to edit any other file, including /etc/hosts, because sudo requires that your machine’s hostname be resolved. It’s for this reason that my new rule is to create a password for root as soon as the OS is installed:

sudo passwd root

Other things I need to do when cloning the machine are editing network settings in /etc/network/interface (I am using static IP addressing) and DNS servers in /etc/resolv.conf. Then reboot and you have a clean system with its own “identity”.