Only use tmpfs if build machine has 4GB+ RAM.

For machines with low RAM (or no access to /proc/meminfo) the builder
will still run, but will just build inside the filesystem that is
hosting /tmp. This will result in a slower build (especially if there
are a lot of .deb packages installed).

Fixes bug #1175453

Change-Id: I79f2672058c11e377548820df0ab4fad8f47ffdc
This commit is contained in:
Clint Byrum 2013-05-02 14:02:38 -07:00
parent f13570d322
commit d9a2211d14
8 changed files with 33 additions and 4 deletions

@ -293,6 +293,19 @@ It's a colon (:) separated path list, and it will work in a first path/element f
first served approach. The included elements tree is used when no path is supplied, first served approach. The included elements tree is used when no path is supplied,
and is added to the end of the path if a path is supplied. and is added to the end of the path if a path is supplied.
Requirements
============
If you have 4GB of available physical RAM\*, or more, diskimage-builder will
create a tmpfs mount to build the image in. This will improve image build time
by building in RAM. This can be disabled completely by passing --no-tmpfs to
disk-image-create. ramdisk-image-create does not use a tmpfs mount. If tmpfs
is not used, you will need enough room in /tmp to store two uncompressed
cloud images. If you do have tmpfs, you will still need /tmp space for one
uncompressed cloud image and about 20% of that for working files.
\* As reported by /proc/meminfo MemTotal
Copyright Copyright
========= =========

@ -39,6 +39,7 @@ function show_options () {
echo " -c -- clear environment before starting work" echo " -c -- clear environment before starting work"
echo " -n skip the default inclusion of the 'base' element" echo " -n skip the default inclusion of the 'base' element"
echo " -p package[,package,package] -- list of packages to install in the image" echo " -p package[,package,package] -- list of packages to install in the image"
echo " --no-tmpfs -- do not use tmpfs to speed image build"
echo echo
echo "ELEMENTS_PATH will allow you to specify multiple locations for the elements." echo "ELEMENTS_PATH will allow you to specify multiple locations for the elements."
exit 0 exit 0
@ -46,7 +47,7 @@ function show_options () {
INSTALL_PACKAGES="" INSTALL_PACKAGES=""
COMPRESS_IMAGE="true" COMPRESS_IMAGE="true"
TEMP=`getopt -o a:ho:xucnp: -n $SCRIPTNAME -- "$@"` TEMP=`getopt -o a:ho:xucnp: -l no-tmpfs -n $SCRIPTNAME -- "$@"`
if [ $? != 0 ] ; then echo "Terminating..." >&2 ; exit 1 ; fi if [ $? != 0 ] ; then echo "Terminating..." >&2 ; exit 1 ; fi
# Note the quotes around `$TEMP': they are essential! # Note the quotes around `$TEMP': they are essential!
@ -62,6 +63,7 @@ while true ; do
-c) shift ; export CLEAR_ENV=1;; -c) shift ; export CLEAR_ENV=1;;
-n) shift; export SKIP_BASE="1";; -n) shift; export SKIP_BASE="1";;
-p) IFS="," read -a INSTALL_PACKAGES <<< "$2"; export INSTALL_PACKAGES ; shift 2 ;; -p) IFS="," read -a INSTALL_PACKAGES <<< "$2"; export INSTALL_PACKAGES ; shift 2 ;;
--no-tmpfs) shift; export DIB_NO_TMPFS=1;;
--) shift ; break ;; --) shift ; break ;;
*) echo "Internal error!" ; exit 1 ;; *) echo "Internal error!" ; exit 1 ;;
esac esac

