BuildingOnEC2

I've been experimenting with building kernels on instances in the Amazon EC2 cloud. In most cases this isn't going to give better performance than building locally on a fast build server, it's an option if you don't have any fast hardware available.

This work was done during the Jaunty alpha releases. Note that a lot of these steps are documented as part of the regular kernel build procedure on the KernelMaintenanceStarter page.

Here's the basic recipe for how to do it:

Set up your Amazon account and sign up for the Ubuntu Beta

You'll need to set up an Amazon account and sign up for the Ubuntu beta testing, in order to get access to ubuntu images on EC2.

To do that, follow the instruction here:

https://help.ubuntu.com/community/EC2StartersGuide

Once you've done that make sure you can start, stop, and access instances as described.

About the EC2 Instances

The EC2 instance is started with storage mounted on /mnt. Since there isn't much storage space on the instance otehr than on this mount point, some of the steps below are done in order to link the 'normal' directories used for kernel builds to that mount point.

Since the instance storage is non-persistent, this example shows how to recreate the chroots used for building and the kernel git trees every time. For actual production use, these should be stored on Amazon persistent storage and mounted on the instance. Since I was only testing kernel build speed, I didn't bother.

How to build a kernel on the EC2 Instance

Create an Instance

The instance type I tested with is one of Amazon's "High-CPU" instances. It is described here

http://aws.amazon.com/ec2/,on this Amazon page

as "High-CPU Extra Large Instance 7 GB of memory, 20 EC2 Compute Units (8 virtual cores with 2.5 EC2 Compute Units each), 1690 GB of instance storage, 64-bit platform".

This instance currently costs $0.80/hour.

sconklin@XPS-1:~$ ec2-run-instances ami-a84aaec1 -k ec2-keypair -t c1.xlarge
RESERVATION     r-a0cb75c9      581779666099    default
INSTANCE        i-599c0b30      ami-a84aaec1                    pending ec2-keypair     0               c1.xlarge       2009-02-20T18:21:27+0000        us-east-1c      aki-d314f0ba    ari-d014f0b9    

sconklin@XPS-1:~$ ec2-describe-instances
RESERVATION     r-a0cb75c9      581779666099    default
INSTANCE        i-599c0b30      ami-a84aaec1    ec2-67-202-42-150.compute-1.amazonaws.com       domU-12-31-39-00-70-91.compute-1.internal       running ec2-keypair     0               c1.xlarge       2009-02-20T18:21:27+0000        us-east-1c      aki-d314f0ba    ari-d014f0b9    

ec2-describe-instances shows that the instance is started - the instance identifier is i-599c0b30 and the name used to access it is ec2-67-202-42-150.compute-1.amazonaws.com

ec2-authorize default -p 22 # This only has to be done once

Log in once as root and select the default configuration

sconklin@XPS-1:~$ ssh -i ./ec2-keypair.pem root@ec2-67-202-42-150.compute-1.amazonaws.com
Linux ubuntu 2.6.27-13-xen #1 SMP Sat Nov 8 23:30:17 UTC 2008 x86_64

The programs included with the Ubuntu system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Ubuntu comes with ABSOLUTELY NO WARRANTY, to the extent permitted by
applicable law.

To access official Ubuntu documentation, please visit:
http://help.ubuntu.com/

======================================================
CONFIGURATION OF YOUR UBUNTU EC2 IMAGE
======================================================
Your EC2 image is about to be finished to be set up.

------------------------------------------------------
New password for ubuntu account: abcd1234
Password changed.
Setting up ssh public keys for the ubuntu account.

------------------------------------------------------
Please select software that you wish to install:

------------------------------------------------------

We are now going to log you out of the root account.
To perform administrative tasks please use the ubuntu account
in combination with sudo using the password: abcd1234

======================================================

Connection to ec2-67-202-42-150.compute-1.amazonaws.com closed.

Make a note of the password supplied for the 'ubuntu' account. You'll need it for using sudo later.

Log in to the EC2 Instance

