Merge "Replace architecture-emulation-binaries with qemu-debootstrap"

This commit is contained in:
Jenkins 2017-07-17 05:36:09 +00:00 committed by Gerrit Code Review
commit c18a3ff029
4 changed files with 10 additions and 102 deletions

View File

@ -1,24 +0,0 @@
===============================
architecture-emulation-binaries
===============================
This element enables execution for different architectures
When building an image for an architecture that the host machine
can not execute, we need to chroot into the image to execute code,
and if the host architecture does not match, we need to emulate
the instructions.
This element does the following:
* copies the binary file into chroot /usr/bin environment.
Binary file is chosen based on host architecture and
image architecture the user is trying to build.
If an image we are building for an architecture is not the host
architecture, install tools provided by qemu-user-static
(which needs to be installed) to allow us to run commands
inside the building image.
This is tested on amd64/i386 architecture to build armhf and arm64
ubuntu cloud images.

View File

@ -1,12 +0,0 @@
#!/bin/bash
if [ ${DIB_DEBUG_TRACE:-1} -gt 0 ]; then
set -x
fi
set -eu
set -o pipefail
if [ -x "$TMP_MOUNT_PATH/tmp/clean_up_qemu_binary" ] ; then
"$TMP_MOUNT_PATH/tmp/clean_up_qemu_binary"
rm -rf "$TMP_MOUNT_PATH/tmp/clean_up_qemu_binary"
fi

View File

@ -1,64 +0,0 @@
#!/bin/bash
if [ ${DIB_DEBUG_TRACE:-1} -gt 0 ]; then
set -x
fi
set -eu
set -o pipefail
function clean_up_arch_emulation {
cat <<EOF >$TMP_MOUNT_PATH/tmp/clean_up_qemu_binary
#!/bin/bash
set -eux
set -o pipefail
sudo rm -rf "${TMP_MOUNT_PATH}${1}"
EOF
sudo chmod +x "$TMP_MOUNT_PATH/tmp/clean_up_qemu_binary"
}
function check_copy_file {
if [ -f "$1" ] ; then
if [ ! -f "${TMP_MOUNT_PATH}${1}" ]; then
sudo cp "$1" "$TMP_MOUNT_PATH/usr/bin"
clean_up_arch_emulation $1
fi
else
echo "qemu binary file not found."
exit 1
fi
}
function copy_binary {
echo "checking for architecture compatibility..."
img_arch=$2
if [[ "$host_arch" != "$img_arch" ]]; then
qemu_binary=$1
check_copy_file $qemu_binary
else
echo "Emulation not required for this host/image architecture combination"
fi
}
host_arch="$(uname -m)"
case "$ARCH" in
"i386" | "amd64")
qemu_binary_file="/usr/bin/qemu-i386-static"
copy_binary $qemu_binary_file $ARCH
;;
"armhf")
qemu_binary_file="/usr/bin/qemu-arm-static"
copy_binary $qemu_binary_file $ARCH
;;
"arm64" | "aarch64")
qemu_binary_file="/usr/bin/qemu-aarch64-static"
copy_binary $qemu_binary_file $ARCH
;;
*)
echo "architecture not supported"
exit 1
;;
esac

View File

@ -34,6 +34,8 @@ DEBOOTSTRAP_TARBALL=$DIB_IMAGE_CACHE/debootstrap-${DISTRO_NAME}-${DIB_RELEASE}-$
http_proxy=${http_proxy:-}
no_proxy=${no_proxy:-}
DEBOOTSTRAP_QEMU=""
if [ -n "$DIB_OFFLINE" -o -n "${DIB_DEBIAN_USE_DEBOOTSTRAP_CACHE:-}" ] && [ -f $DEBOOTSTRAP_TARBALL ] ; then
echo $DEBOOTSTRAP_TARBALL found in cache. Using.
sudo tar -C $TARGET_ROOT --numeric-owner -xzf $DEBOOTSTRAP_TARBALL
@ -47,7 +49,14 @@ else
# Have to --include=python because of dib-run-parts
# Have to --include=sudo for pre-install.d use of sudoers files
# Have to --include=busybox because initramfs needs it
sudo sh -c "http_proxy=$http_proxy no_proxy=$no_proxy debootstrap --verbose \
if [ $(dpkg --print-architecture) != ${ARCH} ]; then
# Target architecture diffrent from host architecture:
# there is the need to call 'qemu-debootstrap'.
DEBOOTSTRAP_QEMU="qemu-"
fi
sudo sh -c "http_proxy=$http_proxy no_proxy=$no_proxy ${DEBOOTSTRAP_QEMU}debootstrap --verbose \
--variant=minbase \
--components=${DIB_DEBIAN_COMPONENTS} \
--arch=${ARCH} \
@ -64,7 +73,6 @@ else
sudo rm -fr ${TARGET_ROOT}/etc/apt/sources.list \
${TARGET_ROOT}/etc/apt/sources.list.d
echo Caching debootstrap result in $DEBOOTSTRAP_TARBALL
if [ "${DIB_DEBOOTSTRAP_CACHE:-0}" != "0" ]; then
sudo tar --numeric-owner -C $TARGET_ROOT -zcf $DEBOOTSTRAP_TARBALL --exclude='./tmp/*' .