Installing OpenStack on a Dell XPS13 Ultrabook running Debian Wheezy

Unsupported, but it works!
by Mitch Halmu, Netside Corporation
March 2013

The Dell XPS13 L322X Ultrabook is a truly wonderful development machine. With a third generation dual core Intel i7 processor and fast SSD disk, you literally hold a Linux mini-server in the palm of your hands. This Ultrabook, originally imaged by Dell with Windows 8, was configured with dual-boot Debian 7.0 Wheezy and CentOS 6.3 - the best of both Open Source Linux variants.

For this project, the latest DevStack (community supported Open Source development branch of the OpenStack project started by RackSpace) was downloaded from the GIT repository:

# git clone git://github.com/openstack-dev/devstack.git

If you then follow the simple Quick Start Guide from DevStack while running Debian, you will most certainly be disappointed. The guide recommends running the following on a fresh install of Ubuntu 12.04 (Precise) or Fedora 16:

# cd devstack
# ./stack.sh

You get a WARNING that the script has not been tested on your distro, and "If you wish to run this script anyway run with FORCE=yes". Most folks simply give up at this point, or start coloring between the lines with a supported O/S. But knowing that Ubuntu is an offspring of Debian gives us a fighting chance to change platforms.

Hacking DevStack for Debian

Start by checking your default repos in /etc/apt/sources.list

### Testing (wheezy)
deb http://ftp.debian.org/debian testing main contrib non-free
deb-src http://ftp.debian.org/debian/ testing main contrib non-free

### Testing Security http://secure-testing-master.debian.net/
deb http://security.debian.org/ wheezy/updates main contrib non-free
deb-src http://security.debian.org/ wheezy/updates main contrib non-free

### Testing Proposed Updates
deb http://ftp.debian.org/debian/ testing-proposed-updates main contrib non-free
deb-src http://ftp.debian.org/debian/ testing-proposed-updates main contrib non-free

### sid
deb http://ftp.debian.org/debian sid main contrib non-free
deb-src http://ftp.debian.org/debian/ sid main contrib non-free

### experimental
deb http://ftp.debian.org/debian experimental main contrib non-free
deb-src http://ftp.debian.org/debian/ experimental main contrib non-free

Make sure you're running on the latest kernel and everything is up-to-date (# apt-get update and # apt-get upgrade). This is the running kernel version at deployment time:

# uname -a
Linux xps13 3.2.0-4-amd64 #1 SMP Debian 3.2.39-2 x86_64 GNU/Linux
# cat /proc/version
Linux version 3.2.0-4-amd64 (debian-kernel@lists.debian.org) (gcc version 4.6.3 (Debian 4.6.3-15) ) #1 SMP Debian 3.2.39-2

Install apache2 (version 2.2.22-13) if you don't already have it running. Install python and python-dev (both versions 2.6 and 2.7 are loaded on this system, default comes up at ver 2.7.3 on the python command line). OpenStack will install lots of python dependencies later. Install screen.

