Getting Started with Xen on Slackware

Install Slackware

I’ll be doing this on Slackware v13.37 64 bit.

Run these commands to setup the LVM partitions:

$ pvcreate /dev/sda1
$ vgcreate vg01 /dev/sda1
$ lvcreate -L 20G -n root vg01
$ lvcreate -L 20G -n iso vg01
$ lvcreate -L 8G -n swap vg01
$ mkswap /dev/vg01/swap
$ setup

Create custom initrd after the setup complete:

$ chroot /mnt
$ /usr/share/mkinitrd/mkinitrd_command_generator.sh > init
$ sh init
$ ln -sf /boot/vmlinuz-generic-2.6.37.6 /boot/vmlinuz

Add initrd option in your /etc/lilo.conf:

# /etc/lilo.conf

image = /boot/vmlinuz
  initrd = /boot/initrd.gz # Add this line
  root = /dev/vg01/root
  label = slackware
  read-only  # Partitions should be mounted read-only for checking

Install the new bootloader and reboot:

$ lilo
$ exit
$ reboot

Setup Dom0 (Host)

Install Xen

Build Xen Kernel

We’ll be using kernel v3.2.28 so that no patching will be required to enable Xen and for that we’ll get the one from Slackware’s repo. By the time of this writing, Slackware v14 has not been released yet (it’s in the current).

$ wget http://slackware.osuosl.org/slackware-current/source/k/linux-3.2.28.tar.xz
$ tar Jxvf linux-3.2.28.tar.xz
$ mv linux-3.2.28 linux-3.2.28-xen
$ mv linux-3.2.28-xen/ /usr/src/
$ cd /usr/src
$ rm linux
$ ln -s linux-3.2.28-xen linux

Get Slackware’s default kernel config for a start. From there, you must add all Xen’s related kernel configs. You can refer to Xen’s wiki on what kernel config that needs to be enabled.

You can also get my configs from this gist. It’s based on 3.2.28 kernel (you can use Gist’s diff to see what config I’ve added).

Whatever you chose, make sure you’ll change the LOCALVERSION so that you won’t replace your current kernel. Use cat /proc/cpuinfo | grep -i 'processor' | wc -l + 1 to get your cpu core count to be used with make -j.

$ cd linux
$ wget http://slackware.osuosl.org/slackware-current/source/k/config-x86_64/config-generic-3.2.28.x64
$ cp config-generic-3.2.28.x64 .config
$ make oldconfig
$ make menuconfig
$ make -j13 bzImage modules
$ make modules_install
$ cp System.map /boot/System.map-xen-3.2.28
$ cp .config /boot/config-xen-3.2.28
$ cd /boot
$ rm System.map
$ ln -s System.map-xen-3.2.28 System.map

Xen + Dom0 + Initrd

Since LILO doesn’t support “module” directive of Grub, we need to use mbootpack.

You can use /usr/share/mkinitrd/mkinitrd_command_generator.sh for mkinitrd recommendation. Create an initrd for Xen’s kernel:

$ depmod 3.2.28-xen
$ mkinitrd -c -k 3.2.28-xen -f ext4 -r /dev/vg01/root -m mptbase:mptscsih:mptsas:usbhid:ehci-hcd:uhci-hcd:jbd2:mbcache:ext4 -L -u -o /boot/initrd-xen.gz

Create the boot image using mbootpack:

$ cd /boot
$ gzip -d -c /boot/xen-4.1.2.gz > /boot/xen-4.1.2
$ gzip -d -c /boot/initrd-xen.gz > /boot/initrd-xen
$ mbootpack -o /boot/vmlinuz-xen-3.2.28 -m /usr/src/linux-3.2.28-xen/vmlinux -m /boot/initrd-xen /boot/xen-4.1.2
$ ln -s vmlinuz-xen-3.2.28 vmlinuz-xen

With mbootpack, we don’t have to specify initrd option. Add these new configs into your /etc/lilo.conf:

# /etc/lilo.conf

