Diff for "Running/LXC"

Not logged in - Log In / Register

Differences between revisions 6 and 105 (spanning 99 versions)
Revision 6 as of 2010-08-09 07:18:18
Size: 2070
Editor: mbp
Comment: better vm-builder invocation that installs launchpad dependencies too?
Revision 105 as of 2014-04-29 12:02:57
Size: 5600
Editor: cjwatson
Comment: back to i386 and add a note
Deletions are marked like this. Additions are marked like this.
Line 1: Line 1:
This page explains how to set up and run Launchpad (for development) inside a VM. This page explains how to set up and run Launchpad (for development) inside an LXC container. LXC is the recommended environment for doing Launchpad development in. We are currently transitioning to using LXC for our Continuous Integration setup.
Line 5: Line 5:
Launchpad development setup makes numerous changes to your machine; its nice to be unaffected by those except when you are actually doing such development. Launchpad development setup makes significant changes to your machine; it's nice to be unaffected by those when you're not doing such development. Also, multiple containers can be used to work around Launchpad's limitations regarding concurrent test runs on a single machine.
Line 7: Line 7:
Also, launchpad has limitations on concurrent testing per-machine and so forth - multiple VM's can be used to work around this. These instructions should work on Ubuntu 12.04 LTS and later. Older versions of LXC are significantly less reliable and polished, so if you've used a version of LXC older than 12.04 LTS's final release on your development machine, you'll want to remove `/var/cache/lxc` first to ensure that you don't have a broken cache.