Install and configure mysql on the system (the DevStack shell script will also try to do that, but you run into a catch-22 with the OpenStack Keystone Identity Service trying to create and configure the database as 'root'@'localhost') and the script hangs (Bug #1118502 MYSQL is accessed as Root). Don't forget to set and remember the password for the mysql root and 'root'@'localhost' accounts (yes, you need to specifically configure both). The following mysql-related packages were installed:

# dpkg -l|grep mysql
ii  libdbd-mysql-perl                     4.021-1+b1                         amd64        Perl5 database interface to the MySQL database
ii  libmysqlclient18:amd64                5.5.29+dfsg-1                      amd64        MySQL database client library
ii  mysql-client                          5.5.29+dfsg-1                      all          MySQL database client (metapackage depending on the latest version)
ii  mysql-client-5.5                      5.5.29+dfsg-1                      amd64        MySQL database client binaries
ri  mysql-common                          5.5.29+dfsg-1                      all          MySQL database common files, e.g. /etc/mysql/my.cnf
ii  mysql-server                          5.5.29+dfsg-1                      all          MySQL database server (metapackage depending on the latest version)
ii  mysql-server-5.5                      5.5.29+dfsg-1                      amd64        MySQL database server binaries and system database setup
ii  mysql-server-core-5.5                 5.5.29+dfsg-1                      amd64        MySQL database server binaries
ii  mysql-utilities                       1.0.5-1                            all          collection of scripts for managing MySQL servers
ii  python-mysql.connector                0.3.2-1                            all          pure Python implementation of MySQL Client/Server protocol
ii  python-mysqldb                        1.2.3-1+b1                         amd64        Python interface to MySQL

I am most concerned with the proper deployment of the mysql server because the keystone bug caused the most pain in the installation and necessitated some reboots to clear hanging processes (unstack.sh and even killing processes manually will not do if you're stopped at creating the database and users). Every time the stack.sh script hangs, you will need to start from scratch.

And finally, check that you have qemu and libvirt installed on your system:

# dpkg -l|egrep "(qemu|libvirt)"
ii  ipxe-qemu                             1.0.0+git-20120202.f6840ba-3       all          PXE boot firmware - ROM images for qemu
ii  kvm                                   1:1.1.2+dfsg-5                     amd64        dummy transitional package from kvm to qemu-kvm
ii  libvirt-bin                           0.9.12-11                          amd64        programs for the libvirt library
ii  libvirt-dev                           0.9.12-11                          amd64        development files for the libvirt library
ii  libvirt-glib-1.0-0                    0.0.8-1                            amd64        libvirt glib mainloop integration
ii  libvirt0                              0.9.12-11                          amd64        library for interfacing with different virtualization systems
ii  python-libvirt                        0.9.12-11                          amd64        libvirt Python bindings
ii  qemu-keymaps                          1.1.2+dfsg-5                       all          QEMU keyboard maps
ii  qemu-kvm                              1.1.2+dfsg-5                       amd64        Full virtualization on x86 hardware
ii  qemu-utils                            1.1.2+dfsg-5                       amd64        QEMU utilities

Create a user stack with group stack and home directory in /opt/stack, give sudo perms to user stack. This is the default, you may be able to change it to suit your needs.

Now that it was tested on Debian and proven to work, you may # vi stack.sh and comment the following lines out:

# Warn users who aren't on an explicitly supported distro, but allow them to
# override check and attempt installation with ``FORCE=yes ./stack``
#if [[ ! ${DISTRO} =~ (oneiric|precise|quantal|raring|f16|f17|f18|opensuse-12.2) ]]; then
#    echo "WARNING: this script has not been tested on $DISTRO"
#    if [[ "$FORCE" != "yes" ]]; then
#        die $LINENO "If you wish to run this script anyway run with FORCE=yes"
#    fi
#fi
and set the following variable to False:
# Should cinder perform secure deletion of volumes?
# Defaults to true, can be set to False to avoid this bug when testing:
# https://bugs.launchpad.net/ubuntu/+source/linux/+bug/1023755
CINDER_SECURE_DELETE=`trueorfalse False $CINDER_SECURE_DELETE`

A logical volume group named "stack-volumes" (derived from the formerly nova-volumes VG of the nova component of OpenStack) should be created on an empty physical volume. Since I had no free space to spare and the XPS13 was set up previously with 16G of swap space, I carved out an 8G disk partition of type 8e00 (Linux LVM), created a PV on /dev/sda7 to receive the stack-volumes VG and rebuilt swap on the remaining 8G on /dev/sda8. This required immediate coordination with the CentOS half that resides on the Ultrabook, because swap is mounted by either at boot time and the swap device name in /etc/fstab changed. Alternately, you may be able to create the LVM volume group on an USB stick (just remember to plug it in before you need it). Obviously, 8G is very skimpy for OpenStack VMs, but there are tiny machine images you may run as a developer.

Most all of the pre-requisites needed in Ubuntu which the script will load have a corresponding package in Debian. I found one notable exception: open-iscsi-utils is not available (the iscsiadm command is included in the open-iscsi package on Debian). Comment out this package name in devstack/files/apts/n-cpu before you run stack.sh, or you will get stuck with an unmet dependency.

DevStack provides a vanilla localrc file in samples. While not necessarily needed (the script prompts for account passwords), you may want to create a minimal localrc file in devstack for dedicated hardware, containing something like:

FLOATING_RANGE=192.168.1.224/27
FIXED_RANGE=10.11.12.0/24
FIXED_NETWORK_SIZE=256
FLAT_INTERFACE=eth0
DATABASE_PASSWORD=mysqlroot
RABBIT_PASSWORD=fluffybunny
SERVICE_TOKEN=withrespect
SERVICE_PASSWORD=howmayihelpu
ADMIN_PASSWORD=supersecret

In regards to the specified eth0 interface, while the XPS13 Ultrabook does not have an ethernet port, a USB dongle (the StarTech.com USB 3.0 to Gigabit Ethernet NIC 10/100/1000 Network Adapter, USB to RJ45 from Amazon.com) with a locally-compiled Asix ax88179_178a.ko kernel module was installed to connect to the network.

The following may also help in certain configurations to avoid install problems when http_proxy is set:

export no_proxy="localhost,127.0.0.1"

You are now finally ready to run stack.sh as root in Debian. The script will change environments to the stack user created earlier (remember, the account must have sudo perms for the script to execute properly) and will run in a screen session. When properly finished, you will get a summary of accounts and URLs.

Horizon is now available at http://10.11.12.13/
Keystone is serving at http://10.11.12.13:5000/v2.0/
Examples on using novaclient command line is in exercise.sh
The default users are: admin and demo
The password: supersecret
This is your host ip: 10.11.12.13
stack.sh completed in 190 seconds.
stack@xps13:~/devstack$ _

OpenStack services will be running after the script completed. Connecting to http://localhost/ with a web browser should present the OpenStack Dashboard login screen.

To thoroughly test the installation, run exercise.sh and watch for failed tests. To restart OpenStack services after you reboot, run rejoin-stack.sh

A more consistent approach

If you believe the folks at OpenStack.org, you only have two options to try OpenStack: 1) Public Clouds and and 2) Local Dev Environment: devstack.org, which was done as described above.