image = /boot/vmlinuz-xen
  root = /dev/vg01/root
  label = slackware-xen
  append="-- nomodeset"
  read-only

Put these configs on the top of your lilo.conf:

default = slackware-xen
timeout = 30

Run lilo and make sure there’s no error from the output:

$ lilo
Warning: LBA32 addressing assumed
Added slackware
Added slackware-xen *
One warning was issued.

Put these settings in your /etc/rc.d/rc.local:

# /etc/rc.d/rc.local

if [ -d /proc/xen ]; then
  if [ -x /etc/rc.d/rc.xencommons ]; then
    echo "Starting XEN commons:  /etc/rc.d/rc.xencommons"
    /etc/rc.d/rc.xencommons start
  fi
  if [ -x /etc/rc.d/rc.xendomains ]; then
    echo "Starting XEN domains:  /etc/rc.d/rc.xendomains"
    /etc/rc.d/rc.xendomains start
  fi
fi

And these commands in your /etc/rc.d/rc.local_shutdown:

# /etc/rc.d/rc.local_shutdown

if [ -d /proc/xen ]; then
  if [ -x /etc/rc.d/rc.xendomains ]; then
    echo "Stopping XEN domains:  /etc/rc.d/rc.xendomains"
    /etc/rc.d/rc.xendomains stop
  fi
  if [ -x /etc/rc.d/rc.xencommons ]; then
    echo "Stopping XEN commons:  /etc/rc.d/rc.xencommons"
    /etc/rc.d/rc.xencommons stop
  fi
fi

After the reboot, you should get something like this:

$ uname -r
3.2.28-xen

$ cat /proc/xen/capabilities
control_d

$ cat /sys/hypervisor/properties/capabilities
xen-3.0-x86_64 xen-3.0-x86_32p hvm-3.0-x86_32 hvm-3.0-x86_32p hvm-3.0-x86_64

$ xl list
Name                                        ID   Mem VCPUs  State Time(s)
Domain-0                                     0 15243    12     r-----       9.0

Disable autosave and restore of DomU:

# /etc/default/xendomains

XENDOMAINS_RESTORE=false
XENDOMAINS_SAVE=""

Setup DomU (Guest)

I’m going to install a Slackware v13.37 64 bit as the first guest. I’ll be using an ISO image that I’ve copied into my /iso.

$ cd /iso
$ wget http://mirrors.xmission.com/slackware/slackware64-13.37-iso/slackware64-13.37-install-dvd.iso

For a start, we need to create a config file for the Slackware installation:

$ mkdir ~/machines
$ cd ~/machines
$ vim slackware-install

Put these initial configs in your /root/machines/slackware-install:

kernel = 'hvmloader'
builder='hvm'
memory = 1024
name = "slackware"
vif = [ 'mac=00:16:3E:AD:81:AE, bridge=virbr0, model=e1000' ]
dhcp = "dhcp"
disk = ['phy:/dev/vg01/slackware,hda,w', 'file:/iso/slackware64-13.37-install-dvd.iso,hdc:cdrom,r']
boot='dc'
sdl=0
opengl=1
vnc=1
vncpasswd=''
serial='pty'

As you can see, there’re various of thing thats we need to take care of before we start the installation. First of all the networking.

Generate Random MAC

Use this command (thanks to Unixtitan):

perl -e 'printf "00:16:3E:%02X:%02X:%02X\n", rand 0xFF, rand 0xFF, rand 0xFF'

Setup Networking Bridging

There are a few methods for a DomU to access the network. For this guide, I’ll use network bridging.

Put these configs (before starting anything related to Xen) into your /etc/rc.d/rc.local to enable network bridge:

# /etc/rc.d/rc.local

ifconfig eth0 up
ifconfig eth0 0.0.0.0

brctl addbr virbr0
brctl addif virbr0 eth0
ifconfig virbr0 192.168.1.10 netmask 255.255.255.0
route add default gw 192.168.1.1

