Diff for "Running/LXC"

Not logged in - Log In / Register

Differences between revisions 99 and 112 (spanning 13 versions)
Revision 99 as of 2012-05-15 13:45:43
Size: 5717
Editor: vila
Comment:
Revision 112 as of 2017-09-22 08:30:24
Size: 4165
Editor: cjwatson
Comment: production is on 16.04 now
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 an LXC container. 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; the core Launchpad team and CI infrastructure all use LXC extensively. If your setup permits it, you should use [[Running/LXD]] instead, which is the recommended setup and what most developers currently use.
Line 7: Line 7:
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. These instructions should work Ubuntu 14.04 LTS or later, and with some adaptation on any Linux distribution that uses LXC 1.0.0 or later. Older versions of LXC are significantly less reliable and polished, so we recommend upgrading to 14.04 LTS and removing `/var/cache/lxc` to ensure a clean, working start.
Line 16: Line 16:
 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`.  1. Create a container. You can use an HTTP proxy or alternate Ubuntu mirror by specifying an http_proxy or MIRROR environment variable after `sudo`. (amd64 works fine too, although it will use more RAM.)
Line 18: Line 18:
sudo lxc-create -t ubuntu -n lpdev -- -r lucid -a i386 -b $USER sudo lxc-create -t ubuntu -n lpdev -- -r xenial -a i386 -b $USER
Line 21: Line 21:
 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]''' Get the container's IP address from the console. You'll generally want to `ssh` in for convenience and better termcap functionality, and the default Ubuntu LXC dnsmasq setup doesn't provide name resolution from the host
 {{{
ip addr show dev eth0 | grep 'inet'
}}}

 1. '''[Inside the container]''' Install some additional packages needed before running `rocketfuel-setup` and the rest of the Launchpad setup process. The language pack is mandatory and must match your configured locale, or [[#postgresql-locale-breakage|PostgreSQL will break]].
 {{{
sudo apt-get install bzr language-pack-en
}}}

 1. '''[Inside the container]''' Shut down by running `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` on the host.
 
 1. Start it up again, headless this time (`-d`). The same IP address will be used, so you don't need console access.
 1. Start the container in the background.
Line 45: Line 26:
 1. `ssh <IP address obtained above>` to connect to the VM. 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. `ssh -A` might give you a better agent experience when dealing with Launchpad code hosting.  1. Find its IP address.
 {{{
sudo lxc-ls --fancy
}}}
    
 1.
`ssh -A IP_ADDRESS_FROM_LXC_LS` to connect to the container. Your username and password will match your account on the host system. 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.
Line 47: Line 33:
 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. '''[Inside the container]''' Install Bazaar so you can run `rocketfuel-setup`.
 {{{
 sudo apt-get install bzr
}}}

 1. '''[Inside the container]'''
You can now follow the normal [[Running|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.
Line 51: Line 42:
== Assigning a static IP to the container ==
Line 52: Line 44:
= Problems = If you would like to assign a static IP to the container via dhcp:

  1. In `/etc/default/lxc-net` ensure the following lines are uncommented:
  {{{
LXC_DHCP_CONFILE=/etc/lxc/dnsmasq.conf
LXC_DOMAIN="lxc"
}}}
  2. Create `/etc/lxc/dnsmasq.conf` and add the following line (change IP to suit):
  {{{
dhcp-host=lpdev,10.0.3.210
}}}
  3. Stop '''all''' lxc containers (lxc-net may not correctly restart if any containers are running):
  {{{
sudo lxc-stop --name lpdev
}}}
  4. Run `sudo service lxc-net restart` and start the container.

The lpdev container should restart with the specified IP.

Alternatively, a static IP can be configured directly in the container from `/var/lib/lxc/lpdev/rootfs/etc/network/interfaces`.

= Troubleshooting =
Line 61: Line 74:
You will know you need to do this if bzr or apt commands have been
spewing locale warnings.
Modern LXC container templates do this automatically, but you will know
you need to do it manually if bzr or apt commands have been spewing locale
warnings.
Line 71: Line 85:
you'll need to run `sudo pg_createcluster 8.4 main` afterwards to fix you'll need to run `sudo pg_createcluster 9.3 main` afterwards to fix
Line 73: Line 87:

== rabbitmq does not start up ==

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
}}}

== lxc-start hangs ==

[[http://paste.ubuntu.com/772517/|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 [[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; the core Launchpad team and CI infrastructure all use LXC extensively. If your setup permits it, you should use Running/LXD instead, which is the recommended setup and what most developers currently use.

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 Ubuntu 14.04 LTS or later, and with some adaptation on any Linux distribution that uses LXC 1.0.0 or later. Older versions of LXC are significantly less reliable and polished, so we recommend upgrading to 14.04 LTS and removing /var/cache/lxc to ensure a clean, working start.

Create an LXC container

  1. Install LXC's userspace tools.
    sudo apt-get install lxc
  2. Create a container. You can use an HTTP proxy or alternate Ubuntu mirror by specifying an http_proxy or MIRROR environment variable after sudo. (amd64 works fine too, although it will use more RAM.)

    sudo lxc-create -t ubuntu -n lpdev -- -r xenial -a i386 -b $USER
  3. Start the container in the background.
    sudo lxc-start -n lpdev -d
  4. Find its IP address.
    sudo lxc-ls --fancy
  5. ssh -A IP_ADDRESS_FROM_LXC_LS to connect to the container. Your username and password will match your account on the host system. 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.

  6. [Inside the container] Install Bazaar so you can run rocketfuel-setup.

     sudo apt-get install bzr
  7. [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.

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

Assigning a static IP to the container

If you would like to assign a static IP to the container via dhcp:

  1. In /etc/default/lxc-net ensure the following lines are uncommented:

    LXC_DHCP_CONFILE=/etc/lxc/dnsmasq.conf
    LXC_DOMAIN="lxc"
  2. Create /etc/lxc/dnsmasq.conf and add the following line (change IP to suit):

    dhcp-host=lpdev,10.0.3.210
  3. Stop all lxc containers (lxc-net may not correctly restart if any containers are running):

    sudo lxc-stop --name lpdev
  4. Run sudo service lxc-net restart and start the container.

The lpdev container should restart with the specified IP.

Alternatively, a static IP can be configured directly in the container from /var/lib/lxc/lpdev/rootfs/etc/network/interfaces.

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.

Modern LXC container templates do this automatically, but you will know you need to do it manually 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 9.3 main afterwards to fix the damage.

Running/LXC (last edited 2017-09-22 08:30:24 by cjwatson)