aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLiam McLoughlin <hexxeh@hexxeh.net>2011-06-15 21:55:09 +0100
committerLiam McLoughlin <hexxeh@hexxeh.net>2011-06-15 21:55:09 +0100
commit38af0b233d9cb1a28df25a44838b4181ff3d2a18 (patch)
treee42b47de0b9e95fb3558bbcc9bd63d511eb00274 /create_image.sh
parentConditionals for download and updated kernel config (diff)
downloadgentoaster-38af0b233d9cb1a28df25a44838b4181ff3d2a18.tar.gz
gentoaster-38af0b233d9cb1a28df25a44838b4181ff3d2a18.tar.bz2
gentoaster-38af0b233d9cb1a28df25a44838b4181ff3d2a18.zip
Added configuration loading support, fixed up the kernel config for framebuffer and EXT2 support (framebuffer/fluxbox not fully tested yet though!)
Diffstat (limited to 'create_image.sh')
-rwxr-xr-xcreate_image.sh155
1 files changed, 95 insertions, 60 deletions
diff --git a/create_image.sh b/create_image.sh
index d3025db..ad271a2 100755
--- a/create_image.sh
+++ b/create_image.sh
@@ -1,24 +1,31 @@
#!/bin/bash
-echo $0
-IMAGE_BASENAME="${1}"
-IMAGE_NAME="${IMAGE_BASENAME}.image"
-IMAGE_OUT="${IMAGE_BASENAME}.vdi"
-IMAGE_MEGABYTES="${2}"
-BOOT_MEGABYTES=64
-SWAP_MEGABYTES=128
+# Gentoaster VM build tool
+# Licensed under GPL v3, see COPYING file
+# Usage: ./create_image.sh <configuration file path>
+# Prerequisites: extlinux, qemu-img, sfdisk
+
+# Parse the configuration we took as an arg
+source parse_config.sh $1
+
+# Generate a few helper variables using the configuration file
+
+IMAGE_NAME="${BUILD_ID}.image"
ROOT_MEGABYTES=$(( ${IMAGE_MEGABYTES} - ( ${BOOT_MEGABYTES} + ${SWAP_MEGABYTES} + 1 ) ))
IMAGE_BYTES=$(( ${IMAGE_MEGABYTES} * 1024 * 1024 ))
-TIMEZONE="Europe/London"
-HOSTNAME="gentoo"
-ROOT_PASSWORD="g3nt00"
-DEFAULT_USERNAME="gentoo"
-DEFAULT_PASSWORD="g3nt00"
-USE_FLAGS="-qt4 -kde X dbus gtk gnome hal gdu extras device-mapper policykit static-libs"
-LOG_FILE="`pwd`/log.txt"
+IMAGES_OUTPUT_PATH=`pwd`
+IMAGE_WORK_PATH="/root/gentoo/${BUILD_ID}"
+LOG_FILE="${IMAGE_WORK_PATH}/log.txt"
+TOOL_RES_PATH=`pwd`/res
+CPU_CORES=`grep -c processor /proc/cpuinfo`
STAGE3_URL="http://distfiles.gentoo.org/releases/x86/current-stage3/stage3-i486-20110607.tar.bz2"
PORTAGE_URL="http://distfiles.gentoo.org/snapshots/portage-latest.tar.bz2"
+BINHOST_URL="http://tinderbox.dev.gentoo.org/default-linux/x86"
+
+echo "Creating build working directory"
+mkdir -p ${IMAGE_WORK_PATH}
+cd ${IMAGE_WORK_PATH}
echo "Starting log at ${LOG_FILE}..."
echo "" > ${LOG_FILE}
@@ -32,14 +39,13 @@ qemu-img create -f raw ${IMAGE_NAME} ${REAL_IMAGE_BYTES} &>> ${LOG_FILE}
# Clean up old mounts
cleanup_mounts() {
-echo "Cleaning up old mounts"
-umount -d rootfs/dev/pts &>> ${LOG_FILE}
-umount -d rootfs/dev/shm &>> ${LOG_FILE}
-umount -d rootfs/dev &>> ${LOG_FILE}
-umount -d rootfs/proc &>> ${LOG_FILE}
-umount -d rootfs/boot &>> ${LOG_FILE}
-umount -d rootfs &>> ${LOG_FILE}
-losetup -d ${LOOP_DEV_ROOT}
+ echo "Cleaning up old mounts"
+ umount -d rootfs/dev/pts &>> ${LOG_FILE}
+ umount -d rootfs/dev/shm &>> ${LOG_FILE}
+ umount -d rootfs/dev &>> ${LOG_FILE}
+ umount -d rootfs/proc &>> ${LOG_FILE}
+ umount -d rootfs/boot &>> ${LOG_FILE}
+ umount -d rootfs &>> ${LOG_FILE}
}
cleanup_mounts
@@ -47,7 +53,7 @@ cleanup_mounts
echo "Writing partition table"
echo -e "\x55\xaa" | dd bs=1 count=2 seek=510 of=${IMAGE_NAME} conv=notrunc &>> ${LOG_FILE}
LOOP_DEV_IMAGE=`losetup -f`
-losetup ${LOOP_DEV_IMAGE} ${IMAGE_NAME} &>> ${LOG_FILE}
+losetup --sizelimit ${REAL_IMAGE_BYTES} ${LOOP_DEV_IMAGE} ${IMAGE_NAME} &>> ${LOG_FILE}
sfdisk ${LOOP_DEV_IMAGE} -H64 -S32 &>> ${LOG_FILE} << EOF
1,${BOOT_MEGABYTES},83,*
@@ -80,34 +86,32 @@ losetup -d ${LOOP_DEV_SWAP}
echo "Mounting fileystems"
-echo "Mount root"
mkdir -p rootfs
mount -o loop,offset=$(( ( 512 * 2048 ) + ( ${BOOT_MEGABYTES} * 1024 * 1024 ) + ( ${SWAP_MEGABYTES} * 1024 * 1024 ) )) ${IMAGE_NAME} rootfs
-echo "Mount boot"
mkdir -p rootfs/boot
mount -o loop,offset=$(( 512 * 2048 )) ${IMAGE_NAME} rootfs/boot
cd rootfs
# Setup Gentoo
-if [ ! -f ../stage3.tar.bz2 ];
+if [ ! -f ${TOOL_RES_PATH}/stage3.tar.bz2 ];
then
echo "Downloading Stage 3"
- wget ${STAGE3_URL} -O ../stage3.tar.bz2 &>> ${LOG_FILE}
+ wget ${STAGE3_URL} -O ${TOOL_RES_PATH}/stage3.tar.bz2 &>> ${LOG_FILE}
fi
echo "Extracting Stage 3"
-tar jvxf ../stage3.tar.bz2 &>> ${LOG_FILE}
+tar jxf ${TOOL_RES_PATH}/stage3.tar.bz2 &>> ${LOG_FILE}
-if [ ! -f ../portage-latest.tar.bz2 ];
+if [ ! -f ${TOOL_RES_PATH}/portage-latest.tar.bz2 ];
then
echo "Downloading Portage snapshot"
- wget ${PORTAGE_URL} -O ../portage-latest.tar.bz2 &>> ${LOG_FILE}
+ wget ${PORTAGE_URL} -O ${TOOL_RES_PATH}/portage-latest.tar.bz2 &>> ${LOG_FILE}
fi
echo "Extracting Portage snapshot"
cd usr
-tar jvxf ../../portage-latest.tar.bz2 &>> ${LOG_FILE}
+tar jxf ${TOOL_RES_PATH}/portage-latest.tar.bz2 &>> ${LOG_FILE}
echo "Setting up chroot"
cd ..
@@ -115,16 +119,24 @@ mount -t proc /proc proc
mount --rbind /dev dev
cp -L /etc/resolv.conf etc/resolv.conf
-echo "Setting up BINHOST"
-echo 'PORTAGE_BINHOST="http://tinderbox.dev.gentoo.org/default-linux/x86"' >> etc/make.conf
-echo 'PKGDIR="/usr/portage/packages"' >> etc/make.conf
-echo 'FEATURES="parallel-fetch userfetch userpriv getbinpkg"' >> etc/make.conf
-mkdir -p usr/portage/packages
-
echo "Setting up make.conf"
+mkdir -p usr/portage/packages
+echo 'PORTAGE_BINHOST="${BINHOST_URL}"' >> etc/make.conf
+echo 'PKGDIR="/usr/portage/packages"' >> etc/make.conf
+echo 'FEATURES="${FEATURES}"' >> etc/make.conf
echo 'USE="${USE_FLAGS}"' >> etc/make.conf
-#echo 'INPUT_DEVICES="virtualbox evdev"' >> etc/make.conf
-#echo 'VIDEO_CARDS="virtualbox"' >> etc/make.conf
+if [[ ${OUTPUT_FORMAT} = "vbox" ]]
+then
+ echo 'INPUT_DEVICES="virtualbox evdev"' >> etc/make.conf
+ echo 'VIDEO_CARDS="virtualbox"' >> etc/make.conf
+fi
+
+echo "Setting up package.use"
+mkdir -p etc/portage
+echo ${PACKAGE_USE} >> etc/portage/package.use
+
+echo "Setting up package.accept_keywords"
+echo ${PACKAGE_ACCEPT_KEYWORDS} >> etc/portage/package.accept_keywords
echo "Entering chroot"
linux32 chroot . env-update &>> ${LOG_FILE}
@@ -137,19 +149,23 @@ linux32 chroot . cp /usr/share/zoneinfo/${TIMEZONE} /etc/localtime &>> ${LOG_FIL
echo "Setting hostname to ${HOSTNAME}"
linux32 chroot . /bin/bash -c "echo 127.0.0.1 ${HOSTNAME}.local ${HOSTNAME} localhost > /etc/hosts" &>> ${LOG_FILE}
-linux32 chroot . bin/hostname ${HOSTNAME} &>> ${LOG_FILE}
echo "Copying new fstab"
-cp ../fstab etc/fstab &>> ${LOG_FILE}
+cp ${TOOL_RES_PATH}/fstab etc/fstab &>> ${LOG_FILE}
+
+echo "Setting up networking"
+echo 'config_eth0=( "dhcp" )' > etc/conf.d/net
+ln -s etc/init.d/net.lo etc/init.d/net.eth0
+linux32 chroot . rc-update add net.eth0 default
echo "Downloading/installing kernel sources"
linux32 chroot . emerge gentoo-sources &>> ${LOG_FILE}
echo "Copying kernel configuration"
-cp ../kernelconfig usr/src/linux/.config
+cp ${TOOL_RES_PATH}/kernelconfig usr/src/linux/.config
echo "Building kernel"
-linux32 chroot . make -C /usr/src/linux -j8 &>> ${LOG_FILE}
+linux32 chroot . make -C /usr/src/linux -j$(( ${CPU_CORES}+1 )) &>> ${LOG_FILE}
echo "Installing kernel"
linux32 chroot . make -C /usr/src/linux modules_install &>> ${LOG_FILE}
@@ -158,32 +174,51 @@ linux32 chroot . cp /usr/src/linux/arch/i386/boot/bzImage /boot/kernel &>> ${LOG
echo "Setting root password"
linux32 chroot . /bin/bash -c "echo 'root:${ROOT_PASSWORD}' | chpasswd" &>> ${LOG_FILE}
-echo "Installing dhcpcd"
-linux32 chroot . emerge dhcpcd &>> ${LOG_FILE}
-
-#echo "Installing Perl"
-#linux32 chroot . emerge perl &>> ${LOG_FILE}
-#linux32 chroot . perl-cleaner --all &>> ${LOG_FILE}
-
-#echo "Installing GNOME"
-#linux32 chroot . emerge gnome &>> ${LOG_FILE}
+echo "Installing packages list"
+linux32 chroot . emerge ${PACKAGES_LIST} &>> ${LOG_FILE}
echo "Adding default user"
linux32 chroot . useradd -g users -G lp,wheel,audio,cdrom,portage -m ${DEFAULT_USERNAME}
linux32 chroot . /bin/bash -c "echo '${DEFAULT_USERNAME}:${DEFAULT_PASSWORD}' | chpasswd" &>> ${LOG_FILE}
-#echo "Installing VirtualBox additions/drivers"
-#linux32 chroot . emerge xf86-video-virtualbox xf86-input-virtualbox virtualbox-guest-additions &>> ${LOG_FILE}
-#linux32 chroot . rc-update add virtualbox-guest-additions default &>> ${LOG_FILE}
-#linux32 chroot . mv /etc/X11/xorg.conf /etc/X11/xorg.conf.bak &>> ${LOG_FILE}
-#linux32 chroot . usermod -a vboxguest ${DEFAULT_USERNAME}
+if [[ ${OUTPUT_FORMAT} = "vbox" ]]
+then
+ echo "Installing VirtualBox additions/drivers"
+ linux32 chroot . emerge xf86-video-virtualbox xf86-input-virtualbox virtualbox-guest-additions &>> ${LOG_FILE}
+ linux32 chroot . rc-update add virtualbox-guest-additions default &>> ${LOG_FILE}
+ linux32 chroot . mv /etc/X11/xorg.conf /etc/X11/xorg.conf.bak &>> ${LOG_FILE}
+ linux32 chroot . usermod -a vboxguest ${DEFAULT_USERNAME}
+fi
echo "Installing extlinux"
extlinux --heads 255 --sectors 63 --install boot
dd if=/usr/lib/extlinux/mbr.bin of=../${IMAGE_NAME} conv=notrunc
-cp ../extlinux.conf boot/
+cp ${TOOL_RES_PATH}/extlinux.conf boot/
cd ..
cleanup_mounts
-#echo "Converting image from RAW to VDI"
-#VBoxManage convertfromraw -format VDI ${IMAGE_NAME} ${IMAGE_OUT}
+case "${OUTPUT_FORMAT}" in
+ "raw" )
+ echo "Already in raw format, not converting"
+ IMAGE_OUT="${IMAGE_NAME}.image"
+ ;;
+ "vbox" )
+ echo "Converting image from RAW to VDI"
+ qemu-img convert -O vdi ${IMAGE_NAME} ${BUILD_ID}.vdi
+ rm -rf ${IMAGE_NAME}
+ IMAGE_OUT="${IMAGE_NAME}.vdi"
+ ;;
+ "vmware" )
+ echo "Converting image from RAW to VMDK"
+ qemu-img convert -O vmdk ${IMAGE_NAME} ${BUILD_ID}.vmdk
+ rm -rf ${IMAGE_NAME}
+ IMAGE_OUT="${IMAGE_NAME}.vmdk"
+ ;;
+esac
+mv ${IMAGE_OUT} ${IMAGES_OUTPUT_PATH}/${IMAGE_OUT}
+mv ${LOG_FILE} ${IMAGES_OUTPUT_PATH}/${BUILD_ID}.log
+rm -rf ${IMAGE_WORK_PATH}
+
+echo "Image build completed!"
+echo "Your image is here: ${IMAGES_OUTPUT_PATH}/${IMAGE_OUT}"
+echo "Your log file is here: ${IMAGES_OUTPUT_PATH}/${BUILD_ID}.log"