Looking at what we have installed with the DevStack script, it appears that a lot of the stuff is temporary (i.e., look in /usr/local/bin - you have nova, but there is no nova Debian package properly installed on the system). What I mean is, the install will only live in its present form until you run the next stack.sh script. So if you try to customize anything in the config files of the various components, it will be overwritten by the script when you run it again for any reason. This implies you can either modify the script to your liking, or try to load all .deb packages from a proper Debian-supported repository and install them on the system. As a sysadmin, I prefer the latter approach, as I like to receive weekly updates on packages and stay current with the latest releases on the system.

There is a third approach: build your own cloud. In past endeavors, I have built OpenNebula from source on Debian sparc just to see if it can be done, but it is not as popular as OpenStack, so we'll stick with mainstream Open Source technology that has a growing rate of adoption and lots of heavyweight sponsors.

The latest version of OpenStack is Grizzly, scheduled to be released in April 2013. The current stable release is Folsom. I am currently searching through Debian repos for packages that can be installed permanently on the system. For Grizzly, add the following repos to the sources.list file:

### OpenStack Grizzly
deb http://ftp.gplhost.com/debian grizzly main
deb-src http://ftp.gplhost.com/debian grizzly main
deb http://ftp.gplhost.com/debian wheezy-backports main

Also download and install the repository key with apt-key add, then apt-get update.

Ken Pepple's conceptual diagram of the OpenStack architecture illustrates the 7 major components:

* Dashboard ("Horizon") provides a modular web-based user interface for all OpenStack services.
* Network ("Quantum") provides network connectivity as a service between interface devices managed by other OpenStack services.
* Compute ("Nova") provides virtual servers upon demand.
* Image ("Glance") provides a catalog and repository for virtual disk images.
* Object Store ("Swift") stores and retrieves files.
* Block Storage ("Cinder") provides persistent block storage to guest VMs.
* Identity ("Keystone") provides authentication and authorization for all OpenStack services.

Let's start with OpenStack Compute, codenamed Nova. An apt-get install nova-common (containing elements that are needed in all parts of Nova) will bring in the following new packages for Folsom besides nova-common: dbconfig-common nova-compute-kvm python-crypto python-daemon python-glance python-nova python-novaclient python-prettytable. The nova-common package configure will present a screen for database setup. Select NO - the package can be configured later on by running "dpkg-reconfigure -plow nova-common". We already have files /etc/nova/api-paste.ini and policy.json from DevStack, so you can view the differences before you install the maintainer's version. Best is to make a backup of api-paste.ini and policy.json, then install the maintainer's version. You can later edit the files and add the missing credentials, IPs, etc. to the new versions. The reason is, the config files that come with the package may list other options, and give some clues about what's deprecated in the version you installed.

With the new repo for Grizzly enabled, the dependency list is much longer, and the nova-common, nova-compute and python-nova packages from Folsom will also be upgraded. Unfortunately, this is where you run into problems. The package nova-common from Grizzly will not configure properly at post-install (throws a python ConfigObjError). I presume it's caused by a versioning mismatch, but tracing it involves lots of work. You get the same python error with cinder-common. I found references to bug #1110567 nova-common dpkg --configure broken in Ubuntu.