@ -13,10 +13,21 @@
# License for the specific language governing permissions and limitations # License for the specific language governing permissions and limitations
# under the License. # under the License.
function tmpfs_check() {
[ "$DIB_NO_TMPFS" == "0" ] || return 1
[ -r /proc/meminfo ] || return 1
total_kB=$(awk '/^MemTotal/ { print $2 }' /proc/meminfo)
[ $total_kB -lt $((4*1024*1024)) ] || return 0
echo "Not enough RAM to use tmpfs for build. ($total_kB < 4G)"
return 1
}
function mk_build_dir () { function mk_build_dir () {
export TMP_BUILD_DIR=$(mktemp -t -d --tmpdir=${TMP_DIR:-/tmp} image.XXXXXXXX) export TMP_BUILD_DIR=$(mktemp -t -d --tmpdir=${TMP_DIR:-/tmp} image.XXXXXXXX)
[ $? -eq 0 ] || die "Failed to create tmp directory" [ $? -eq 0 ] || die "Failed to create tmp directory"
sudo mount -t tmpfs tmpfs $TMP_BUILD_DIR if tmpfs_check ; then
sudo mount -t tmpfs tmpfs $TMP_BUILD_DIR
fi
sudo chown $(id -u):$(id -g) $TMP_BUILD_DIR sudo chown $(id -u):$(id -g) $TMP_BUILD_DIR
trap cleanup EXIT trap cleanup EXIT
echo Building in $TMP_BUILD_DIR echo Building in $TMP_BUILD_DIR

@ -38,6 +38,7 @@ FS_TYPE=${FS_TYPE:-ext4}
IMAGE_TYPE=${IMAGE_TYPE:-qcow2} IMAGE_TYPE=${IMAGE_TYPE:-qcow2}
IMAGE_NAME=${IMAGE_NAME:-image} IMAGE_NAME=${IMAGE_NAME:-image}
export DIB_IMAGE_SIZE=${DIB_IMAGE_SIZE:-2} # N.B. This size is in GB export DIB_IMAGE_SIZE=${DIB_IMAGE_SIZE:-2} # N.B. This size is in GB
export DIB_NO_TMPFS=${DIB_NO_TMPFS:-0}
# Set via the CLI normally. # Set via the CLI normally.
# IMAGE_ELEMENT= # IMAGE_ELEMENT=
_BASE_ELEMENT_DIR=$(dirname $0)/../elements _BASE_ELEMENT_DIR=$(dirname $0)/../elements

@ -41,7 +41,7 @@ function cleanup () {
function cleanup_dirs () { function cleanup_dirs () {
sudo rm -rf $TMP_BUILD_DIR/built sudo rm -rf $TMP_BUILD_DIR/built
sudo rm -rf $TMP_BUILD_DIR/mnt sudo rm -rf $TMP_BUILD_DIR/mnt
sudo umount $TMP_BUILD_DIR sudo umount -f $TMP_BUILD_DIR || true
rm -rf $TMP_BUILD_DIR rm -rf $TMP_BUILD_DIR
} }

@ -24,3 +24,4 @@ IMAGE_NAME=${IMAGE_NAME:-"ramdisk"}
_BASE_ELEMENT_DIR=$(dirname $0)/../elements _BASE_ELEMENT_DIR=$(dirname $0)/../elements
ELEMENTS_PATH=${ELEMENTS_PATH:+"$ELEMENTS_PATH:$_BASE_ELEMENT_DIR"} ELEMENTS_PATH=${ELEMENTS_PATH:+"$ELEMENTS_PATH:$_BASE_ELEMENT_DIR"}
export ELEMENTS_PATH=${ELEMENTS_PATH:-$_BASE_ELEMENT_DIR} export ELEMENTS_PATH=${ELEMENTS_PATH:-$_BASE_ELEMENT_DIR}
export DIB_NO_TMPFS=${DIB_NO_TMPFS:-1}

@ -25,6 +25,7 @@ function fullpath() {
} }
function cleanup () { function cleanup () {
sudo umount -f $TMP_BUILD_DIR || true
rm -rf "$TMP_BUILD_DIR" rm -rf "$TMP_BUILD_DIR"
} }

@ -54,5 +54,5 @@ ALL ALL=(root) NOPASSWD: /sbin/losetup -d /dev/loop*
ALL ALL=(root) NOPASSWD: /sbin/partprobe /dev/loop* ALL ALL=(root) NOPASSWD: /sbin/partprobe /dev/loop*
ALL ALL=(root) NOPASSWD: /usr/bin/du --block-size=* -x -s /tmp/*/built ALL ALL=(root) NOPASSWD: /usr/bin/du --block-size=* -x -s /tmp/*/built
ALL ALL=(root) NOPASSWD: /bin/mount -t tmpfs tmpfs /tmp/image.* ALL ALL=(root) NOPASSWD: /bin/mount -t tmpfs tmpfs /tmp/image.*
ALL ALL=(root) NOPASSWD: /bin/umount /tmp/image.* ALL ALL=(root) NOPASSWD: /bin/umount -f /tmp/image.*
ALL ALL=(root) NOPASSWD: /bin/chown *\:* /tmp/image.* ALL ALL=(root) NOPASSWD: /bin/chown *\:* /tmp/image.*