From d881d27e8eaaf154f24432f4a9c19a10a6fa7701 Mon Sep 17 00:00:00 2001 From: Alexandru Avadanii Date: Thu, 19 Sep 2019 13:49:55 +0200 Subject: [PATCH 1/1] Arch-specific builds, aarch64 support Only x86_64 machines (i386, i686 etc.) use BIOS and have a 'syslinux' package (currently a dependency of ipa-deployer). Make ipa-deployer produce arch-specific binaries, adding support for AArch64 architecture: - syslinux should be a build dependency only on x86_64; - diskimage-builder provided by CentOS repos is too old to properly support AArch64, rely on PIP to install a working version; - add EFI system partition (ESP) handling requirements (util-linux, dosfstools, gdisk); - DIB elements: AArch64 requires block-device-efi; - iso-image-create: Add support for creating EFI images (new args "-e", "-E" may be used to specify the path to efiboot.img, respectively the EFI directory), handle syslinux only on x86, bail if mkisofs fails; - enable EFI support for x86_64 image too; Change-Id: Id37164d5eadf5729b8aeb6da0617d3310ba1109b Signed-off-by: Alexandru Avadanii --- ipa-deployer.spec | 31 +++++-- .../finalise.d/20-unlink-net-name-slot-rule | 4 +- work/iso-image-create | 97 +++++++++++++++++----- 3 files changed, 106 insertions(+), 26 deletions(-) diff --git a/ipa-deployer.spec b/ipa-deployer.spec index bb8c3d7..de86c3e 100644 --- a/ipa-deployer.spec +++ b/ipa-deployer.spec @@ -7,11 +7,24 @@ License: %{_platform_licence} Source0: %{name}-%{version}.tar.gz Vendor: %{_platform_vendor} -BuildArch: noarch -BuildRequires: diskimage-builder qemu-img-ev which sudo PyYAML e2fsprogs syslinux genisoimage wget kernel python2-ironic-python-agent python-ironic-lib python-devel +BuildRequires: qemu-img-ev which sudo PyYAML e2fsprogs genisoimage wget kernel python2-ironic-python-agent python-ironic-lib python-devel xz python-pip gdisk dosfstools util-linux +%ifarch x86_64 amd64 +BuildRequires: syslinux +%endif %define dib_selinuxfile elements/rpm-distro/cleanup.d/99-selinux-fixfiles-restore %define dib_epel elements/epel/pre-install.d/05-rpm-epel-release +%ifarch x86_64 amd64 +%define centos_cloudimg https://cloud.centos.org/centos/7/images/CentOS-7-x86_64-GenericCloud-1801-01.qcow2 +%define centos_mirror http://mirror.centos.org/centos/7 +%else +%define centos_cloudimg https://cloud.centos.org/altarch/7/images/aarch64/CentOS-7-aarch64-GenericCloud-1708.qcow2.xz +%define centos_cloudimg_xz 1 +%define centos_mirror http://mirror.centos.org/altarch/7 +%define dib_block_device_efi 1 +%endif +%define centos_efibootimg %{centos_mirror}/os/%{_arch}/images/efiboot.img +%define centos_efidir %{centos_mirror}/os/%{_arch}/EFI %description Deployment image for ironic python agent image @@ -20,18 +33,26 @@ Deployment image for ironic python agent image %autosetup %build +sudo pip install diskimage-builder==2.26.1 sudo rm -rf %{python2_sitelib}/diskimage_builder/%{dib_selinuxfile} %{_datarootdir}§/diskimage-builder/%{dib_selinuxfile} %{python2_sitelib}/diskimage_builder/elements/epel/pre-install.d/05-rpm-epel-release cp /etc/yum.conf work/local.repo -wget --progress=dot:giga https://cloud.centos.org/centos/7/images/CentOS-7-x86_64-GenericCloud-1801-01.qcow2 -O CentOS.qcow2 +wget --progress=dot:giga %{centos_cloudimg} -O CentOS.qcow2%{?centos_cloudimg_xz:.xz} +%if 0%{?centos_cloudimg_xz:1} +unxz CentOS.qcow2.xz +%endif +url=%{centos_efidir}/ +wget --progress=dot:giga %{centos_efibootimg} -O efiboot.img +cut_dirs=$(echo $url | sed -re 's|.*://[^/]+/(.+)|\1|' -e 's|/$||' | grep -o / | wc -l) +wget -N -r --no-host-directories --no-verbose --cut-dirs=${cut_dirs} --reject index.html* --no-parent $url DIB_DEBUG_TRACE=1 \ ELEMENTS_PATH="${PWD}/work/dib-ipa-element/" \ DIB_LOCAL_IMAGE="file://${PWD}/CentOS.qcow2" \ DIB_YUM_REPO_CONF="work/local.repo" \ DIB_LOCAL_REPO="/usr/localrepo/" \ - break=after-error /usr/bin/disk-image-create --install-type package localrepo centos7 virtmedia-netconf ironic-agent + break=after-error /usr/bin/disk-image-create --install-type package localrepo centos7 virtmedia-netconf ironic-agent %{?dib_block_device_efi:block-device-efi} if [[ $? == 0 ]]; then - work/iso-image-create -o ./ironic-deploy.iso -i ./image.initramfs -k ./image.vmlinuz + work/iso-image-create -o ./ironic-deploy.iso -i ./image.initramfs -k ./image.vmlinuz -e ./efiboot.img -E ./EFI else echo "Failed to run disk-image-create" fi diff --git a/work/dib-ipa-element/virtmedia-netconf/finalise.d/20-unlink-net-name-slot-rule b/work/dib-ipa-element/virtmedia-netconf/finalise.d/20-unlink-net-name-slot-rule index 10a6e82..e9936a4 100755 --- a/work/dib-ipa-element/virtmedia-netconf/finalise.d/20-unlink-net-name-slot-rule +++ b/work/dib-ipa-element/virtmedia-netconf/finalise.d/20-unlink-net-name-slot-rule @@ -21,4 +21,6 @@ fi set -eu set -o pipefail -unlink /etc/udev/rules.d/80-net-name-slot.rules +if [ -e /etc/udev/rules.d/80-net-name-slot.rules ]; then + unlink /etc/udev/rules.d/80-net-name-slot.rules +fi diff --git a/work/iso-image-create b/work/iso-image-create index 879e72a..a93c438 100755 --- a/work/iso-image-create +++ b/work/iso-image-create @@ -32,6 +32,8 @@ function show_options() { echo " -o output filename " echo " -i initrd " echo " -k kernel " + echo " -e efiboot.img " + echo " -E EFI directory " } function cleanup() { @@ -51,7 +53,7 @@ function v_print() { # Parse command line options -ARGS=`getopt -o "o:i:k:" -l "output,initrd,kernel:" \ +ARGS=`getopt -o "o:i:k:e:E:" -l "output,initrd,kernel,efiboot,EFI:" \ -n "$SCRIPTNAME" -- "$@"` if [ $? -ne 0 ]; then @@ -65,6 +67,8 @@ while true ; do -o) OUTPUT_FILENAME=$2; shift 2 ;; -i) INITRD=$2; shift 2 ;; -k) KERNEL=$2; shift 2 ;; + -e) EFIBOOT=$2; shift 2 ;; + -E) EFIDIR=$2; shift 2 ;; # *) show_options ; exit 1 ;; --) shift; break ;; esac @@ -89,28 +93,40 @@ if [ -z "$KERNEL" ]; then exit 1 fi +if [ -z "$EFIBOOT" ]; then + err_print "efiboot.img not provided." + show_options + exit 1 +fi + +if [ -z "$EFIDIR" ]; then + err_print "EFI directory not provided." + show_options + exit 1 +fi + # Create a temporary build directory for holiding the contents of iso TMP_IMAGE_DIR="$TMP_BUILD_DIR/image" v_print "Creating temporary directory $TMP_IMAGE_DIR" mkdir -p "$TMP_IMAGE_DIR" -# Copy isolinux bin to the isolinux directory -mkdir -p "$TMP_IMAGE_DIR/isolinux" -v_print "Copying isolinux.bin" -if [ -f /usr/share/syslinux/isolinux.bin ] -then - cp /usr/share/syslinux/isolinux.bin "$TMP_IMAGE_DIR/isolinux" - -elif [ -f /usr/lib/syslinux/isolinux.bin ] -then - cp /usr/lib/syslinux/isolinux.bin "$TMP_IMAGE_DIR/isolinux" -else - err_print "Could not find isolinux.bin. Install syslinux?" - cleanup - exit 1 +if [ "$(uname -m)" = 'x86_64' ]; then + # Copy isolinux bin to the isolinux directory + mkdir -p "$TMP_IMAGE_DIR/isolinux" + v_print "Copying isolinux.bin" + if [ -f /usr/share/syslinux/isolinux.bin ] + then + cp /usr/share/syslinux/isolinux.bin "$TMP_IMAGE_DIR/isolinux" + + elif [ -f /usr/lib/syslinux/isolinux.bin ] + then + cp /usr/lib/syslinux/isolinux.bin "$TMP_IMAGE_DIR/isolinux" + else + err_print "Could not find isolinux.bin. Install syslinux?" + cleanup + exit 1 + fi fi - - # Copy initrd, kernel v_print "Copying kernel to $TMP_IMAGE_DIR/vmlinuz" cp $KERNEL "$TMP_IMAGE_DIR/vmlinuz" @@ -128,9 +144,34 @@ if [ $? -ne 0 ]; then exit 1 fi -# Generate isolinux.cfg for default booting -v_print "Generating isolinux.cfg" +mkdir -p "$TMP_IMAGE_DIR/images" +v_print "Copying efiboot image to $TMP_IMAGE_DIR/images/efiboot.img" +cp $EFIBOOT "$TMP_IMAGE_DIR/images/efiboot.img" +if [ $? -ne 0 ]; then + err_print "Failed to copy $EFIBOOT to $TMP_IMAGE_DIR/images" + cleanup + exit 1 +fi + +v_print "Copying EFI directory to $TMP_IMAGE_DIR/EFI" +cp -r $EFIDIR "$TMP_IMAGE_DIR/EFI" +if [ $? -ne 0 ]; then + err_print "Failed to copy $EFIDIR to $TMP_IMAGE_DIR/EFI" + cleanup + exit 1 +fi +# Generate grub.cfg for default booting +sed -i '/BEGIN/q' "$TMP_IMAGE_DIR/EFI/BOOT/grub.cfg" echo "\ +menuentry 'Install image' --class red --class gnu-linux --class gnu --class os { + linux /vmlinuz boot_method=vmedia console=tty0 console=ttyS1,115200 console=ttyS0,115200 console=ttyAMA0,115200 selinux=0 + initrd /initrd +}" >> "$TMP_IMAGE_DIR/EFI/BOOT/grub.cfg" + +if [ "$(uname -m)" = 'x86_64' ]; then + # Generate isolinux.cfg for default booting + v_print "Generating isolinux.cfg" + echo "\ DEFAULT install LABEL install menu label "Install image" @@ -138,6 +179,7 @@ LABEL install append initrd=/initrd boot_method=vmedia console=tty0 console=ttyS1,115200 selinux=0 -- TIMEOUT 5 PROMPT 0 " > "$TMP_IMAGE_DIR/isolinux/isolinux.cfg" +fi # Convert relative path output filename to absolute path echo $OUTPUT_FILENAME | grep -q '^/' @@ -145,9 +187,24 @@ if [ $? -ne 0 ]; then OUTPUT_FILENAME="$PWD/$OUTPUT_FILENAME" fi +# On x86_64 platforms, use isolinux for BIOS support +if [ "$(uname -m)" = 'x86_64' ]; then + MKISOFS_ARGS+=" -b isolinux/isolinux.bin -c isolinux/boot.cat -no-emul-boot \ + -boot-load-size 4 -boot-info-table" +fi + +# efiboot.img path is hard set, create an EFI compatible ISO +MKISOFS_ARGS+=" -eltorito-alt-boot -e images/efiboot.img -no-emul-boot" + # Create the ISO v_print "Generating the ISO" -cd $TMP_IMAGE_DIR && $MKISOFS -r -V "INSTALL_IMAGE" -cache-inodes -J -l -b isolinux/isolinux.bin -no-emul-boot -boot-load-size 4 -boot-info-table -o $OUTPUT_FILENAME . +cd $TMP_IMAGE_DIR && $MKISOFS -r -V "INSTALL_IMAGE" -cache-inodes -J -l $MKISOFS_ARGS -o $OUTPUT_FILENAME . + +if [ $? -ne 0 ]; then + err_print "Failed generating the ISO" + cleanup + exit 1 +fi # Cleanup cleanup -- 2.16.6