Clear out any values set in your /etc/rc.d/rc.inet1.conf. Usually the value of IPADDR[0], NETMASK[0] and GATEWAY.

# /etc/rc.d/rc.inet1.conf

# Config information for eth0:
IPADDR[0]=""
NETMASK[0]=""
USE_DHCP[0]=""
DHCP_HOSTNAME[0]=""

# Default gateway IP address:
GATEWAY=""

This configs assume your main networking interface is eth0. Change other settings based on your network environment. Reboot your Dom0.

You’ll get something that looks like this after the reboot (if you got it right).

$ ifconfig

eth0      Link encap:Ethernet  HWaddr bc:30:5b:db:e2:99
          inet6 addr: fe80::be30:5bff:fedb:e299/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:163836 errors:0 dropped:0 overruns:0 frame:0
          TX packets:337 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:18347806 (17.4 MiB)  TX bytes:30535 (29.8 KiB)
          Interrupt:36 Memory:d6000000-d6012800

lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
          RX packets:4 errors:0 dropped:0 overruns:0 frame:0
          TX packets:4 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:336 (336.0 B)  TX bytes:336 (336.0 B)

virbr0    Link encap:Ethernet  HWaddr bc:30:5b:db:e2:99
          inet addr:192.168.1.10  Bcast:192.168.1.255  Mask:255.255.255.0
          inet6 addr: fe80::be30:5bff:fedb:e299/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:147426 errors:0 dropped:506 overruns:0 frame:0
          TX packets:129 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:12417385 (11.8 MiB)  TX bytes:16779 (16.3 KiB)

Enable X11 Forwarding in Dom0

Uncomment or create these options in your /etc/ssh/sshd_config:

# /etc/ssh/sshd_config

X11Forwarding yes

Restart your ssh server:

$ /etc/rc.d/rc.sshd restart
$ exit

Reconnect to Dom0 using -Y option:

$ ssh -Y root@192.168.1.10
$ xclock

If you can see a clock ticking, that means the X11 forward is working.

Prepare space for DomU

I’m going to store my DomU in the a new logical volume.

$ lvcreate -L 15G -n slackware vg01

Install Slackware in DomU

$ cd machines
$ xl create slackware

If everything is good, you should see slackware when you run xl list.

$ xl list
Name                                        ID   Mem VCPUs  State Time(s)
Domain-0                                     0 13988    12     r-----      40.0
slackware                                    2  1019     1     -b----       4.6

Install Slackware through VNC:

$ xl vncviewer slackware

Just install as if you’re installing on a normal server. halt after you’ve finished your installation.

Start Slackware in DomU

$ cd ~/machines
$ cp slackware-install slackware
$ vim slackware

Change these two lines in your config file to make sure it’ll boot from the hardisk:

# /root/machines/slackware

disk = ['phy:/dev/vg01/slackware,hda,w']
boot='c'

Start the guest:

$ xl create slackware

Enable Console in DomU

It’s pretty annoying to use vnc everytime we need to access our DomU directly. It’s possible to connect to our DomU using console connection:

Uncomment these lines:

# /etc/inittab
s1:12345:respawn:/sbin/agetty -L ttyS0 9600 vt100

# /etc/securetty
ttyS0

$ reboot

For Ubuntu’s DomU, please check out https://help.ubuntu.com/community/SerialConsoleHowto.

You can now connect to your Slackware DomU using:

$ xl console slackware

Additional Info

Disable auto save and restore of domUs on host reboot:

$ vim /etc/default/xendomains

XENDOMAINS_RESTORE=false
XENDOMAINS_SAVE=""

In order to run xl shutdown guest so that your DomU will shutdown gracefully, you need to use PVHVM drivers. You can refer here for the related kernel configs that you need to enable in your kernel.

There are still many things that I’d like to add, but I think it’s good enough for now. After all, this post is about getting started, not a complete guide. I’ll update this post if I found anything worth of sharing.

Good luck!

More references:

Written by Amree Zaid


Powered by Jekyll. Get the source at Github. Design copied from Sam Vermette.