#!/bin/bash # # Join two Arch Linux iso images of i686 and x86_64 architecture. # Contributed for archiso by Gerardo Exequiel Pozzi # set -e -u publisher="Arch Linux " application="Arch Linux Live/Rescue disk" label="ARCH_$(date +%Y%m)" isofile_i686="" isofile_x86_64="" imgname="" quiet="y" profile_type="basic" work_dir="/tmp/archiso2dual" isomounts_file="/usr/share/archiso2dual/isomounts" isolinuxcfg_file="/usr/share/archiso2dual/isolinux.cfg" removefiles_file="/usr/share/archiso2dual/removefiles.lst" appname=${0##*/} _error="0" _confirm="n" _v="" _iscoreiso=n iso_umount() { echo "Executing: ${FUNCNAME}" trap - 0 1 2 15 umount ${_v} ${work_dir}/i686/mnt umount ${_v} ${work_dir}/x86_64/mnt } iso_mount() { echo "Executing: ${FUNCNAME}" trap 'iso_umount' 0 1 2 15 mount ${_v} -t udf -o ro,loop ${isofile_i686} ${work_dir}/i686/mnt mount ${_v} -t udf -o ro,loop ${isofile_x86_64} ${work_dir}/x86_64/mnt } kernel_copy() { echo "Executing: ${FUNCNAME}" for _arch in i686 x86_64; do cp ${_v} $work_dir/${_arch}/mnt/boot/archiso.img $work_dir/iso/boot/${_arch}/archiso.img cp ${_v} $work_dir/${_arch}/mnt/boot/vmlinuz26 $work_dir/iso/boot/${_arch}/vmlinuz26 done } isolinux_copy() { echo "Executing: ${FUNCNAME}" cp ${_v} $work_dir/i686/mnt/boot/{memtest*,releasenotes.txt,splash.png,x86test*} $work_dir/iso/boot/ cp ${_v} $work_dir/i686/mnt/boot/isolinux/*.c32 $work_dir/iso/boot/isolinux/ cp ${_v} $work_dir/i686/mnt/boot/isolinux/memdisk $work_dir/iso/boot/isolinux/ cp ${_v} $work_dir/i686/mnt/boot/isolinux/isolinux.bin $work_dir/iso/boot/isolinux/ cp ${_v} $work_dir/i686/mnt/boot/isolinux/pxelinux.0 $work_dir/iso/boot/isolinux/ cp ${_v} $work_dir/i686/mnt/boot/isolinux/gpxelinux.0 $work_dir/iso/boot/isolinux/ } isolinuxcfg_copy() { echo "Executing: ${FUNCNAME}" sed "s|XXX|${label}|g" ${isolinuxcfg_file} > $work_dir/iso/boot/isolinux/isolinux.cfg } isomounts_copy() { echo "Executing: ${FUNCNAME}" cp ${_v} ${isomounts_file} $work_dir/iso/ } squashfs_copy() { echo "Executing: ${FUNCNAME}" for _arch in i686 x86_64; do cp ${_v} $work_dir/${_arch}/mnt/*.sqfs $work_dir/iso/${_arch}/ done } make_iso() { echo "Executing: ${FUNCNAME}" if [ "${quiet}" = "y" ]; then _qflag="-quiet" else _qflag="" fi mkisofs ${_v} ${_qflag} -r -l \ -b boot/isolinux/isolinux.bin -c boot/isolinux/boot.cat \ -uid 0 -gid 0 \ -udf -allow-limited-size -iso-level 3 \ -input-charset utf-8 -p "prepared by archiso2dual" \ -no-emul-boot -boot-load-size 4 -boot-info-table \ -publisher "${publisher}" \ -A "${application}" \ -V "${label}" \ -o "${imgname}" "${work_dir}/iso/" isohybrid "${imgname}" } unsquashfs_image() { echo "Executing: ${FUNCNAME}" img=${1} arch=${2} rm -rf ${work_dir}/tmp/${arch}/${img} if [ "${quiet}" = "y" ]; then unsquashfs -d ${work_dir}/tmp/${arch}/${img} $work_dir/iso/${arch}/${img}.sqfs > /dev/null else unsquashfs -d ${work_dir}/tmp/${arch}/${img} $work_dir/iso/${arch}/${img}.sqfs fi } mksquashfs_image() { echo "Executing: ${FUNCNAME}" img=${1} arch=${2} rm -f ${work_dir}/iso/${arch}/${img}.sqfs if [ "${quiet}" = "y" ]; then mksquashfs ${work_dir}/tmp/${arch}/${img} ${work_dir}/iso/${arch}/${img}.sqfs > /dev/null else mksquashfs ${work_dir}/tmp/${arch}/${img} ${work_dir}/iso/${arch}/${img}.sqfs fi } usrshare_make_image() { echo "Executing: ${FUNCNAME}" mkdir -p ${work_dir}/tmp/any/usrshare/usr cp -a ${work_dir}/tmp/i686/root-image/usr/share ${work_dir}/tmp/any/usrshare/usr mksquashfs_image usrshare any } libmodules_make_image() { echo "Executing: ${FUNCNAME}" for _arch in i686 x86_64; do mkdir -p ${work_dir}/tmp/${_arch}/libmodules/lib cp -a ${work_dir}/tmp/${_arch}/root-image/lib/modules ${work_dir}/tmp/${_arch}/libmodules/lib mksquashfs_image libmodules ${_arch} done } core_pkgs_make_image() { echo "Executing: ${FUNCNAME}" mkdir -p ${work_dir}/tmp/any/core-any-pkgs/src/core/pkg cp -a ${work_dir}/tmp/i686/core-pkgs/src/core/pkg/*-any.pkg.* ${work_dir}/tmp/any/core-any-pkgs/src/core/pkg for _arch in i686 x86_64; do rm -rf ${work_dir}/tmp/${_arch}/core-pkgs/src/core/pkg/*-any.pkg.* mksquashfs_image core-pkgs ${_arch} done mksquashfs_image core-any-pkgs any } core_pkgs_extract() { echo "Executing: ${FUNCNAME}" for _arch in i686 x86_64; do unsquashfs_image core-pkgs ${_arch} done } check_if_core_medium() { echo "Executing: ${FUNCNAME}" if [ -f ${work_dir}/iso/i686/core-pkgs.sqfs ] && [ -f ${work_dir}/iso/x86_64/core-pkgs.sqfs ]; then _iscoreiso=y fi } root_image_extract() { echo "Executing: ${FUNCNAME}" for _arch in i686 x86_64; do unsquashfs_image root-image ${_arch} done } root_image_purge() { echo "Executing: ${FUNCNAME}" while read _file; do [ "${_file#"#"}" != "${_file}" ] && continue for _arch in i686 x86_64; do rm -rf "${work_dir}/tmp/${_arch}/root-image/${_file}" done done < "${removefiles_file}" } root_image_list_purge() { while read _file; do [ "${_file#"#"}" != "${_file}" ] && continue for _arch in i686 x86_64; do echo "${work_dir}/tmp/${_arch}/root-image/${_file}" done done < "${removefiles_file}" } root_image_make_image() { echo "Executing: ${FUNCNAME}" for _arch in i686 x86_64; do rm -rf ${work_dir}/tmp/${_arch}/root-image/usr/share rm -rf ${work_dir}/tmp/${_arch}/root-image/lib/modules mksquashfs_image root-image ${_arch} done } make_workspace() { echo "Executing: ${FUNCNAME}" for _arch in i686 x86_64; do mkdir ${_v} -p ${work_dir}/iso/${_arch} mkdir ${_v} -p ${work_dir}/iso/boot/${_arch} mkdir ${_v} -p ${work_dir}/${_arch}/mnt mkdir ${_v} -p ${work_dir}/tmp/${_arch} done mkdir ${_v} -p ${work_dir}/iso/boot/isolinux mkdir ${_v} -p ${work_dir}/iso/any mkdir ${_v} -p ${work_dir}/tmp/any } show_help() { exitvalue=${1} echo echo "${appname} [options] -3 -6 -o " echo echo " needed options:" echo " -3 Path to i686 source iso image" echo " -6 Path to x86_64 source iso image" echo " -o Path to dual target iso image" echo echo " general options:" echo " -M Path to isomounts file (default to '${isomounts_file}'" echo " -S Path to isolinux.cfg file (default to '${isolinuxcfg_file}'" echo " -R Path to removefiles file (default to '${removefiles_file}'" echo " -w Set work directory (default to '${work_dir}')" echo " -T Type of target image (work is done on root-image.sqfs): basic: join both images, no changes in root-image split: 'basic' + split out usr/share/ and lib/modules/ from root-image full: 'split' + remove specified directories (with -R) from root-image (default to '${profile_type}')" echo " -L