Merge "Replace architecture-emulation-binaries with qemu-debootstrap"
This commit is contained in:
commit
c18a3ff029
@ -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.
|
|
@ -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
|
|
@ -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
|
|
@ -34,6 +34,8 @@ DEBOOTSTRAP_TARBALL=$DIB_IMAGE_CACHE/debootstrap-${DISTRO_NAME}-${DIB_RELEASE}-$
|
|||||||
http_proxy=${http_proxy:-}
|
http_proxy=${http_proxy:-}
|
||||||
no_proxy=${no_proxy:-}
|
no_proxy=${no_proxy:-}
|
||||||
|
|
||||||
|
DEBOOTSTRAP_QEMU=""
|
||||||
|
|
||||||
if [ -n "$DIB_OFFLINE" -o -n "${DIB_DEBIAN_USE_DEBOOTSTRAP_CACHE:-}" ] && [ -f $DEBOOTSTRAP_TARBALL ] ; then
|
if [ -n "$DIB_OFFLINE" -o -n "${DIB_DEBIAN_USE_DEBOOTSTRAP_CACHE:-}" ] && [ -f $DEBOOTSTRAP_TARBALL ] ; then
|
||||||
echo $DEBOOTSTRAP_TARBALL found in cache. Using.
|
echo $DEBOOTSTRAP_TARBALL found in cache. Using.
|
||||||
sudo tar -C $TARGET_ROOT --numeric-owner -xzf $DEBOOTSTRAP_TARBALL
|
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=python because of dib-run-parts
|
||||||
# Have to --include=sudo for pre-install.d use of sudoers files
|
# Have to --include=sudo for pre-install.d use of sudoers files
|
||||||
# Have to --include=busybox because initramfs needs it
|
# 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 \
|
--variant=minbase \
|
||||||
--components=${DIB_DEBIAN_COMPONENTS} \
|
--components=${DIB_DEBIAN_COMPONENTS} \
|
||||||
--arch=${ARCH} \
|
--arch=${ARCH} \
|
||||||
@ -64,7 +73,6 @@ else
|
|||||||
sudo rm -fr ${TARGET_ROOT}/etc/apt/sources.list \
|
sudo rm -fr ${TARGET_ROOT}/etc/apt/sources.list \
|
||||||
${TARGET_ROOT}/etc/apt/sources.list.d
|
${TARGET_ROOT}/etc/apt/sources.list.d
|
||||||
|
|
||||||
|
|
||||||
echo Caching debootstrap result in $DEBOOTSTRAP_TARBALL
|
echo Caching debootstrap result in $DEBOOTSTRAP_TARBALL
|
||||||
if [ "${DIB_DEBOOTSTRAP_CACHE:-0}" != "0" ]; then
|
if [ "${DIB_DEBOOTSTRAP_CACHE:-0}" != "0" ]; then
|
||||||
sudo tar --numeric-owner -C $TARGET_ROOT -zcf $DEBOOTSTRAP_TARBALL --exclude='./tmp/*' .
|
sudo tar --numeric-owner -C $TARGET_ROOT -zcf $DEBOOTSTRAP_TARBALL --exclude='./tmp/*' .
|
||||||
|
Loading…
Reference in New Issue
Block a user