diskimage-builder/lib/img-functions
Chris Jones 8d1ce9c0c3 Build ramdisks in an image chroot.
Ramdisks are now built inside a chroot which is built by the normal
image build process. Doing so improves our independence of the
precise state of the build host.

This fixes bug 1194055.

Change-Id: Ibc254fbb9e7b404b5f38c1b35bcde8a4136e8e28
2013-07-12 11:09:35 +01:00

131 lines
4.7 KiB
Text

# Copyright 2012 Hewlett-Packard Development Company, L.P.
# All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
function unmount_image () {
# unmount from the chroot
# Don't use TMP_MOUNT_PATH here, it might not have been set.
sudo umount -f $TMP_BUILD_DIR/mnt/sys || true
sudo umount -f $TMP_BUILD_DIR/mnt/proc || true
sudo umount -f $TMP_BUILD_DIR/mnt/dev || true
sudo umount -f $TMP_BUILD_DIR/mnt/tmp/in_target.d || true
sudo umount -f $TMP_BUILD_DIR/mnt/tmp/ccache || true
# give it a second (ok really 5) to umount XXX - why? should instead track
# the mount data / lsof etc.
sleep 5
# oh ya don't want to forget to unmount the image
sudo umount -f $TMP_BUILD_DIR/mnt || true
# having disk corruption issues; one possibility is qemu-nbd not flushing
# dirty pages on disconnect?
sync
if [ -n "$EXTRA_UNMOUNT" ]; then
$EXTRA_UNMOUNT
fi
}
function cleanup () {
unmount_image
cleanup_dirs
}
function ensure_nbd () {
NBD=`which qemu-nbd` || true
if [ -z "$NBD" ]; then
echo "qemu-nbd is not found in your PATH"
echo "Please install it on your system"
exit 1
fi
# prep nbd for mounting
(lsmod | grep '^nbd ') || sudo modprobe nbd max_part=16
}
function ensure_sudo () {
sudo echo "Ensuring sudo is available"
}
# Helper function to run a command inside the chroot
function run_in_target () {
# Force the inclusion of /usr/local/bin in PATH, this is needed for some
# distros that does not include /usr/local/bin in the sudoers secure_path.
# Note that we're not expanding PATH during argument processing, the \$
# will preserve the PATH syntax until after the sh command runs
cmd="PATH=\$PATH:/usr/local/bin ; $@"
# -E to preserve http_proxy
sudo -E chroot $TMP_MOUNT_PATH sh -c "$cmd"
}
# Helper function to run a directory of scripts inside the chroot
function run_d_in_target () {
check_element
# If we can find a directory of hooks to run in the target filesystem, bind
# mount it into the target and then execute run-parts in a chroot
if [ -d ${TMP_HOOKS_PATH}/$1.d ] ; then
sudo mkdir $TMP_MOUNT_PATH/tmp/in_target.d
sudo mount --bind ${TMP_HOOKS_PATH} $TMP_MOUNT_PATH/tmp/in_target.d
sudo mount -o remount,ro,bind ${TMP_HOOKS_PATH} $TMP_MOUNT_PATH/tmp/in_target.d
sudo mkdir -p $TMP_MOUNT_PATH/tmp/ccache
mkdir -p $DIB_CCACHE_DIR
sudo mount --bind $DIB_CCACHE_DIR $TMP_MOUNT_PATH/tmp/ccache
check_break before-$1 run_in_target bash
run_in_target dib-run-parts /tmp/in_target.d/$1.d
check_break after-$1 run_in_target bash
sudo umount -f $TMP_MOUNT_PATH/tmp/in_target.d
sudo rmdir $TMP_MOUNT_PATH/tmp/in_target.d
sudo umount -f $TMP_MOUNT_PATH/tmp/ccache || true
sudo rmdir $TMP_MOUNT_PATH/tmp/ccache
fi
}
function prepare_first_boot () {
check_break before-first-boot run_in_target bash
if [ -d ${TMP_HOOKS_PATH}/first-boot.d ] ; then
sudo cp -t $TMP_MOUNT_PATH/etc/ -a $TMP_HOOKS_PATH/first-boot.d
fi
check_break after-first-boot run_in_target bash
}
function finalise_base () {
TARGET_ROOT=$TMP_MOUNT_PATH run_d cleanup
# Remove the resolv.conf we created above
sudo rm -f $TMP_MOUNT_PATH/etc/resolv.conf
# Move the original back
if [ -L $TMP_MOUNT_PATH/etc/resolv.conf.ORIG ] || [ -f $TMP_MOUNT_PATH/etc/resolv.conf.ORIG ] ; then
sudo mv $TMP_MOUNT_PATH/etc/resolv.conf.ORIG $TMP_MOUNT_PATH/etc/resolv.conf
fi
}
function compress_image () {
# Recreate our image to throw away unnecessary data
test $IMAGE_TYPE != qcow2 && COMPRESS_IMAGE=""
qemu-img convert ${COMPRESS_IMAGE:+-c} -f raw $TMP_IMAGE_PATH -O $IMAGE_TYPE $TMP_IMAGE_PATH-new
rm $TMP_IMAGE_PATH
mv $TMP_IMAGE_PATH-new $TMP_IMAGE_PATH
}
function remove_image () {
echo "Removing $TMP_IMAGE_PATH"
rm $TMP_IMAGE_PATH
}
function do_extra_package_install () {
# Install any packages that were requested with the -p command line option
if [ "$INSTALL_PACKAGES" != "" ]; then
run_in_target install-packages ${INSTALL_PACKAGES[@]}
fi
}
function copy_elements_lib () {
sudo mkdir -p $TMP_MOUNT_PATH/lib/diskimage-builder
sudo cp -t $TMP_MOUNT_PATH/lib/diskimage-builder $_LIB/elements-functions
}