So, after loading some other components that behave (i.e., keystone, glance, novnc), and even some of the toys that come pre-installed in the XPS13 Ubuntu developer edition (juju, juju-jitsu, lxc, zookeeper, apt-cacher-ng, bzr, mr, byobu, debootstrap, gource, graphviz, tmux, vagrant, virtualbox), I disabled the Grizzly repo and reloaded stable Debian package versions for Nova.

A note about virtualbox: I had installed the Oracle distribution previously, so vboxdrv was already available for the kernel, and this created a conflict. Because of dependency requirements, I had to purge the Oracle package and reinstall the Debian version instead. DKMS then built and configured a new set of modules for the running kernel. I continue to run the Oracle version of virtualbox only on the CentOS half of the machine. This illustrates exactly why I'm trying to build a custom DevStack using Debian packages.

I purged all Folsom Nova packages and started from scratch with the Grizzly repo. Ran into the same python problem - downloaded the nova-2013.1~g3 source package, examining the config files, and working on a fix. Checked on Debian Bug #700620: nova-common: fails to upgrade from sid: configobj.ConfigObjError: Parsing failed with several errors.

Also, Debian currently uses python-novaclient ver 2.10.0, whereas DevStack uses python-novaclient ver 2.11.0, which was just introduced in Feb 2013. You can download ver 2.11.0 at:

# git clone git://github.com/openstack/python-novaclient.git

After building the python package, it will install in /usr/local/lib/python2.7/dist-packages/ (anything stored in /usr/local is a custom path, containing files that were not loaded from an official Debian repo). You can see here how many packages you need to install if you want to build OpenStack.

Will tinker with this some more and post updates when available.


Progress
April 2013

While waiting for the Easter Bunny and a package rev fix, I upgraded the Debian kernel on the XPS13 from ver 3.2 to the 3.8 experimental kernel:

# uname -a
Linux xps13 3.8-trunk-amd64 #1 SMP Debian 3.8.5-1~experimental.1 x86_64 GNU/Linux
# cat /proc/version
Linux version 3.8-trunk-amd64 (debian-kernel@lists.debian.org) (gcc version 4.7.2 (Debian 4.7.2-5) ) #1 SMP Debian 3.8.5-1~experimental.1

