# Creating a New VM Guest on the BKNIX Ganeti Cluster

## Install Image Types

Install the noop image type on all nodes in the cluster

```
echo 'deb http://repo.noc.grnet.gr/ wheezy main' > /etc/apt/sources.list.d/grnet.list
wget -O - http://repo.noc.grnet.gr/grnet.gpg.key | apt-key add -
apt-get update
apt-get install ganeti-os-noop
```

Now you can create instances a la

```
gnt-instance add -t plain -o noop
...
```

## Create the VM

As I am lazy, I have a script to create a new VM guest

```
do-add nodeNum diskGB ramGB nameFQDN
```

This is the script as it is in vm0:~root

```
#!/bin/sh

# do-add nodeNum diskGB ramGB nameFQDN

DISK=$2
RAM=$3
NAME=$4
NODE=vm$1.bknix.co.th

gnt-instance add \
     -t plain \
     -o image+default \
     -s ${DISK}G \
     -B maxmem=${RAM}G,minmem=$((${RAM}/2))G \
     -n $NODE \
     -H kvm:vnc_bind_address=0.0.0.0 \
     --no-install \
     --no-start \
     --no-ip-check \
     --no-name-check \
     ${NAME}
```

## If You are Lazy and Just Want to Copy the Prototype

Find the image of the source and target images

```
gnt-instance info proto.bknix.co.th | grep 'on prim'
gnt-instance info your.vm.name | grep 'on prim'
dd bs=1024k if=/dev/ganeti/f95c22fc-8061-4402-b276-193875fc6561.disk0 | ssh vm1.bknix.co.th dd of=/dev/ganeti/b295c26a-04a9-46be-a4b9-a5febfd29195.disk0
```

You can then start your VM

```
gnt-instance start your.vm.name
```

Start a console

```
gnt-instance console your.vm.name
```

Configure the Network to the Correct IP, Gateway etc.

```
e /etc/network/interfaces
```

Fix the hostname

```
echo "foo.bknix.co.th" > /etc/hostname
hostname `cat /etc/hostname`
```

Reconfigure the mail system for the hostname and the correct IP address

```
dpkg-reconfigure exim4-config
```

Fix grub for something I forgot <blush?

```
e /etc/default/grub
quiet
update-grub
```

Enable serial console

```
e /etc/inittab
T0:23:respawn:/sbin/getty -L ttyS0 9600 vt100
```

Make new ssh keys

```
rm sudo rm -rf /etc/ssh/ssh_host_*
ssh-keygen -A
service ssh restart
```

Fix the timezone

```
dpkg-reconfigure tzdata
```

If you have reconfigured networking to be on the public LAN, then you need to bind the NIC to the public LAN with

```
gnt-instance modify --net 0:modify,link=br-public your.vm.name
```

Restart the server from ganeti

```
gnt-instance reboot foo.bknix.coth
```

## If you want to build from CD-ROM

Start the Guest VM With the CD-ROM Mounted ==

```
gnt-instance start -H boot_order=cdrom,cdrom_image_path=/ISOs/debian-7.6.0-i386-netinst.iso <your VM name>
```

### Find the Console Port of the Running VM

```
gnt-instance info your.vm.name | grep console
```

### Tunnel VNC over SSH

From your laptop

```
ssh -N -L 5900:127.0.0.1:<port from gnt-instance info> your.vm.name
```

I use a hack

```
do-link vnc vm0.bknix.co.th 11024
```

### Run VNC to the Guest VM

From your laptop, use a VNC client to connect to localhost, display 0, password as set for the VM host.

### Do the Install

It should have booted the CD-ROM.  Now do the install of the OpSys in your usual fashion.

When it finishes, if you just let it reboot, it will likely just boot the CD-ROM again.  So restart the guest by

```
gnt-instance reboot your.vm.name
```

### Enable Serial Console

It is also smart to enable the serial console in the guest so that the Ganeti host is able to

```
gnt-instance console your.vm.name
```

In FreeBSD, the hack is in /etc/ttys and the baud rate makes no difference.

```
ttyu0   "/usr/libexec/getty std.9600"   vt100   on  secure
```

### Install NTP

[Install !NTP in the guest](https://wiki.rg.net/wiki/GuestNTP)

## DRBD Mirror Guest to Cluster

You will likely want the reliability of mirroring the guest to another node in the cluster.  I have a script I use

```
#!/bin/sh
# do-drbd guest-name to-node
gnt-instance shutdown $1
gnt-instance modify \
    -t drbd \
    --no-wait-for-sync \
    -n $2 \
    $1
gnt-instance start $1
```