If you are using kvm (or qemu) on Ubuntu, then you can build a vm from scratch with the tool vmbuilder. Install it first by doing this:
aptitude install ubuntu-vm-builder
Creating a virtual machine is simple, but the most examples I’ve found left me back with an useless installation – at best.
What didn’t work for me? Well e.g. this one:
DON’T USE THIS!!!
sudo vmbuilder kvm ubuntu --suite lucid --flavour virtual --arch i386 -o --libvirt qemu:///system
This line works only (also at best) one time, a second time is will produce the error code listed below. Also you won’t be able to use it bridged, but NAT only. Err – who needs NAT? – Anyone?
The hostname bug
--hostname=<my_hostname>
I’ve figured out, that the switch “–hostname=” is needed, else you’ll get the error below. But be carefull, the next time you start it without “–hostname” it will work again, but will delete all of your already generated virtual machines in:
$HOME/ubunutu-kvm/
This is the default location where your virtual guest are stored, and this folder will only contain the new build virtual machine, all other are gone!
The bridge switch
--bridge=br0
In order to use your vm bridged, so you can access it from your own subnet, you’ll need to provide the “–bridge=br0” switch. But prepare you host for the br0 feature. Look for the second ocurance of “/etc/network/interfaces” here: http://blog.mymediasystem.net/uncategorized/vmware-kvm-migration-guide/
Some folks start modifying /etc/vmbuilder/libvirt/libvirtxml.tmpl
and replaced the whole interface
part with this here:
<interface type='bridge'> <source bridge='br0'/> </interface>
Well, it’s working like this also, but why should I do that? The bridge switch is working also. Maybe it didn’t before Lucid (10.04).
Providing user and password
--user=<my_username> --pass=<my_password> --name=<my_name_or_nick>
To make it round, I’d suggest to provide a new user and password. Just imagine you plan to set up a new exposed web-host, and you forget to change –user=ubuntu and –pass=ubuntu. You don’t need to be a hero to own this machine! You can also provide your real name or something “–name=<my_name_here>”
Architecture
--arch=amd64
or
--arch=i386
Select your target architecture. You can look up KVM’s site to see, if your OS is supported for a certain bitting.
Static IP
--ip=<my_ip>
If you’re setting up a server, why would you want to use DHCP?
Ubuntu Version
--suite=<your_desired_ubuntu_version>
For a server an LTS (long term support) is not such a bad idea, so I’m using Lucid (10.04) in this case.
The whole story
Ok, now you can put the pieces together and invoke this on your console (even on a fast connection it took for me up to half an hour):
USE THIS:
vmbuilder kvm ubuntu --suite=lucid --flavour=virtual --arch=amd64 -o --hostname=lucid64 --ip 192.168.1.100 --user john --name lill_joe --pass johnspw --libvirt=qemu:///system --bridge=br0
Starting
virt-manager
Your machine will have another name, but will automatically show up in the virt-manager. You can modify the preferences of your guest there, or perform a
virsh dumpxml <my_vmname> > <my_vmname>.xml
to create an xml file, which you can edit with the editor of your choice.
Let’s say your Ubuntu installation is called ubuntu_1
, then you can modify your xml file, undefine your vm first and define it again with the new settings:
virsh -c qemu:///system undefine ubunut_1
Make your changes to the ubuntu_1.xml
now, and do a
virsh -c qemu:///system define ubuntu_1.xml virsh start ubuntu_1
–hostname-Bug
~# vmbuilder kvm ubuntu --suite=lucid --flavour=virtual --arch=amd64 -o --bridge=br0 --libvirt=qemu:///system 2011-05-14 19:18:32,396 INFO : Calling hook: preflight_check 2011-05-14 19:18:32,444 INFO : Calling hook: set_defaults 2011-05-14 19:18:32,445 INFO : Calling hook: bootstrap 2011-05-14 19:31:04,343 INFO : Calling hook: configure_os 2011-05-14 19:31:20,347 INFO : 2011-05-14 19:31:20,347 INFO : Current default time zone: 'Etc/UTC' 2011-05-14 19:31:20,351 INFO : Local time is now: Sat May 14 17:31:20 UTC 2011. 2011-05-14 19:31:20,351 INFO : Universal Time is now: Sat May 14 17:31:20 UTC 2011. 2011-05-14 19:31:20,351 INFO : Extracting templates from packages: 100% 2011-05-14 19:32:28,283 INFO : 2011-05-14 19:32:28,283 INFO : Current default time zone: 'Etc/UTC' 2011-05-14 19:32:28,287 INFO : Local time is now: Sat May 14 17:32:28 UTC 2011. 2011-05-14 19:32:28,287 INFO : Universal Time is now: Sat May 14 17:32:28 UTC 2011. 2011-05-14 19:32:28,287 INFO : Run 'dpkg-reconfigure tzdata' if you wish to change it. 2011-05-14 19:32:28,287 INFO : 2011-05-14 19:33:53,467 INFO : start: Unknown parameter: JOB 2011-05-14 19:33:55,217 INFO : Calling hook: post_install 2011-05-14 19:33:55,219 INFO : Calling hook: preflight_check Traceback (most recent call last): File "/usr/bin/vmbuilder", line 24, in cli.main() File "/usr/lib/python2.6/dist-packages/VMBuilder/contrib/cli.py", line 117, in main hypervisor.install_os() File "/usr/lib/python2.6/dist-packages/VMBuilder/hypervisor.py", line 60, in install_os self.call_hooks('preflight_check') File "/usr/lib/python2.6/dist-packages/VMBuilder/distro.py", line 66, in call_hooks call_hooks(self, *args, **kwargs) File "/usr/lib/python2.6/dist-packages/VMBuilder/util.py", line 158, in call_hooks getattr(plugin, func, log_no_such_method)(*args, **kwargs) File "/usr/lib/python2.6/dist-packages/VMBuilder/plugins/libvirt/__init__.py", line 54, in preflight_check if hostname in self.all_domains() and not self.vm.overwrite: AttributeError: 'Libvirt' object has no attribute 'vm'
Notes
I’ve been using ubuntu-vm-builder version 0.12.4
My Ubuntu is a 10.04 LTS aka Lucid Lynx x86_64:
Linux server 2.6.32-31-server #61-Ubuntu SMP Fri Apr 8 19:44:42 UTC 2011 x86_64 GNU/Linux