Everything seems to work, with the exception of building the virtualbox kernel modules (Bug #696011), which fails in make with 'VM_RESERVED' undeclared. Old version is 4.1.18-dfsg-2+deb7u1 from sid. Upgraded all virtualbox packages to version 4.1.18-dfsg-2.1 from experimental, which now build and load the vbox modules with the new 3.8 kernel.

I was especially worried about Bug #689268: Intel HD 4000 (Ivy Bridge) graphics freeze. Not happening so far - worked with the GUI for several hours while away in a meeting, and the XPS13 Ultrabook behaved nicely. The screen brightness keyboard control and the Cypress trackpad have the same old issues, though.

Of course, this upgrade brings the host to a higher Debian rev level. The system packages now load and upgrade from sid and experimental, so you may comment out the Wheezy repos from the old sources list. Forgot to mention this (to clarify: the DevStack was first installed on a 3.2 kernel, but the XPS13 is now running on bleeding edge Debian experimental), and Thomas Goirand (zigo) pointed it out in a message. He also noted that now there is a Wheezy backport repository at GPLHost for Grizzly:

deb http://ftp.gplhost.com/debian grizzly-backports main

The good news is, the gplhost Grizzly repo now contains several package updates, which have started to come in (i.e., python-novaclient ver 2.12.0). This made it possible to install the nova ver 2013.1-1 packages without any python errors. Of course, you have the problem of /etc/nova being overwritten by the Debian packages, so make sure you keep a copy of the files generated by DevStack and the new config files.

# dpkg -l|grep nova
ii  nova-api                              2013.1-1                           all          OpenStack Compute - compute API frontend
ii  nova-baremetal                        2013.1-1                           all          Openstack Compute - baremetal virt
ii  nova-cells                            2013.1-1                           all          Openstack Compute - cells
ii  nova-cert                             2013.1-1                           all          OpenStack Compute - certificate manager
ii  nova-common                           2013.1-1                           all          OpenStack Compute - common files
ii  nova-compute                          2013.1-1                           all          OpenStack Compute - compute node
ii  nova-compute-kvm                      2013.1-1                           all          OpenStack Compute - compute node (KVM)
ii  nova-conductor                        2013.1-1                           all          OpenStack Compute - conductor service
ii  nova-console                          2013.1-1                           all          OpenStack Compute - console
ic  nova-consoleauth                      2013.1-1                           all          OpenStack Compute - Console Authenticator
ii  nova-network                          2013.1-1                           all          OpenStack Compute - network manager
ii  nova-novncproxy                       2013.1-1                           all          OpenStack Compute - NoVNC proxy
ii  nova-objectstore                      2013.1-1                           all          OpenStack Compute - object store
ii  nova-scheduler                        2013.1-1                           all          OpenStack Compute - virtual machine scheduler
ii  nova-spicehtml5proxy                  2013.1-1                           all          Openstack Compute - Spice HTML5 Proxy
ii  nova-volume                           2013.1-1                           all          OpenStack Compute - storage
ii  nova-xvpvncproxy                      2013.1-1                           all          OpenStack Compute - XVP VNC proxy
ii  python-nova                           2013.1-1                           all          OpenStack Compute - libraries
ii  python-novaclient                     2:2.12.0-1                         all          client library for OpenStack Compute API

Note: Thomas Goirand advised that the following nova APIs, which are distinct under DevStack, are not missing, but were deliberately integrated under nova-api and served more efficiently with a single daemon in the 2013.1-1 distribution:

    nova-api-ec2              - OpenStack Compute - EC2 API frontend
    nova-api-metadata         - OpenStack Compute - metadata API frontend
    nova-api-os-compute       - OpenStack Compute - compute API frontend
    nova-api-os-volume        - OpenStack Compute - Volume API frontend
nova-api is configured in /etc/nova/nova.conf as follows:

enabled_apis=ec2,osapi_compute,metadata
Same comment for cinder configuration files in /etc/cinder. Installed cinder packages in Debian ver 2013.1-1:

# dpkg -l|grep cinder
ii  cinder-api                            2013.1-1                           all          Openstack block storage as a service - API server
ii  cinder-common                         2013.1-1                           all          Openstack block storage as a service - common files
ii  cinder-scheduler                      2013.1-1                           all          Openstack block storage as a service - Scheduler server
ii  cinder-volume                         2013.1-1                           all          Openstack block storage as a service - Volume server
ii  python-cinder                         2013.1-1                           all          Openstack block storage as a service - Python libraries
ii  python-cinderclient                   1:1.0.3-1                          all          python bindings to the OpenStack Volume API

cinder packages missing from the 2013.1-1 distribution:

    cinder-backup
    cinder-clear-rabbit-queues
    cinder-rtstool
    cinder-volume-usage-audit

The way to check that you have everything is 1) see what packages are missing when comparing the new distribution with older releases, 2) compare corresponding package files in /usr/bin with the DevStack files installed by the script in /usr/local/bin, and 3) search for documented changes.

Regarding the missing cinder-rtstool, it was either renamed to rtstool, or removed, as indicated here.

Note: after corresponding with Thomas Goirand, it was a nice surprise to receive the first Grizzly package update coming in from the gplhost.com repo - cinder ver 2013.1-1 is now complete!

Same comment for glance configuration files in /etc/glance. Installed glance packages in Debian ver 2013.1-1:

# dpkg -l|grep glance
ii  glance                                2013.1-1                           all          OpenStack Image Service - metapackage
ii  glance-api                            2013.1-1                           all          OpenStack Image Service - API server
ii  glance-common                         2013.1-1                           all          OpenStack Image Service - common files
ii  glance-registry                       2013.1-1                           all          OpenStack Image Service - registry server
ii  python-glance                         2013.1-1                           all          OpenStack Image Service - Python client library
ii  python-glanceclient                   1:0.8.0-1                          all          Client library for Openstack glance server

Filed Debian Bug repport #704751 nova-consoleauth 2013.1-1 conflicts with nova-console 2013.1-1. Also filed Debian Bug report #704757 novnc 0.4+dfsg+1-6 conflicts with websockify 0.3.0-1.

In his response, Thomas Goirand (zigo) states that websockify is *not* in Debian yet (it is in the FTP master NEW queue), and he will fix the novnc package in the gplhost.com repository. Very good!

I will have to go through the config files and create permanent nova, cinder and glance configurations to keep on the system.

[PREV] Installing Debian Wheezy on a Dell XPS13 Ultrabook
[NEXT] Installing OpenNebula 4.0 on a Dell XPS13 Ultrabook running Debian sid

Cheers,

Mitch Halmu
NetSide Corporation
305-531-1995