sconklin@XPS-1:~$ ssh -i ./ec2-keypair.pem ubuntu@ec2-67-202-42-150.compute-1.amazonaws.com

On the instance, perform the following:

ubuntu@ubuntu:~$ sudo mkdir -m 775 /mnt/chroots 
ubuntu@ubuntu:~$ sudo mkdir -m 755 /mnt/src
ubuntu@ubuntu:~$ sudo ln -s /mnt/chroots /var/chroots
ubuntu@ubuntu:~$ sudo mkdir /home/ubuntu/src
ubuntu@ubuntu:~$ sudo chown ubuntu:ubuntu /home/src
ubuntu@ubuntu:~$ sudo ln -s /mnt/src /home/ubuntu/src

ubuntu@ubuntu:~$ sudo apt-get install debootstrap schroot git-core

ubuntu@ubuntu:~$ cd src
ubuntu@ubuntu:~$ git clone git://kernel.ubuntu.com/ubuntu/kteam-tools.git

Next, edit one of the chroot scripts - find the 'binds=' line and add 'mnt' to the list

ubuntu@ubuntu:~$ vim kteam-tools/setup-chroots

This is an intrepid instance and we want to build jaunty, so we have to duplicate a tools directory:

ubuntu@ubuntu:~$ sudo cp /usr/share/debootstrap/scripts/intrepid /usr/share/debootstrap/scripts/jaunty

Now create the chroot to be used for building the jaunty kernel: When postfix asks you to pick a configuration you can just choose "no configuration".

ubuntu@ubuntu:~$ sudo kteam-tools/build-mkschroot --arch=i386 jaunty /var/chroots/jaunty-chroot  http://archive.ubuntu.com/ubuntu 

Now fetch the kernel source for jaunty

ubuntu@ubuntu:~$ git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6.git
ubuntu@ubuntu:~$ git clone --reference linux-2.6/ git://kernel.ubuntu.com/ubuntu/ubuntu-jaunty.git ubuntu-jaunty

Now change to the chroot and perform the build:

ubuntu@ubuntu:~$ schroot -c jaunty-i386
I: [jaunty-i386-88efd646-47f1-48a6-a0e3-0dbad5591aee chroot] Running login shell: ‘/bin/bash’
(jaunty-i386)ubuntu@ubuntu:~/src$ cd ubuntu-jaunty
(jaunty-i386)ubuntu@ubuntu:~/src$ export CONCURRENCY_LEVEL=8 # make sure the build uses eight compile threads
(jaunty-i386)ubuntu@ubuntu:~/src/ubuntu-jaunty$ fakeroot debian/rules binary-generic

And away you go!

When you are done, log out twice (once from the chroot, and once from the instance)

Terminate Your Instance When You Are Finished

When you are done, be sure to terminate you instance - you are being charged for it when it is running, whether you are using it or not.

When you terminate the image, everything you installed on it is lost.

sconklin@XPS-1:~$ ec2-describe-instances
RESERVATION     r-a0cb75c9      581779666099    default
INSTANCE        i-599c0b30      ami-a84aaec1    ec2-67-202-42-150.compute-1.amazonaws.com       domU-12-31-39-00-70-91.compute-1.internal       running ec2-keypair     0               c1.xlarge       2009-02-20T18:21:27+0000        us-east-1c      aki-d314f0ba    ari-d014f0b9    
sconklin@XPS-1:~$ ec2-terminate-instances i-599c0b30
INSTANCE        i-599c0b30      running shutting-down
sconklin@XPS-1:~$ ec2-terminate-instances i-599c0b30
INSTANCE        i-599c0b30      terminated      terminated
sconklin@XPS-1:~$ 

Results - build time comparison

Host

Number of cores

CONCURRENCY_LEVEL

Real

User

Sys

Dell XPS M1330

2

2

45m16

66m17

7m58

Amazon EC2

8

8

20m47

51m8

7m58

Amazon EC2

8

2

38m6

54m56

9m24

KernelTeam/BuildingOnEC2 (last edited 2010-02-13 14:52:17 by chasedouglas)