From 1a80486e954bd86ffa73ea4e1b6fe6e80d03f75c Mon Sep 17 00:00:00 2001 From: Gerardo Exequiel Pozzi Date: Fri, 26 Feb 2010 20:58:30 -0300 Subject: Add script archiso2dual, a tool for merging two archiso images The installation is separated from main archiso. Signed-off-by: Gerardo Exequiel Pozzi --- archiso2dual/Makefile | 13 ++ archiso2dual/README | 49 ++++ archiso2dual/archiso2dual | 457 +++++++++++++++++++++++++++++++++++++ archiso2dual/isolinux.cfg | 91 ++++++++ archiso2dual/isomounts.i686 | 5 + archiso2dual/isomounts.x86_64 | 5 + archiso2dual/isomounts.x86_64-i686 | 5 + 7 files changed, 625 insertions(+) create mode 100644 archiso2dual/Makefile create mode 100644 archiso2dual/README create mode 100755 archiso2dual/archiso2dual create mode 100644 archiso2dual/isolinux.cfg create mode 100644 archiso2dual/isomounts.i686 create mode 100644 archiso2dual/isomounts.x86_64 create mode 100644 archiso2dual/isomounts.x86_64-i686 (limited to 'archiso2dual') diff --git a/archiso2dual/Makefile b/archiso2dual/Makefile new file mode 100644 index 0000000..fc29dae --- /dev/null +++ b/archiso2dual/Makefile @@ -0,0 +1,13 @@ +all: + +install: all + install -D -m 755 archiso2dual $(DESTDIR)/usr/sbin/archiso2dual + install -d -m 644 $(DESTDIR)/usr/share/archiso2dual/ + install -D -m 644 isomounts.i686 $(DESTDIR)/usr/share/archiso2dual/isomounts.i686 + install -D -m 644 isomounts.x86_64 $(DESTDIR)/usr/share/archiso2dual/isomounts.x86_64 + install -D -m 644 isomounts.x86_64-i686 $(DESTDIR)/usr/share/archiso2dual/isomounts.x86_64-i686 + install -D -m 644 isolinux.cfg $(DESTDIR)/usr/share/archiso2dual/isolinux.cfg + +uninstall: + rm -f $(DESTDIR)/usr/sbin/archiso2dual + rm -rf $(DESTDIR)/usr/share/archiso2dual diff --git a/archiso2dual/README b/archiso2dual/README new file mode 100644 index 0000000..acbeffc --- /dev/null +++ b/archiso2dual/README @@ -0,0 +1,49 @@ +Tree structure of an iso image archlinux-2010.02.25-core-dual.iso (652MB) +running with profile "full": + +# tree -h -I *.c32 +. +|-- [ 92] any +| `-- [ 29M] usrshare.sqfs +|-- [ 496] boot +| |-- [ 140] i686 +| | |-- [5.6M] archiso.img +| | `-- [1.7M] vmlinuz26 +| |-- [1.6K] isolinux +| | |-- [ 0] boot.cat +| | |-- [ 14K] isolinux.bin +| | |-- [2.5K] isolinux.cfg +| | `-- [ 25K] memdisk +| |-- [157K] memtest +| |-- [ 18K] memtest.COPYING +| |-- [ 70] releasenotes.txt +| |-- [ 44K] splash.png +| |-- [ 140] x86_64 +| | |-- [5.7M] archiso.img +| | `-- [1.9M] vmlinuz26 +| |-- [ 38K] x86test +| `-- [ 18K] x86test.COPYING +|-- [ 260] i686 +| |-- [209M] core-pkgs.sqfs +| |-- [ 24M] libmodules.sqfs +| |-- [8.0K] overlay.sqfs +| `-- [ 58M] root-image.sqfs +|-- [ 210] isomounts.i686 +|-- [ 228] isomounts.x86_64 +|-- [ 226] isomounts.x86_64-i686 +`-- [ 260] x86_64 + |-- [222M] core-pkgs.sqfs + |-- [ 25M] libmodules.sqfs + |-- [8.0K] overlay.sqfs + `-- [ 66M] root-image.sqfs + +7 directories, 26 files + +# ls -1sh +total 1.9G +652M archlinux-2010.02.25-core-dual.iso +363M archlinux-2010.02.25-core-i686.iso +385M archlinux-2010.02.25-core-x86_64.iso +220M archlinux-2010.02.25-netinstall-dual.iso +153M archlinux-2010.02.25-netinstall-i686.iso +163M archlinux-2010.02.25-netinstall-x86_64.iso diff --git a/archiso2dual/archiso2dual b/archiso2dual/archiso2dual new file mode 100755 index 0000000..d84d7d8 --- /dev/null +++ b/archiso2dual/archiso2dual @@ -0,0 +1,457 @@ +#!/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/ +} + +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 -offset 1 "${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}" + cp -a ${work_dir}/tmp/i686/root-image/usr/share ${work_dir}/tmp/any/usrshare +} + +usrshare_purge() { + echo "Executing: ${FUNCNAME}" + rm -rf ${work_dir}/tmp/any/usrshare/man + rm -rf ${work_dir}/tmp/any/usrshare/info + rm -rf ${work_dir}/tmp/any/usrshare/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 + cp -a ${work_dir}/tmp/${_arch}/root-image/lib/modules ${work_dir}/tmp/${_arch}/libmodules + 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_us() { + do_common_begin + + root_image_extract + + usrshare_copy_from_root_image + usrshare_make_image + + root_image_remove_usrshare + root_image_make_image + + do_common_end +} + +do_split_lm() { + 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_us: 'basic' + split usr/share/ + split_lm: 'split_us' + split lib/modules/ + purge_us: 'split_us' + prune usr/share/{doc,info,man}/ + full: 'purge_us' + prune boot/ usr/include/ usr/src/ + (default to '${profile_type}')" + echo " -L