diff options
author | Liam McLoughlin <hexxeh@hexxeh.net> | 2011-06-15 21:55:09 +0100 |
---|---|---|
committer | Liam McLoughlin <hexxeh@hexxeh.net> | 2011-06-15 21:55:09 +0100 |
commit | 38af0b233d9cb1a28df25a44838b4181ff3d2a18 (patch) | |
tree | e42b47de0b9e95fb3558bbcc9bd63d511eb00274 /create_image.sh | |
parent | Conditionals for download and updated kernel config (diff) | |
download | gentoaster-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-x | create_image.sh | 155 |
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" |