#!/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" appname=${0##*/} _error="0" _confirm="n" _v="" 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/ } 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}.i686 $work_dir/iso/ cp ${_v} ${isomounts_file}.x86_64 $work_dir/iso/ cp ${_v} ${isomounts_file}.x86_64-i686 $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_copy_from_root_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 } usrshare_purge() { echo "Executing: ${FUNCNAME}" rm -rf ${work_dir}/tmp/any/usrshare/usr/share/man rm -rf ${work_dir}/tmp/any/usrshare/usr/share/info rm -rf ${work_dir}/tmp/any/usrshare/usr/share/doc } usrshare_make_image() { echo "Executing: ${FUNCNAME}" mksquashfs_image usrshare any } libmodules_make_image() { echo "Executing: ${FUNCNAME}" for _arch in i686 x86_64; do mksquashfs_image libmodules ${_arch} done } libmodules_copy_from_root_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 done } root_image_extract() { echo "Executing: ${FUNCNAME}" for _arch in i686 x86_64; do unsquashfs_image root-image ${_arch} done } root_image_make_image() { echo "Executing: ${FUNCNAME}" for _arch in i686 x86_64; do mksquashfs_image root-image ${_arch} done } root_image_remove_usrshare() { echo "Executing: ${FUNCNAME}" for _arch in i686 x86_64; do rm -rf ${work_dir}/tmp/${_arch}/root-image/usr/share done } root_image_remove_libmodules() { echo "Executing: ${FUNCNAME}" for _arch in i686 x86_64; do rm -rf ${work_dir}/tmp/${_arch}/root-image/lib/modules done } root_image_purge() { echo "Executing: ${FUNCNAME}" for _arch in i686 x86_64; do rm -rf ${work_dir}/tmp/${_arch}/root-image/boot rm -rf ${work_dir}/tmp/${_arch}/root-image/usr/include rm -rf ${work_dir}/tmp/${_arch}/root-image/usr/src 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 } do_common_begin() { make_workspace iso_mount kernel_copy isolinux_copy squashfs_copy iso_umount isolinuxcfg_copy isomounts_copy } do_common_end() { make_iso } do_basic() { do_common_begin do_common_end } do_split() { do_common_begin root_image_extract usrshare_copy_from_root_image usrshare_make_image libmodules_copy_from_root_image libmodules_make_image root_image_remove_usrshare root_image_remove_libmodules root_image_make_image do_common_end } do_purge_us() { do_common_begin root_image_extract usrshare_copy_from_root_image usrshare_purge usrshare_make_image libmodules_copy_from_root_image libmodules_make_image root_image_remove_usrshare root_image_remove_libmodules root_image_make_image do_common_end } do_full() { do_common_begin root_image_extract usrshare_copy_from_root_image usrshare_purge usrshare_make_image libmodules_copy_from_root_image libmodules_make_image root_image_remove_usrshare root_image_remove_libmodules root_image_purge root_image_make_image do_common_end } 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 files [basename] (default to '${isomounts_file}'" echo " -S Path to isolinux.cfg file (default to '${isolinuxcfg_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 *.sqfs split: 'basic' + split usr/share/ and lib/modules/ from / purge_us: 'split' + prune usr/share/{doc,info,man}/ full: 'purge_us' + prune boot/ usr/include/ usr/src/ (default to '${profile_type}')" echo " -L