add blog article about linux virtual machines
Signed-off-by: Nico Schottelius <nico@ikn.schottelius.org>
This commit is contained in:
parent
ce8fe92eda
commit
e324ef31a7
2 changed files with 241 additions and 0 deletions
238
blog/linux-virtual-machines-a-real-pain.mdwn
Normal file
238
blog/linux-virtual-machines-a-real-pain.mdwn
Normal file
|
@ -0,0 +1,238 @@
|
||||||
|
[[!meta title="Linux virtual machine software is a real pain"]]
|
||||||
|
|
||||||
|
This report is a about my todays experience with virtual machines.
|
||||||
|
|
||||||
|
## UML (user-mode-linux)
|
||||||
|
|
||||||
|
It began this morning, when I tried to setup a new virtual
|
||||||
|
machine with [User mode Linux](http://user-mode-linux.sourceforge.net/).
|
||||||
|
I could easily reuse an existing installation using
|
||||||
|
copy-on-write with the following command:
|
||||||
|
|
||||||
|
linux umid=vm4 uml_dir=/home/nico/vm/uml con1=pts ubda=/home/nico/vm/cow/vm4,/home/nico/vm/images/debian eth0=tuntap,,,192.168.4.1 mem=4096M
|
||||||
|
|
||||||
|
After I issued
|
||||||
|
|
||||||
|
apt-get update && apt-get dist-upgrade
|
||||||
|
|
||||||
|
in the virtual machine, it hung. It did not react to new ssh connections.
|
||||||
|
I've seen this behaviour quite often with **user mode Linux**, when I have
|
||||||
|
"a lot" of disk input/output. Ok, I wanted to use some kind of
|
||||||
|
framework for my virtual machines anyway, so for the time being,
|
||||||
|
let's forget about uml and try the libvirt+kvm.
|
||||||
|
|
||||||
|
## Libvirt
|
||||||
|
|
||||||
|
The [libvirt](http://libvirt.org/) project looks quite promising
|
||||||
|
from its documentation, especially in combination with
|
||||||
|
[virt-manager](http://virt-manager.org/). Trying to create a
|
||||||
|
new virtual machine with virt-manager is kind of strange, because
|
||||||
|
it insists of having an installation medium. Though, locating the
|
||||||
|
Debian live CD is not so difficult. But then came the big problem:
|
||||||
|
When I tried to create a new disk image, virt-manager just hung
|
||||||
|
for several minutes, without the host system doing anything.
|
||||||
|
Some time before I had massive problems using virt-manager and selecting
|
||||||
|
a different pool for the images, which caused several problems when
|
||||||
|
trying to start the VM.
|
||||||
|
|
||||||
|
But well, let's give [virsh](http://www.libvirt.org/apps.html) a try,
|
||||||
|
the command line utility to manage libvirt. Creating a new disk image
|
||||||
|
with virsh is pretty easy:
|
||||||
|
|
||||||
|
vol-create-as default jr.img 8G
|
||||||
|
|
||||||
|
A bit confusing is the fact that the **vol-create** command without
|
||||||
|
**-as** prefix expects a XML-file as input. Having a look at the
|
||||||
|
other create commands confirms guess:
|
||||||
|
|
||||||
|
ikn:~% LANG=C LC_ALL=C virsh help | grep create
|
||||||
|
create create a domain from an XML file
|
||||||
|
net-create create a network from an XML file
|
||||||
|
nodedev-create create a device defined by an XML file on the node
|
||||||
|
pool-create create a pool from an XML file
|
||||||
|
pool-create-as create a pool from a set of args
|
||||||
|
vol-create create a vol from an XML file
|
||||||
|
vol-create-from create a vol, using another volume as input
|
||||||
|
vol-create-as create a volume from a set of args
|
||||||
|
ikn:~% virsh --version
|
||||||
|
0.7.4
|
||||||
|
|
||||||
|
Some commands do not support creation from the command line, but
|
||||||
|
only from an XML-file, which makes virsh useless for interactive
|
||||||
|
and scripting use.
|
||||||
|
|
||||||
|
This brings me to the new kid on the block: ganeti
|
||||||
|
|
||||||
|
## Ganeti
|
||||||
|
|
||||||
|
When I first experienced problems with libvirt, some people pointed
|
||||||
|
me to [ganeti](http://code.google.com/p/ganeti/)
|
||||||
|
(to speak truth, it was one of the ganeti developers).
|
||||||
|
Until today I delayed this idea, but after the problems with libvirt
|
||||||
|
I decided to give ganeti-2.0.5-1 (Debian package) a try. First of all
|
||||||
|
I tried to follow the
|
||||||
|
[installation tutorial](http://ganeti-doc.googlecode.com/svn/ganeti-1.2/install.html)
|
||||||
|
referenced on the homepage, which is heavily orientated on using
|
||||||
|
[Xen](http://www.xen.org/) and [LVM](http://tldp.org/HOWTO/LVM-HOWTO/), both
|
||||||
|
of them I do not plan to use. Trying to get ganeti running, I was meeting
|
||||||
|
some interesting problems:
|
||||||
|
|
||||||
|
[11:26] tee:root# gnt-cluster init ganeti.schottelius.org
|
||||||
|
Failure: prerequisites not met for this operation:
|
||||||
|
This host's IP resolves to the private range (127.0.1.1). Please fix DNS or /etc/hosts.
|
||||||
|
|
||||||
|
This is described in the ganeti manual and easily fixed by commenting out the
|
||||||
|
relevant entry in ***/etc/hosts***:
|
||||||
|
|
||||||
|
[11:27] tee:root# grep tee.schottelius.org /etc/hosts
|
||||||
|
#127.0.1.1 tee.schottelius.org tee
|
||||||
|
|
||||||
|
After that I was a bit confused by ganeti not finding its cluster name:
|
||||||
|
|
||||||
|
[11:27] tee:root# gnt-cluster init ganeti.schottelius.org
|
||||||
|
Failure: can't resolve hostname 'ganeti.schottelius.org'
|
||||||
|
[11:28] tee:root# ping ganeti.schottelius.org
|
||||||
|
PING ganeti.schottelius.org (77.109.138.195) 56(84) bytes of data.
|
||||||
|
64 bytes from ganeti.schottelius.org (77.109.138.195): icmp_seq=1 ttl=64 time=0.026 ms
|
||||||
|
^C
|
||||||
|
--- ganeti.schottelius.org ping statistics ---
|
||||||
|
1 packets transmitted, 1 received, 0% packet loss, time 0ms
|
||||||
|
rtt min/avg/max/mdev = 0.026/0.026/0.026/0.000 ms
|
||||||
|
|
||||||
|
Retrying two times "solved" the problem, which is a bit confusing for me
|
||||||
|
as ganeti and ping both use the same resolver library. After that I met the
|
||||||
|
"no-lvm-problem":
|
||||||
|
|
||||||
|
[11:38] tee:root# gnt-cluster init -b br0 ganeti.schottelius.org
|
||||||
|
Failure: prerequisites not met for this operation:
|
||||||
|
Error: volume group 'xenvg' missing
|
||||||
|
specify --no-lvm-storage if you are not using lvm
|
||||||
|
|
||||||
|
Specifying the required parameter led me into a new problem:
|
||||||
|
|
||||||
|
[11:38] tee:root# gnt-cluster init -b br0 --no-lvm-storage ganeti.schottelius.org
|
||||||
|
Failure: prerequisites not met for this operation:
|
||||||
|
Invalid master netdev given (xen-br0): 'Device "xen-br0" does not exist.'
|
||||||
|
|
||||||
|
Which is interesting, **ganeti seems to ignore the bridge paramater -b**.
|
||||||
|
So, to use ganeti, I **renamed the bridge from br0 to xen-br0** in
|
||||||
|
***/etc/network/interfaces***:
|
||||||
|
|
||||||
|
auto xen-br0
|
||||||
|
iface xen-br0 inet manual
|
||||||
|
bridge_ports eth1
|
||||||
|
|
||||||
|
And finally I was able to initialise the ganeti cluster:
|
||||||
|
|
||||||
|
[15:06] tee:root# gnt-cluster init -b br0 --no-lvm-storage ganeti.schottelius.org
|
||||||
|
|
||||||
|
Then I tried to join the host into the cluster, which failed, but retrieving
|
||||||
|
status information also failed:
|
||||||
|
|
||||||
|
[15:06] tee:root# gnt-node add tee.schottelius.org
|
||||||
|
Node tee.schottelius.org already in the cluster (as tee.schottelius.org) - please retry with '--readd'
|
||||||
|
[15:07] tee:root# gnt-node list
|
||||||
|
Node DTotal DFree MTotal MNode MFree Pinst Sinst
|
||||||
|
tee.schottelius.org ? ? ? ? ? 0 0
|
||||||
|
|
||||||
|
Trying to re-add it, results in an error without an error message
|
||||||
|
and does not fix the problem:
|
||||||
|
|
||||||
|
[15:07] tee:root# gnt-node add --readd tee.schottelius.org
|
||||||
|
The authenticity of host 'tee.schottelius.org (77.109.138.222)' can't be established.
|
||||||
|
RSA key fingerprint is c7:d0:a8:32:ad:f0:9b:fa:1e:77:d5:1f:64:d8:9b:db.
|
||||||
|
Are you sure you want to continue connecting (yes/no)? yes
|
||||||
|
Thu Dec 31 15:08:23 2009 - INFO: Readding a node, the offline/drained flags were reset
|
||||||
|
Thu Dec 31 15:08:23 2009 - INFO: Node will be a master candidate
|
||||||
|
Failure: command execution error:
|
||||||
|
[15:08] tee:root#
|
||||||
|
[15:32] tee:root# gnt-node list
|
||||||
|
Node DTotal DFree MTotal MNode MFree Pinst Sinst
|
||||||
|
tee.schottelius.org ? ? ? ? ? 0 0
|
||||||
|
[15:34] tee:root#
|
||||||
|
|
||||||
|
At that point I was pointed to the
|
||||||
|
[more recent documentation](http://ganeti-doc.googlecode.com/svn/ganeti-2.0/install.html)
|
||||||
|
of ganeti and began from scratch:
|
||||||
|
|
||||||
|
[16:22] tee:vm# gnt-cluster destroy --yes-do-it
|
||||||
|
[16:23] tee:vm# gnt-cluster init --no-lvm-storage ganeti.schottelius.org
|
||||||
|
[16:26] tee:vm# gnt-node list
|
||||||
|
Node DTotal DFree MTotal MNode MFree Pinst Sinst
|
||||||
|
tee.schottelius.org ? ? ? ? ? 0 0
|
||||||
|
|
||||||
|
After double checking that the needed daemons are running
|
||||||
|
(/etc/init.d/ganeti restart), I got a good hint: One has to specify
|
||||||
|
the supervisor to use during initialisation:
|
||||||
|
|
||||||
|
[16:34] tee:vm# gnt-cluster destroy --yes-do-it
|
||||||
|
[16:35] tee:vm# gnt-cluster init --no-lvm-storage -t kvm ganeti.schottelius.org
|
||||||
|
[16:36] tee:vm# gnt-node list
|
||||||
|
Node DTotal DFree MTotal MNode MFree Pinst Sinst
|
||||||
|
tee.schottelius.org ? ? 19.6G 2.7G 17.6G 0 0
|
||||||
|
|
||||||
|
Now I tried to add a new virtual machine instance, which resulted in another
|
||||||
|
error:
|
||||||
|
|
||||||
|
[16:51] tee:vm# gnt-instance add -t file -s 4G -o debootstrap -n tee.schottelius.org jr.nachtbrand.ch
|
||||||
|
Failure: prerequisites not met for this operation:
|
||||||
|
Hypervisor parameter validation failed on node tee.schottelius.org: Instance kernel '/boot/vmlinuz-2.6-kvmU' not found or not a file
|
||||||
|
|
||||||
|
This seems to be some kind ganeti logic to have the kernel outside the
|
||||||
|
block device, which is similar to the user mode Linux approach. After linking one
|
||||||
|
of the host kernels and its initrd adding an instance succeeded:
|
||||||
|
|
||||||
|
[16:59] tee:/boot# ln -s vmlinuz-2.6.30-2-amd64 vmlinuz-2.6-kvmU
|
||||||
|
[16:59] tee:/boot# ln -s initrd.img-2.6.30-2-amd64 initrd-2.6-kvmU
|
||||||
|
[17:00] tee:vm# gnt-instance add -t file -s 4G -o debootstrap -n tee.schottelius.org jr.nachtbrand.ch
|
||||||
|
[17:01] tee:/boot# gnt-instance list
|
||||||
|
Instance Hypervisor OS Primary_node Status Memory
|
||||||
|
jr.nachtbrand.ch kvm debootstrap tee.schottelius.org running 128M
|
||||||
|
|
||||||
|
It is also correctly connected to the bridge, seen as valid by **gnt-os**
|
||||||
|
and **gnt-cluster verify** looks good:
|
||||||
|
|
||||||
|
[17:14] tee:/boot# brctl show
|
||||||
|
bridge name bridge id STP enabled interfaces
|
||||||
|
br0 8000.000000000000 no
|
||||||
|
xen-br0 8000.0015176a26f7 no eth1
|
||||||
|
tap4
|
||||||
|
[17:16] tee:/boot# gnt-os diagnose
|
||||||
|
OS: debootstrap [global status: valid]
|
||||||
|
Node: tee.schottelius.org, status: VALID (path: /usr/share/ganeti/os/debootstrap)
|
||||||
|
[17:17] tee:/boot# gnt-cluster verify
|
||||||
|
Thu Dec 31 17:17:24 2009 * Verifying global settings
|
||||||
|
Thu Dec 31 17:17:24 2009 * Gathering data (1 nodes)
|
||||||
|
Thu Dec 31 17:17:24 2009 * Verifying node tee.schottelius.org (master)
|
||||||
|
Thu Dec 31 17:17:24 2009 * Verifying instance jr.nachtbrand.ch
|
||||||
|
Thu Dec 31 17:17:24 2009 * Verifying orphan volumes
|
||||||
|
Thu Dec 31 17:17:24 2009 * Verifying remaining instances
|
||||||
|
Thu Dec 31 17:17:24 2009 * Verifying N+1 Memory redundancy
|
||||||
|
Thu Dec 31 17:17:24 2009 * Other Notes
|
||||||
|
Thu Dec 31 17:17:24 2009 - NOTICE: 1 non-redundant instance(s) found.
|
||||||
|
Thu Dec 31 17:17:24 2009 * Hooks Results
|
||||||
|
|
||||||
|
As specified in the documentation, I tried to connect to the console:
|
||||||
|
|
||||||
|
[17:28] tee:/boot# gnt-instance console jr.nachtbrand.ch
|
||||||
|
[17:30] tee:/boot# gnt-instance console --show-cmd jr.nachtbrand.ch
|
||||||
|
ssh -q -oEscapeChar=none -oHashKnownHosts=no -oGlobalKnownHostsFile=/var/lib/ganeti/known_hosts -oUserKnownHostsFile=/dev/null -oHostKeyAlias=ganeti.schottelius.org -oBatchMode=yes -oStrictHostKeyChecking=yes -t root@tee.schottelius.org '/usr/bin/socat STDIO,echo=0,icanon=0 UNIX-CONNECT:/var/run/ganeti/kvm-hypervisor/ctrl/jr.nachtbrand.ch.serial'
|
||||||
|
|
||||||
|
The problem is that the newly debootstrapped system
|
||||||
|
*does not have a serial console setup*.
|
||||||
|
|
||||||
|
As you can see, in the evening of this day I had a lot of new experiences,
|
||||||
|
but *no reliable running virtualisation framework*. That brings me to the
|
||||||
|
end of this report:
|
||||||
|
|
||||||
|
* User mode Linux does not work reliable under some I/O load.
|
||||||
|
* Virt-manager is absolutely not able to change the simplest parameters.
|
||||||
|
* Virsh is unusable, if you don't want to edit XML-files.
|
||||||
|
* Ganeti has a lot of unhandled problems and still relies very much on Xen + LVM.
|
||||||
|
|
||||||
|
As next Monday my vacation ends, I will have a look at the commercial virtualisation
|
||||||
|
frameworks. For the folks of the named FOSS stuff above: Guys, you've to improve
|
||||||
|
a lot, until one can call your software "good and clean software".
|
||||||
|
|
||||||
|
|
||||||
|
[[!tag unix vm]]
|
3
tags/vm.mdwn
Normal file
3
tags/vm.mdwn
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
Virtual machine related stuff
|
||||||
|
|
||||||
|
[[!inline pages="tagged(vm)" archive="yes" show=0 quick=no]]
|
Loading…
Reference in a new issue