| 1 | 1 |
new file mode 100755 |
| ... | ... |
@@ -0,0 +1,115 @@ |
| 0 |
+#!/bin/bash -e |
|
| 1 |
+# build_pxe_boot.sh - Create a PXE boot environment |
|
| 2 |
+# |
|
| 3 |
+# build_pxe_boot.sh [-k kernel-version] destdir |
|
| 4 |
+# |
|
| 5 |
+# Assumes syslinux is installed |
|
| 6 |
+# Assumes devstack files are in `pwd`/pxe |
|
| 7 |
+# Only needs to run as root if the destdir permissions require it |
|
| 8 |
+ |
|
| 9 |
+UBUNTU_MIRROR=http://archive.ubuntu.com/ubuntu/dists/natty/main/installer-amd64/current/images/netboot/ubuntu-installer/amd64 |
|
| 10 |
+ |
|
| 11 |
+MEMTEST_VER=4.10 |
|
| 12 |
+MEMTEST_BIN=memtest86+-${MEMTEST_VER}.bin
|
|
| 13 |
+MEMTEST_URL=http://www.memtest.org/download/${MEMTEST_VER}/
|
|
| 14 |
+ |
|
| 15 |
+KVER=`uname -r` |
|
| 16 |
+if [ "$1" = "-k" ]; then |
|
| 17 |
+ KVER=$2 |
|
| 18 |
+ shift;shift |
|
| 19 |
+fi |
|
| 20 |
+ |
|
| 21 |
+DEST_DIR=${1:-/tmp}/tftpboot
|
|
| 22 |
+OPWD=`pwd` |
|
| 23 |
+PROGDIR=`dirname $0` |
|
| 24 |
+ |
|
| 25 |
+mkdir -p $DEST_DIR/pxelinux.cfg |
|
| 26 |
+cd $DEST_DIR |
|
| 27 |
+for i in memdisk menu.c32 pxelinux.0; do |
|
| 28 |
+ cp -p /usr/lib/syslinux/$i $DEST_DIR |
|
| 29 |
+done |
|
| 30 |
+ |
|
| 31 |
+DEFAULT=$DEST_DIR/pxelinux.cfg/default |
|
| 32 |
+cat >$DEFAULT <<EOF |
|
| 33 |
+default menu.c32 |
|
| 34 |
+prompt 0 |
|
| 35 |
+timeout 0 |
|
| 36 |
+ |
|
| 37 |
+MENU TITLE PXE Boot Menu |
|
| 38 |
+ |
|
| 39 |
+EOF |
|
| 40 |
+ |
|
| 41 |
+# Setup devstack boot |
|
| 42 |
+mkdir -p $DEST_DIR/ubuntu |
|
| 43 |
+if [ ! -d $OPWD/pxe ]; then |
|
| 44 |
+ mkdir -p $OPWD/pxe |
|
| 45 |
+fi |
|
| 46 |
+if [ ! -r $OPWD/pxe/vmlinuz-${KVER} ]; then
|
|
| 47 |
+ sudo chmod 644 /boot/vmlinuz-${KVER}
|
|
| 48 |
+ if [ ! -r /boot/vmlinuz-${KVER} ]; then
|
|
| 49 |
+ echo "No kernel found" |
|
| 50 |
+ else |
|
| 51 |
+ cp -p /boot/vmlinuz-${KVER} $OPWD/pxe
|
|
| 52 |
+ fi |
|
| 53 |
+fi |
|
| 54 |
+cp -p $OPWD/pxe/vmlinuz-${KVER} $DEST_DIR/ubuntu
|
|
| 55 |
+if [ ! -r $OPWD/pxe/stack-initrd.gz ]; then |
|
| 56 |
+ cd $OPWD |
|
| 57 |
+ sudo $PROGDIR/build_pxe_ramdisk.sh $OPWD/pxe/stack-initrd.gz |
|
| 58 |
+fi |
|
| 59 |
+cp -p $OPWD/pxe/stack-initrd.gz $DEST_DIR/ubuntu |
|
| 60 |
+cat >>$DEFAULT <<EOF |
|
| 61 |
+ |
|
| 62 |
+LABEL devstack |
|
| 63 |
+ MENU LABEL ^devstack |
|
| 64 |
+ MENU DEFAULT |
|
| 65 |
+ KERNEL ubuntu/vmlinuz-$KVER |
|
| 66 |
+ APPEND initrd=ubuntu/stack-initrd.gz ramdisk_size=2109600 root=/dev/ram0 |
|
| 67 |
+EOF |
|
| 68 |
+ |
|
| 69 |
+# Get Ubuntu |
|
| 70 |
+if [ -d $OPWD/pxe ]; then |
|
| 71 |
+ cp -p $OPWD/pxe/natty-base-initrd.gz $DEST_DIR/ubuntu |
|
| 72 |
+fi |
|
| 73 |
+cat >>$DEFAULT <<EOF |
|
| 74 |
+ |
|
| 75 |
+LABEL ubuntu |
|
| 76 |
+ MENU LABEL ^Ubuntu Natty |
|
| 77 |
+ KERNEL ubuntu/vmlinuz-$KVER |
|
| 78 |
+ APPEND initrd=ubuntu/natty-base-initrd.gz ramdisk_size=419600 root=/dev/ram0 |
|
| 79 |
+EOF |
|
| 80 |
+ |
|
| 81 |
+# Get Memtest |
|
| 82 |
+cd $DEST_DIR |
|
| 83 |
+if [ ! -r $MEMTEST_BIN ]; then |
|
| 84 |
+ wget -N --quiet ${MEMTEST_URL}/${MEMTEST_BIN}.gz
|
|
| 85 |
+ gunzip $MEMTEST_BIN |
|
| 86 |
+fi |
|
| 87 |
+cat >>$DEFAULT <<EOF |
|
| 88 |
+ |
|
| 89 |
+LABEL memtest |
|
| 90 |
+ MENU LABEL ^Memtest86+ |
|
| 91 |
+ KERNEL $MEMTEST_BIN |
|
| 92 |
+EOF |
|
| 93 |
+ |
|
| 94 |
+# Get FreeDOS |
|
| 95 |
+mkdir -p $DEST_DIR/freedos |
|
| 96 |
+cd $DEST_DIR/freedos |
|
| 97 |
+wget -N --quiet http://www.fdos.org/bootdisks/autogen/FDSTD.288.gz |
|
| 98 |
+gunzip -f FDSTD.288.gz |
|
| 99 |
+cat >>$DEFAULT <<EOF |
|
| 100 |
+ |
|
| 101 |
+LABEL freedos |
|
| 102 |
+ MENU LABEL ^FreeDOS bootdisk |
|
| 103 |
+ KERNEL memdisk |
|
| 104 |
+ APPEND initrd=freedos/FDSTD.288 |
|
| 105 |
+EOF |
|
| 106 |
+ |
|
| 107 |
+# Local disk boot |
|
| 108 |
+cat >>$DEFAULT <<EOF |
|
| 109 |
+ |
|
| 110 |
+LABEL local |
|
| 111 |
+ MENU LABEL ^Local disk |
|
| 112 |
+ MENU DEFAULT |
|
| 113 |
+ LOCALBOOT 0 |
|
| 114 |
+EOF |
| ... | ... |
@@ -6,17 +6,19 @@ if [ ! "$#" -eq "1" ]; then |
| 6 | 6 |
exit 1 |
| 7 | 7 |
fi |
| 8 | 8 |
|
| 9 |
+PROGDIR=`dirname $0` |
|
| 10 |
+ |
|
| 9 | 11 |
# Source params |
| 10 | 12 |
source ./stackrc |
| 11 | 13 |
|
| 12 | 14 |
# clean install of natty |
| 13 | 15 |
if [ ! -d natty-base ]; then |
| 14 |
- debootstrap natty natty-base |
|
| 16 |
+ $PROGDIR/make_image.sh -C natty natty-base |
|
| 15 | 17 |
# copy kernel modules... |
| 16 | 18 |
# NOTE(ja): is there a better way to do this? |
| 17 | 19 |
cp -pr /lib/modules/`uname -r` natty-base/lib/modules |
| 18 |
- cp files/sources.list natty-base/etc/apt/sources.list |
|
| 19 |
- chroot natty-base apt-get update |
|
| 20 |
+ # a simple password - pass |
|
| 21 |
+ echo root:pass | chroot natty-base chpasswd |
|
| 20 | 22 |
fi |
| 21 | 23 |
|
| 22 | 24 |
# prime natty with as many apt/pips as we can |
| ... | ... |
@@ -1,27 +1,40 @@ |
| 1 | 1 |
#!/bin/bash |
| 2 | 2 |
# make_image.sh - Create Ubuntu images in various formats |
| 3 | 3 |
# |
| 4 |
-# make_image.sh release format |
|
| 5 |
-# |
|
| 6 | 4 |
# Supported formats: qcow (kvm), vmdk (vmserver), vdi (vbox), vhd (vpc), raw |
| 7 | 5 |
# |
| 8 | 6 |
# Requires sudo to root |
| 9 | 7 |
|
| 10 | 8 |
ROOTSIZE=${ROOTSIZE:-8192}
|
| 11 | 9 |
SWAPSIZE=${SWAPSIZE:-1024}
|
| 10 |
+MIN_PKGS=${MIN_PKGS:-"apt-utils gpgv openssh-server"}
|
|
| 12 | 11 |
|
| 13 | 12 |
usage() {
|
| 14 |
- echo "$0 - Create Ubuntu images" |
|
| 13 |
+ echo "Usage: $0 - Create Ubuntu images" |
|
| 14 |
+ echo "" |
|
| 15 |
+ echo "$0 [-m] [-r rootsize] [-s swapsize] release format" |
|
| 16 |
+ echo "$0 -C [-m] release chrootdir" |
|
| 17 |
+ echo "$0 -I [-r rootsize] [-s swapsize] chrootdir format" |
|
| 15 | 18 |
echo "" |
| 16 |
- echo "$0 [-r rootsize] [-s swapsize] release format" |
|
| 19 |
+ echo "-C - Create the initial chroot dir" |
|
| 20 |
+ echo "-I - Create the final image from a chroot" |
|
| 21 |
+ echo "-m - minimal installation" |
|
| 22 |
+ echo "-r size - root fs size in MB" |
|
| 23 |
+ echo "-s size - swap fs size in MB" |
|
| 24 |
+ echo "release - Ubuntu release: jaunty - oneric" |
|
| 25 |
+ echo "format - image format: qcow2, vmdk, vdi, vhd, xen, raw, fs" |
|
| 17 | 26 |
exit 1 |
| 18 | 27 |
} |
| 19 | 28 |
|
| 20 |
-while getopts hm:r:s: c; do |
|
| 29 |
+while getopts CIhmr:s: c; do |
|
| 21 | 30 |
case $c in |
| 31 |
+ C) CHROOTONLY=1 |
|
| 32 |
+ ;; |
|
| 33 |
+ I) IMAGEONLY=1 |
|
| 34 |
+ ;; |
|
| 22 | 35 |
h) usage |
| 23 | 36 |
;; |
| 24 |
- m) MIRROR=$OPTARG |
|
| 37 |
+ m) MINIMAL=1 |
|
| 25 | 38 |
;; |
| 26 | 39 |
r) ROOTSIZE=$OPTARG |
| 27 | 40 |
;; |
| ... | ... |
@@ -31,8 +44,26 @@ while getopts hm:r:s: c; do |
| 31 | 31 |
done |
| 32 | 32 |
shift `expr $OPTIND - 1` |
| 33 | 33 |
|
| 34 |
+if [ ! "$#" -eq "2" -o -n "$CHROOTONLY" -a -n "$IMAGEONLY" ]; then |
|
| 35 |
+ usage |
|
| 36 |
+fi |
|
| 37 |
+ |
|
| 38 |
+# Default args |
|
| 34 | 39 |
RELEASE=$1 |
| 35 | 40 |
FORMAT=$2 |
| 41 |
+CHROOTDIR="" |
|
| 42 |
+ |
|
| 43 |
+if [ -n "$CHROOTONLY" ]; then |
|
| 44 |
+ RELEASE=$1 |
|
| 45 |
+ CHROOTDIR=$2 |
|
| 46 |
+ FORMAT="pass" |
|
| 47 |
+fi |
|
| 48 |
+ |
|
| 49 |
+if [ -n "$IMAGEONLY" ]; then |
|
| 50 |
+ CHROOTDIR=$1 |
|
| 51 |
+ FORMAT=$2 |
|
| 52 |
+ RELEASE="pass" |
|
| 53 |
+fi |
|
| 36 | 54 |
|
| 37 | 55 |
case $FORMAT in |
| 38 | 56 |
kvm|qcow2) FORMAT=qcow2 |
| ... | ... |
@@ -60,6 +91,7 @@ case $FORMAT in |
| 60 | 60 |
QFORMAT=raw |
| 61 | 61 |
HYPER=kvm |
| 62 | 62 |
;; |
| 63 |
+ pass) ;; |
|
| 63 | 64 |
*) echo "Unknown format: $FORMAT" |
| 64 | 65 |
usage |
| 65 | 66 |
esac |
| ... | ... |
@@ -70,6 +102,7 @@ case $RELEASE in |
| 70 | 70 |
lucid) ;; |
| 71 | 71 |
karmic) ;; |
| 72 | 72 |
jaunty) ;; |
| 73 |
+ pass) ;; |
|
| 73 | 74 |
*) echo "Unknown release: $RELEASE" |
| 74 | 75 |
usage |
| 75 | 76 |
;; |
| ... | ... |
@@ -80,17 +113,59 @@ if [ -z `which vmbuilder` ]; then |
| 80 | 80 |
sudo apt-get install ubuntu-vm-builder |
| 81 | 81 |
fi |
| 82 | 82 |
|
| 83 |
+if [ -n "$CHROOTONLY" ]; then |
|
| 84 |
+ # Build a chroot directory |
|
| 85 |
+ HYPER=kvm |
|
| 86 |
+ if [ "$MINIMAL" = 1 ]; then |
|
| 87 |
+ ARGS="--variant=minbase" |
|
| 88 |
+ for i in $MIN_PKGS; do |
|
| 89 |
+ ARGS="$ARGS --addpkg=$i" |
|
| 90 |
+ done |
|
| 91 |
+ fi |
|
| 92 |
+ sudo vmbuilder $HYPER ubuntu $ARGS \ |
|
| 93 |
+ --suite $RELEASE \ |
|
| 94 |
+ --only-chroot \ |
|
| 95 |
+ --chroot-dir=$CHROOTDIR \ |
|
| 96 |
+ --overwrite \ |
|
| 97 |
+ --addpkg=$MIN_PKGS \ |
|
| 98 |
+ |
|
| 99 |
+ sudo cp -p files/sources.list $CHROOTDIR/etc/apt/sources.list |
|
| 100 |
+ sudo chroot $CHROOTDIR apt-get update |
|
| 101 |
+ |
|
| 102 |
+ exit 0 |
|
| 103 |
+fi |
|
| 104 |
+ |
|
| 83 | 105 |
# Build the image |
| 106 |
+TMPDIR=tmp |
|
| 84 | 107 |
TMPDISK=`mktemp imgXXXXXXXX` |
| 85 | 108 |
SIZE=$[$ROOTSIZE+$SWAPSIZE+1] |
| 86 |
-dd if=/dev/null of=$TMPDISK bs=1M seek=$SIZE |
|
| 87 |
-sudo vmbuilder $HYPER ubuntu --suite $RELEASE \ |
|
| 88 |
- -o \ |
|
| 89 |
- --rootsize=$ROOTSIZE \ |
|
| 90 |
- --swapsize=$SWAPSIZE \ |
|
| 91 |
- --tmpfs - \ |
|
| 92 |
- --addpkg=openssh-server \ |
|
| 93 |
- --raw=$TMPDISK \ |
|
| 109 |
+dd if=/dev/null of=$TMPDISK bs=1M seek=$SIZE count=1 |
|
| 110 |
+ |
|
| 111 |
+if [ -n "$IMAGEONLY" ]; then |
|
| 112 |
+ # Build image from chroot |
|
| 113 |
+ sudo vmbuilder $HYPER ubuntu $ARGS \ |
|
| 114 |
+ --existing-chroot=$CHR \ |
|
| 115 |
+ --overwrite \ |
|
| 116 |
+ --rootsize=$ROOTSIZE \ |
|
| 117 |
+ --swapsize=$SWAPSIZE \ |
|
| 118 |
+ --tmpfs - \ |
|
| 119 |
+ --raw=$TMPDISK \ |
|
| 120 |
+ |
|
| 121 |
+else |
|
| 122 |
+ # Do the whole shebang in one pass |
|
| 123 |
+ ARGS="--variant=minbase" |
|
| 124 |
+ for i in $MIN_PKGS; do |
|
| 125 |
+ ARGS="$ARGS --addpkg=$i" |
|
| 126 |
+ done |
|
| 127 |
+ sudo vmbuilder $HYPER ubuntu $ARGS \ |
|
| 128 |
+ --suite $RELEASE \ |
|
| 129 |
+ --overwrite \ |
|
| 130 |
+ --rootsize=$ROOTSIZE \ |
|
| 131 |
+ --swapsize=$SWAPSIZE \ |
|
| 132 |
+ --tmpfs - \ |
|
| 133 |
+ --raw=$TMPDISK \ |
|
| 134 |
+ |
|
| 135 |
+fi |
|
| 94 | 136 |
|
| 95 | 137 |
if [ "$FORMAT" = "raw" ]; then |
| 96 | 138 |
# Get image |
| ... | ... |
@@ -26,10 +26,6 @@ if ! grep -q natty /etc/lsb-release; then |
| 26 | 26 |
fi |
| 27 | 27 |
fi |
| 28 | 28 |
|
| 29 |
-#The following makes fresh mininmal installs (i.e. LXCs) happy |
|
| 30 |
-apt-get update |
|
| 31 |
-apt-get install -y sudo |
|
| 32 |
- |
|
| 33 | 29 |
# stack.sh keeps the list of **apt** and **pip** dependencies in external |
| 34 | 30 |
# files, along with config templates and other useful files. You can find these |
| 35 | 31 |
# in the ``files`` directory (next to this script). We will reference this |
| ... | ... |
@@ -40,12 +36,26 @@ if [ ! -d $FILES ]; then |
| 40 | 40 |
exit 1 |
| 41 | 41 |
fi |
| 42 | 42 |
|
| 43 |
-# you need to run this as a regular user with sudo priviledges |
|
| 43 |
+# If stack.sh is run as root, it automatically creates a stack user with |
|
| 44 |
+# sudo privileges and runs as that user. |
|
| 44 | 45 |
if [[ $EUID -eq 0 ]]; then |
| 45 |
- echo "This script cannot be run as root." 1>&2 |
|
| 46 |
- echo "You should run this script as the user you wish openstack to run as" 1>&2 |
|
| 47 |
- echo "The user will need to be a sudoer (without password)" 1>&2 |
|
| 48 |
- exit 1 |
|
| 46 |
+ echo "You are running this script as root." |
|
| 47 |
+ apt-get update |
|
| 48 |
+ apt-get install -y sudo |
|
| 49 |
+ if ! getent passwd | grep -q stack; then |
|
| 50 |
+ echo "Creating a user called stack" |
|
| 51 |
+ useradd -g sudo -s /bin/bash -m stack |
|
| 52 |
+ fi |
|
| 53 |
+ echo "Making sure stack has passwordless sudo" |
|
| 54 |
+ sed -i "/^%sudo/ { / ALL/ { s/ ALL/ NOPASSWD:ALL/ }}" /etc/sudoers
|
|
| 55 |
+ echo "Copying files to stack user" |
|
| 56 |
+ cp -r -f `pwd` /home/stack/ |
|
| 57 |
+ THIS_DIR=$(basename $(dirname $(readlink -f $0))) |
|
| 58 |
+ chown -R stack:sudo /home/stack/$THIS_DIR |
|
| 59 |
+ echo "Running the script as stack in 3 seconds..." |
|
| 60 |
+ sleep 3 |
|
| 61 |
+ exec su -c "cd /home/stack/$THIS_DIR/; bash stack.sh; bash" stack |
|
| 62 |
+ exit 0 |
|
| 49 | 63 |
fi |
| 50 | 64 |
|
| 51 | 65 |
|