= Create an LXC container =

 1. Install LXC's userspace tools.
 {{{
sudo apt-get install lxc
}}}

 1. Create a container. You might want to use an HTTP proxy or alternate Ubuntu mirror; you can do this by specifying an http_proxy or MIRROR environment variable after `sudo`. (You can use amd64 if you prefer, although it will use more RAM.)
 {{{
sudo lxc-create -t ubuntu -n lpdev -- -r precise -a i386 -b $USER
}}}

 1. Start the container. You'll probably see a few early warnings about boot processes dying -- they're normal and can be ignored as long as you end up at a login prompt.
 {{{
sudo lxc-start -n lpdev
}}}
    
 1. '''[Inside the container]''' Log in with your normal username and password. You'll have full sudo powers.

 1. '''[Inside the container]''' Install various packages needed to be able to connect easily (avahi-daemon) and run `rocketfuel-setup` [[#postgresql-locale-breakage|successfully]].
 {{{
 sudo apt-get install avahi-daemon bzr language-pack-en
}}}

 1. '''[Inside the container]''' Shut down by running `sudo poweroff` inside the container, and you should eventually be dumped back out to your host system. If it looks like it's hanging, force it to stop with `sudo lxc-stop -n lpdev` from outside the container.
 
 1. Start it up again, headless this time (`-d`). The same IP address will be used, so you don't need console access.
 {{{
sudo lxc-start -n lpdev -d
}}}

 1. `ssh -A lpdev.local` to connect to the container. If your SSH key is in your local `authorized_keys` file you shouldn't be prompted for a password, as your home directory (including public and private keys) is bind mounted into the container. The `-A` permits you to access Launchpad code hosting from within the container without needing to reenter passphrases.

 1. '''[Inside the container]''' You can now follow the normal [[Getting|LP installation instructions]]. Be warned that changes in your home directory will also be seen outside the container and vice versa. If your home directory already has a Launchpad work area set up you'll want to run `rocketfuel-setup --no-workspace` to avoid trying to recreate it, but all subsequent steps are still required.

 1. Follow [[Running/RemoteAccess]] to set up access from the host's applications to the container's Launchpad instance.
Line 10: Line 47:
= Make a VM image = = Troubleshooting =
Line 12: Line 49:
 1. Install KVM <<Anchor(postgresql-locale-breakage)>>
== launchpad-database-setup fails ==

PostgreSQL will fail to create a cluster during installation if your
locale is configured to something non-C but not supported by the
container, so you need to install the relevant language pack.

You will know you need to do this if bzr or apt commands have been
spewing locale warnings.

For instance, if your computer has a localised English locale, use this:
Line 15: Line 62:
% sudo apt-get install virt-manager apt-get install language-pack-en
Line 18: Line 65:
 1. Download the Lucid server ISO If you didn't install the language pack before running rocketfuel-setup,
you'll need to run `sudo pg_createcluster 8.4 main` afterwards to fix
the damage.
Line 20: Line 69:
 1. Run virt-manager. == rabbitmq does not start up ==
Line 22: Line 71:
 1. Double click on localhost(QEMU) rabbitmq may fail to start up. If that happens it appears to be a [[http://lists.rabbitmq.com/pipermail/rabbitmq-discuss/2010-April/007024.html|mnesia glitch]] best sorted by zapping mnesia.
 {{{
sudo rm -rf /var/lib/rabbitmq/mnesia/rabbit/*
sudo service rabbit-mq start
}}}
Line 24: Line 77:
 1. click on the New virtual machine icon == lxc-start hangs ==
Line 26: Line 79:
 1. follow your nose here, using the ISO as the install media, and allocating no less than 2G of disk and 1G of memory. I suggest 4G if you can spare it. [[http://paste.ubuntu.com/772517/|The symptom looks like this]]. It hangs after that.
Line 28: Line 81:
 1. After its installed, connect to the image and install {{{acpid}}} and {{{openssh-server}}} No fix or workaround identified yet, other than making a new lxc container.
Line 30: Line 83:
 1. Use ssh-copy-id to copy your public key into the VM. To debug, try '''{{{lxc-start -n $containername -l debug -o outout}}}''' and look at output.
Line 32: Line 85:
 1. ssh -A <vm IP address> to connect to the VM. == DNS fails inside the container ==
Line 34: Line 87:
 1. {{{bzr whoami "Your Name <your.email@example.com>"}}} to set your bzr identity in the VM. After restarting in daemon mode and logging in as a regular user, DNS was not working.
Ensure there is a nameserver in the container's /etc/resolv.conf, which is created at startup by resolverconf. Stopping and starting the container solved the problem.
Line 36: Line 90:
 1. You can now follow the [[Getting|getting-started]] on LP instructions. == Random flakiness ==

Using lxc via juju I ran into all sorts of problems with DNS, version mismatches, etc. Since it was via juju I wasn't able to muck around with /etc/resolv.conf (the damage was done before I got the chance to ssh to the guest.) I found {{{sudo rm -rf /var/cache/lxc}}} solved the problem. It is rather brutal but worked. Of course the next run took a long time as all of that previously cached stuff had to be refetched.

== Other problems ==

If other lxc users don't have an idea (known lxc users as of this writing include lifeless, wgrant, frankban and gary_poster) try asking hallyn or Spamaps on #ubuntu-server on freenode.
Line 40: Line 100:
See also this email thread about [[https://lists.launchpad.net/launchpad-dev/msg03456.html|running Launchpad in a virtual machine]], and this [[https://lists.launchpad.net/launchpad-dev/msg03454.html|discussion of the differences]] between running in a [[Running/Schroot|chroot]] environment and running a VM.
Line 44: Line 103:
You can skip some manual steps of installing from an ISO using a command like this:

{{{
sudo ubuntu-vm-builder kvm lucid --domain vm --dest ~/vm/lp-dev --hostname lp-dev --mem 2048 --cpus 3 --components main,universe,multiverse,restricted --mirror http://10.113.3.35:3142/mirror.internode.on.net/pub/ubuntu/ubuntu --libvirt qemu:///system --debug -v --ppa launchpad/ppa --ppa bzr/ppa --ssh-user-key ~/.ssh/id_rsa.pub --ssh-key ~/.ssh/id_rsa.pub --user $USER
}}}

After installation completes, it should show up in your virt-manager menu.
You can also run in a [[Running/Schroot|chroot]] environment or a [[Running/VirtualMachine|VM]].

This page explains how to set up and run Launchpad (for development) inside an LXC container. LXC is the recommended environment for doing Launchpad development in. We are currently transitioning to using LXC for our Continuous Integration setup.

Why?

Launchpad development setup makes significant changes to your machine; it's nice to be unaffected by those when you're not doing such development. Also, multiple containers can be used to work around Launchpad's limitations regarding concurrent test runs on a single machine.

These instructions should work on Ubuntu 12.04 LTS and later. Older versions of LXC are significantly less reliable and polished, so if you've used a version of LXC older than 12.04 LTS's final release on your development machine, you'll want to remove /var/cache/lxc first to ensure that you don't have a broken cache.

Create an LXC container

  1. Install LXC's userspace tools.
    sudo apt-get install lxc
  2. Create a container. You might want to use an HTTP proxy or alternate Ubuntu mirror; you can do this by specifying an http_proxy or MIRROR environment variable after sudo. (You can use amd64 if you prefer, although it will use more RAM.)

    sudo lxc-create -t ubuntu -n lpdev -- -r precise -a i386 -b $USER
  3. Start the container. You'll probably see a few early warnings about boot processes dying -- they're normal and can be ignored as long as you end up at a login prompt.
    sudo lxc-start -n lpdev
  4. [Inside the container] Log in with your normal username and password. You'll have full sudo powers.

  5. [Inside the container] Install various packages needed to be able to connect easily (avahi-daemon) and run rocketfuel-setup successfully.

     sudo apt-get install avahi-daemon bzr language-pack-en
  6. [Inside the container] Shut down by running sudo poweroff inside the container, and you should eventually be dumped back out to your host system. If it looks like it's hanging, force it to stop with sudo lxc-stop -n lpdev from outside the container.

  7. Start it up again, headless this time (-d). The same IP address will be used, so you don't need console access.

    sudo lxc-start -n lpdev -d
  8. ssh -A lpdev.local to connect to the container. If your SSH key is in your local authorized_keys file you shouldn't be prompted for a password, as your home directory (including public and private keys) is bind mounted into the container. The -A permits you to access Launchpad code hosting from within the container without needing to reenter passphrases.

  9. [Inside the container] You can now follow the normal LP installation instructions. Be warned that changes in your home directory will also be seen outside the container and vice versa. If your home directory already has a Launchpad work area set up you'll want to run rocketfuel-setup --no-workspace to avoid trying to recreate it, but all subsequent steps are still required.

  10. Follow Running/RemoteAccess to set up access from the host's applications to the container's Launchpad instance.

Troubleshooting

launchpad-database-setup fails

PostgreSQL will fail to create a cluster during installation if your locale is configured to something non-C but not supported by the container, so you need to install the relevant language pack.

You will know you need to do this if bzr or apt commands have been spewing locale warnings.

For instance, if your computer has a localised English locale, use this:

apt-get install language-pack-en

If you didn't install the language pack before running rocketfuel-setup, you'll need to run sudo pg_createcluster 8.4 main afterwards to fix the damage.

rabbitmq does not start up

rabbitmq may fail to start up. If that happens it appears to be a mnesia glitch best sorted by zapping mnesia.

  • sudo rm -rf /var/lib/rabbitmq/mnesia/rabbit/*
    sudo service rabbit-mq start

lxc-start hangs

The symptom looks like this. It hangs after that.

No fix or workaround identified yet, other than making a new lxc container.

To debug, try lxc-start -n $containername -l debug -o outout and look at output.

DNS fails inside the container

After restarting in daemon mode and logging in as a regular user, DNS was not working. Ensure there is a nameserver in the container's /etc/resolv.conf, which is created at startup by resolverconf. Stopping and starting the container solved the problem.

Random flakiness

Using lxc via juju I ran into all sorts of problems with DNS, version mismatches, etc. Since it was via juju I wasn't able to muck around with /etc/resolv.conf (the damage was done before I got the chance to ssh to the guest.) I found sudo rm -rf /var/cache/lxc solved the problem. It is rather brutal but worked. Of course the next run took a long time as all of that previously cached stuff had to be refetched.

Other problems

If other lxc users don't have an idea (known lxc users as of this writing include lifeless, wgrant, frankban and gary_poster) try asking hallyn or Spamaps on #ubuntu-server on freenode.

References

Alternatively

You can also run in a chroot environment or a VM.