177 lines
5.9 KiB
Bash
Executable file
177 lines
5.9 KiB
Bash
Executable file
#! /bin/bash
|
|
|
|
# This script takes an unpacked s390x Live iso image in the form KIWI-NG currently creates.
|
|
#
|
|
# It modifies the tree to match s390x expectations.
|
|
#
|
|
# Usage:
|
|
#
|
|
# fix_bootconfig.s390x DST_DIR
|
|
#
|
|
# iso layout before:
|
|
# .
|
|
# ├── LiveOS
|
|
# │ └── squashfs.img
|
|
# └── boot
|
|
# └── s390x
|
|
# └── loader
|
|
# ├── initrd
|
|
# ├── isolinux.cfg
|
|
# ├── isolinux.msg
|
|
# └── linux
|
|
#
|
|
#
|
|
# iso layout adjusted:
|
|
# .
|
|
# ├── LiveOS
|
|
# │ └── squashfs.img
|
|
# ├── boot
|
|
# │ └── s390x
|
|
# │ └── loader
|
|
# │ ├── cd.ikr
|
|
# │ ├── initrd
|
|
# │ ├── initrd.off
|
|
# │ ├── initrd.siz
|
|
# │ ├── linux
|
|
# │ ├── parmfile
|
|
# │ ├── parmfile.hmc
|
|
# │ ├── sles.exec
|
|
# │ └── suse.ins
|
|
# ├── suse.ins
|
|
# └── susehmc.ins
|
|
#
|
|
|
|
set -e
|
|
|
|
dst="$1"
|
|
|
|
if [ ! -d "$dst" ] ; then
|
|
echo "fix_bootconfig.s390x: image dir \"$dst\" not found"
|
|
exit 1
|
|
fi
|
|
|
|
# ----------------
|
|
|
|
# Note:
|
|
#
|
|
# KIWI-NG creates an iso with isolinux boot files in boot/s390x/loader.
|
|
#
|
|
# These files are not needed except for kernel and initrd (and kernel params from isolinux.cfg).
|
|
#
|
|
# This script removes the isolinux config and adds s390x related config
|
|
# files. It also moves kernel and initrd to the usual location (in boot/s390x).
|
|
#
|
|
|
|
boot_dir=$dst/boot/s390x/loader
|
|
grub_dir=$dst/boot/grub2
|
|
|
|
# Create parmfile.
|
|
#
|
|
# These parameters are taken from a sampel isolinux.cfg; the required parameters will
|
|
# possibly change according to the KIWI config.
|
|
#
|
|
parmfile_content=
|
|
echo "$parmfile_content" >$boot_dir/parmfile
|
|
|
|
# Note on parmfile:
|
|
#
|
|
# Possibly s390 expects parmfile to have a maximal line length of 80 chars - but you can have several lines.
|
|
#
|
|
# In contrast the parmfile blob embedded in cd.ikr should have no line breaks but can be longer than 80 chars.
|
|
#
|
|
|
|
# Create suse.ins & cd.ikr.
|
|
#
|
|
# cd.ikr is an image file combining kernel and initrd; suse.ins describes its layout.
|
|
#
|
|
# cd.ikr is used as boot image in El-torito style cd booting.
|
|
#
|
|
|
|
# Offsets used for cd.ikr.
|
|
initrd_ofs_ofs=0x0001040c
|
|
initrd_siz_ofs=0x00010414
|
|
initrd_ofs=0x01000000
|
|
parmfile_ofs=0x00010480
|
|
|
|
# Create initrd.off (note: 32 bit, stored in big endian).
|
|
printf "%08x" $((initrd_ofs)) | xxd -r -p - $boot_dir/initrd.off
|
|
|
|
# Create initrd.siz (note: 32 bit, stored in big endian).
|
|
read initrd_size x < <(du -b $boot_dir/initrd)
|
|
printf "%08x" $((initrd_size)) | xxd -r -p - $boot_dir/initrd.siz
|
|
|
|
# Create suse.ins.
|
|
cat >$boot_dir/suse.ins <<XXX
|
|
* SUSE Linux for IBM z Systems Installation System
|
|
linux 0x00000000
|
|
initrd.off $initrd_ofs_ofs
|
|
initrd.siz $initrd_siz_ofs
|
|
initrd $initrd_ofs
|
|
parmfile $parmfile_ofs
|
|
XXX
|
|
|
|
# A suse.ins copy at media root dir - note the different paths.
|
|
cat >$dst/suse.ins <<XXX
|
|
* SUSE Linux for IBM z Systems Installation System
|
|
boot/s390x/loader/linux 0x00000000
|
|
boot/s390x/loader/initrd.off $initrd_ofs_ofs
|
|
boot/s390x/loader/initrd.siz $initrd_siz_ofs
|
|
boot/s390x/loader/initrd $initrd_ofs
|
|
boot/s390x/loader/parmfile $parmfile_ofs
|
|
XXX
|
|
|
|
# Another suse.ins copy at media root dir - note the different paths and the hmc stuff.
|
|
cat >$dst/susehmc.ins <<XXX
|
|
* SUSE Linux for IBM z Systems Installation System via HMC
|
|
boot/s390x/loader/linux 0x00000000
|
|
boot/s390x/loader/initrd.off $initrd_ofs_ofs
|
|
boot/s390x/loader/initrd.siz $initrd_siz_ofs
|
|
boot/s390x/loader/initrd $initrd_ofs
|
|
boot/s390x/loader/parmfile.hmc $parmfile_ofs
|
|
XXX
|
|
echo "$parmfile_content console=ttyS1" >$boot_dir/parmfile.hmc
|
|
|
|
# Some rexx script to ipl something...
|
|
cat >$boot_dir/sles.exec <<XXX
|
|
/* REXX LOAD EXEC FOR SUSE LINUX S/390 VM GUESTS */
|
|
/* LOADS SUSE LINUX S/390 FILES INTO READER */
|
|
SAY ''
|
|
SAY 'LOADING SLES FILES INTO READER...'
|
|
'CP CLOSE RDR'
|
|
'PURGE RDR ALL'
|
|
'SPOOL PUNCH * RDR'
|
|
'PUNCH SLES LINUX A (NOH'
|
|
'PUNCH SLES PARMFILE A (NOH'
|
|
'PUNCH SLES INITRD A (NOH'
|
|
'IPL 00C'
|
|
XXX
|
|
|
|
# Strip CDLABEL from the kiwi-generated grub configuration
|
|
# We are specifying the correct one in /etc/cmdline.d (see config.sh)
|
|
# and having it here might be confusing to repackers such as
|
|
# mksusecd (bsc#1245453)
|
|
sed -i -E 's|root=live:CDLABEL=[^ ]+||g' $grub_dir/grub.cfg
|
|
|
|
# Note:
|
|
#
|
|
# SUSE installer media also have boot/s390x/zpxe.rexx - a rexx script
|
|
# that comes directly from the s390-tools package.
|
|
#
|
|
|
|
# Create cd.ikr with all the file blobs mentioned in suse.ins.
|
|
dd status=none if=$boot_dir/linux of=$boot_dir/cd.ikr
|
|
dd status=none conv=notrunc obs=1 seek=$((initrd_ofs_ofs)) if=$boot_dir/initrd.off of=$boot_dir/cd.ikr
|
|
dd status=none conv=notrunc obs=1 seek=$((initrd_siz_ofs)) if=$boot_dir/initrd.siz of=$boot_dir/cd.ikr
|
|
dd status=none conv=notrunc obs=4096 seek=$((initrd_ofs/4096)) if=$boot_dir/initrd of=$boot_dir/cd.ikr
|
|
# clear kernel cmdline area; it's actually 4 kiB, but 1 block should be more than enough
|
|
dd status=none conv=notrunc bs=1 count=512 seek=$((parmfile_ofs)) if=/dev/zero of=$boot_dir/cd.ikr
|
|
echo -n "$parmfile_content" | dd status=none conv=notrunc obs=1 seek=$((parmfile_ofs)) of=$boot_dir/cd.ikr
|
|
|
|
# S390 Magic?
|
|
echo 80010000 | xxd -r -p -seek 4 - $boot_dir/cd.ikr
|
|
|
|
# Pad cd.ikr to full 4k blocks.
|
|
dd status=none conv=notrunc oflag=append bs=1 count=$((-initrd_size & 0xfff)) if=/dev/zero of=$boot_dir/cd.ikr
|
|
|
|
# Add zipl map file for later use
|
|
dd status=none if=/dev/zero of=$boot_dir/zipl.map bs=4k count=4
|