diff --git a/.gitignore b/.gitignore index 7964faa..22a7898 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ proto *~ +localrc diff --git a/build_lxc.sh b/build_lxc.sh index a13ca35..191c493 100755 --- a/build_lxc.sh +++ b/build_lxc.sh @@ -1,5 +1,16 @@ #!/usr/bin/env bash +# Sanity check +if [ "$EUID" -ne "0" ]; then + echo "This script must be run with root privileges." + exit 1 +fi + +# Warn users who aren't on natty +if ! grep -q natty /etc/lsb-release; then + echo "WARNING: this script has only been tested on natty" +fi + # Source params source ./stackrc @@ -23,18 +34,14 @@ STACKSH_PARAMS=${STACKSH_PARAMS:-} # Option to use the version of devstack on which we are currently working USE_CURRENT_DEVSTACK=${USE_CURRENT_DEVSTACK:-1} -# Warn users who aren't on natty -if ! grep -q natty /etc/lsb-release; then - echo "WARNING: this script has only been tested on natty" -fi # Install deps apt-get install -y lxc debootstrap # Install cgroup-bin from source, since the packaging is buggy and possibly incompatible with our setup if ! which cgdelete | grep -q cgdelete; then - apt-get install -y g++ bison flex libpam0g-dev - wget http://sourceforge.net/projects/libcg/files/libcgroup/v0.37.1/libcgroup-0.37.1.tar.bz2/download -O /tmp/libcgroup-0.37.1.tar.bz2 + apt-get install -y g++ bison flex libpam0g-dev make + wget http://sourceforge.net/projects/libcg/files/libcgroup/v0.37.1/libcgroup-0.37.1.tar.bz2/download -O /tmp/libcgroup-0.37.1.tar.bz2 cd /tmp && bunzip2 libcgroup-0.37.1.tar.bz2 && tar xfv libcgroup-0.37.1.tar cd libcgroup-0.37.1 ./configure @@ -75,17 +82,25 @@ function git_clone { fi } -# Warm the base image on first install +# Location of the base image directory CACHEDIR=/var/cache/lxc/natty/rootfs-amd64 -if [ ! -d $CACHEDIR ]; then + +# Provide option to do totally clean install +if [ "$CLEAR_LXC_CACHE" = "1" ]; then + rm -rf $CACHEDIR +fi + +# Warm the base image on first install +if [ ! -f $CACHEDIR/bootstrapped ]; then # by deleting the container, we force lxc-create to re-bootstrap (lxc is # lazy and doesn't do anything if a container already exists) lxc-destroy -n $CONTAINER # trigger the initial debootstrap lxc-create -n $CONTAINER -t natty -f $LXC_CONF chroot $CACHEDIR apt-get update - chroot $CACHEDIR apt-get install -y --force-yes `cat files/apts/* | cut -d\# -f1 | egrep -v "(rabbitmq|libvirt-bin|mysql-server)"` + chroot $CACHEDIR apt-get install -y --force-yes `cat files/apts/* | cut -d\# -f1 | egrep -v "(rabbitmq|libvirt-bin|mysql-server|munin-node)"` chroot $CACHEDIR pip install `cat files/pips/*` + touch $CACHEDIR/bootstrapped fi # Clean out code repos if directed to do so @@ -125,7 +140,7 @@ lxc-create -n $CONTAINER -t natty -f $LXC_CONF # Specify where our container rootfs lives ROOTFS=/var/lib/lxc/$CONTAINER/rootfs/ -# Create a stack user that is a member of the libvirtd group so that stack +# Create a stack user that is a member of the libvirtd group so that stack # is able to interact with libvirt. chroot $ROOTFS groupadd libvirtd chroot $ROOTFS useradd stack -s /bin/bash -d $DEST -G libvirtd @@ -133,7 +148,7 @@ chroot $ROOTFS useradd stack -s /bin/bash -d $DEST -G libvirtd # a simple password - pass echo stack:pass | chroot $ROOTFS chpasswd -# and has sudo ability (in the future this should be limited to only what +# and has sudo ability (in the future this should be limited to only what # stack requires) echo "stack ALL=(ALL) NOPASSWD: ALL" >> $ROOTFS/etc/sudoers @@ -145,7 +160,7 @@ cp -pR /lib/modules/`uname -r`/kernel/net $ROOTFS/lib/modules/`uname -r`/kernel/ # Gracefully cp only if source file/dir exists function cp_it { if [ -e $1 ] || [ -d $1 ]; then - cp -pr $1 $2 + cp -pRL $1 $2 fi } @@ -196,6 +211,9 @@ if [ ! -d "$DEST/devstack" ]; then git clone git://github.com/cloudbuilders/devstack.git $DEST/devstack fi cd $DEST/devstack && $STACKSH_PARAMS ./stack.sh > /$DEST/run.sh.log +echo >> /$DEST/run.sh.log +echo >> /$DEST/run.sh.log +echo "All done! Time to start clicking." >> /$DEST/run.sh.log EOF # Make the run.sh executable @@ -216,3 +234,20 @@ fi # Start our container lxc-start -d -n $CONTAINER + +# Done creating the container, let's tail the log +echo +echo "=============================================================" +echo " -- YAY! --" +echo "=============================================================" +echo +echo "We're done creating the container, about to start tailing the" +echo "stack.sh log. It will take a second or two to start." +echo +echo "Just CTRL-C at any time to stop tailing." + +while [ ! -e "$ROOTFS/$DEST/run.sh.log" ]; do + sleep 1 +done + +tail -F $ROOTFS/$DEST/run.sh.log diff --git a/build_pxe_ramdisk.sh b/build_pxe_ramdisk.sh index 0f598f8..648fc3b 100755 --- a/build_pxe_ramdisk.sh +++ b/build_pxe_ramdisk.sh @@ -14,7 +14,7 @@ if [ ! -d natty-base ]; then debootstrap natty natty-base # copy kernel modules... # NOTE(ja): is there a better way to do this? - cp -pr /lib/modules/`uname -r` proto/lib/modules + cp -pr /lib/modules/`uname -r` natty-base/lib/modules cp files/sources.list natty-base/etc/apt/sources.list chroot natty-base apt-get update fi @@ -89,8 +89,8 @@ BASE=build.$$ IMG=$BASE.img MNT=$BASE/ -# create a 2GB blank filesystem -dd if=/dev/zero of=$IMG bs=1024k count=2048 +# (quickly) create a 2GB blank filesystem +dd bs=1 count=1 seek=$((2*1024*1024*1024)) if=/dev/zero of=$IMG # force it to be initialized as ext2 mkfs.ext2 -F $IMG diff --git a/lxc_network_hostonlyplusnat.sh b/lxc_network_hostonlyplusnat.sh new file mode 100755 index 0000000..4e29ed7 --- /dev/null +++ b/lxc_network_hostonlyplusnat.sh @@ -0,0 +1,93 @@ +#!/bin/bash + +# Print some usage info +function usage { + echo "Usage: $0 [OPTION] [host_ip]" + echo "Set up temporary networking for LXC" + echo "" + echo " -n, --dry-run Just print the commands that would execute." + echo " -h, --help Print this usage message." + echo "" + exit +} + +# Allow passing the ip address on the command line. +function process_option { + case "$1" in + -h|--help) usage;; + -n|--dry-run) dry_run=1;; + *) host_ip="$1" + esac +} + +# Set up some defaults +host_ip= +dry_run=0 +bridge=br0 +DRIER= + +# Process the args +for arg in "$@"; do + process_option $arg +done + +if [ $dry_run ]; then + DRIER=echo +fi + +if [ "$UID" -ne "0" ]; then + echo "This script must be run with root privileges." + exit 1 +fi + +# Check for bridge-utils. +BRCTL=`which brctl` +if [ ! -x "$BRCTL" ]; then + echo "This script requires you to install bridge-utils." + echo "Try: sudo apt-get install bridge-utils." + exit 1 +fi + +# Scare off the nubs. +echo "=====================================================" +echo +echo "WARNING" +echo +echo "This script will modify your current network setup," +echo "this can be a scary thing and it is recommended that" +echo "you have something equivalent to physical access to" +echo "this machine before continuing in case your network" +echo "gets all funky." +echo +echo "If you don't want to continue, hit CTRL-C now." + +if [ -z "$host_ip" ]; +then + echo "Otherwise, please type in your host's ip address and" + echo "hit enter." + echo + echo "=====================================================" + read host_ip +else + echo "Otherwise hit enter." + echo + echo "=====================================================" + read accept +fi + + +# Add a bridge interface, this will choke if there is already +# a bridge named $bridge +$DRIER $BRCTL addbr $bridge +$DRIER ip addr add 192.168.1.1/24 dev $bridge +if [ $dry_run ]; then + echo "echo 1 > /proc/sys/net/ipv4/ip_forward" +else + echo 1 > /proc/sys/net/ipv4/ip_forward +fi +$DRIER ifconfig $bridge up + +# Set up the NAT for the instances +$DRIER iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -j SNAT --to-source $host_ip +$DRIER iptables -I FORWARD -s 192.168.1.0/24 -j ACCEPT + diff --git a/stack.sh b/stack.sh index f21b371..4daa95d 100755 --- a/stack.sh +++ b/stack.sh @@ -13,6 +13,9 @@ # Sanity Check # ============ +# Start our timer +START_TIME=`python -c "import time; print time.time()"` + # Warn users who aren't on natty, but allow them to override check and attempt # installation with ``FORCE=yes ./stack`` if ! grep -q natty /etc/lsb-release; then @@ -37,6 +40,15 @@ if [ ! -d $FILES ]; then exit 1 fi +# you need to run this as a regular user with sudo priviledges +if [[ $EUID -eq 0 ]]; then + echo "This script cannot be run as root." 1>&2 + echo "You should run this script as the user you wish openstack to run as" 1>&2 + echo "The user will need to be a sudoer (without password)" 1>&2 + exit 1 +fi + + # Settings # ======== @@ -48,6 +60,11 @@ fi # # You can also pass options on a single line ``MYSQL_PASS=simple ./stack.sh`` # +# Additionally, you can put any local variables into a ``localrc`` file, like:: +# +# MYSQL_PASS=anothersecret +# MYSQL_USER=hellaroot +# # We try to have sensible defaults, so you should be able to run ``./stack.sh`` # in most cases. @@ -377,7 +394,7 @@ if [[ "$ENABLED_SERVICES" =~ "mysql" ]]; then $NOVA_DIR/bin/nova-manage db sync # create a small network - $NOVA_DIR/bin/nova-manage network create private $FIXED_RANGE 1 $FIXED_NETWORK_SIZE + $NOVA_DIR/bin/nova-manage network create private $FIXED_RANGE 1 $FIXED_NETWORK_SIZE # create some floating ips $NOVA_DIR/bin/nova-manage floating create $FLOATING_RANGE @@ -500,3 +517,11 @@ if [[ "$ENABLED_SERVICES" =~ "key" ]]; then echo "keystone is serving at http://$HOST_IP:5000/v2.0/" echo "examples on using novaclient command line is in exercise.sh" fi + +# Summary +# ======= + +# End our timer and give a timing summary +END_TIME=`python -c "import time; print time.time()"` +ELAPSED=`python -c "print $END_TIME - $START_TIME"` +echo "stack.sh completed in $ELAPSED seconds." diff --git a/stackrc b/stackrc index 2d265d3..deb467b 100644 --- a/stackrc +++ b/stackrc @@ -1,6 +1,6 @@ # compute service -NOVA_REPO=https://github.com/openstack/nova.git -NOVA_BRANCH=2011.3 +NOVA_REPO=https://github.com/cloudbuilders/nova.git +NOVA_BRANCH=diablo # image catalog service GLANCE_REPO=https://github.com/cloudbuilders/glance.git @@ -34,3 +34,8 @@ OPENSTACKX_BRANCH=diablo # openstack-munin is a collection of munin plugins for monitoring the stack MUNIN_REPO=https://github.com/cloudbuilders/openstack-munin.git MUNIN_BRANCH=master + +# allow local overrides of env variables +if [ -f ./localrc ]; then + source ./localrc +fi