#! /bin/bash # This script uses the KIWI 'editbootconfig' hook to modify the Live layout # and ISO generation. # # Note that the 'editbootconfig' hook runs before the initrd is generated - # this is too early for our purposes. So we have to do some gray area # trickery: # # 1. Inject our modification scripts via config-cdroot.tar.xz into the Live tree. # 2. Inject a 'xorriso' wrapper script into /usr/local/bin to hook into the ISO # creation directly. # This script (a) adjusts the boot config, (b) runs xorriso, and (c) makes # it zIPL bootable on s390x. # set -ex dst=${1#iso:} # KIWI config # Copy it to $dst from where it can be later read by xorriso if [ -f .profile ]; then source .profile cp .profile "$dst" fi arch=`uname -m` bootfix=$dst/fix_bootconfig.$arch if [ -f $bootfix ] ; then echo "bootconfig script found: \"$bootfix\"" fi if [ $arch = ppc64le ] ; then mkdir -p $dst/boot/grub2 cp -r usr/share/grub2/powerpc-ieee1275 $dst/boot/grub2 mv $dst/boot/grub2/powerpc-ieee1275/grub.elf $dst/boot/grub2 fi cat </usr/local/bin/xorriso #! /bin/bash set -x # get the output ISO file name and the input directory from the xorriso parameters for i in "\$@" ; do if [ -n "\$iso_opt" ] ; then iso_opt= export iso="\$i" continue fi if [ "\$i" = "-outdev" ] ; then iso_opt=1 continue fi if [ -n "\$map_opt" ] ; then map_opt= target_dir="\$i" continue fi if [ "\$i" = "-map" ] ; then map_opt=1 continue fi done # dump or copy some data from the Live system root image directly to the ISO image to avoid # complicated processing (the ISO image contains a squashfs image which contains ext4 image which # finally contains the needed files) if [ -n "\$target_dir" ]; then mount_dir1=\$(mktemp -d) mount_dir2=\$(mktemp -d) mount -o loop "\$target_dir"/LiveOS/squashfs.img "\$mount_dir1" mount -o loop "\$mount_dir1"/LiveOS/rootfs.img "\$mount_dir2" # dump the list of the installed packages rpm --root "\$mount_dir2" -qa | sort | gzip > "\$target_dir/LiveOS/.packages.gz" # dump the same list also in JSON format for easier processing, # use jq for sorting the array (case insensitive), for merging to a single # array and also for formatting the final JSON output rpm --root "\$mount_dir2" -qa --queryformat \\ '\\{"name":"%{NAME}","version":"%{VERSION}","release":"%{RELEASE}","arch":"%{ARCH}"\\}' \\ | chroot "\$mount_dir2" /usr/bin/jq -s 'sort_by(.name|ascii_downcase)' \\ | gzip > "\$target_dir/LiveOS/.packages.json.gz" # copy the build info file if present if [ -f "\$mount_dir2"/var/log/build/info ]; then cp -a "\$mount_dir2"/var/log/build/info "\$target_dir/LiveOS/.info" fi # unmount in reverse(!) order umount "\$mount_dir2" umount "\$mount_dir1" rmdir "\$mount_dir1" rmdir "\$mount_dir2" fi profile=$(echo "$kiwi_profiles" | tr "_" "-") # keep in sync with ISO Volume ID set in the config.sh script volid="Install-\$profile-$arch" # the simple rescue system reuses the installation live media # but boots to the text-mode only and disables the Agama server export RESCUE_SYSTEM_BOOT_SETTINGS="systemd.unit=multi-user.target \ systemd.mask=agama.service systemd.mask=agama-dbus-monitor.service \ systemd.mask=agama-ssh-issue.service systemd.mask=agama-avahi-issue.service \ systemd.mask=agama-welcome-issue.service systemd.mask=agama-url-issue.service \ systemd.mask=agama-certificate-issue.service \ systemd.mask=agama-certificate-issue.path \ systemd.mask=agama-certificate-wait.service" [ -x $bootfix ] && $bootfix $dst rm -f $dst/fix_bootconfig.* $dst/.profile case $arch in s390x) /usr/bin/xorriso "\$@" -volid "\$volid" -boot_image any bin_path=boot/s390x/cd.ikr -boot_image any boot_info_table=off -boot_image any load_size=512 err=\$? [ -x /usr/bin/isozipl ] && isozipl "\$iso" ;; ppc64le) /usr/bin/xorriso "\$@" -volid "\$volid" -boot_image any chrp_boot_part=on err=\$? ;; *) /usr/bin/xorriso "\$@" -volid "\$volid" err=\$? esac exit \$err XXX chmod +x /usr/local/bin/xorriso